Home Indicatore tecnico Post

Waddah_Attar_Trend_Alert: L'indicatore per MetaTrader 5 che ti avvisa!

Allegato
16832.zip (22.5 KB, Scarica 0 volte)

Autore originale: Eng. Waddah Attar

L'indicatore Waddah_Attar_Trend offre avvisi, email e notifiche push per migliorare la tua esperienza di trading.

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

  1. Introdotti nuovi parametri di input:
    //---- Input per avvisi 
    input uint NumeroBarre=1;                    //Numero di barre per il segnale
    input bool SuonoAttivo=true;                     //Abilita avvisi
    input uint NumeroAvvisi=2;                 //Numero di avvisi
    input bool EmailAttiva=false;                    //Abilita invio email del segnale
    input bool PushAttiva=false;                     //Abilita invio segnale ai dispositivi mobili
    
  2. Aggiunte 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 messaggi email e push
    double &ColorArray[],// buffer dell'indice di colore
    int IndiceColore,// indice di colore nel buffer per generare un segnale
    const int TotaleBarre, // numero attuale di barre
    const int PrecedenteCalcolato, // numero di barre sul 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(ColorArray);
    int indice,indice1;
    if(TestSerie)
    {
    indice=int(NumeroBarre);
    indice1=indice+1;
    }
    else
    {
    indice=TotaleBarre-int(NumeroBarre)-1;
    indice1=indice-1;
    }
    if(ColorArray[indice1]!=IndiceColore && ColorArray[indice]==IndiceColore) 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(NumeroBarre);
    else indice=TotaleBarre-int(NumeroBarre)-1;
    double Ask=Chiusura[indice];
    double Bid=Chiusura[indice];
    TestSerie=ArrayGetAsSeries(Spread);
    if(TestSerie) indice=int(NumeroBarre);
    else indice=TotaleBarre-int(NumeroBarre)-1;
    Bid+=_Point*Spread[indice];
    string sAsk=DoubleToString(Ask,_Digits);
    string sBid=DoubleToString(Bid,_Digits);
    string sPeriodo=GetStringTimeframe(ChartPeriod());
    if(SuonoAttivo) Alert("Segnale ACQUISTO Ask=",Ask," Bid=",Bid," currtime=",testo," Simbolo=",Symbol()," Period=",sPeriodo);
    if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale ACQUISTO","Segnale ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
    if(PushAttiva) SendNotification(NomeSegnale+": Segnale 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 messaggi email e push
    double &ColorArray[], // buffer dell'indice di colore
    int IndiceColore, // indice di colore nel buffer per generare un segnale
    const int TotaleBarre, // numero attuale di barre
    const int PrecedenteCalcolato, // numero di barre sul 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(ColorArray);
    int indice,indice1;
    if(TestSerie)
    {
    indice=int(NumeroBarre);
    indice1=indice+1;
    }
    else
    {
    indice=TotaleBarre-int(NumeroBarre)-1;
    indice1=indice-1;
    }
    if(ColorArray[indice1]!=IndiceColore && ColorArray[indice]==IndiceColore) 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(NumeroBarre);
    else indice=TotaleBarre-int(NumeroBarre)-1;
    double Ask=Chiusura[indice];
    double Bid=Chiusura[indice];
    TestSerie=ArrayGetAsSeries(Spread);
    if(TestSerie) indice=int(NumeroBarre);
    else indice=TotaleBarre-int(NumeroBarre)-1;
    Bid+=_Point*Spread[indice];
    string sAsk=DoubleToString(Ask,_Digits);
    string sBid=DoubleToString(Bid,_Digits);
    string sPeriodo=GetStringTimeframe(ChartPeriod());
    if(SuonoAttivo) Alert("Segnale VENDITA Ask=",Ask," Bid=",Bid," currtime=",testo," Simbolo=",Symbol()," Period=",sPeriodo);
    if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale VENDITA","Segnale VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
    if(PushAttiva) SendNotification(NomeSegnale+": Segnale VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| Ottenere un timeframe come stringa                                  |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
    {
    //----
    return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
    }
  3. Aggiunte alcune chiamate a BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
    //---
    BuySignal("Waddah_Attar_Trend_Alert",ColorIndBuffer,0,totale_barre,precedente_calcolato,chiusura,spread);
    SellSignal("Waddah_Attar_Trend_Alert",ColorIndBuffer,1,totale_barre,precedente_calcolato,chiusura,spread);
    //---

dove ColorIndBuffer è il nome di un buffer di indice colore per memorizzare un colore di linea come indice, mentre 0 e 1 sono i numeri dei colori nel buffer di indice colore.

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

L'indicatore utilizza le classi della libreria SmoothAlgorithms.mqh (copiare nella cartella <terminal_data_folder>\MQL5\Include). L'uso delle classi è stato descritto dettagliatamente nell'articolo "Media delle serie di prezzi per calcoli intermedi senza utilizzare buffer aggiuntivi".

Fig.1. Indicatore Waddah_Attar_Trend_Alert sul grafico

Fig.1. Indicatore Waddah_Attar_Trend_Alert sul grafico

Fig.2. Indicatore Waddah_Attar_Trend_Alert. Generazione di avvisi

Fig.2. Indicatore Waddah_Attar_Trend_Alert. Generazione di avvisi

Post correlati

Commento (0)