PPO_SignAlert: L'indicatore per MetaTrader 5 che genera avvisi

Mike 2016.09.19 21:39 31 0 0
Allegato

Se sei un trader su MetaTrader 5, sicuramente apprezzerai l'indicatore PPO_SignAlert, che ti offre segnali di trading attraverso avvisi pratici. Questo indicatore utilizza un tasso di cambiamento dei prezzi relativi smussato e include notifiche via email e notifiche push sul tuo dispositivo mobile.

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

  1. Introduzione di 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 EmailAttivo=false; //Abilita l'invio dell'email per il segnale
    input bool PushAttivo=false; //Abilita l'invio del segnale ai dispositivi mobili
  2. Aggiunta di tre nuove funzioni: 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 PrecedenteCalcolato,// numero di barre nell'ultimo tick
        const double &Chiusura[],// prezzo di chiusura
        const int &Spread[])      // spread
      {
        //---
        static uint contatore=0;
        if(TotaleBarre!=PrecedenteCalcolato) 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(SuonoAttivo) Alert("SEGNALAZIONE ACQUISTO Ask=",Ask," Bid=",Bid," orario corrente=",testo," Simbolo=",Symbol()," Period=",sPeriodo);
            if(EmailAttivo) SendMail(NomeSegnale+": AVVISO ACQUISTO","SEGNALAZIONE ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
            if(PushAttivo) SendNotification(NomeSegnale+": AVVISO 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 attuale di barre
        const int PrecedenteCalcolato,// numero di barre nell'ultimo tick
        const double &Chiusura[],// prezzo di chiusura
        const int &Spread[])      // spread
      {
        //---
        static uint contatore=0;
        if(TotaleBarre!=PrecedenteCalcolato) 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(SuonoAttivo) Alert("SEGNALAZIONE VENDITA Ask=",Ask," Bid=",Bid," orario corrente=",testo," Simbolo=",Symbol()," Period=",sPeriodo);
            if(EmailAttivo) SendMail(NomeSegnale+": AVVISO VENDITA","SEGNALAZIONE VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
            if(PushAttivo) SendNotification(NomeSegnale+": AVVISO 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. Aggiunta di chiamate alle funzioni: BuySignal() e SellSignal() nel blocco OnCalculate()
    //---     
       BuySignal("PPO_Sign",FrecciaAcquisto,totale_barre,precedente_calcolato,chiusura,spread);
       SellSignal("PPO_Sign",FrecciaVendita,totale_barre,precedente_calcolato,chiusura,spread);
    //---  

Qui, FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Valori vuoti nei buffer dell'indicatore devono essere impostati a zero o EMPTY_VALUE.

Si presuppone che ci sia solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.

L'indicatore fa uso delle classi della libreria SmoothAlgorithms.mqh (devi copiarla nella cartella <terminal_data_folder>\MQL5\Include). L'uso delle classi è stato descritto in dettaglio nell'articolo "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".

Originariamente, questo indicatore è stato scritto in MQL4 e pubblicato per la prima volta nella Code Base il 08.03.2008.

Fig.1. L'indicatore PPO_SignAlert sul grafico

Fig.1. L'indicatore PPO_SignAlert sul grafico

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

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

Elenco
Commento 0