Se sei un trader su MetaTrader 5, sicuramente apprezzerai l'indicatore PPO_SignAlert, che ti offre segnali di trading attraverso avvisi pratici. Questo indicatore utilizza un tasso di cambiamento dei prezzi relativi smussato e include notifiche via email e notifiche push sul tuo dispositivo mobile.
Di seguito, ti mostro le modifiche apportate al codice dell'indicatore per integrare avvisi, email e notifiche push:
- 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 EmailAttivo=false; //Abilita l'invio dell'email per il segnale
input bool PushAttivo=false; //Abilita l'invio del segnale ai dispositivi mobili - Aggiunta di tre nuove funzioni: BuySignal(), SellSignal() e GetStringTimeframe()
//+------------------------------------------------------------------+
//| Funzione segnale di acquisto |
//+------------------------------------------------------------------+
void BuySignal(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 PrecedenteCalcolato,// numero di barre nell'ultimo tick
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(FrecciaAcquisto);
int indice;
if(TestSerie) indice=int(NumeroBar);
else indice=TotaleBarre-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=TotaleBarre-int(NumeroBar)-1;
double Ask=Chiusura[indice];
double Bid=Chiusura[indice];
TestSerie=ArrayGetAsSeries(Spread);
if(TestSerie) indice=int(NumeroBar);
else indice=TotaleBarre-int(NumeroBar)-1;
Bid+=Spread[indice];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriodo=GetStringTimeframe(ChartPeriod());
if(SuonoAttivo) Alert("SEGNALAZIONE ACQUISTO Ask=",Ask," Bid=",Bid," orario corrente=",testo," Simbolo=",Symbol()," Period=",sPeriodo);
if(EmailAttivo) SendMail(NomeSegnale+": AVVISO ACQUISTO","SEGNALAZIONE ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
if(PushAttivo) SendNotification(NomeSegnale+": AVVISO 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 email e messaggi push
double &FrecciaVendita[],// buffer dell'indicatore con segnali di vendita
const int TotaleBarre, // numero attuale di barre
const int PrecedenteCalcolato,// numero di barre nell'ultimo tick
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(FrecciaVendita);
int indice;
if(TestSerie) indice=int(NumeroBar);
else indice=TotaleBarre-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=TotaleBarre-int(NumeroBar)-1;
double Ask=Chiusura[indice];
double Bid=Chiusura[indice];
TestSerie=ArrayGetAsSeries(Spread);
if(TestSerie) indice=int(NumeroBar);
else indice=TotaleBarre-int(NumeroBar)-1;
Bid+=Spread[indice];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriodo=GetStringTimeframe(ChartPeriod());
if(SuonoAttivo) Alert("SEGNALAZIONE VENDITA Ask=",Ask," Bid=",Bid," orario corrente=",testo," Simbolo=",Symbol()," Period=",sPeriodo);
if(EmailAttivo) SendMail(NomeSegnale+": AVVISO VENDITA","SEGNALAZIONE VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
if(PushAttivo) SendNotification(NomeSegnale+": AVVISO VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo);
}
//---
}
//+------------------------------------------------------------------+
//| Ottenere il timeframe come stringa |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Aggiunta di chiamate alle funzioni: BuySignal() e SellSignal() nel blocco OnCalculate()
//---
BuySignal("PPO_Sign",FrecciaAcquisto,totale_barre,precedente_calcolato,chiusura,spread);
SellSignal("PPO_Sign",FrecciaVendita,totale_barre,precedente_calcolato,chiusura,spread);
//---
Qui, FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Valori vuoti nei buffer dell'indicatore devono essere impostati a zero o EMPTY_VALUE.
Si presuppone che ci sia solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.
L'indicatore fa uso delle classi della libreria SmoothAlgorithms.mqh (devi copiarla nella cartella <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".
Originariamente, questo indicatore è stato scritto in MQL4 e pubblicato per la prima volta nella Code Base il 08.03.2008.

Fig.1. L'indicatore PPO_SignAlert sul grafico
Fig.2. L'indicatore PPO_SignAlert. Generazione di avvisi.

Commento 0