Se sei un trader alla ricerca di strumenti per migliorare le tue operazioni, il WeightOscillator potrebbe diventare il tuo alleato ideale. Questo indicatore di tendenza non solo analizza il mercato, ma offre anche la possibilità di ricevere avvisi tramite email e notifiche push sui dispositivi mobili.
Vediamo insieme quali sono le novità introdotte nel codice dell'indicatore per implementare queste funzionalità:
- È stata dichiarata un'enumerazione per le opzioni di generazione dei segnali a livello globale, prima della dichiarazione delle variabili di input.//+----------------------------------------------------+
//| Enumerazione per le opzioni di generazione segnali |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Segnali di rottura
MODE_TREND //Segnali di rottura e di tendenza
}; - Sono stati introdotti nuovi parametri di input//---- Variabili di input per gli avvisi
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Modalità di generazione del segnale
input uint NumberofBar=1; //Numero della barra per generare un segnale
input bool SoundON=true; //Attiva gli avvisi
input uint NumberofAlerts=2; //Numero di avvisi
input bool EMailON=false; //Attiva l'invio del segnale via email
input bool PushON=false; //Attiva l'invio del segnale ai dispositivi mobili - Abbiamo aggiunto tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe()//+------------------------------------------------------------------+
//| Funzione per il segnale di acquisto |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// testo del nome dell'indicatore per email e messaggi push
double &ColorArray[],// buffer degli indici di colore
int ColorIndex,// indice di colore nel buffer per generare un segnale
const int Rates_total, // numero corrente di barre
const int Prev_calculated, // numero di barre al tick precedente
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(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
}
else
{
if(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+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("Segnale di ACQUISTO Ask=",Ask," Bid=",Bid," ora=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": avviso segnale ACQUISTO","Segnale di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": avviso ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
else
{
if(SoundON) Alert("Segnale di Tendenza in CORSO Ask=",Ask," Bid=",Bid," ora=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": avviso Tendenza in CORSO","Segnale di Tendenza in CORSO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": avviso Tendenza in CORSO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Funzione per il segnale di vendita |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// testo del nome dell'indicatore per email e messaggi push
double &ColorArray[], // buffer degli indici di colore
int ColorIndex, // indice di colore nel buffer per generare un segnale
const int Rates_total, // numero corrente di barre
const int Prev_calculated, // numero di barre al tick precedente
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(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
}
else
{
if(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+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("Segnale di VENDITA Ask=",Ask," Bid=",Bid," ora=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": avviso segnale VENDITA","Segnale di VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": avviso VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
else
{
if(SoundON) Alert("Segnale di discesa in CORSO Ask=",Ask," Bid=",Bid," ora=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": avviso discesa in CORSO","Segnale di discesa a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": avviso discesa in CORSO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Ottenere il timeframe come stringa |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Sono state aggiunte alcune chiamate alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate() //---
BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
//---In questo caso, ColorBuffer è il nome del buffer degli indici di colore per memorizzare i colori dell'indicatore. I valori 0 e 4 rappresentano i numeri dei colori in questo buffer, che indicano quando l'oscillatore si trova nelle aree di ipercomprato e ipervenduto.
Si presume che verrà utilizzata solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.
Ricorda che l'indicatore utilizza le classi della libreria SmoothAlgorithms.mqh (copia la libreria nella cartella <terminal_data_folder>\MQL5\Include). L'uso delle classi è stato descritto dettagliatamente nell'articolo "Mediare le serie di prezzi per calcoli intermedi senza utilizzare buffer aggiuntivi".

Fig1. L'indicatore WeightOscillator_Alert sul grafico

Fig.2. L'indicatore WeightOscillator_Alert. Generazione avviso per segnale di rottura

Fig.3. L'indicatore WeightOscillator_Alert. Generazione avviso per segnale di tendenza
Post correlati
- Indice di Volatilità Chaikin: Scegli il Giusto Algoritmo di Smussamento per MetaTrader 5
- Volatilità Stocastica: Indicatore per MetaTrader 5 da Utilizzare sul Grafico
- Notis: L'Indicatore per Misurare la Volatilità su MetaTrader 5
- Indicatore di Equità e Bilancio per MetaTrader 5: Monitoraggio della Tua Performance di Trading
- Utilità per Serie e Informazioni sulle Rate in MetaTrader 5