Home Indicatore tecnico Post

RJTX_Matches_Smoothed_Alert: Un Indicatore Potente per MetaTrader 5

Allegato
22712.zip (22.92 KB, Scarica 0 volte)

Autore originale:

Rafael Jimenez Tocino

Indicatore RJTX_Matches_Smoothed con avvisi, email e notifiche push per smartphone.

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

  1. Nuove variabili di input sono state aggiunte agli input dell'indicatore:
    input uint NumeroDiBarre=1;                 // Numero di barre per attivare il segnale
    input bool SuonoAttivo=true;           // Abilita gli avvisi
    input uint NumeroDiAvvisi=2;       // Numero di avvisi
    input bool EmailAttivo=false;          // Abilita l'invio di email per il segnale
    input bool PushAttivo=false;           // Abilita l'invio di segnalazioni ai dispositivi mobili
    


  2. Tre nuove funzioni sono state aggiunte alla fine dell'indicatore: BuySignal(), SellSignal(), e GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Funzione di 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 del tick precedente
                   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,indice1;
       if(TestSerie)
        {
         indice=int(NumeroDiBarre);
         indice1=indice+1;
        }
       else
         {
          indice=TotaleBarre-int(NumeroDiBarre)-1;
          indice1=indice-1;
         }
       if(!FrecciaAcquisto[indice1] && FrecciaAcquisto[indice]) 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]*_Point;
          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(EmailAttivo) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale di 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 di 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 del tick precedente
                    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,indice1;
       if(TestSerie)
        {
         indice=int(NumeroDiBarre);
         indice1=indice+1;
        }
       else
         {
          indice=TotaleBarre-int(NumeroDiBarre)-1;
          indice1=indice-1;
         }
       if(!FrecciaVendita[indice1] && FrecciaVendita[indice]) 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]*_Point;
          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(EmailAttivo) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale di 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. Due chiamate alle funzioni BuySignal() e SellSignal() sono state aggiunte dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
    //---     
       BuySignal("RJTX_Matches_Smoothed_Alert",FrecciaAcquisto,totale_barre,precedente_calcolato,chuisura,spread);
       SellSignal("RJTX_Matches_Smoothed_Alert",FrecciaVendita,totale_barre,precedente_calcolato,chuisura,spread);
    //---
    


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

Si assume che ci sia una sola chiamata a ciascuna delle funzioni BuySignal() e SellSignal() nel codice dell'indicatore nel blocco OnCalculate().

L'indicatore utilizza le classi di libreria SmoothAlgorithms.mqh (da copiare nella cartella <terminal_data_directory>\MQL5\Include). L'uso delle classi è stato descritto in dettaglio nell'articolo Mediazione delle Serie di Prezzi per Calcoli Intermedi Senza Utilizzare Buffer Aggiuntivi.

Questo indicatore è stato implementato per la prima volta in MQL4 e pubblicato nel Code Base il 23 dicembre 2015.


Fig.1. Indicatore RJTX_Matches_Smoothed_Alert sul grafico

Fig.1. Indicatore RJTX_Matches_Smoothed_Alert sul grafico


Fig. 2. Indicatore RJTX_Matches_Smoothed_Alert. Alerting

Fig. 2. Indicatore RJTX_Matches_Smoothed_Alert. Alerting

Post correlati

Commento (0)