Nikolay, lequel de vos enfants cerveaux a le moins de décalage et le moins de faux signaux (si, bien sûr, cela peut être déterminé) ?
Nikolay, lequel de vos enfants a le moins de retard et le moins de faux signaux (si, bien sûr, cela peut être déterminé).
Ce n'est absolument pas mon style de programmation.
C'est l'arbre qui cache la forêt = c'est le commentaire qui cache le code.
De plus, le paramètre d'entrée 'shift' n'est pas du tout utilisé.
Je l'ai reprogrammé dans mon style, peut-être que ces messieurs les 'super-programmeurs' peuvent en prendre de la graine.
//+------------------------------------------------------------------+ //|super tendance.mq5 | //| Code original trouvé sur https://www.mql5.com/fr/code/527 | //| Code original de Jason Robinson, réécrit par Nikolay Kositsin | //| Improved by Ing. Otto Pauser alias Kronenchakra | //+------------------------------------------------------------------+ //--- inckudes #include <Utils.mqh> //--- propriétés générales #property copyright COPY #property link LINK #property version "1.00" //--- Propriétés de l'indicateur #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 4 //--- paramètres d'entrée input int CCIPeriod = 50; // Période de l'indicateur CCI input int ATRPeriod = 5; // Période de l'indicateur ATR input int Level = 0; // Niveau d'activation CCI //---- indicateurs buffers double ATR[], CCI[]; double TrendUp[], TrendDn[]; double SignUp[], SignDn[]; //---- global variables int min_rates_total; int ATR_Handle, CCI_Handle; //+------------------------------------------------------------------+ //| Fonction d'initialisation de l'indicateur personnalisé | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Fonction d'itération de l'indicateur personnalisé | //+------------------------------------------------------------------+ 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 // check ( BarsCalculated(CCI_Handle)<rates_total || // vérifier l'indicateur CCI BarsCalculated(ATR_Handle)<rates_total || // vérifier l'indicateur ATR rates_total<min_rates_total // vérifier qu'il y a assez de barres ) return(0); // try next tick int limit,to_copy,bar; ArraySetAsSeries(high,true); // doit être défini AsSeries à chaque tick ArraySetAsSeries(low ,true); if(prev_calculated>rates_total || prev_calculated<=0) // contrôle du premier démarrage du calcul de l'indicateur limit=rates_total-min_rates_total; // indice de départ pour le calcul de toutes les barres else limit=rates_total-prev_calculated; // indice de départ pour le calcul des nouvelles barres to_copy=limit+1; // copier les données ATR dans la mémoire tampon if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0); to_copy++; // copier les données CCI dans la mémoire tampon if(CopyBuffer(CCI_Handle,0,0,to_copy,CCI)<=0) return(0); for(bar=limit; bar>=0; bar--) // calcul de la boucle principale { TrendUp[bar]=NULL; // effacer tous les tampons TrendDn[bar]=NULL; SignUp [bar]=NULL; SignDn [bar]=NULL; // calculer les lignes 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]; // vérifier le signal UP if(TrendUp[bar+1]!=0.0 && TrendDn[bar]!=0.0) SignDn[bar]=TrendDn[bar]; // check signal DOWN } return(rates_total); }
//+------------------------------------------------------------------+ //|Utils .mqh | //| Copyright © 2018, Ing. Otto Pauser | //| https://www.mql5.com/fr/users/kronenchakra | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| définitions| //+------------------------------------------------------------------+ #define COPY "Copyright © 2018, Ing. Otto Pauser" #define LINK "https://www.mql5.com/fr/users/kronenchakra" #define SPACER "---------------------" //+------------------------------------------------------------------+ //| abbreviations| //+------------------------------------------------------------------+ #define PRICE ENUM_APPLIED_PRICE #define TIMEF ENUM_TIMEFRAMES //+------------------------------------------------------------------+ //| Fonctions auxiliaires| //+------------------------------------------------------------------+ 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; // initialiser l'index du tampon à 0 SetIndexBuffer (idx,_buffer); // initialiser la mémoire tampon ArrayInitialize (_buffer ,NULL); // initialiser la mémoire tampon ArraySetAsSeries (_buffer ,_series); // set AsSeries // set properties 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++; // incrément bufferindex pour le prochain appel } bool InvalidHandle(int _handle, string _msg) { if(_handle==INVALID_HANDLE) // check handle Alert("*ERROR* creating "+_msg+" handle."); // info return(_handle==INVALID_HANDLE); // return true if invalid } 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+")"); } //+------------------------------------------------------------------+ //| Fonctions de calcul| //+------------------------------------------------------------------+ 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); // check position for(i=0;i<period;i++) // calcualte StdDev StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2); StdDev_dTmp=MathSqrt(StdDev_dTmp/period); return(StdDev_dTmp); // return calculated value }
Cela semble tout de suite plus clair.
MetaQutes pourrait éventuellement s'en inspirer, par exemple : comment définir des plotbuffers sur une seule ligne.
Otto ,
cela :
TrendUp[bar]=NULL; // effacer tous les tampons TrendDn[bar]=NULL; SignUp [bar]=NULL; SignDn [bar]=NULL;
est dangereux. NULL est de type'void'. Plus tard, pour rendre le MT5 encore plus rapide, il se peut que rien ne soit attribué (l'ancienne valeur serait alors conservée) ou qu'une valeur aléatoire soit créée lors du changement d'emplacement de mémoire.
A mon avis, il serait préférable d'utiliser _Symbol pour le symbole et EMPTY_VALUE ou directement 0 pour les valeurs. Ainsi, tu donnes une existence au néant ;)
Comment puis-je obtenir
Etape 1 : 
Étape 2 : 
Est-ce que vous avez ceci pour mt4
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
SuperTrend:
Indicateur de tendance SuperTrend.
Author: Nikolay Kositsin