Autore: dimeon
Scopriamo insieme il ColorXdinMA, un indicatore di media mobile che non solo analizza le tendenze, ma invia anche avvisi tramite email e notifiche push sui dispositivi mobili.
Di seguito, vediamo le modifiche apportate al codice dell'indicatore per implementare queste funzionalità:
- È stata dichiarata un'enumerazione per le opzioni di generazione dei segnali a livello globale, prima delle variabili di input.//+----------------------------------------------------+
//| Enumerazione per le opzioni di generazione dei segnali |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Segnali di breakout
MODE_TREND //Segnali di breakout e tendenza
}; - Abbiamo introdotto nuovi parametri di input//---- Variabili di input per gli avvisi
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Modalità di generazione dei segnali
input uint NumberofBar=1; //Numero della barra per generare un segnale
input bool SoundON=true; //Abilita gli avvisi
input uint NumberofAlerts=2; //Numero di avvisi
input bool EMailON=false; //Abilita l'invio di email per il segnale
input bool PushON=false; //Abilita l'invio di segnale ai dispositivi mobili - Sono state aggiunte tre nuove funzioni al termine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe()//+------------------------------------------------------------------+
//| Funzione di segnale di acquisto |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// testo del nome 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, // numero attuale di barre
const int Prev_calculated, // numero di barre sul 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("SEGNALAZIONE di ACQUISTO Ask=",Ask," Bid=",Bid," orario=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": SEGNALAZIONE di ACQUISTO","Segnale di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": SEGNALAZIONE di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
else
{
if(SoundON) Alert("Segnale di tendenza in aumento Ask=",Ask," Bid=",Bid," orario=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Segnale di tendenza in aumento","Segnale di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Segnale di tendenza in aumento a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Funzione di segnale di vendita |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// testo del nome 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, // numero attuale di barre
const int Prev_calculated, // numero di barre sul 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("SEGNALAZIONE di VENDITA Ask=",Ask," Bid=",Bid," orario=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": SEGNALAZIONE di VENDITA","Segnale di VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": SEGNALAZIONE di VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
}
else
{
if(SoundON) Alert("Segnale di tendenza in discesa Ask=",Ask," Bid=",Bid," orario=",text," Simbolo=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Segnale di tendenza in discesa","Segnale di VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+text+" Simbolo="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Segnale di tendenza in discesa 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));
//----
} - Infine, sono state aggiunte delle chiamate alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate() //---
BuySignal("ColorXdinMA_Alert",ColorXdinMA,1,rates_total,prev_calculated,close,spread);
SellSignal("ColorXdinMA_Alert",ColorXdinMA,2,rates_total,prev_calculated,close,spread);
//---
Dove ColorXdinMA è il nome del buffer indice colore per memorizzare i colori dell'indicatore. I valori 1 e 2 rappresentano i numeri dei colori in questo buffer, rispettivamente per una media mobile ascendente o discendente.
Si presume che venga utilizzata una sola chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.
L'indicatore utilizza le classi della libreria SmoothAlgorithms.mqh (copia questa libreria in <terminal_data_folder>\MQL5\Include). L'utilizzo di queste classi è stato descritto in dettaglio nell'articolo "Mediazione delle serie di prezzo per calcoli intermedi senza utilizzare buffer aggiuntivi".

Fig1. L'indicatore ColorXdinMA_Alert sul grafico

Fig.2. L'indicatore ColorXdinMA_Alert. Generazione di avviso per segnale di breakout

Fig.3. L'indicatore ColorXdinMA_Alert. Generazione di avviso per segnale di tendenza
Post correlati
- 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
- Utilità per le Informazioni su Barre e Tassi per MetaTrader 5