Autore: Paul Stringer
L'indicatore Harami Alert ti permette di identificare i pattern Harami e offre funzionalità di avvisi, email e notifiche push.
Sono state apportate diverse modifiche al codice dell'indicatore per implementare gli avvisi, i messaggi email e le notifiche push:
- Introduzione di nuovi parametri di input
input uint NumeroBar=1;//Numero di barre per il segnale input bool SuonoAttivo=true; //Abilita gli avvisi input uint NumeroAvvisi=2;//Numero di avvisi input bool EmailAttiva=false; //Abilita l'invio di email per il segnale input bool PushAttivo=false; //Abilita l'invio di segnale ai dispositivi mobili
- Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: BuySignal(), SellSignal() e GetStringTimeframe().
//+------------------------------------------------------------------+ //| Funzione di segnale di acquisto | //+------------------------------------------------------------------+ void BuySignal(string NomeSegnale, // nome dell'indicatore per email e messaggi push double &FrecciaAcquisto[], // buffer indicatore con segnali di acquisto const int BarreTotali, // numero attuale di barre const int PrecedenteCalcolato, // numero di barre al tick precedente const double &Chiusura[], // prezzo di chiusura const int &Spread[]) // spread { //--- static uint contatore=0; if(BarreTotali!=PrecedenteCalcolato) contatore=0; bool SegnaleAcquisto=false; bool TestSerie=ArrayGetAsSeries(FrecciaAcquisto); int indice; if(TestSerie) indice=int(NumeroBar); else indice=BarreTotali-int(NumeroBar)-1; if(NormalizeDouble(FrecciaAcquisto[indice],_Digits) && FrecciaAcquisto[indice]!=EMPTY_VALUE) 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(NumeroBar); else indice=BarreTotali-int(NumeroBar)-1; double Chiedi=Chiusura[indice]; double Offerta=Chiusura[indice]; TestSerie=ArrayGetAsSeries(Spread); if(TestSerie) indice=int(NumeroBar); else indice=BarreTotali-int(NumeroBar)-1; Offerta+=Spread[indice]*_Point; string sChiedi=DoubleToString(Chiedi,_Digits); string sOfferta=DoubleToString(Offerta,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SuonoAttivo) Alert("Segnale di ACQUISTO \n Chiedi=",Chiedi,"\n Offerta=",Offerta,"\n ora=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo); if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di ACQUISTO","Segnale di ACQUISTO a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushAttivo) SendNotification(NomeSegnale+": avviso segnale di ACQUISTO a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Funzione di segnale di vendita | //+------------------------------------------------------------------+ void SellSignal(string NomeSegnale, // nome dell'indicatore per email e messaggi push double &FrecciaVendita[], // buffer indicatore con segnali di vendita const int BarreTotali, // numero attuale di barre const int PrecedenteCalcolato, // numero di barre al tick precedente const double &Chiusura[], // prezzo di chiusura const int &Spread[]) // spread { //--- static uint contatore=0; if(BarreTotali!=PrecedenteCalcolato) contatore=0; bool SegnaleVendita=false; bool TestSerie=ArrayGetAsSeries(FrecciaVendita); int indice; if(TestSerie) indice=int(NumeroBar); else indice=BarreTotali-int(NumeroBar)-1; if(NormalizeDouble(FrecciaVendita[indice],_Digits) && FrecciaVendita[indice]!=EMPTY_VALUE) 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(NumeroBar); else indice=BarreTotali-int(NumeroBar)-1; double Chiedi=Chiusura[indice]; double Offerta=Chiusura[indice]; TestSerie=ArrayGetAsSeries(Spread); if(TestSerie) indice=int(NumeroBar); else indice=BarreTotali-int(NumeroBar)-1; Offerta+=Spread[indice]*_Point; string sChiedi=DoubleToString(Chiedi,_Digits); string sOfferta=DoubleToString(Offerta,_Digits); string sPeriodo=GetStringTimeframe(ChartPeriod()); if(SuonoAttivo) Alert("Segnale di VENDITA \n Chiedi=",Chiedi,"\n Offerta=",Offerta,"\n ora=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo); if(EmailAttiva) SendMail(NomeSegnale+": avviso segnale di VENDITA","Segnale di VENDITA a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushAttivo) SendNotification(NomeSegnale+": avviso segnale di VENDITA a Chiedi="+sChiedi+", Offerta="+sOfferta+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| 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("Harami_Alert",FrecciaAcquisto,barre_totali,precedente_calcolato,chiusura,spread); SellSignal("Harami_Alert",FrecciaVendita,barre_totali,precedente_calcolato,chiusura,spread); //---
Dove FrecciaAcquisto e FrecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. Le eventuali posizioni vuote nei buffer dell'indicatore devono essere impostate su zero o su EMPTY_VALUE.
Si presume che ci sia solo una chiamata alle funzioni BuySignal() e SellSignal() nel blocco OnCalculate() del codice dell'indicatore.
Originariamente, questo indicatore è stato scritto in MQL4 ed è stato pubblicato per la prima volta nella Code Base il 14.06.2016.

Fig. 1. Indicatore Harami_Alert sul grafico
Fig. 2. Harami_Alert. Generazione avvisi
Post correlati
- Master Tools: Il Nuovo Indicatore per MetaTrader 4
- Indicatori ZigZag Potenziati: Scopri le Nuove Funzionalità per MetaTrader 4
- Indice di Volatilità Chaikin: Scegli il Giusto Algoritmo di Smussamento per MetaTrader 5
- Indicatore Donchian Ultimate per MT4: Scopri tutte le Funzionalità
- Utilità per Serie e Informazioni sulle Rate in MetaTrader 5
