iCustom

La funzione restituisce l'handle di un indicatore personalizzato specificato.

int  iCustom(
   string           symbol,     // nome simbolo
   ENUM_TIMEFRAMES  period,     // periodo
   string           name        // cartella/nome_indicatore_personalizzato
   ...                          // elenco dei parametri di unput dell'indicatore
   );

Parametri

symbol

[in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare l'indicatore. Il valore NULL significa il simbolo corrente.

period

[in] Il valore del periodo può essere uno dei valori ENUM_TIMEFRAMES, 0 significa il corrente timefreame.

name

[in] Nome dell'indicatore personalizzato (custom indicator). Se il nome inizia con la barra inversa '\', il file dell'indicatore EX5 viene ricercato rispetto alla directory principale MQL5\. Pertanto, quando si chiama iCustom(Simbol(), Period(), "\FirstIndicator "...), l'indicatore viene scaricato come MQL5\FirstIndicator.ex5. Se il percorso non contiene file, si verifica l'errore 4802 (ERR_INDICATOR_CANNOT_CREATE).

Se il percorso non inizia con '\', l'indicatore viene cercato e scaricato come segue:

  • Innanzitutto, il file indicatore EX5 viene cercato nella cartella in cui si trova il file EX5 del programma chiamante. Ad esempio, CrossMA.EX5 EA si trova in MQL5\Experts\MyExperts e contiene la chiamata iCustom (Symbol(), Period(), "SecondIndicator" ...). In questo caso, l'indicatore viene cercato in MQL5\Experts\MyExperts\SecondIndicator.ex5.
  • Se l'indicatore non viene trovato nella stessa directory, la ricerca viene eseguita in relazione alla directory principale dell'indicatore MQL5\Indicators. In altre parole, viene eseguita la ricerca del file MQL5\Indicators\SecondIndicator.ex5. Se l'indicatore non viene trovato ancora, la funzione restituisce INVALID_HANDLE e viene generato l'errore 4802 (ERR_INDICATOR_CANNOT_CREATE).

Se il percorso dell'indicatore è impostato nella sottodirectory (ad esempio MyIndicators\ThirdIndicator), la ricerca viene prima eseguita nella cartella del programma chiamante (l'EA si trova in MQL5\Experts\MyExperts) in MQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5. In caso di esito negativo, viene eseguita la ricerca del file MQL5\Indicators\MyIndicators\ThirdIndicator.ex5. Assicurati di usare la doppia barra inversa '\\' come separatore nel percorso, ad esempio iCustom (Symbol(), Period(), "MyIndicators\\ThirdIndicator"...)

...

[in]parametri-di-input- di un indicatore personalizzato, separati da virgole. Tipo ed ordine con cui i parametri devono corrispondere. Se non ci sono i parametri specificati, allora verranno utilizzati valori predefiniti.

Valore restituito

Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce INVALID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più utilizzato, utilizzando la funzione IndicatorRelease(), al quale l'handle indicatore viene passato.

Nota

Un indicatore personalizzato deve essere compilato (con estensione EX5) e si trova nella directory MQL5/Indicators del terminale client o la sua sottodirectory.

Indicatori che richiedono il testing vengono definiti automaticamente dalla chiamata della funzione iCustom(), se il parametro corrispondente è impostato attraverso la costante stringa. Per tutti gli altri casi (utilizzo della funzione IndicatorCreate() o uso di una stringa non-costante nel parametro che imposta il nome indicatore) la proprietà #property tester_indicator è necessaria:

#property tester_indicator "indicator_name.ex5"

Se la prima forma di chiamata viene utilizzata nell'indicatore, allora all'avvio dell' indicatore personalizzato è possibile inoltre indicare i dati per il calcolo nella sua scheda "Parametri". Se il parametro "Applica a" non è selezionato in modo esplicito, il calcolo predefinito è basato sui valori dei prezzi "Close".

Selezione di una timeseries per calcolare un indicatore

Quando si chiama un indicatore personalizzato da un programma MQL5, il parametro Applied_Price o un handle di un altro indicatore dovrebbe essere passato per ultimo, dopo tutte le variabili di input dell'indicatore personalizzato.

Vedi anche

Proprietà del programma, TimeSeries ed Accesso Indicatori,IndicatorCreate(), IndicatorRelease()

Esempio:

#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
//--- parametri di input
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- buffers indicatore
double         Label1Buffer[];
//--- Handle dell'indicatore personalizzato Custom Moving Average.mq5
int MA_handle;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ResetLastError();
   MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                     MA_Period,
                     MA_Shift,
                     MA_Method,
                     PRICE_CLOSE // usando i prezzi close
                     );
   Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                                |
//+--------------------------------------------------------------------------------+
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[])
  {
//--- Copiare i valori dell'indicatore Custom Moving Average nel nostro buffer di indicatore
   int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
   Print("copy = ",copy,"    rates_total = ",rates_total);
//--- Se il nostro tentativo è fallito - Segnala questo
   if(copy<=0)
      Print("Il tentativo di ottenere i valori di Custom Moving Average è fallito");
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+