Nikolay, quale dei tuoi figli del cervello ha il minor ritardo e il minor numero di falsi segnali (se, naturalmente, questo può essere determinato)?
Nikolay, quale dei tuoi figli del cervello ha il minor ritardo e il minor numero di falsi segnali (se, naturalmente, questo può essere determinato).
Quindi non è assolutamente il mio stile di programmazione.
Non si vede il legno per gli alberi = non si vede il codice per tutti i commenti.
Inoltre, il parametro di ingresso 'shift' non viene utilizzato affatto.
L'ho riprogrammato nel mio stile, forse i "superprogrammatori" possono prendere esempio da me.
//+------------------------------------------------------------------+ //|Supertrend.mq5 | //| Codice originale trovato su https://www.mql5.com/it/code/527 | //| Codice originale di Jason Robinson, riscritto da Nikolay Kositsin | //| Migliorato dall'Ing. Otto Pauser alias Kronenchakra | //+------------------------------------------------------------------+ //--- inckudes #include <Utils.mqh> //--- proprietà generali #property copyright COPY #property link LINK #property version "1.00" //--- proprietà dell'indicatore #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 4 //--- parametri di ingresso input int CCIPeriod = 50; // Periodo dell'indicatore CCI input int ATRPeriod = 5; // Periodo dell'indicatore ATR input int Level = 0; // Livello di attivazione dell'ICC //---- buffer dell'indicatore double ATR[], CCI[]; double TrendUp[], TrendDn[]; double SignUp[], SignDn[]; //---- variabili globali int min_rates_total; int ATR_Handle, CCI_Handle; //+------------------------------------------------------------------+ //| Funzione di inizializzazione dell'indicatore personalizzata | //+------------------------------------------------------------------+ int OnInit() { min_rates_total=MathMax(CCIPeriod,ATRPeriod); CCI_Handle=iCCI(NULL,0,CCIPeriod,PRICE_TYPICAL); if(InvalidHandle(CCI_Handle,"iCCI")) return(INIT_FAILED); ATR_Handle=iATR(NULL,0,ATRPeriod); if(InvalidHandle(ATR_Handle,"iATR")) return(INIT_FAILED); string shortname=IndiShortName("Supertrend",CCIPeriod,ATRPeriod); IndicatorSetString(INDICATOR_SHORTNAME,shortname); IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); InitBuffer(TrendUp,DRAW_LINE ,"Supertrend Up" ,clrLime,min_rates_total,0 ,2,true); InitBuffer(TrendDn,DRAW_LINE ,"Supertrend Down" ,clrRed ,min_rates_total,0 ,2,true); InitBuffer(SignUp ,DRAW_ARROW,"Supertrend signal Buy" ,clrLime,min_rates_total,108,1,true); InitBuffer(SignDn ,DRAW_ARROW,"Supertrend signal Sell",clrRed ,min_rates_total,108,1,true); ArraySetAsSeries(ATR,true); ArraySetAsSeries(CCI,true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Funzione di iterazione dell'indicatore personalizzata | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double& high[], const double& low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if // controllo ( BarsCalculated(CCI_Handle)<rates_total || // controllare l'indicatore CCI BarsCalculated(ATR_Handle)<rates_total || // controllare l'indicatore ATR rates_total<min_rates_total // controllare se le barre sono sufficienti ) return(0); // prova il tick successivo int limit,to_copy,bar; ArraySetAsSeries(high,true); // deve essere impostato AsSeries ad ogni tick ArraySetAsSeries(low ,true); if(prev_calculated>rates_total || prev_calculated<=0) // verifica del primo avvio del calcolo dell'indicatore limit=rates_total-min_rates_total; // indice di partenza per il calcolo di tutte le barre else limit=rates_total-prev_calculated; // indice di partenza per il calcolo delle nuove barre to_copy=limit+1; // copia dei dati ATR nel buffer if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0); to_copy++; // copia dei dati CCI nel buffer if(CopyBuffer(CCI_Handle,0,0,to_copy,CCI)<=0) return(0); for(bar=limit; bar>=0; bar--) // calcolo ciclo principale { TrendUp[bar]=NULL; // cancellare tutti i buffer TrendDn[bar]=NULL; SignUp [bar]=NULL; SignDn [bar]=NULL; // calcolare le linee if(CCI[bar]>=Level && CCI[bar+1]<Level) TrendUp[bar]=TrendDn[bar+1]; if(CCI[bar]<=Level && CCI[bar+1]>Level) TrendDn[bar]=TrendUp[bar+1]; if(CCI[bar]>Level) { TrendUp[bar]=low[bar]-ATR[bar]; if(TrendUp[bar]<TrendUp[bar+1] && CCI[bar+1]>=Level) TrendUp[bar]=TrendUp[bar+1]; } if(CCI[bar]<Level) { TrendDn[bar]=high[bar]+ATR[bar]; if(TrendDn[bar]>TrendDn[bar+1] && CCI[bar+1]<=Level) TrendDn[bar]=TrendDn[bar+1]; } if(TrendDn[bar+1]!=0.0 && TrendUp[bar]!=0.0) SignUp[bar]=TrendUp[bar]; // controllare il segnale UP if(TrendUp[bar+1]!=0.0 && TrendDn[bar]!=0.0) SignDn[bar]=TrendDn[bar]; // controllare il segnale DOWN } return(rates_total); }
//+------------------------------------------------------------------+ //|Utilità.mqh | //| Copyright © 2018, ing. Otto Pauser | //| https://www.mql5.com/it/users/kronenchakra | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| definizioni| //+------------------------------------------------------------------+ #define COPY "Copyright © 2018, Ing. Otto Pauser" #define LINK "https://www.mql5.com/it/users/kronenchakra" #define SPACER "---------------------" //+------------------------------------------------------------------+ //| abbreviazioni| //+------------------------------------------------------------------+ #define PRICE ENUM_APPLIED_PRICE #define TIMEF ENUM_TIMEFRAMES //+------------------------------------------------------------------+ //| Funzioni ausiliarie| //+------------------------------------------------------------------+ void InitBuffer(double &_buffer[], ENUM_DRAW_TYPE _type, string _label, color _color, int _begin, int _arrow=159, int _width=1, bool _series=false) { static int idx=0; // inizializzare il bufferindex a 0 SetIndexBuffer (idx,_buffer); // inizializzare il buffer ArrayInitialize (_buffer ,NULL); // inizializzare il buffer ArraySetAsSeries (_buffer ,_series); // imposta AsSeries // impostare le proprietà PlotIndexSetInteger(idx,PLOT_DRAW_TYPE ,_type ); PlotIndexSetInteger(idx,PLOT_LINE_COLOR ,_color); PlotIndexSetInteger(idx,PLOT_LINE_WIDTH ,_width); PlotIndexSetInteger(idx,PLOT_DRAW_BEGIN ,_begin); PlotIndexSetInteger(idx,PLOT_ARROW ,_arrow); PlotIndexSetString (idx,PLOT_LABEL ,_label); PlotIndexSetDouble (idx,PLOT_EMPTY_VALUE,NULL ); idx++; // incrementa il bufferindex per la chiamata successiva } bool InvalidHandle(int _handle, string _msg) { if(_handle==INVALID_HANDLE) // controllare la maniglia Alert("*ERROR* creating "+_msg+" handle."); // info return(_handle==INVALID_HANDLE); // restituisce true se non è valido } string IndiShortName(string _name, int val_1, int val_2=NULL, int val_3=NULL) { string result=_name+"("+IntegerToString(val_1); if(val_2!=NULL) result=result+","+IntegerToString(val_2); if(val_3!=NULL) result=result+","+IntegerToString(val_3); return(result+")"); } //+------------------------------------------------------------------+ //| Funzioni di calcolo| //+------------------------------------------------------------------+ double StdDeviation(int position,const double &price[],const double &MAprice[],int period) { int i; double StdDev_dTmp=0.0; if(position<period) return(StdDev_dTmp); // controllare la posizione for(i=0;i<period;i++) // calcola StdDev StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2); StdDev_dTmp=MathSqrt(StdDev_dTmp/period); return(StdDev_dTmp); // restituire il valore calcolato }
Sembra subito abbastanza chiaro.
Forse MetaQutes potrebbe imparare qualcosa, ad esempio come definire i buffer di trama in una sola riga.
Otto,
che:
TrendUp[bar]=NULL; // cancellare tutti i buffer TrendDn[bar]=NULL; SignUp [bar]=NULL; SignDn [bar]=NULL;
è pericoloso. NULL è di tipo'void'. In un secondo momento, per rendere MT5 ancora più veloce, forse non si potrebbe assegnare nulla (quindi il vecchio rimarrebbe) o si creerebbe un valore casuale quando la posizione di memoria cambia.
Sarebbe meglio usare _symbol per il simbolo e EMPTY_VALUE o 0 direttamente per i valori. In questo modo si dà al nulla un essere ;)
Come posso ottenere
Fase 1: 
Passo 2: 
avete questo per mt4
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
SuperTrend:
Indicatore di tendenza SuperTrend.
Author: Nikolay Kositsin