Hai mai sentito parlare dell'indicatore ColorX2MA? Questo strumento è davvero utile per i trader, poiché include allerta, invio di email e notifiche push direttamente sui dispositivi mobili.
Recentemente, sono stati apportati alcuni aggiornamenti al codice dell'indicatore per migliorare le sue funzionalità di allerta, email e notifiche push:
- Introdotti nuovi parametri di input:
//---- Variabili di input per le allerta inputuint NumeroBarre=1; //Numero di barre per il segnaleinputbool SuonoON=true; //Abilita le allertainputuint NumeroAllerta=2; //Numero di allertainputbool EmailON=false; //Abilita l'invio di email per il segnaleinputbool PushON=false; //Abilita l'invio del segnale ai dispositivi mobili
- Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe()
//+------------------------------------------------------------------+//| Funzione Buy signal |//+------------------------------------------------------------------+void BuySignal(string NomeSegnale,// testo del nome dell'indicatore per email e messaggi push double &ColorArray[],// buffer dell'indice colore int IndiceColore,// indice colore nel buffer per generare un segnale constint TotaleBarre, // numero attuale di barre constint PrecedenteCalcolato, // numero di barre sul tick precedente constdouble &Close[], // prezzo di chiusura constint &Spread[]) // spread { //--- staticuint counter=0; if(TotaleBarre!=PrecedenteCalcolato) counter=0; bool BuySignal=false; bool SerieTest=ArrayGetAsSeries(ColorArray); int index,index1; if(SerieTest) { index=int(NumeroBarre); index1=index+1; } else { index=TotaleBarre-int(NumeroBarre)-1; index1=index-1; } if(ColorArray[index1]!=IndiceColore && ColorArray[index]==IndiceColore) BuySignal=true; if(BuySignal && counter<=NumeroAllerta) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SerieTest=ArrayGetAsSeries(Close); if(SerieTest) index=int(NumeroBarre); else index=TotaleBarre-int(NumeroBarre)-1; doubleAsk=Close[index]; doubleBid=Close[index]; SerieTest=ArrayGetAsSeries(Spread); if(SerieTest) index=int(NumeroBarre); else index=TotaleBarre-int(NumeroBarre)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SuonoON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EmailON) SendMail(NomeSegnale+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(NomeSegnale+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } //--- } //+------------------------------------------------------------------+//| Funzione Sell signal |//+------------------------------------------------------------------+void SellSignal(string NomeSegnale, // testo del nome dell'indicatore per email e messaggi push double &ColorArray[], // buffer dell'indice colore int IndiceColore, // indice colore nel buffer per generare un segnale constint TotaleBarre, // numero attuale di barre constint PrecedenteCalcolato, // numero di barre sul tick precedente constdouble &Close[], // prezzo di chiusura constint &Spread[]) // spread { //--- staticuint counter=0; if(TotaleBarre!=PrecedenteCalcolato) counter=0; bool SellSignal=false; bool SerieTest=ArrayGetAsSeries(ColorArray); int index,index1; if(SerieTest) { index=int(NumeroBarre); index1=index+1; } else { index=TotaleBarre-int(NumeroBarre)-1; index1=index-1; } if(ColorArray[index1]!=IndiceColore && ColorArray[index]==IndiceColore) SellSignal=true; if(SellSignal && counter<=NumeroAllerta) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); SerieTest=ArrayGetAsSeries(Close); if(SerieTest) index=int(NumeroBarre); else index=TotaleBarre-int(NumeroBarre)-1; doubleAsk=Close[index]; doubleBid=Close[index]; SerieTest=ArrayGetAsSeries(Spread); if(SerieTest) index=int(NumeroBarre); else index=TotaleBarre-int(NumeroBarre)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SuonoON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EmailON) SendMail(NomeSegnale+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(NomeSegnale+": 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)); //---- }
- Aggiunti alcuni richiami alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
//--- BuySignal("X2MA_Alert",ColorX2MA,1,totale_barre,precedente_calcolato,close,spread); SellSignal("X2MA_Alert",ColorX2MA,2,totale_barre,precedente_calcolato,close,spread); //---
In questo contesto, ColorX2MA rappresenta il nome del buffer dell'indice colore utilizzato per memorizzare il colore della linea sotto forma di indice.
Si presume che venga utilizzato un solo richiamo alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.
L'indicatore utilizza le classi della libreria SmoothAlgorithms.mqh (copia la libreria nella cartella
\\MQL5\Include). L'uso delle classi è stato descritto in dettaglio nell'articolo "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers". 
Fig1. Indicatore ColorX2MA_Alert sul grafico
Fig.2 Indicatore ColorX2MA_Alert. Generazione di allerta.


Commento 0