ASCtrend è un indicatore di segnale a semaforo che include avvisi, email e notifiche push. Scopriamo insieme le novità del codice che rendono questo strumento ancora più utile per i trader.
Di seguito, ti presento i cambiamenti apportati al codice dell'indicatore per implementare avvisi, messaggi email e notifiche push:
- È stata introdotta una serie di nuovi parametri di input:
input uint NumeroDiBarre=1;// Numero di barre per il segnale input bool SuonoAttivo=true; // Abilita avvisi sonori input uint NumeroDiAvvisi=2;// Numero di avvisi input bool EmailAttiva=false; // Abilita invio email per il segnale input bool PushAttivo=false; // Abilita invio notifiche ai dispositivi mobili
- Abbiamo aggiunto 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 email e messaggi push double &FrecciaAcquisto[], // buffer dell'indicatore con segnali di acquisto const int TotaleBarre, // numero corrente di barre const int Prev_calcolato,// numero di barre sul tick precedente const double &Chiusura[], // prezzo di chiusura const int &Spread[]) // spread { //--- static uint contatore=0; if(TotaleBarre!=Prev_calcolato) contatore=0; bool SegnaleAcquisto=false; bool TestSerie=ArrayGetAsSeries(FrecciaAcquisto); int indice; if(TestSerie) indice=int(NumeroDiBarre); else indice=TotaleBarre-int(NumeroDiBarre)-1; if(NormalizeDouble(FrecciaAcquisto[indice],_Digits) && FrecciaAcquisto[indice]!=EMPTY_VALUE) 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]; 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(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale 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 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 corrente di barre const int Prev_calcolato, // numero di barre sul tick precedente const double &Chiusura[], // prezzo di chiusura const int &Spread[]) // spread { //--- static uint contatore=0; if(TotaleBarre!=Prev_calcolato) contatore=0; bool SegnaleVendita=false; bool TestSerie=ArrayGetAsSeries(FrecciaVendita); int indice; if(TestSerie) indice=int(NumeroDiBarre); else indice=TotaleBarre-int(NumeroDiBarre)-1; if(NormalizeDouble(FrecciaVendita[indice],_Digits) && FrecciaVendita[indice]!=EMPTY_VALUE) 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]; 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(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale 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)); //---- }
- Sono stati aggiunti un paio di chiamate alle funzioni BuySignal() e SellSignal() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate() //---
BuySignal("ASCtrend",FrecciaAcquisto,totale_barre,prev_calcolato,chiusura,spread);
SellSignal("ASCtrend",FrecciaVendita,totale_barre,prev_calcolato,chiusura,spread);
//---
Dove FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Nei buffer dell'indicatore devono essere impostati zeri o EMPTY_VALUE come valori vuoti.
Si presume che ci sia solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.

Fig.1. Indicatore ASCtrendAlert sul grafico

Fig.2. Indicatore BykovTrendAlert. Generazione di avvisi
Commento 0