Pon "Me gusta" y sigue las noticias
Deje un enlace a él, ¡qué los demás también lo valoren!
Evalúe su trabajo en el terminal MetaTrader 5
- Visualizaciones:
- 808
- Ranking:
- Publicado:
-
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa
Autor real: Iin Zulkarnainn
Indicador semafórico de señal Iin_MA_Signal con el envío de alertas, mensajes de correo y notificaciones Push su teléfono inteligente.
En el código del indicador, han sido hechas las siguientes modificaciones para las alertas, mensajes de correo y Push al smartphone:
- Han sido añadidas nuevas variables de entrada a los parámetros de entrada del indicador:
input uint NumberofBar=1;//Número de la barra para enviar la señal input bool SoundON=true; //Permiso de la alerta input uint NumberofAlerts=2; // Número de alertas input bool EMailON=false; //Permiso para enviar la señal por email input bool PushON=false; //Permiso para enviar la señal al móvil
- Han sido añadidas tres nuevas funciones BuySignal(), SellSignal() y GetStringTimeframe() al final del código del indicador
//+------------------------------------------------------------------+ //| Buy signal function | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // texto del nombre del indicador para emails y señales Push double &BuyArrow[], // búfer de indicador con señales de compra const int Rates_total, // número de barras actuales const int Prev_calculated, // número de barras en el tick anterior const double &Close[], // precio de cierre const int &Spread[]) // spread { //--- 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("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Sell signal function | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // texto del nombre del indicador para emails y señales Push double &SellArrow[], // búfer de indicador con señales de compra const int Rates_total, // número actual de las barras const int Prev_calculated, // número de barras en el tick anterior const double &Close[], // precio de cierre const int &Spread[]) // spread { //--- 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("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Obtener timeframe como cadena | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- En el bloque OnCalculate() después del cálculo del indicador, ha sido insertada la llamada a las funciones BuySignal() y SellSignal()
//--- BuySignal("Iin_MA_Signal_Alert",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("Iin_MA_Signal_Alert",SellBuffer,rates_total,prev_calculated,close,spread); //---
Aquí, BuyBuffer y SellBuffer son los nombres de los búferes de indicador para guardar las señales de compra y venta. En los búferes de indicador, como valores vacíos, tienen que figurar ceros o EMPTY_VALUE.
Se supone que en el código del indicador, en el bloque OnCalculate() va a usarse sólo una llamada a las funciones BuySignal() y SellSignal().
Fig. 1. Indicador Iin_MA_Signal_Alert en el gráfico
Fig. 2. Indicador Indicador Iin_MA_Signal_Alert. Envío de alertas
Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/21911

El indicador StepMA_3D_v3 tiene la posibilidad de cambiar el timeframe del indicador en los parámetros de entrada.

Oscilador DeMarker en forma del histograma de color con el uso de volúmenes.

El indicador RSI_Histogram_Vol en forma de velas

El indicador CCI_Histogram_Vol en forma de velas