Se sei un trader che utilizza ColorParabolic, saprai che è un indicatore semaforico che ti invia avvisi tramite email e notifiche push. Ma ora, vediamo insieme alcune novità che rendono questo strumento ancora più potente!
Recentemente, sono state apportate delle modifiche al codice dell'indicatore per implementare avvisi, messaggi email e notifiche push. Ecco i dettagli:
-
Introdotti nuovi parametri di input:
input uint NumeroDiBarre=1;//Numero di barre per il segnale input bool SuonoAttivo=true; //Abilita avvisi input uint NumeroDiAvvisi=2;//Numero di avvisi input bool EmailAttiva=false; //Abilita invio email del segnale input bool PushAttiva=false; //Abilita invio segnale a dispositivi mobili
-
Aggiunte tre nuove funzioni alla fine del codice dell'indicatore: FunzioneAcquisto(), FunzioneVendita() e OttieniStringaTimeframe()
//+------------------------------------------------------------------+ //| Funzione segnale di acquisto | //+------------------------------------------------------------------+ void FunzioneAcquisto(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 prev_calcolato, // numero di barre al 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 Offerta=Chiusura[indice]; double Domanda=Chiusura[indice]; testSerie=ArrayGetAsSeries(Spread); if(testSerie) indice=int(NumeroDiBarre); else indice=totaleBarre-int(NumeroDiBarre)-1; Domanda+=Spread[indice]*_Point; string sDomanda=DoubleToString(Offerta,_Digits); string sBid=DoubleToString(Domanda,_Digits); string sPeriodo=OttieniStringaTimeframe(ChartPeriod()); if(SuonoAttivo) Alert("segnale di ACQUISTO \n Offerta=",Offerta,"\n Domanda=",Domanda,"\n ora corrente=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo); if(EmailAttiva) SendMail(nomeSegnale+": avviso segnale di ACQUISTO","segnale di ACQUISTO a Offerta="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushAttiva) SendNotification(nomeSegnale+": segnale di ACQUISTO a Offerta="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Funzione segnale di vendita | //+------------------------------------------------------------------+ void FunzioneVendita(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 prev_calcolato, // numero di barre al 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 Offerta=Chiusura[indice]; double Domanda=Chiusura[indice]; testSerie=ArrayGetAsSeries(Spread); if(testSerie) indice=int(NumeroDiBarre); else indice=totaleBarre-int(NumeroDiBarre)-1; Domanda+=Spread[indice]*_Point; string sDomanda=DoubleToString(Offerta,_Digits); string sBid=DoubleToString(Domanda,_Digits); string sPeriodo=OttieniStringaTimeframe(ChartPeriod()); if(SuonoAttivo) Alert("segnale di VENDITA \n Offerta=",Offerta,"\n Domanda=",Domanda,"\n ora corrente=",testo,"\n Simbolo=",Symbol()," Period=",sPeriodo); if(EmailAttiva) SendMail(nomeSegnale+": avviso segnale di VENDITA","segnale di VENDITA a Offerta="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); if(PushAttiva) SendNotification(nomeSegnale+": segnale di VENDITA a Offerta="+sDomanda+", Domanda="+sBid+", Data="+testo+" Simbolo="+Symbol()+" Period="+sPeriodo); } //--- } //+------------------------------------------------------------------+ //| Ottenere il timeframe come stringa | //+------------------------------------------------------------------+ string OttieniStringaTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
-
Aggiunti alcuni richiami alle funzioni FunzioneAcquisto() e FunzioneVendita() dopo i cicli di calcolo dell'indicatore nel blocco OnCalculate()
//--- FunzioneAcquisto("ColorParabolic_Alert",frecciaAcquisto,totaleBarre,prev_calcolato,Chiusura,Spread); FunzioneVendita("ColorParabolic_Alert",frecciaVendita,totaleBarre,prev_calcolato,Chiusura,Spread); //---
In questo caso, frecciaAcquisto e frecciaVendita sono i nomi dei buffer dell'indicatore per memorizzare i segnali di acquisto e vendita. È importante impostare i valori vuoti nei buffer dell'indicatore a zero o a EMPTY_VALUE.
Si presume che ci sarà solo un richiamo alle funzioni FunzioneAcquisto() e FunzioneVendita() nel blocco OnCalculate() del codice dell'indicatore.

Fig1. ColorParabolic_Alert su un grafico

Fig.2. L'indicatore ColorParabolic_Alert. Generazione di avvisi.
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 le Informazioni su Barre e Tassi per MetaTrader 5
- Utilità per Serie e Informazioni sulle Rate in MetaTrader 5
- Notis: L'Indicatore per Misurare la Volatilità su MetaTrader 5