Autore originale:
Rafael Jimenez Tocino
Indicatore RJTX_Matches_Smoothed con avvisi, email e notifiche push per smartphone.
Di seguito sono elencate le modifiche apportate al codice dell'indicatore per implementare avvisi, messaggi email e notifiche push:
- Nuove variabili di input sono state aggiunte agli input dell'indicatore:
input uint NumeroDiBarre=1; // Numero di barre per attivare il segnale input bool SuonoAttivo=true; // Abilita gli avvisi input uint NumeroDiAvvisi=2; // Numero di avvisi input bool EmailAttivo=false; // Abilita l'invio di email per il segnale input bool PushAttivo=false; // Abilita l'invio di segnalazioni ai dispositivi mobili
- Tre nuove funzioni sono state aggiunte alla fine dell'indicatore: BuySignal(), SellSignal(), e GetStringTimeframe()
//+------------------------------------------------------------------+ //| Funzione di 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 del 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(FrecciaAcquisto); int indice,indice1; if(TestSerie) { indice=int(NumeroDiBarre); indice1=indice+1; } else { indice=TotaleBarre-int(NumeroDiBarre)-1; indice1=indice-1; } if(!FrecciaAcquisto[indice1] && FrecciaAcquisto[indice]) SegnaleAcquisto=true; if(SegnaleAcquisto && contatore<=NumeroDiAvvisi) { 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(NumeroDiBarre); else indice=TotaleBarre-int(NumeroDiBarre)-1; double Ask=Chiusura[indice]; double Bid=Chiusura[indice]; TestSerie=ArrayGetAsSeries(Spread); if(TestSerie) indice=int(NumeroDiBarre); else indice=TotaleBarre-int(NumeroDiBarre)-1; Bid+=Spread[indice]*_Point; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SuonoAttivo) Alert("Segnale di ACQUISTO Ask=",Ask," Bid=",Bid," currtime=",testo," Simbolo=",Symbol()," Period=",sPeriodo); if(EmailAttivo) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushAttivo) SendNotification(NomeSegnale+": Segnale di ACQUISTO a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Funzione di 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 del 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(FrecciaVendita); int indice,indice1; if(TestSerie) { indice=int(NumeroDiBarre); indice1=indice+1; } else { indice=TotaleBarre-int(NumeroDiBarre)-1; indice1=indice-1; } if(!FrecciaVendita[indice1] && FrecciaVendita[indice]) SegnaleVendita=true; if(SegnaleVendita && contatore<=NumeroDiAvvisi) { 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(NumeroDiBarre); else indice=TotaleBarre-int(NumeroDiBarre)-1; double Ask=Chiusura[indice]; double Bid=Chiusura[indice]; TestSerie=ArrayGetAsSeries(Spread); if(TestSerie) indice=int(NumeroDiBarre); else indice=TotaleBarre-int(NumeroDiBarre)-1; Bid+=Spread[indice]*_Point; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SuonoAttivo) Alert("Segnale di VENDITA Ask=",Ask," Bid=",Bid," currtime=",testo," Simbolo=",Symbol()," Period=",sPeriodo); if(EmailAttivo) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale di VENDITA a Ask="+sAsk+", Bid="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushAttivo) SendNotification(NomeSegnale+": Segnale di 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)); //---- }
- Due chiamate alle funzioni BuySignal() e SellSignal() sono state aggiunte dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
//--- BuySignal("RJTX_Matches_Smoothed_Alert",FrecciaAcquisto,totale_barre,precedente_calcolato,chuisura,spread); SellSignal("RJTX_Matches_Smoothed_Alert",FrecciaVendita,totale_barre,precedente_calcolato,chuisura,spread); //---
Dove FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Devono essere aggiunti zeri o EMPTY_VALUE ai buffer dell'indicatore come valori vuoti.
Si assume che ci sia una sola chiamata a ciascuna delle funzioni BuySignal() e SellSignal() nel codice dell'indicatore nel blocco OnCalculate().
L'indicatore utilizza le classi di libreria SmoothAlgorithms.mqh (da copiare nella cartella <terminal_data_directory>\MQL5\Include). L'uso delle classi è stato descritto in dettaglio nell'articolo Mediazione delle Serie di Prezzi per Calcoli Intermedi Senza Utilizzare Buffer Aggiuntivi.
Questo indicatore è stato implementato per la prima volta in MQL4 e pubblicato nel Code Base il 23 dicembre 2015.

Fig.1. Indicatore RJTX_Matches_Smoothed_Alert sul grafico
Fig. 2. Indicatore RJTX_Matches_Smoothed_Alert. Alerting
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
- Utilità per Serie e Informazioni sulle Rate in MetaTrader 5
- Notis: L'Indicatore per Misurare la Volatilità su MetaTrader 5
- Indicatore di Equità e Bilancio per MetaTrader 5: Monitoraggio della Tua Performance di Trading
