【MQL4定数】初期化関数の戻り値の定数(ENUM_INIT_RETCODE)

【辞書】MQLリファレンス

初期化関数の戻り値の定数(ENUM_INIT_RETCODE)

初期化関数の戻り値の定数(ENUM_INIT_RETCODE)は、OnInit関数の戻り値として使われる定数です。

初期化が成功したのか、失敗したのかを戻すことができます。

初期化関数の戻り値の定数(ENUM_INIT_RETCODE)

定数説明
INIT_SUCCEEDED初期化成功
INIT_FAILED初期化失敗
INIT_PARAMETERS_INCORRECTパラメータに異常値が代入されている
INIT_AGENT_NOT_SUITABLEメモリ不足などの問題が発生

初期化関数の戻り値の定数の使い方

主に、OnInit関数で使用されます。

OnInit関数の戻り値として記述します。

システムで自動的に戻る定数ではなく、開発者が戻す定数なので、戻す定数を間違えないように注意しましょう。

例えば、以下のように使用します。

//異常値を検出するためのパラメータ
input int ma_period=10;

int OnInit()
  {


   //パラメータが異常かどうかをチェック
   if(ma_period <= 0)
     {
      //パラメータが異常なので、INIT_PARAMETERS_INCORRECT定数を戻す
      return (INIT_PARAMETERS_INCORRECT);
     }


   //メモリに異常がないかチェック
   int memory = TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
   if(memory < 2000)
     {
      //メモリが異常なので、INIT_AGENT_NOT_SUITABLE定数を戻す
      return (INIT_AGENT_NOT_SUITABLE);
     }


   //その他異常がないかチェック
   double ma = iMA(Symbol(), PERIOD_CURRENT, 14, 0, MODE_SMA, PRICE_CLOSE, 0);
   if(ma <= 0)
     {
      //値が異常なので、INIT_FAILED定数を戻す
      return(INIT_FAILED);
     }


   //正常なので、INIT_SUCCEEDED定数を戻す
   return(INIT_SUCCEEDED);
  }

ほとんどの場合、成功(INIT_SUCCEEDED)と異常(INIT_FAILED)の定数を使えば良いので、この2つを覚えておくと良いでしょう。

サンプルプログラム

以下は、初期化関数の戻り値の定数(ENUM_INIT_RETCODE)を活用したEAのサンプルプログラムです。

OnInit関数内で各種チェックを行い、適切な定数を返しています。初期化に成功した場合のみOnTick関数で移動平均線の値をログに出力します。

//+------------------------------------------------------------------+
//| ENUM_INIT_RETCODE サンプルプログラム                              |
//+------------------------------------------------------------------+
#property strict

//--- 入力パラメータ
input int    InpMaPeriod   = 14;    // 移動平均の期間
input double InpLotSize    = 0.1;   // ロットサイズ

//--- グローバル変数
double g_maValue;

//+------------------------------------------------------------------+
//| 初期化関数                                                        |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- パラメータが異常かどうかをチェック
   if(InpMaPeriod <= 0)
     {
      Print("エラー: 移動平均の期間が不正です。期間=", InpMaPeriod);
      return(INIT_PARAMETERS_INCORRECT);
     }

   //--- ロットサイズが異常かどうかをチェック
   if(InpLotSize <= 0 || InpLotSize > 10.0)
     {
      Print("エラー: ロットサイズが不正です。ロット=", InpLotSize);
      return(INIT_PARAMETERS_INCORRECT);
     }

   //--- メモリに異常がないかチェック
   int memory = TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
   if(memory < 2000)
     {
      Print("エラー: メモリが不足しています。メモリ=", memory, "MB");
      return(INIT_AGENT_NOT_SUITABLE);
     }

   //--- 移動平均の値を取得してチェック
   g_maValue = iMA(Symbol(), PERIOD_CURRENT, InpMaPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   if(g_maValue <= 0)
     {
      Print("エラー: 移動平均の値が取得できませんでした。");
      return(INIT_FAILED);
     }

   //--- すべてのチェックに問題なし
   Print("初期化成功: 移動平均期間=", InpMaPeriod, " ロット=", InpLotSize);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| ティック関数                                                      |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- 移動平均の最新値を取得
   g_maValue = iMA(Symbol(), PERIOD_CURRENT, InpMaPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);

   //--- 現在の価格と移動平均の値をログに出力
   double currentPrice = Close[0];
   Print("現在価格=", currentPrice, " 移動平均=", g_maValue);

   //--- 価格が移動平均より上か下かを判定
   if(currentPrice > g_maValue)
     {
      Print("現在価格は移動平均より上です(買いシグナル)");
     }
   else
     {
      Print("現在価格は移動平均より下です(売りシグナル)");
     }
  }

//+------------------------------------------------------------------+
//| 終了関数                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print("EAを終了します。理由コード=", reason);
  }

このサンプルでは、OnInit関数内で以下の4つのチェックを行っています。

  • 移動平均の期間チェック:0以下の場合はINIT_PARAMETERS_INCORRECTを返す
  • ロットサイズのチェック:0以下または10を超える場合はINIT_PARAMETERS_INCORRECTを返す
  • メモリのチェック:メモリが不足している場合はINIT_AGENT_NOT_SUITABLEを返す
  • 移動平均値の取得チェック:値が取得できない場合はINIT_FAILEDを返す

すべてのチェックに問題がなければ、INIT_SUCCEEDEDを返して正常に初期化が完了します。

【補足】初期化関数の戻り値の定数の列挙型(ENUM_INIT_RETCODE)

初期化関数の戻り値の定数は、ENUM_INIT_RETCODEという列挙型に含まれています。

列挙型は、定数群をひとまとめにしたものです。

以下のように使います。

ENUM_INIT_RETCODE initRetcode = INIT_SUCCEEDED;

上記のようにプログラムすると、initRetcode変数に INIT_SUCCEEDEDの値が代入されます。