Home Indicatore tecnico Post

BrainTrend2SigAlert: L'indicatore con avvisi per MetaTrader 5

Allegato
16695.zip (4.09 KB, Scarica 0 volte)

Se sei un trader che utilizza BrainTrend2Sig, allora sei nel posto giusto! Questo indicatore semaforo non solo offre segnali, ma ora è dotato anche di avvisi, email e notifiche push per tenerti sempre aggiornato.

Di seguito, ti mostro le modifiche apportate al codice dell'indicatore per implementare avvisi e notifiche:

  1. Introdotti nuovi parametri di input:
    input uint NumeroBar=1;//Numero di barre per il segnale
    input bool SuonoAttivo=true; //Abilita gli avvisi
    input uint NumeroAvvisi=2;//Numero di avvisi
    input bool EmailAttiva=false; //Abilita l'invio di email per il segnale
    input bool NotificaAttiva=false; //Abilita l'invio di notifiche sui 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 CalcolatoPrecedentemente, // numero di barre nell'ultimo tick
                   const double &Chiusura[],     // prezzo di chiusura
                   const int &Spread[])       // spread
      {
    //---
       static uint contatore=0;
       if(TotaleBarre!=CalcolatoPrecedentemente) 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 Offerta=Chiusura[indice];
          double Domanda=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroBar);
          else indice=TotaleBarre-int(NumeroBar)-1;
          Domanda+=Spread[indice];
          string sOfferta=DoubleToString(Offerta,_Digits);
          string sDomanda=DoubleToString(Domanda,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoAttivo) Alert("Segnale di ACQUISTO \n Offerta=",Offerta,"\n Domanda=",Domanda,"\n ora corrente=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo);
          if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale di ACQUISTO a Offerta="+sOfferta+", Domanda="+sDomanda+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(NotificaAttiva) SendNotification(NomeSegnale+": avviso segnale di ACQUISTO a Offerta="+sOfferta+", Domanda="+sDomanda+", Data="+testo+" Simbolo="+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 CalcolatoPrecedentemente, // numero di barre nell'ultimo tick
                    const double &Chiusura[],     // prezzo di chiusura
                    const int &Spread[])       // spread
      {
    //---
       static uint contatore=0;
       if(TotaleBarre!=CalcolatoPrecedentemente) 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 Offerta=Chiusura[indice];
          double Domanda=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroBar);
          else indice=TotaleBarre-int(NumeroBar)-1;
          Domanda+=Spread[indice];
          string sOfferta=DoubleToString(Offerta,_Digits);
          string sDomanda=DoubleToString(Domanda,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoAttivo) Alert("Segnale di VENDITA \n Offerta=",Offerta,"\n Domanda=",Domanda,"\n ora corrente=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo);
          if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale di VENDITA a Offerta="+sOfferta+", Domanda="+sDomanda+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(NotificaAttiva) SendNotification(NomeSegnale+": avviso segnale di VENDITA a Offerta="+sOfferta+", Domanda="+sDomanda+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Ottenere il timeframe come stringa                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Aggiunte delle chiamate alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
    //---
    BuySignal("BrainTrend2SigAlert",FrecciaAcquisto,totale_barre,calcolato_precedentemente,chiusura,spread);
    SellSignal("BrainTrend2SigAlert",FrecciaVendita,totale_barre,calcolato_precedentemente,chiusura,spread);
    //---

Dove FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Nei buffer dell'indicatore devono essere impostati zeri o EMPTY_VALUE come valori vuoti.

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

Fig.1. Indicatore BrainTrend2SigAlert sul grafico

Fig.1. Indicatore BrainTrend2SigAlert sul grafico

Fig.2. Indicatore BrainTrend2SigAlert. Generazione di avvisi

Fig.2. Indicatore BrainTrend2SigAlert. Generazione di avvisi

Post correlati

Commento (0)