【MQL5】IndicatorRelease関数について

MQL5リファレンス
スポンサーリンク

IndicatorRelease関数の働き・役割

IndicatorRelease関数は、使用されていない指標のハンドルを削除し、その計算ブロックを解放するために使用されます。

IndicatorRelease関数は特に、指標がもはや必要でなくなった場合、または新しい指標に置き換えたい場合などに役立ちます。

IndicatorRelease関数の引数について

IndicatorRelease関数引数には解放したい指標の「ハンドル」を指定します。

bool  IndicatorRelease(
  int      indicator_handle    // 指標ハンドル
  );

ハンドルとは、特定の指標を識別するための一意(=同じものが存在しない)の数値です。

例えば、iMA関数を使用して移動平均ハンドルを取得した場合、このハンドルIndicatorRelease関数に渡してその指標を解放することができます。

ハンドルについては↓の記事をご参照ください

IndicatorRelease関数の戻り値について

IndicatorRelease関数戻り値は、処理が成功時にtrueを、失敗時にfalseを返します

IndicatorRelease関数を使う際の注意点

IndicatorRelease関数を使う際には解放しようとするハンドルが有効であることを確認することです。無効なハンドルを渡すと、IndicatorRelease関数の処理は失敗します。

また、ストラテジーテスター環境ではIndicatorRelease関数は実行されませんので、実際の取引環境でのみ使用するようにしましょう。

IndicatorRelease関数を使う局面ってどんな時?

IndicatorRelease関数を使う局面、すなわち冒頭の『IndicatorRelease関数の働き・役割』セクションで書いた、「指標がもはや必要でなくなった場合、または新しい指標に置き換えたい場合」というのは具体的にどんな時でしょうか?主に以下のような局面での使用が考えられます。

最適化のための指標の交換

システムトレードを最適化する過程で、異なる指標を試す必要がある場合、IndicatorRelease関数で古い指標を解放して新しい指標に交換します。たとえば、単純移動平均(SMA) から指数平滑移動平均 (EMA) への切り替えをテストする、といった局面での使用が考えられます。

条件付き指標の使用

ある特定の市場条件下でのみ特定の指標を使用し、条件が変わったらIndicatorRelease関数でその指標を解放する場合などの利用法です。

例えば、ボラティリティが高い市場状況でのみ特定の指標を使用し、ボラティリティが低下したら解放する、といった利用が考えられます。

リソースの節約

複数の指標を同時に使用している中で、リアルタイムのトレードに必要ない指標はメモリ使用量を減らすためにIndicatorRelease関数でリソースを解放する、といった利用法も考えられます。

特に、限られたリソースの中で効率的に運用する必要がある場合に重要です。

エラーの発生後のクリーンアップ

指標がエラーを発生させたり、予期せぬ結果をもたらしたりした場合、IndicatorRelease関数でその指標をシステムから解放し、改めて正しく機能する指標を設置する、といった利用法も考えられます。

システムの終了時

システムを停止する際に、使用していた指標のハンドルを全て解放し、メモリをクリーンな状態に戻すためにIndicatorRelease関数を使用します。

これらのシナリオは、トレーディングシステムが動的に指標を使用し(=「市場の変動に合わせて、その時々で最適なトレーディングの指標を選んで使う」)、それに応じてリソースを管理する必要がある場合に特に重要です。常に最適な指標を使用しながら、システムのパフォーマンスを維持するために、IndicatorRelease関数が役立ちます。

IndicatorRelease関数を使ったサンプルコード

以下のサンプルコードはIndicatorRelease関数を利用したものです↓

// 入力パラメータの定義
input int               MA_Period=15;        // 移動平均の期間
input int               MA_shift=0;          // 移動平均のシフト
input ENUM_MA_METHOD    MA_smooth=MODE_SMA;  // 移動平均の平滑化方法(ここでは単純移動平均)
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;  // 移動平均を計算するための価格タイプ

// 指標ハンドルを格納する変数を宣言(初期値は無効なハンドル)
int MA_handle=INVALID_HANDLE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  // 指標ハンドルを作成し、移動平均指標に関連付ける
  MA_handle=iMA(Symbol(),0,MA_Period,MA_shift,MA_smooth,PRICE_CLOSE);
  
  // グローバル変数が存在するかチェックし、存在すれば削除
  if(GlobalVariableCheck("MA_value"))
    GlobalVariableDel("MA_value");

  // 初期化が成功したことを示す
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  // グローバル変数'MA_value'が存在しない場合のみ処理を実行
  if(!GlobalVariableCheck("MA_value"))
  {
    // 指標ハンドルが有効ならば指標値を取得する試みを行う
    if(MA_handle!=INVALID_HANDLE)
    {
      // 指標値を格納するための動的配列を宣言
      double values[];
      // 最新の2つのバーにおける指標値を配列にコピーし、その数が2つであることを確認
      if(CopyBuffer(MA_handle,0,0,2,values)==2 && values[0]!=EMPTY_VALUE)
      {
        // 最後から2番目のバーの指標値をグローバル変数に保存
        if(GlobalVariableSet("MA_value",values[0]))
        {
          // 指標ハンドルを解放し、それが成功したかをチェック
          if(!IndicatorRelease(MA_handle))
            Print("IndicatorRelease() failed. Error ", GetLastError());
          else 
            MA_handle=INVALID_HANDLE; // 解放に成功したらハンドルを無効にする
        }
        else
        {
          // グローバル変数の設定に失敗した場合のエラーメッセージ
          Print("GlobalVariableSet failed. Error ", GetLastError());
        }
      }
    }
  }
}

上記サンプルコードには以下の挙動が記述されています。

初期化(OnInit関数)

まずOnInit関数内での初期化処理です。

移動平均の指標ハンドルを生成します。iMA関数は、指定されたシンボルとチャート上で移動平均を計算するために使用されます。

MA_Period, MA_shift, MA_smooth, そして priceinput変数として設定されておりユーザーからの入力に基づいています。

input変数については↓の記事をご参照ください

また、Global変数「MA_value」が存在するかを確認し、存在する場合は削除します。これは、EAが再起動されたときに古い値が残らないようにするためです。

初期化が成功した場合、INIT_SUCCEEDEDを返します。

新しい価格が来た際の処理(OnTick関数)

続いてOnTick関数内の処理についてです。

  • まず、Global変数「MA_value」が存在するかどうかを確認します。存在しない場合のみ、次のステップに進みます。
  • MA_handleが有効な場合(INVALID_HANDLEでない場合)、最新のバーから2つの移動平均の値を取得しようとします。
  • CopyBuffer関数を使って指標ハンドルからバッファのデータを読み取り、最後から2番目のバー(values[0])の移動平均の値を取得します。この値がEMPTY_VALUEでないことを確認します。
  • Global変数MA_valueにこの移動平均の値を設定します。
  • 値の設定に成功したら、IndicatorRelease関数を使用して指標ハンドルを解放し、メモリを節約します。これにより、その指標はもはや計算や表示に使用されなくなります。
  • IndicatorRelease関数が失敗した場合は、エラーメッセージを出力します。
  • グローバル変数の設定に失敗した場合も、エラーメッセージを出力します。

このサンプルコードは、トレードシステムの動的な部分(=トレードシステムが柔軟に対応し、自動的に変化に適応する機能)を示しており、特定の条件下で指標の値をグローバル変数に保存し、それが成功したら指標ハンドルを解放してリソースを管理しています。

————————————————————————————–

※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる

<MQL5でEAを作ろう講座>

をメインコンテンツとして展開しています。

【言語基礎編】

【中級実際にEAを作ろう編】

【発展編・MT5用EAを作る工程をカスタマイズしていく】

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

タイトルとURLをコピーしました