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:
- 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
- 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));
//----
} - 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.2. Indicatore Waddah_Attar_Trend_Alert. Generazione di avvisi
Post correlati
- Indice di Volatilità Chaikin: Scegli il Giusto Algoritmo di Smussamento per MetaTrader 5
- WeightOscillator_Alert: Il Nuovo Indicatore per MetaTrader 5 con Notifiche
- Volatilità Stocastica: Indicatore per MetaTrader 5 da Utilizzare sul Grafico
- Indicatori di Open Range Breakout per MetaTrader 5: Scopri Come Sfruttare le Uscite di Prezzo
- Utilità per le Informazioni su Barre e Tassi per MetaTrader 5
