iCustom

Rend le handle de l'indicateur indiqué d'utilisateur.

int  iCustom(
   string           symbol,     // nom du symbole
   ENUM_TIMEFRAMES  period,     // période
   string           name        // dossier/le nom de_l'indicateur d'utilisateur
   ...                          // liste des paramètres d'entrée de l'indicateur
   );

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.

name

[in]  Si le backslash '\' est indiqué avant le nom de l'indicateur personnalisé, le fichier EX5 de l'indicateur est recherché par rapport au dossier racine MQL5. Ainsi, pour un appel de iCustom(Symbol(), Period(), "\FirstIndicator"...), l'indicateur sera chargé depuis MQL5\FirstIndicator.ex5. Si le fichier est introuvable sur ce chemin, l'erreur 4802 (ERR_INDICATOR_CANNOT_CREATE) est renvoyée.

Si le chemin ne commence pas par un backslash '\', l'indicateur est recherché et chargé en fonction de la séquence d'actions suivante :

  • Le fichier EX5 est recherché dans le même dossier, où se trouve l'EX5 du programme appelant. Par exemple, l'Expert Advisor CrossMA.EX5 est situé dans MQL5\Experts\MyExperts. Il contient l'appel suivant : iCustom(Symbol(), Period(), "SecondIndicator"...). Dans ce cas, l'indicateur est recherché dans MQL5\Experts\MyExperts\SecondIndicator.ex5
  • Si l'indicateur n'est pas trouvé, une recherche relative au répertoire racine Indicators est effectuée : MQL5\Indicators. Ainsi, le fichier MQL5\Indicators\SecondIndicator.ex5 est recherché. Si l'indicateur n'est pas trouvé, la fonction renvoie INVALID_HANDLE et l'erreur 4802 (ERR_INDICATOR_CANNOT_CREATE) est déclenchée.

Si le chemin de l'indicateur est défini dans un sous-répertoire tel que MyIndicators\ThirdIndicator, la recherche démarre dans le dossier du programme appelant (l'Expert Advisor se trouve dans le dossier MQL5\Experts\MyExperts) au chemin suivant : MQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5. En cas d'échec, le fichier MQL5\Indicators\MyIndicators\ThirdIndicator.ex5 est recherché. Veuillez noter que le séparateur de chemin doit être spécifié par un double backslash '\\'. Par exemple : iCustom(Symbol(), Period(), "MyIndicators\\ThirdIndicator"...)

...

[in] les paramètres input de l'indicateur d'utilisateur divisés par les virgules. Le type et l'héritage des paramètres doit correspondre. Si les paramètres ne sont pas indiqués, on utilise les valeurs par défaut.

La valeur rendue

Rend le handle de l'indicateur technique indiqué, en cas de l'échec rend INVALID_HANDLE.

Note

L'indicateur d'utilisateur doit être compilé (le fichier avec l'extension EX5) et se trouver dans le directoire MQL5/Indicators du terminal de client ou le sous-répertoire inclus.

Les indicateurs nécessaires au test sont définis automatiquement de l'appel des fonctions, iCustom(), si le paramètre correspondant est spécifié par la ligne constante. Pour les autres cas (l'utilisation de la fonction IndicatorCreate() ou l'utilisation de la ligne non constante dans le paramètre qui spécifie le nom de l'indicateur) la propriété donnée #property tester_indicator est nécessaire:

#property tester_indicator "indicator_name.ex5"

Si dans l'indicateur on utilise la première forme de l'appel, au lancement de l'indicateur d'utilisateur sur l'onglet "Parameters" on peut indiquer supplémentairement sur quelles données il sera calculé. Si le paramètre "Apply to" n'est pas choisi évidemment, par défaut le calcul est produit selon les valeurs "Close".

Le choix de la série temporelle pour le calcul de l'indicateur

A l'appel de l'indicateur d'utilisateur du programme mql5 le paramètre Applied_Price ou le handle d'un autre indicateur doit être transmis le dernier après toutes les variables d'entrée prévues par l'indicateur d'utilisateur.

Voir aussi

Propriétés des programmes, Accès aux séries temporelles et les données des indicateurs, IndicatorCreate(), IndicatorRelease()

Exemple:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- indicator buffers
double         Label1Buffer[];
//--- handle de l'indicateur d'utilisateur Custom Moving Average.mq5
int MA_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ResetLastError();
   MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                     MA_Period,
                     MA_Shift,
                     MA_Method,
                     PRICE_CLOSE // calculons selon les prix de la clôture
                     );
   Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
   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[])
  {
//--- copions les valeurs de l'indicateur Custom Moving Average à notre tampon d'indicateur
   int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
   Print("copy = ",copy,"    rates_total = ",rates_total);
//--- si la tentative est ratée - signalez-le
   if(copy<=0)
      Print("La tentative ratée de recevoir les valeurs de l'indicateur  Custom Moving Average");
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+