iCustom

この関数は指定されたカスタム指標ハンドルを返します。

int  iCustom(
  string          symbol,    // 銘柄名
  ENUM_TIMEFRAMES  period,    // 期間
  string          name        // フォルダ/カスタム指標名
  ...                          // 指標入力パラメータのリスト
  );

パラメータ

symbol

[in] データが指標計算に使用される有価証券の銘柄名(NULL は現在のシンボル)

period

[in] 期間の値は ENUM_TIMEFRAMES 列挙の値の 1 つで、0 は現在の時間軸の意味です。

name

[in] カスタム指標名の前にバックスラッシュ(\)が示されている場合、EXL指標ファイルはMQL5ルートフォルダーに対して相対的に検索されます。例えば、iCustom(Symbol(), Period(), "\FirstIndicator"...)が呼び出された場合、指標はMQL5\FirstIndicator.ex5として読み込まれます。このパスでファイルが見つからない場合、エラー4802 (ERR_INDICATOR_CANNOT_CREATE)が返されます。

パスが「\」で始まらない場合、指標は次のように検索およびダウンロードされます。

  • まず、指標EX5ファイルが、呼び出しプログラムのEX5ファイルが置かれているフォルダーで検索されます。例えば、CrossMA.EX5 EAがMQL5\Experts\MyExpertsにあって、iCustom呼び出し(Symbol(), Period(), "SecondIndicator"...)が含まれるとすると、指標はMQL5\Experts\MyExperts\SecondIndicator.ex5で検索されます。
  • 同じディレクトリで指標がが見つからない場合、MQL5\Indicators指標ルートディレクトリに早退した検索が実行されます。つまり、MQL5\Indicators\SecondIndicator.ex5ファイルの検索が実行されます。それでも指標が見つからない場合、関数はINVALID_HANDLEを返してエラー4802 (ERR_INDICATOR_CANNOT_CREATE)が発生します。

指標へのパスがサブディレクトリ(例: MyIndicators\ThirdIndicator)に設定されている場合、検索は最初に呼び出し側プログラムフォルダーMQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5で実行されます(EAはMQL5\Experts\MyExpertsにある)。失敗した場合、MQL5\Indicators\MyIndicators\ThirdIndicator.ex5ファイルの検索が実行されます。呼び出しでは、パスの区切り文字として必ず二重逆スラッシュ「\\」を使用してください(例: iCustom(Symbol(), Period(), "MyIndicators\\ThirdIndicator"...))

...

[in]  コンマで区切られたカスタム指標の入力パラメータパラメータの種類と順序が一致している必要があります。パラメータの指定がない場合は初期値が使用されます。

戻り値

指定されたテクニカル指標ハンドル。失敗の場合 INVALID_HANDLEIndicatorRelease() 関数に指標ハンドルを渡すことによって 、コンピュータメモリを利用されていない指標から解放することが出来ます。

注意事項

カスタム指標はコンパイルされて( EX5 拡張子) クライアント端末の MQL5/Indicators ディレクトリかそのサブディレクトリに置かれなければなりません。

テストが必要な指標は、パラメータが文字列定数で設定されていれば、iCustom() 関数の呼び出しから自動的に定義されています。他の全ての場合(IndicatorCreate() 関数の使用や指標名を設定するパラメータでの非定数文字列の使用)#property tester_indicator プロパティが必要です。

#property tester_indicator "indicator_name.ex5"

指標が最初の呼び出し形式を使用する場合、カスタム指標を使い始める時に、その「パラメータ」タブで、計算のためのデータを指定することが出来ます。「適用価格」パラメータが明確に選択されていない場合、デフォルト計算は終値に基づきます。

指標計算に使用する時系列の選択

MQL5 プログラムからカスタム指標が呼ばれる場合、Applied_Price パラメータまたは別の指標ハンドルは、カスタム指標の他の入力パラメータ全ての後で受け渡しされるべきです。

参照

プログラムプロパティ時系列と指標へのアクセスIndicatorCreate()IndicatorRelease()

例:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- Label1 をプロットする
#property indicator_label1 "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//--- 入力パラメータ
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- 指標バッファ
double         Label1Buffer[];
//--- Custom Moving Average.mq5 カスタム指標ハンドル
int MA_handle;
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                            |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- 指標バッファマッピング
  SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
  ResetLastError();
  MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                    MA_Period,
                    MA_Shift,
                    MA_Method,
                    PRICE_CLOSE // 終値の使用
                    );
  Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| カスタム指標の反復関数                                                |
//+------------------------------------------------------------------+
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[])
 {
//--- 指標 Custom Moving Average の値を指標バッファに複製する
  int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
  Print("copy = ",copy,"    rates_total = ",rates_total);
//--- I試みが失敗したら報告する
  if(copy<=0)
    Print("An attempt to get the values if Custom Moving Average has failed");
//--- 次の呼び出しのために prev_calculated の値を返す
  return(rates_total);
 }
//+------------------------------------------------------------------+