初期化関数の戻り値の定数(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の値が代入されます。





