Autor real:
TrendLaboratory Ltd.
Te presento el indicador de señales con flechas de semáforo basado en el oscilador Fisher_org_v1. Este indicador te ayudará a identificar cuándo salir de las zonas de sobrecompra y sobreventa, además de contar con alertas que envían correos electrónicos y notificaciones push a tus dispositivos móviles.
Se han realizado las siguientes modificaciones 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 NumeroDeBarra=1;//Número de barra para la señal input bool SonidoActivado=true; //Habilitar alertas input uint NumeroDeAlertas=2;//Número de alertas input bool CorreoActivado=false; //Habilitar envío de señales por correo input bool NotificacionPushActivada=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 NombreSeñal, // texto del nombre del indicador para correos y mensajes push double &FlechaCompra[], // buffer del indicador con señales de compra const int TotalDeBarras, // el número actual de barras const int Prev_calculado, // el número de barras en el tick anterior const double &Cierre[], // precio de cierre const int &Diferencial[]) // spread { u//--- static uint contador=0; if(TotalDeBarras!=Prev_calculado) contador=0; bool SeñalCompra=false; bool PruebaSerie=ArrayGetAsSeries(FlechaCompra); int indice; if(PruebaSerie) indice=int(NumeroDeBarra); else indice=TotalDeBarras-int(NumeroDeBarra)-1; if(NormalizeDouble(FlechaCompra[indice],_Digits) && FlechaCompra[indice]!=EMPTY_VALUE) SeñalCompra=true; if(SeñalCompra && contador<=NumeroDeAlertas) { contador++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); PruebaSerie=ArrayGetAsSeries(Cierre); if(PruebaSerie) indice=int(NumeroDeBarra); else indice=TotalDeBarras-int(NumeroDeBarra)-1; double Preguntar=Cierre[indice]; double Ofertar=Cierre[indice]; PruebaSerie=ArrayGetAsSeries(Diferencial); if(PruebaSerie) indice=int(NumeroDeBarra); else indice=TotalDeBarras-int(NumeroDeBarra)-1; Ofertar+=Diferencial[indice]; string sOfertar=DoubleToString(Preguntar,_Digits); string sBid=DoubleToString(Ofertar,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoActivado) Alert("Señal de COMPRA Preguntar=",Preguntar," Ofertar=",Ofertar," hora actual=",texto," Símbolo=",Symbol()," Periodo=",sPeriodo); if(CorreoActivado) SendMail(NombreSeñal+": alerta de señal de COMPRA","Señal de COMPRA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); if(NotificacionPushActivada) SendNotification(NombreSeñal+": Seña de COMPRA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); } u//--- } //+------------------------------------------------------------------+ //| Función de señal de venta | //+------------------------------------------------------------------+ void SellSignal(string NombreSeñal, // texto del nombre del indicador para correos y mensajes push double &FlechaVenta[], // buffer del indicador con señales de venta const int TotalDeBarras, // el número actual de barras const int Prev_calculado, // el número de barras en el tick anterior const double &Cierre[], // precio de cierre const int &Diferencial[]) // spread { u//--- static uint contador=0; if(TotalDeBarras!=Prev_calculado) contador=0; bool SeñalVenta=false; bool PruebaSerie=ArrayGetAsSeries(FlechaVenta); int indice; if(PruebaSerie) indice=int(NumeroDeBarra); else indice=TotalDeBarras-int(NumeroDeBarra)-1; if(NormalizeDouble(FlechaVenta[indice],_Digits) && FlechaVenta[indice]!=EMPTY_VALUE) SeñalVenta=true; if(SeñalVenta && contador<=NumeroDeAlertas) { contador++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); PruebaSerie=ArrayGetAsSeries(Cierre); if(PruebaSerie) indice=int(NumeroDeBarra); else indice=TotalDeBarras-int(NumeroDeBarra)-1; double Preguntar=Cierre[indice]; double Ofertar=Cierre[indice]; PruebaSerie=ArrayGetAsSeries(Diferencial); if(PruebaSerie) indice=int(NumeroDeBarra); else indice=TotalDeBarras-int(NumeroDeBarra)-1; Ofertar+=Diferencial[indice]; string sOfertar=DoubleToString(Preguntar,_Digits); string sBid=DoubleToString(Ofertar,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoActivado) Alert("Señal de VENTA Preguntar=",Preguntar," Ofertar=",Ofertar," hora actual=",texto," Símbolo=",Symbol()," Periodo=",sPeriodo); if(CorreoActivado) SendMail(NombreSeñal+": alerta de señal de VENTA","Señal de VENTA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de VENTA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); } u//--- } //+------------------------------------------------------------------+ //| Obtener el marco de tiempo como un string | //+------------------------------------------------------------------+ 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()
BuySignal("iWPRSign",FlechaCompra,total_de_barras,prev_calculado,cierre,diferencial); SellSignal("iWPRSign",FlechaVenta,total_de_barras,prev_calculado,cierre,diferencial);
Donde FlechaCompra y FlechaVenta son los nombres de los buffers del indicador para almacenar las señales de compra y venta. Los valores vacíos en los buffers del indicador deben establecerse en cero o en EMPTY_VALUE.
Se asume que solo se utilizará una llamada a las funciones BuySignal() y SellSignal() en el bloque OnCalculate() del código del indicador.

Fig.1. El indicador Fisher_org_v1_Sign en el gráfico

Fig.2. El indicador Fisher_org_v1_Sign Generando alertas.
Publicaciones relacionadas
- Ideal ZigZag: Un Indicador Rápido para MetaTrader 5
- ID Lite Info MA: Tu Nuevo Aliado en MetaTrader 5
- BinaryWave_HTF_Signal: El Indicador Clave para MetaTrader 5
- Volatilidad Estocástica: Indicador en Gráficos para MetaTrader 5
- Basket Viewer: Estadísticas para Grupos de Pares Largos y Cortos en MetaTrader 5