Home Indicatore tecnico Post

iStochKomposterAlert: Il Nuovo Indicatore per MetaTrader 5 con Segnali di Allerta

Allegato
15850.zip (3.17 KB, Scarica 0 volte)

Autore reale:

komposter

L'iStochKomposterAlert è un indicatore che utilizza le frecce di segnale Semaphore, basato sul classico oscillatore Stocastico, per identificare le aree di ipercomprato e ipervenduto. Questo strumento è dotato di avvisi, invio di email e notifiche push sui dispositivi mobili.

Di seguito, ti mostro le modifiche apportate al codice dell'indicatore per implementare gli avvisi, i messaggi email e le notifiche push:

  • Introduzione di nuovi parametri di input:
    input uint NumberofBar=1;// Numero di barre per il segnale
    input bool SoundON=true; // Abilitare avvisi
    input uint NumberofAlerts=2;// Numero di avvisi
    input bool EMailON=false; // Abilitare l'invio email del segnale
    input bool PushON=false; // Abilitare l'invio del segnale ai dispositivi mobili
    
  • Aggiunta di 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));
    //----
      }
    
  • Aggiunta di un paio di 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);
    

Qui, BuyBuffer e SellBuffer sono i nomi dei buffer dell'indicatore utilizzati per memorizzare i segnali di acquisto e vendita. I valori vuoti nei buffer dell'indicatore devono essere impostati a zero o su EMPTY_VALUE.

Si presume che venga effettuata solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.

Fig.1. L'indicatore iStochKomposterAlert sul grafico

Fig.1. L'indicatore iStochKomposterAlert sul grafico

Fig.2. L'indicatore iStochKomposterAlert. Generazione di avvisi.

Fig.2. L'indicatore iStochKomposterAlert. Generazione di avvisi.

Post correlati

Commento (0)