Home Indicatore tecnico Post

iMFISignAlert: L'Indicatore di Segnale per MetaTrader 5

Allegato
15843.zip (3.11 KB, Scarica 0 volte)

L'indicatore iMFISignAlert è un potente strumento basato sull'oscillatore Money Flow Index, progettato per aiutarti a identificare i momenti di ipercomprato e ipervenduto. Questo indicatore non solo fornisce segnali visivi tramite frecce, ma è anche dotato di allerta che ti avvisa tramite email e notifiche push sul tuo dispositivo mobile.

Di seguito, ti mostrerò le modifiche apportate al codice dell'indicatore per implementare le funzioni di allerta, messaggi email e notifiche push:

  1. Sono stati introdotti nuovi parametri di input:
    input uint NumberofBar=1;//Numero di barre per il segnale
    input bool SoundON=true; //Abilita le allerta
    input uint NumberofAlerts=2;//Numero di allerta
    input bool EMailON=false; //Abilita l'invio del segnale via email
    input bool PushON=false; //Abilita l'invio del segnale ai dispositivi mobili
    
  2. Sono state aggiunte tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe():
    //+------------------------------------------------------------------+
    //| Funzione di segnale di acquisto                                              |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,      // testo del nome dell'indicatore per email e messaggi push
                   double &BuyArrow[],        // buffer dell'indicatore con segnali di acquisto
                   const int Rates_total,     // numero attuale di barre
                   const int Prev_calculated, // numero di barre nel tick precedente
                   const double &Close[],     // prezzo di chiusura
                   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);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Funzione di segnale di vendita                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      // testo del nome dell'indicatore per email e messaggi push
                    double &SellArrow[],       // buffer dell'indicatore con segnali di vendita
                    const int Rates_total,     // numero attuale di barre
                    const int Prev_calculated, // numero di barre nel tick precedente
                    const double &Close[],     // prezzo di chiusura
                    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);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Ottenere il timeframe come stringa                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Infine, sono state aggiunte delle chiamate alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate():
    BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread);
        SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
    

Dove BuyBuffer e SellBuffer sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Assicurati che i valori vuoti nei buffer dell'indicatore siano impostati a zero o a EMPTY_VALUE.

È previsto che venga utilizzata solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.

Fig.1. L'indicatore iMFISignAlert sul grafico

Fig.1. L'indicatore iMFISignAlert sul grafico

Fig.2. L'indicatore iMFISignAlert. Generazione di allerta.

Fig.2. L'indicatore iMFISignAlert. Generazione di allerta.

Post correlati

Commento (0)