Autor original:
Te presento un indicador de señales basado en el algoritmo del Elliott Wave Oscillator, que incluye alertas, envíos de correos electrónicos y notificaciones push para dispositivos móviles.
Se han realizado los siguientes cambios en el código del indicador para implementar las alertas, mensajes de correo y notificaciones push:
- Se introdujeron nuevos parámetros de entrada:
input uint NumberofBar=1;//Número de barra para la señal input bool SoundON=true; //Habilitar alertas input uint NumberofAlerts=2;//Número de alertas input bool EMailON=false; //Habilitar envío de señales por correo input bool PushON=false; //Habilitar envío de señales a dispositivos móviles
- Se añadieron tres nuevas funciones al final del código del indicador: BuySignal(), SellSignal() y GetStringTimeframe()
//+------------------------------------------------------------------+ //| Función de señal de compra | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // texto del nombre del indicador para correos y mensajes push double &BuyArrow[], // buffer del indicador con señales de compra const int Rates_total, // número actual de barras const int Prev_calculated, // número de barras en el tick anterior const double &Close[], // precio de cierre const int &Spread[]) // spread { u//--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool BuySignal=false; bool SeriesTest=ArrayGetAsSeries(BuyArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true; if(BuySignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("Señal de COMPRA Ask=",Ask," Bid=",Bid," hora actual=",text," Símbolo=",Symbol()," Periodo=",sPeriod); if(EMailON) SendMail(SignalSirname+": Alerta de señal de COMPRA","Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod); if(PushON) SendNotification(SignalSirname+": Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Función de señal de venta | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // texto del nombre del indicador para correos y mensajes push double &SellArrow[], // buffer del indicador con señales de venta const int Rates_total, // número actual de barras const int Prev_calculated, // número de barras en el tick anterior const double &Close[], // precio de cierre const int &Spread[]) // spread { u//--- static uint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool SellSignal=false; bool SeriesTest=ArrayGetAsSeries(SellArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true; if(SellSignal && counter<=NumberofAlerts) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SeriesTest=ArrayGetAsSeries(Close); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; double Ask=Close[index]; double Bid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("Señal de VENTA Ask=",Ask," Bid=",Bid," hora actual=",text," Símbolo=",Symbol()," Periodo=",sPeriod); if(EMailON) SendMail(SignalSirname+": Alerta de señal de VENTA","Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod); if(PushON) SendNotification(SignalSirname+": Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Obteniendo el marco temporal como cadena | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Se añadieron un par de llamadas a las funciones BuySignal() y SellSignal() después de los ciclos de cálculo del indicador en el bloque OnCalculate()
u//--- BuySignal("Elliott_Wave_Oscillator_Sign",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("Elliott_Wave_Oscillator_Sign",SellBuffer,rates_total,prev_calculated,close,spread); u//---
Donde BuyBuffer y SellBuffer son los nombres de los buffers del indicador para almacenar las señales de compra y venta. Se debe establecer que los valores vacíos en los buffers del indicador sean ceros o EMPTY_VALUE.
Se asume que solo se usará una llamada a las funciones BuySignal() y SellSignal() en el bloque OnCalculate() del código del indicador.
El indicador original ya incluía un código funcional para generar alertas, el cual fue eliminado por considerarse innecesario.
El indicador utiliza las clases de la biblioteca SmoothAlgorithms.mqh (cópialo en <terminal_data_folder>\MQL5\Include). El uso de estas clases se describió a fondo en el artículo "Promediando series de precios para cálculos intermedios sin usar buffers adicionales".
Originalmente, este indicador fue escrito en MQL5 y se publicó por primera vez en la Base de Código el 26.04.2016.

Fig.1. El indicador Elliott Wave Oscillator Sign Alert en el gráfico
Fig.2. El indicador Elliott Wave Oscillator Sign Alert. Generando alertas.
Publicaciones relacionadas
- iStochKomposterAlert: El Indicador de Señales para MetaTrader 5 con Alertas
- iDeMarkerSignAlert: Tu nuevo indicador para MetaTrader 5
- Niveles Históricos Fuertes: Herramienta Clave para Traders de MetaTrader 5
- Ideal ZigZag: Un Indicador Rápido para MetaTrader 5
- iWPRSignAlert: Tu nuevo aliado en MetaTrader 5
