Home Indicatore tecnico Post

BykovTrendAlert: L'indicatore per MetaTrader 5 che ti avvisa dei segnali

Allegato
16458.zip (3.75 KB, Scarica 0 volte)

Autore reale:

Ramdass - Solo conversione

Il BykovTrend è un indicatore a semaforo che offre avvisi, inviando email e notifiche push ai dispositivi mobili.

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

  1. Introduzione di nuovi parametri di input:
    input uint NumeroBar=1;// Numero di barre per il segnale
    input bool SuonoON=true; // Abilita avvisi
    input uint NumeroAvvisi=2;// Numero di avvisi
    input bool EmailON=false; // Abilita invio email del segnale
    input bool PushON=false; // Abilita invio del segnale a dispositivi mobili
    
  2. Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe():
    //+------------------------------------------------------------------+
    //| Funzione segnale di acquisto                                               |
    //+------------------------------------------------------------------+
    void BuySignal(string NomeSegnale,      // testo del nome dell'indicatore per email e messaggi push
                   double &FrecciaAcquisto[],        // buffer dell'indicatore con segnali di acquisto
                   const int TotaleBarre,     // numero attuale di barre
                   const int Prev_calcolato, // numero di barre al tick precedente
                   const double &Chiusura[],     // prezzo di chiusura
                   const int &Spread[])       // spread
      {
    //---
       static uint contatore=0;
       if(TotaleBarre!=Prev_calcolato) contatore=0;
    
       bool SegnaleAcquisto=false;
       bool TestSerie=ArrayGetAsSeries(FrecciaAcquisto);
       int indice;
       if(TestSerie) indice=int(NumeroBar);
       else indice=TotaleBarre-int(NumeroBar)-1;
       if(NormalizeDouble(FrecciaAcquisto[indice],_Digits) && FrecciaAcquisto[indice]!=EMPTY_VALUE) SegnaleAcquisto=true;
       if(SegnaleAcquisto && contatore<=NumeroAvvisi)
         {
          contatore++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string testo=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          TestSerie=ArrayGetAsSeries(Chiusura);
          if(TestSerie) indice=int(NumeroBar);
          else indice=TotaleBarre-int(NumeroBar)-1;
          double Ask=Chiusura[indice];
          double Bid=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroBar);
          else indice=TotaleBarre-int(NumeroBar)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoON) Alert("segnale BUY \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",testo,"\n Symbol=",Symbol()," Period=",sPeriodo);
          if(EmailON) SendMail(NomeSegnale+": avviso segnale BUY","segnale BUY a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Symbol="+Symbol()+" Period="+sPeriodo);
          if(PushON) SendNotification(NomeSegnale+": segnale BUY a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Symbol="+Symbol()+" Period="+sPeriodo);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Funzione segnale di vendita                                              |
    //+------------------------------------------------------------------+
    void SellSignal(string NomeSegnale,      // testo del nome dell'indicatore per email e messaggi push
                    double &FrecciaVendita[],       // buffer dell'indicatore con segnali di vendita
                    const int TotaleBarre,     // numero attuale di barre
                    const int Prev_calcolato, // numero di barre al tick precedente
                    const double &Chiusura[],     // prezzo di chiusura
                    const int &Spread[])       // spread
      {
    //---
       static uint contatore=0;
       if(TotaleBarre!=Prev_calcolato) contatore=0;
    
       bool SegnaleVendita=false;
       bool TestSerie=ArrayGetAsSeries(FrecciaVendita);
       int indice;
       if(TestSerie) indice=int(NumeroBar);
       else indice=TotaleBarre-int(NumeroBar)-1;
       if(NormalizeDouble(FrecciaVendita[indice],_Digits) && FrecciaVendita[indice]!=EMPTY_VALUE) SegnaleVendita=true;
       if(SegnaleVendita && contatore<=NumeroAvvisi)
         {
          contatore++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string testo=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          TestSerie=ArrayGetAsSeries(Chiusura);
          if(TestSerie) indice=int(NumeroBar);
          else indice=TotaleBarre-int(NumeroBar)-1;
          double Ask=Chiusura[indice];
          double Bid=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroBar);
          else indice=TotaleBarre-int(NumeroBar)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoON) Alert("segnale SELL \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",testo,"\n Symbol=",Symbol()," Period=",sPeriodo);
          if(EmailON) SendMail(NomeSegnale+": avviso segnale SELL","segnale SELL a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Symbol="+Symbol()+" Period="+sPeriodo);
          if(PushON) SendNotification(NomeSegnale+": segnale SELL a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Symbol="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Ottenere il timeframe come stringa                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Aggiunti un paio di chiamate a BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate():
    //---     
       BuySignal("BykovTrendAlert",FrecciaAcquisto,rates_total,prev_calculated,close,spread);
       SellSignal("BykovTrendAlert",FrecciaVendita,rates_total,prev_calculated,close,spread);
    //--- 
    

Le variabili FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. I valori vuoti nei buffer dell'indicatore devono essere impostati su zero o su EMPTY_VALUE.

Si presume che ci sarà una sola chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.

Questo indicatore è stato implementato per la prima volta in MQL4 ed è stato pubblicato nel Code Base il 28.09.2007.

Fig1. L'indicatore BykovTrendAlert sul grafico

Fig1. L'indicatore BykovTrendAlert sul grafico


Fig.2. L'indicatore BykovTrendAlert genera avvisi.

Fig.2. L'indicatore BykovTrendAlert genera avvisi.

Post correlati

Commento (0)