Home Indicatore tecnico Post

BalanceOfPower_Histogram_Alert: Un Indicatore Essenziale per MetaTrader 5

Allegato
16403.zip (22.71 KB, Scarica 0 volte)

Autore originale:

RoboFx

Il Balance of Power (BOP) è un indicatore che si presenta come un istogramma colorato, capace di mostrare la forza e la direzione del trend attuale. Questo strumento include avvisi, invio di email e notifiche push sui dispositivi mobili. I colori dell'istogramma sono determinati dai parametri di input riguardanti i livelli di ipercomprato e ipervenduto, nonché dalla direzione del movimento dell'istogramma.

Per implementare gli avvisi, i messaggi email e le notifiche push, sono state effettuate le seguenti modifiche al codice dell'indicatore:

  1. Introdotti nuovi parametri di input:
    //---- Variabili di input per avvisi
    input uint NumberofBar=1;                    //Numero di barra per il segnale
    input bool SoundON=true;                     //Abilita avvisi
    input uint NumberofAlerts=2;                 //Numero di avvisi
    input bool EMailON=false;                    //Abilita l'invio di segnale via email
    input bool PushON=false;                     //Abilita l'invio di segnale a dispositivi mobili
    
  2. Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Funzione segnale d'acquisto                                            |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// testo del nome dell'indicatore per email e messaggi push
                   double &ColorArray[],// buffer indice colore
                   int ColorIndex,// indice colore nel buffer per generare un segnale
                   const int Rates_total,     // il numero attuale di barre
                   const int Prev_calculated, // il numero di barre sull'ultimo tick
                   const double &Close[],     // prezzo di chiusura
                   const int &Spread[])       // spread
      {
    //---    static uint counter=0;    if(Rates_total!=Prev_calculated) counter=0;    bool BuySignal=false;    bool SeriesTest=ArrayGetAsSeries(ColorArray);    int index,index1;    if(SeriesTest)      {       index=int(NumberofBar);       index1=index+1;      }    else      {       index=Rates_total-int(NumberofBar)-1;       index1=index-1;      }    if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;    if(BuySignal && counter<=NumberofAlerts)      {       counter++;       MqlDateTime tm;       TimeToStruct(TimeCurrent(),tm);       string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);       SeriesTest=ArrayGetAsSeries(Close);       if(SeriesTest) index=int(NumberofBar);       else index=Rates_total-int(NumberofBar)-1;       double Ask=Close[index];       double Bid=Close[index];       SeriesTest=ArrayGetAsSeries(Spread);       if(SeriesTest) index=int(NumberofBar);       else index=Rates_total-int(NumberofBar)-1;       Bid+=Spread[index];       string sAsk=DoubleToString(Ask,_Digits);       string sBid=DoubleToString(Bid,_Digits);       string sPeriod=GetStringTimeframe(ChartPeriod());       if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);       if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);       if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);      } //---   }
    //+------------------------------------------------------------------+ //| Funzione segnale di vendita                                             | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname,      // testo del nome dell'indicatore per email e messaggi push                 double &ColorArray[],       // buffer indice colore                 int ColorIndex,             // indice colore nel buffer per generare un segnale                 const int Rates_total,     // il numero attuale di barre                const int Prev_calculated, // il numero di barre sull'ultimo tick                const double &Close[],     // prezzo di chiusura                const int &Spread[])       // spread   {
    //---    static uint counter=0;    if(Rates_total!=Prev_calculated) counter=0;    bool SellSignal=false;    bool SeriesTest=ArrayGetAsSeries(ColorArray);    int index,index1;    if(SeriesTest)      {       index=int(NumberofBar);       index1=index+1;      }    else      {       index=Rates_total-int(NumberofBar)-1;       index1=index-1;      }    if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;    if(SellSignal && counter<=NumberofAlerts)      {       counter++;       MqlDateTime tm;       TimeToStruct(TimeCurrent(),tm);       string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);       SeriesTest=ArrayGetAsSeries(Close);       if(SeriesTest) index=int(NumberofBar);       else index=Rates_total-int(NumberofBar)-1;       double Ask=Close[index];       double Bid=Close[index];       SeriesTest=ArrayGetAsSeries(Spread);       if(SeriesTest) index=int(NumberofBar);       else index=Rates_total-int(NumberofBar)-1;       Bid+=Spread[index];       string sAsk=DoubleToString(Ask,_Digits);       string sBid=DoubleToString(Bid,_Digits);       string sPeriod=GetStringTimeframe(ChartPeriod());       if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);       if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);       if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);      } //---   }
    //+------------------------------------------------------------------+ //| Ottenere il timeframe come stringa | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)   { //----    return(StringSubstr(EnumToString(timeframe),7,-1)); //----   }
  3. Aggiunti un paio di chiamate a BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
    //---     
       BuySignal("BalanceOfPower_Histogram_Alert",ColorIndBuffer,0,rates_total,prev_calculated,close,spread);
       SellSignal("BalanceOfPower_Histogram_Alert",ColorIndBuffer,7,rates_total,prev_calculated,close,spread);
    //---
    

Qui, ColorIndBuffer è il nome del buffer dell'indice colore utilizzato per memorizzare il colore delle candele in forma di indice.

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

L'indicatore utilizza le classi della libreria SmoothAlgorithms.mqh (da copiare in <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".

Inizialmente, questo indicatore è stato scritto in MQL5 e pubblicato per la prima volta nella Code Base il 07.02.2013.

Fig1. L'indicatore BalanceOfPower_Histogram_Alert sul grafico

Fig1. L'indicatore BalanceOfPower_Histogram_Alert sul grafico

Fig.2. L'indicatore BalanceOfPower_Histogram_Alert Genera avvisi.

Fig.2. L'indicatore BalanceOfPower_Histogram_Alert Genera avvisi.

Post correlati

Commento (0)