ASCtrend es un indicador de señales tipo semáforo que cuenta con alertas, correos electrónicos y notificaciones push para mejorar tu trading.
Se han realizado varias modificaciones en el código del indicador para implementar estas alertas. Aquí te cuento qué cambios se hicieron:
- Se introdujeron nuevos parámetros de entrada:
input uint NumeroDeBarras=1;//Número de barras para la señal input bool SonidoActivado=true; //Habilitar alertas input uint NumeroDeAlertas=2;//Número de alertas input bool CorreoActivado=false; //Habilitar el envío de correos electrónicos input bool NotificacionPushActivada=false; //Habilitar el envío de la señal 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 TotalBarras, // el número actual de barras const int Prev_calculated, // el número de barras en el tick anterior const double &Cierre[], // precio de cierre const int &Spread[]) // spread { //--- static uint contador=0; if(TotalBarras!=Prev_calculated) contador=0; bool SeñalCompra=false; bool TestSerie=ArrayGetAsSeries(FlechaCompra); int indice; if(TestSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-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); TestSerie=ArrayGetAsSeries(Cierre); if(TestSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; double Ask=Cierre[indice]; double Bid=Cierre[indice]; TestSerie=ArrayGetAsSeries(Spread); if(TestSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoActivado) Alert("Señal de COMPRA Ask=",Ask," Bid=",Bid," tiempo actual=",texto," Símbolo=",Symbol()," Periodo=",sPeriodo); if(CorreoActivado) 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(NotificacionPushActivada) 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 correos y mensajes push double &FlechaVenta[], // buffer del indicador con señales de venta const int TotalBarras, // el número actual de barras const int Prev_calculated, // el número de barras en el tick anterior const double &Cierre[], // precio de cierre const int &Spread[]) // spread { //--- static uint contador=0; if(TotalBarras!=Prev_calculated) contador=0; bool SeñalVenta=false; bool TestSerie=ArrayGetAsSeries(FlechaVenta); int indice; if(TestSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-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); TestSerie=ArrayGetAsSeries(Cierre); if(TestSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; double Ask=Cierre[indice]; double Bid=Cierre[indice]; TestSerie=ArrayGetAsSeries(Spread); if(TestSerie) indice=int(NumeroDeBarras); else indice=TotalBarras-int(NumeroDeBarras)-1; Bid+=Spread[indice]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SonidoActivado) Alert("Señal de VENTA Ask=",Ask," Bid=",Bid," tiempo actual=",texto," Símbolo=",Symbol()," Periodo=",sPeriodo); if(CorreoActivado) 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(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Obtener el timeframe 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() //---
BuySignal("ASCtrend",FlechaCompra,total_barras,prev_calculated,cierre,spread);
SellSignal("ASCtrend",FlechaVenta,total_barras,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. En los buffers del indicador se deben establecer ceros o EMPTY_VALUE como valores vacíos.
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. Indicador ASCtrendAlert en el gráfico

Fig.2. Indicador BykovTrendAlert. Generando alertas
Comentarios 0