Indicateurs: SuperTrend

 

SuperTrend:

Indicateur de tendance SuperTrend.

SuperTrend

Author: Nikolay Kositsin

 

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é) ?

 
Makser:

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é).

Voici une question, donc la question. J'utilise JFatlSpeed sur les croisements, et depuis peu sur tout le reste. Mais seulement sur les marqueurs de quatre heures. Et j'attrape les rebonds sur les trades de cinq minutes sur X2MA_BBx9.
 

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.

Dossiers :
supertrend.mq5  11 kb
Utils.mqh  7 kb
 

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
 
Je souhaite utiliser cet indicateur
 
ka03ht8096:
Comment puis-je obtenir

Etape 1 :

Étape 2 :

 
Quelle est l'entrée du multiplicateur et de la valeur ATR ?
 

Est-ce que vous avez ceci pour mt4