ASCtrendAlert: L'indicatore per MetaTrader 5 con avvisi real-time

Mike 2017.01.20 01:38 13 0 0
Allegato

ASCtrend è un indicatore di segnale a semaforo che include avvisi, email e notifiche push. Scopriamo insieme le novità del codice che rendono questo strumento ancora più utile per i trader.

Di seguito, ti presento i cambiamenti apportati al codice dell'indicatore per implementare avvisi, messaggi email e notifiche push:

  1. È stata introdotta una serie di nuovi parametri di input:
    input uint NumeroDiBarre=1;// Numero di barre per il segnale
    input bool SuonoAttivo=true; // Abilita avvisi sonori
    input uint NumeroDiAvvisi=2;// Numero di avvisi
    input bool EmailAttiva=false; // Abilita invio email per il segnale
    input bool PushAttivo=false; // Abilita invio notifiche ai dispositivi mobili
    
  2. Abbiamo aggiunto 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 corrente di barre
                   const int Prev_calcolato,// numero di barre sul 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(NumeroDiBarre);
       else indice=TotaleBarre-int(NumeroDiBarre)-1;
       if(NormalizeDouble(FrecciaAcquisto[indice],_Digits) && FrecciaAcquisto[indice]!=EMPTY_VALUE) SegnaleAcquisto=true;
       if(SegnaleAcquisto && contatore<=NumeroDiAvvisi)
         {
          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(NumeroDiBarre);
          else indice=TotaleBarre-int(NumeroDiBarre)-1;
          double Ask=Chiusura[indice];
          double Bid=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroDiBarre);
          else indice=TotaleBarre-int(NumeroDiBarre)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoAttivo) Alert("Segnale di ACQUISTO 
     Ask=",Ask,"
     Bid=",Bid,"
     currtime=",testo,"
     Simbolo=",Symbol()," Period=",sPeriodo);
          if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(PushAttivo) SendNotification(NomeSegnale+": Segnale di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", 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 corrente di barre
                    const int Prev_calcolato, // numero di barre sul 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(NumeroDiBarre);
       else indice=TotaleBarre-int(NumeroDiBarre)-1;
       if(NormalizeDouble(FrecciaVendita[indice],_Digits) && FrecciaVendita[indice]!=EMPTY_VALUE) SegnaleVendita=true;
       if(SegnaleVendita && contatore<=NumeroDiAvvisi)
         {
          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(NumeroDiBarre);
          else indice=TotaleBarre-int(NumeroDiBarre)-1;
          double Ask=Chiusura[indice];
          double Bid=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroDiBarre);
          else indice=TotaleBarre-int(NumeroDiBarre)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoAttivo) Alert("Segnale di VENDITA 
     Ask=",Ask,"
     Bid=",Bid,"
     currtime=",testo,"
     Simbolo=",Symbol()," Period=",sPeriodo);
          if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(PushAttivo) SendNotification(NomeSegnale+": Segnale di VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Ottenere il timeframe come stringa                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Sono stati aggiunti un paio di chiamate alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
    //---
    BuySignal("ASCtrend",FrecciaAcquisto,totale_barre,prev_calcolato,chiusura,spread);
    SellSignal("ASCtrend",FrecciaVendita,totale_barre,prev_calcolato,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 ci sia solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.

Fig.1. Indicatore ASCtrendAlert sul grafico

Fig.1. Indicatore ASCtrendAlert sul grafico


Fig.2. Indicatore BykovTrendAlert. Generazione di avvisi

Fig.2. Indicatore BykovTrendAlert. Generazione di avvisi

Elenco
Commento 0