Home Indicatore tecnico Post

ColorParabolic_Alert: L'indicatore per MetaTrader 5 che genera avvisi

Allegato
17846.zip (3.9 KB, Scarica 0 volte)

Se sei un trader che utilizza ColorParabolic, saprai che è un indicatore semaforico che ti invia avvisi tramite email e notifiche push. Ma ora, vediamo insieme alcune novità che rendono questo strumento ancora più potente!

Recentemente, sono state apportate delle modifiche al codice dell'indicatore per implementare avvisi, messaggi email e notifiche push. Ecco i dettagli:

  1. Introdotti nuovi parametri di input:

    input uint NumeroDiBarre=1;//Numero di barre per il segnale
    input bool SuonoAttivo=true; //Abilita avvisi
    input uint NumeroDiAvvisi=2;//Numero di avvisi
    input bool EmailAttiva=false; //Abilita invio email del segnale
    input bool PushAttiva=false; //Abilita invio segnale a dispositivi mobili
    
  2. Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: FunzioneAcquisto(), FunzioneVendita() e OttieniStringaTimeframe()

    //+------------------------------------------------------------------+
    //| Funzione segnale di acquisto         |
    //+------------------------------------------------------------------+
    void FunzioneAcquisto(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 prev_calcolato, // numero di barre al 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 Offerta=Chiusura[indice];
          double Domanda=Chiusura[indice];
          testSerie=ArrayGetAsSeries(Spread);
          if(testSerie) indice=int(NumeroDiBarre);
          else indice=totaleBarre-int(NumeroDiBarre)-1;
          Domanda+=Spread[indice]*_Point;
          string sDomanda=DoubleToString(Offerta,_Digits);
          string sBid=DoubleToString(Domanda,_Digits);
          string sPeriodo=OttieniStringaTimeframe(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="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(PushAttiva) SendNotification(nomeSegnale+": segnale di ACQUISTO a Offerta="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Funzione segnale di vendita         |
    //+------------------------------------------------------------------+
    void FunzioneVendita(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 prev_calcolato, // numero di barre al 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 Offerta=Chiusura[indice];
          double Domanda=Chiusura[indice];
          testSerie=ArrayGetAsSeries(Spread);
          if(testSerie) indice=int(NumeroDiBarre);
          else indice=totaleBarre-int(NumeroDiBarre)-1;
          Domanda+=Spread[indice]*_Point;
          string sDomanda=DoubleToString(Offerta,_Digits);
          string sBid=DoubleToString(Domanda,_Digits);
          string sPeriodo=OttieniStringaTimeframe(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="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
          if(PushAttiva) SendNotification(nomeSegnale+": segnale di VENDITA a Offerta="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Ottenere il timeframe come stringa                               |
    //+------------------------------------------------------------------+
    string OttieniStringaTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  3. Aggiunti alcuni richiami alle funzioni FunzioneAcquisto() e FunzioneVendita() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()

    //---     
       FunzioneAcquisto("ColorParabolic_Alert",frecciaAcquisto,totaleBarre,prev_calcolato,Chiusura,Spread);
       FunzioneVendita("ColorParabolic_Alert",frecciaVendita,totaleBarre,prev_calcolato,Chiusura,Spread);
    //---     
    

In questo caso, frecciaAcquisto e frecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. È importante impostare i valori vuoti nei buffer dell'indicatore a zero o a EMPTY_VALUE.

Si presume che ci sarà solo un richiamo alle funzioni FunzioneAcquisto() e FunzioneVendita() nel blocco OnCalculate() del codice dell'indicatore.

Fig1. ColorParabolic_Alert su un grafico

Fig1. ColorParabolic_Alert su un grafico

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

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

Post correlati

Commento (0)