//+------------------------------------------------------------------+
//| 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("");
}
|