iGatore

Rend le handle de l'indicateur Gator. L'Oscillateur montre la différence entre les lignes bleues et rouges de l'Alligator (l'histogramme supérieur) et  la différence entre la ligne rouge et verte (l'histogramme inférieur).

int  iGator(
   string              symbol,            // nom du symbole
   ENUM_TIMEFRAMES     period,            // période
   int                 jaw_period,        // période pour le calcul des mâchoires
   int                 jaw_shift,         // décalage horizontal des mâchoires
   int                 teeth_period,      // période pour le calcul des dents
   int                 teeth_shift,       // décalage horizontal des dents
   int                 lips_period,       // période pour le calcul des lèvres
   int                 lips_shift,        // décalage horizontal des lèvres 
   ENUM_MA_METHOD      ma_method,         // type de lissage
   ENUM_APPLIED_PRICE  applied_price      // type de prix ou le handle
   );

Paramètres

symbol

[in]  Le nom symbolique de l'instrument dont les données devraient être utilisées pour calculer l'indicateur. NULL signifie le symbole actuel.

period

[in]  La valeur de la période peut être une des valeurs de l'énumération ENUM_TIMEFRAMES, 0 signifit le temps trame courant.

jaw_period

[in]   La période de la prise de moyenne de la ligne bleue (la mâchoire d'alligator).

jaw_shift

[in]  Le décalage de la ligne bleue de l'Alligator par rapport au graphique du prix. Il n'est pas directement raccordé avec le changement visuel de l'histogramme d'indicateur.

teeth_period

[in]  La période de la prise de moyenne de la ligne rouge (les dents d'alligator).

teeth_shift

[in]  Le décalage de la ligne rouge d'Alligator par rapport au graphique du prix. Il n'est pas directement raccordé avec le changement visuel de l'histogramme d'indicateur.

lips_period

[in]  La période de la prise de moyenne de la ligne verte (les lèvres d'alligator).

lips_shift

[in]  Le décalage de la ligne verte de l'Alligator par rapport au graphique du prix. Il n'est pas directement raccordé avec le changement visuel de l'histogramme d'indicateur.

ma_method

[in]  La méthode de la prise de moyenne. Peut être l'une des valeurs ENUM_MA_METHOD.

applied_price

[in]  Le prix utilisé. Peut être l'une des constantes de prix ENUM_APPLIED_PRICE ou le handle d'un autre indicateur.

La valeur rendue

Rend le handle de l'indicateur technique indiqué, en cas de l'échec rend INVALID_HANDLE. Pour la désallocation de la mémoire de l'ordinateur de l' indicateur non plus utilisé plus il y a la fonction IndicatorRelease(), auquelle est transmis le handle de cet indicateur.

Note

Les numéros des tampons: 0 - UPPER_HISTOGRAM, 1- le tampon coloré de l'histogramme supérieur, 2 - LOWER_HISTOGRAM, 3- le tampon coloré de l'histogramme inférieur.

Exemple:

//+------------------------------------------------------------------+
//|                                                  Demo_iGator.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "L'indicateur montre comment il faut recevoir les données"
#property description "des tampons d'indicateur pour l'indicateur technique iGator."
#property description "Le symbole et le temps trame sur lequel l'indicateur est calculé,"
#property description "sont spécifiés par les paramètres symbol et period."
#property description "Le moyen de la création du handle est spécifié par le paramètre 'type' (le type de la fonction)."
#property description "Tous les autres paramètres comme dans Gator Oscillator standard."
 
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
//--- la construction GatorUp
#property indicator_label1  "GatorUp"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen, clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- la construction GatorDown
#property indicator_label2  "GatorDown"
#property indicator_type2   DRAW_COLOR_HISTOGRAM
#property indicator_color2  clrGreen, clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//+------------------------------------------------------------------+
//| L'énumération des moyens de la création du handle                |
//+------------------------------------------------------------------+
enum Creation
  {
   Call_iGator,            // utiliser iGator
   Call_IndicatorCreate    // utiliser IndicatorCreate
  };
//--- les paramètres d'entrée
input Creation             type=Call_iGator;       // le type de la fonction 
input string               symbol=" ";             // le symbole 
input ENUM_TIMEFRAMES      period=PERIOD_CURRENT;  // le temps trame
input int                  jaw_period=13;          // la période pour la ligne des Mâchoires
input int                  jaw_shift=8;            // le décalage de la ligne des Mâchoires
input int                  teeth_period=8;         // la période pour la ligne des Dents
input int                  teeth_shift=5;          // le décalage de la ligne des Mâchoires
input int                  lips_period=5;          // la période pour la ligne des Lèvres
input int                  lips_shift=3;           // le décalage de la ligne des Lèvres
input ENUM_MA_METHOD       MA_method=MODE_SMMA;    // la méthode de la prise de moyenne des lignes de l'Alligator 
input ENUM_APPLIED_PRICE   applied_price=PRICE_MEDIAN;// le type de prix utilisé pour le calcul de l'Alligator
//--- les tampons d'indicateur
double         GatorUpBuffer[];
double         GatorUpColors[];
double         GatorDownBuffer[];
double         GatorDownColors[];
//--- la variable pour stocker le handle de l'indicateur iGator
int    handle;
//--- la variable pour le stockage
string name=symbol;
//---le nom de l'indicateur sur le graphique
string short_name;
//--- les valeurs des décalages pour l'histogramme supérieur et inférieur
int shift;
//--- stockerons le nombre de valeurs dans l'indicateur Gator Oscillator
int    bars_calculated=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- le rattachement des tableaux aux tampons d'indicateur
   SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX);
/*
  Tous les décalages indiqués dans les paramètres se rapportent à l'indicateur Alligator, selon lequel est construit Gator Oscillator!
  C'est pourquoi les décalages indiqués ne produisent pas le décalage de l'indicateur Gator, ils déplacent les lignes de l'Alligator,
  dont les valeurs sont utilisées pour le calcul de Gator Oscillator!
*/
//--- Nous calculerons le décalage pour les histogrammes supérieurs et inférieurs, qui est la différence entre la ligne des Mâchoires et la ligne des Dents
   shift=MathMin(jaw_shift,teeth_shift);
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//--- malgré le fait qu'il y a deux histogrammes dans l'indicateur, on utilise le décalage identique - telle est la réalisation de l'indicateur iGator
   PlotIndexSetInteger(1,PLOT_SHIFT,shift);
 
//--- définissons avec le symbole sur lequel l'indicateur est construit
   name=symbol;
//--- supprimons les espaces de la gauche et de la droite
   StringTrimRight(name);
   StringTrimLeft(name);
//--- si la longueur de la chaîne name est nulle après cela
   if(StringLen(name)==0)
     {
      //--- prenons le symbole du graphique, où on a lancé l'indicateur
      name=_Symbol;
     }
//--- créons le handle de l'indicateur
   if(type==Call_iGator)
      handle=iGator(name,period,jaw_period,jaw_shift,teeth_period,teeth_shift,
                    lips_period,lips_shift,MA_method,applied_price);
   else
     {
      //--- remplirons la structure par les valeurs des paramètres de l'indicateur
      MqlParam pars[8];
      //--- les périodes et les décalages des lignes de l'Alligator
      pars[0].type=TYPE_INT;
      pars[0].integer_value=jaw_period;
      pars[1].type=TYPE_INT;
      pars[1].integer_value=jaw_shift;
      pars[2].type=TYPE_INT;
      pars[2].integer_value=teeth_period;
      pars[3].type=TYPE_INT;
      pars[3].integer_value=teeth_shift;
      pars[4].type=TYPE_INT;
      pars[4].integer_value=lips_period;
      pars[5].type=TYPE_INT;
      pars[5].integer_value=lips_shift;
      //--- le type du lissage
      pars[6].type=TYPE_INT;
      pars[6].integer_value=MA_method;
      //--- le type du prix
      pars[7].type=TYPE_INT;
      pars[7].integer_value=applied_price;
      //--- créons le handle
      handle=IndicatorCreate(name,period,IND_GATOR,8,pars);
     }
//--- si on n'a pas réussi à créer le handle
   if(handle==INVALID_HANDLE)
     {
      //--- informons sur l'échec et déduisons le numéro de l'erreur
      PrintFormat("On n'a pas réussi à créer le handle de l'indicateur iGator pour la paire %s/%s, le code de l'erreur %d",
                  name,
                  EnumToString(period),
                  GetLastError());
      //--- le travail de l'indicateur est terminé avant terme
      return(INIT_FAILED);
     }
//--- montrons sur quelle paire le symbole/temps trame l'indicateur Gator Oscillator a été calculé
   short_name=StringFormat("iGator(%s/%s, %d, %d ,%d, %d, %d, %d)",name,EnumToString(period),
                           jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- l'exécution normale de l'initialisation de l'indicateur  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- le nombre de valeurs copiées de l'indicateur iGator
   int values_to_copy;
//--- apprenons le nombre de valeurs calculées dans l'indicateur
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() a rendu %d, le code de l'erreur %d",calculated,GetLastError());
      return(0);
     }
//---si c'est un premier lancement des calculs de notre indicateur ou a changé le nombre de valeurs dans l'indicateur iGator
//--- ou s'il est nécessaire de calculer l'indicateur pour deux ou plus de barres (cela signifie que quelque chose a changé dans l'histoire)
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- si le tableau GatorUpBuffer est plus grand, que les valeurs dans l'indicateur iGator sur la paire symbol/period, copions pas tout 
      //--- autrement copions moins que la taille des tampons d'indicateur
      if(calculated>rates_total) values_to_copy=rates_total;
      else                       values_to_copy=calculated;
     }
   else
     {
      //--- signifie que notre indicateur est calculé non pour la première fois et dès le moment du dernier appel OnCalculate())
      //--- pour le calcul a été ajouté pas plus d'une barre
      values_to_copy=(rates_total-prev_calculated)+1;
     }
//--- remplissons les tableaux par les valeurs de l'indicateur Gator Oscillator
//--- si FillArraysFromBuffer a rendu false, signifie que les données ne sont pas prêts - terminons le travail
   if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors,
      shift,handle,values_to_copy)) return(0);
//--- formerons le message
   string comm=StringFormat("%s ==>  a été mise à jour des valeurs de l'indicateur %s: %d",
                            TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
                            short_name,
                            values_to_copy);
//--- déduisons le message de service sur le graphique
   Comment(comm);
//--- retiendrons le nombre de valeurs dans l'indicateur Gator Oscillator
   bars_calculated=calculated;
//--- rendons la valeur prev_calculated pour un appel suivant
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Remplissons les tampons d'indicateur de l'indicateur iGator      |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &ups_buffer[],         // le tampon d'indicateur pour l'histogramme supérieur
                           double &up_color_buffer[],    // le tampon d'indicateur pour les indexes des prix de l'histogramme supérieur
                           double &downs_buffer[],       // le tampon d'indicateur pour l'histogramme inférieur
                           double &downs_color_buffer[], // le tampon d'indicateur pour les indexes des prix de l'histogramme inférieur
                           int u_shift,                  // le décalage pour l'histogramme supérieur et inférieur
                           int ind_handle,               // le handle de l'indicateur iGator
                           int amount                    // le nombre de valeurs copiées
                           )
  {
//--- oblitérons le code de l'erreur
   ResetLastError();
//--- emplissons la partie du tableau GatorUpBuffer par les valeurs du tampon d'indicateur sous l'index 0
   if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0)
     {
      //--- si le copiage n'a pas réussi, annonçons le code de l'erreur
      PrintFormat("On n'a pas réussi à copier les données de l'indicateur iGator, le code de l'erreur %d",GetLastError());
      //--- terminerons avec le résultat nul - cela signifie que l'indicateur sera considéré comme non calculé
      return(false);
     }
 
//--- emplissons la partie du tableau GatorUpColors par les valeurs du tampon d'indicateur sous l'index 1
   if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0)
     {
      //--- si le copiage n'a pas réussi, annonçons le code de l'erreur
      PrintFormat("On n'a pas réussi à copier les données de l'indicateur iGator, le code de l'erreur %d",GetLastError());
      //--- terminerons avec le résultat nul - cela signifie que l'indicateur sera considéré comme non calculé
      return(false);
     }
 
//--- remplissons la partie du tableau GatorDownBuffer par les valeurs du tampon d'indicateur sous l'index 2
   if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0)
     {
      //--- si le copiage n'a pas réussi, annonçons le code de l'erreur
      PrintFormat("On n'a pas réussi à copier les données de l'indicateur iGator, le code de l'erreur %d",GetLastError());
      //--- terminerons avec le résultat nul - cela signifie que l'indicateur sera considéré comme non calculé
      return(false);
     }
 
//--- remplissons la partie du tableau GatorDownColors par les valeurs du tampon d'indicateur sous l'index 3
   if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0)
     {
      //--- si le copiage n'a pas réussi, annonçons le code de l'erreur
      PrintFormat("On n'a pas réussi à copier les données de l'indicateur iGator, le code de l'erreur %d",GetLastError());
      //--- terminerons avec le résultat nul - cela signifie que l'indicateur sera considéré comme non calculé
      return(false);
     }
//--- tout a réussi
   return(true);
  }
//+------------------------------------------------------------------+
//| Indicator deinitialization function                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
//--- effaçons le graphique à la suppression de l'indicateur
   Comment("");
  }