Autor original:
Ramdass - Conversión únicamente
El BykovTrend es un indicador de señales tipo semáforo que cuenta con alertas, envíos de correos electrónicos y notificaciones push a dispositivos móviles.
Para implementar las alertas, los mensajes de correo y las notificaciones push, se realizaron los siguientes cambios en el código del indicador:
- Se introdujeron nuevos parámetros de entrada.
input uint NumeroDeBarra=1;//Número de barra para la señal input bool SonidoON=true; //Habilitar alertas input uint NumeroDeAlertas=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 NombreSeñal, // texto del nombre del indicador para mensajes de correo y push double &FlechaCompra[], // buffer del indicador con señales de compra const int TotalRates, // 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 &Spread[]) // spread { //--- static uint contador=0; if(TotalRates!=Prev_calculado) contador=0; bool señalCompra=false; bool pruebaSerie=ArrayGetAsSeries(FlechaCompra); int indice; if(pruebaSerie) indice=int(NumeroDeBarra); else indice=TotalRates-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=TotalRates-int(NumeroDeBarra)-1; double Ask=Cierre[indice]; double Bid=Cierre[indice]; pruebaSerie=ArrayGetAsSeries(Spread); if(pruebaSerie) indice=int(NumeroDeBarra); else indice=TotalRates-int(NumeroDeBarra)-1; Bid+=Spread[indice]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod(); if(SonidoON) Alert("Señal de COMPRA Ask=",Ask," Bid=",Bid," tiempo actual=",texto," Símbolo=",Symbol()," Periodo=",sPeriodo); if(EmailON) SendMail(NombreSeñal+": alerta de señal de COMPRA","Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); if(PushON) SendNotification(NombreSeñal+": Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Función de señal de venta | //+------------------------------------------------------------------+ void SellSignal(string NombreSeñal, // texto del nombre del indicador para mensajes de correo y push double &FlechaVenta[], // buffer del indicador con señales de venta const int TotalRates, // 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 &Spread[]) // spread { //--- static uint contador=0; if(TotalRates!=Prev_calculado) contador=0; bool señalVenta=false; bool pruebaSerie=ArrayGetAsSeries(FlechaVenta); int indice; if(pruebaSerie) indice=int(NumeroDeBarra); else indice=TotalRates-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=TotalRates-int(NumeroDeBarra)-1; double Ask=Cierre[indice]; double Bid=Cierre[indice]; pruebaSerie=ArrayGetAsSeries(Spread); if(pruebaSerie) indice=int(NumeroDeBarra); else indice=TotalRates-int(NumeroDeBarra)-1; Bid+=Spread[indice]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoON) Alert("Señal de VENTA Ask=",Ask," Bid=",Bid," tiempo actual=",texto," Símbolo=",Symbol()," Periodo=",sPeriodo); if(EmailON) SendMail(NombreSeñal+": alerta de señal de VENTA","Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); if(PushON) SendNotification(NombreSeñal+": Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Obtener el marco de tiempo como una 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().
//--- BuySignal("BykovTrendAlert",FlechaCompra,total_rates,prev_calculated,cierre,spread); SellSignal("BykovTrendAlert",FlechaVenta,total_rates,prev_calculated,cierre,spread); //---
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 ser configurados como ceros o 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.
Este indicador fue implementado por primera vez en MQL4 y publicado en Code Base el 28.09.2007.

Fig1. El indicador BykovTrendAlert en el gráfico
Fig.2. El indicador BykovTrendAlert Generando alertas.
Publicaciones relacionadas
- Alertas de Señales con el Indicador Iin_MA para MetaTrader 5
- iStochKomposterAlert: El Indicador de Señales para MetaTrader 5 con Alertas
- PPO_SignAlert: Tu nuevo aliado de señales en MetaTrader 5
- DSSBressertSignAlert: Indicador para MetaTrader 5 con Alertas
- wlxBW5ZoneAlert: El Indicador Definitivo para MetaTrader 5
