Home Indicatore tecnico Post

Harami Alert: L'indicatore per MetaTrader 5 che non puoi perdere

Allegato
22403.zip (3.69 KB, Scarica 0 volte)

Autore: Paul Stringer

L'indicatore Harami Alert ti permette di identificare i pattern Harami e offre funzionalità di avvisi, email e notifiche push.

Sono state apportate diverse modifiche al codice dell'indicatore per implementare gli avvisi, i messaggi email e le 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 EmailAttiva=false; //Abilita l'invio di email per il segnale
    input bool PushAttivo=false; //Abilita l'invio di segnale ai dispositivi mobili
    
  2. Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe().
    //+------------------------------------------------------------------+
    //| Funzione di segnale di acquisto                                               |
    //+------------------------------------------------------------------+
    void BuySignal(string NomeSegnale,      // nome dell'indicatore per email e messaggi push
                   double &FrecciaAcquisto[],        // buffer indicatore con segnali di acquisto
                   const int BarreTotali,     // numero attuale di barre
                   const int PrecedenteCalcolato, // numero di barre al tick precedente
                   const double &Chiusura[],     // prezzo di chiusura
                   const int &Spread[])       // spread
      {
    //---
       static uint contatore=0;
       if(BarreTotali!=PrecedenteCalcolato) contatore=0;
    
       bool SegnaleAcquisto=false;
       bool TestSerie=ArrayGetAsSeries(FrecciaAcquisto);
       int indice;
       if(TestSerie) indice=int(NumeroBar);
       else indice=BarreTotali-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=BarreTotali-int(NumeroBar)-1;
          double Chiedi=Chiusura[indice];
          double Offerta=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroBar);
          else indice=BarreTotali-int(NumeroBar)-1;
          Offerta+=Spread[indice]*_Point;
          string sChiedi=DoubleToString(Chiedi,_Digits);
          string sOfferta=DoubleToString(Offerta,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoAttivo) Alert("Segnale di ACQUISTO \n Chiedi=",Chiedi,"\n Offerta=",Offerta,"\n ora=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo);
          if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale di ACQUISTO a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(PushAttivo) SendNotification(NomeSegnale+": avviso segnale di ACQUISTO a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Funzione di segnale di vendita                                              |
    //+------------------------------------------------------------------+
    void SellSignal(string NomeSegnale,      // nome dell'indicatore per email e messaggi push
                    double &FrecciaVendita[],       // buffer indicatore con segnali di vendita
                    const int BarreTotali,     // numero attuale di barre
                    const int PrecedenteCalcolato, // numero di barre al tick precedente
                    const double &Chiusura[],     // prezzo di chiusura
                    const int &Spread[])       // spread
      {
    //---
       static uint contatore=0;
       if(BarreTotali!=PrecedenteCalcolato) contatore=0;
    
       bool SegnaleVendita=false;
       bool TestSerie=ArrayGetAsSeries(FrecciaVendita);
       int indice;
       if(TestSerie) indice=int(NumeroBar);
       else indice=BarreTotali-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=BarreTotali-int(NumeroBar)-1;
          double Chiedi=Chiusura[indice];
          double Offerta=Chiusura[indice];
          TestSerie=ArrayGetAsSeries(Spread);
          if(TestSerie) indice=int(NumeroBar);
          else indice=BarreTotali-int(NumeroBar)-1;
          Offerta+=Spread[indice]*_Point;
          string sChiedi=DoubleToString(Chiedi,_Digits);
          string sOfferta=DoubleToString(Offerta,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SuonoAttivo) Alert("Segnale di VENDITA \n Chiedi=",Chiedi,"\n Offerta=",Offerta,"\n ora=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo);
          if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale di VENDITA a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(PushAttivo) SendNotification(NomeSegnale+": avviso segnale di VENDITA a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Ottenere il timeframe come stringa                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }


  3. Aggiunti alcuni richiami alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
    //---     
       BuySignal("Harami_Alert",FrecciaAcquisto,barre_totali,precedente_calcolato,chiusura,spread);
       SellSignal("Harami_Alert",FrecciaVendita,barre_totali,precedente_calcolato,chiusura,spread);
    //---   
    

Dove FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Le eventuali posizioni vuote nei buffer dell'indicatore devono essere impostate su zero o su EMPTY_VALUE.

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

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

Fig. 1. Indicatore Harami_Alert sul grafico

Fig. 1. Indicatore Harami_Alert sul grafico


Fig. 2. Harami_Alert. Generazione avvisi

Fig. 2. Harami_Alert. Generazione avvisi

Post correlati

Commento (0)