El indicador de señales Semáforo se basa en el algoritmo del DSSBressert, y es una herramienta imprescindible para los traders que desean optimizar su estrategia. Este indicador no solo proporciona señales de compra y venta, sino que también cuenta con funciones de alertas, enviando correos electrónicos y notificaciones push a tus dispositivos móviles.
Para implementar las alertas, se han realizado las siguientes modificaciones en el código del indicador:
- Se han introducido nuevos parámetros de entrada:
input uint NumberofBar=1;//Número de barras 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 correos con la señal input bool PushON=false; //Habilitar 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 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, // el número actual de barras const int Prev_calculated, // el 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," tiempo actual=",text," Símbolo=",Symbol()," Período=",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()+" Período="+sPeriod); if(PushON) SendNotification(SignalSirname+": señal de compra en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Período="+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, // el número actual de barras const int Prev_calculated, // el 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," tiempo actual=",text," Símbolo=",Symbol()," Período=",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()+" Período="+sPeriod); if(PushON) SendNotification(SignalSirname+": señal de venta en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Período="+sPeriod); } u//--- } //+------------------------------------------------------------------+ //| Obtener el período 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():
u//--- BuySignal("DSSBressertSignAlert",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("DSSBressertSignAlert",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. Los valores vacíos en los buffers del indicador deben ser establecidos 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.
El indicador utiliza las clases de la biblioteca SmoothAlgorithms.mqh (cópiala en <terminal_data_folder>\MQL5\Include). El uso de las clases se describió detalladamente en el artículo "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".

Fig.1. El indicador DSSBressertSignAlert en el gráfico
Fig.2. El indicador DSSBressertSignAlert. Generando alertas.

Comentarios 0