【MQL5】OnInit関数の使い方と自動売買実装コード

1. OnInit関数の概要と実務での活用法

OnInit関数は、MQL5プログラム(EA、インジケーター、スクリプト)がチャートにロードされた直後に、「一度だけ」実行される初期化イベントハンドラです。オブジェクト指向言語におけるコンストラクタに近い役割を担います。

実務開発において、OnInitは単に「準備をする場所」ではありません。プロのクオンツエンジニアは、ここで「このEAが安全に稼働できる環境か?」を厳格にチェックするゲートキーパーとして活用します。

具体的には、以下の処理を行います。
– 入力パラメータの妥当性チェック(例:ストップロスが0以下になっていないか)
– インジケーターのハンドル(計算の準備)の取得
– 取引条件の確認(スプレッド制限や最小ロット数の確認)
– チャート上のGUI(ボタンやラベル)の生成

初心者がつまずきやすいポイントは、「OnInitでエラーが起きても無理やり動かしてしまう」ことです。不適切な設定で稼働を強行すると、意図しない大損失に繋がるため、異常があれば即座に稼働を停止させる設計が求められます。

2. 構文と戻り値

OnInit関数の基本構文は以下の通りです。

int OnInit()
{
   // 初期化処理をここに記述

   return(INIT_SUCCEEDED); // 正常終了
}

戻り値の意味

MQL5では、OnInitが何を返すかによってその後のプログラムの挙動が決まります。

  • INIT_SUCCEEDED (0): 初期化成功。そのままOnTickなどの処理へ移行します。
  • INIT_PARAMETERS_INCORRECT: パラメータが不正であると判断し、プログラムをチャートから削除します(ユーザーに設定修正を促す場合に便利)。
  • INIT_FAILED: 初期化に失敗したため、プログラムをチャートから削除します。

3. 具体的な使い方・実践サンプルコード

以下は、実戦を想定したEAの初期化コードの例です。移動平均線(MA)のハンドル取得と、アカウントの安全チェックを行っています。

//--- 入力パラメータ
input int      InpMAPeriod = 20;          // 移動平均の期間
input double   InpMaxSpread = 2.0;        // 許容最大スプレッド(pips)

//--- グローバル変数
int            handleMA;                  // インジケーターのハンドル保持用

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // 1. パラメータの妥当性チェック
   if(InpMAPeriod <= 0)
   {
      Print("エラー:MA期間は1以上に設定してください。");
      return(INIT_PARAMETERS_INCORRECT);
   }

   // 2. インジケーターハンドルの作成
   // iMA関数で移動平均の計算準備を行う
   handleMA = iMA(_Symbol, _Period, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE);

   if(handleMA == INVALID_HANDLE)
   {
      Print("エラー:MAハンドルの取得に失敗しました。");
      return(INIT_FAILED);
   }

   // 3. アカウント環境の確認(リアル口座のみ許可する場合など)
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_REAL)
   {
      Print("【注意】リアル口座での稼働を開始します。");
   }

   // 全てのチェックを通過
   Print("初期化成功:システムを開始します。");
   return(INIT_SUCCEEDED);
}

4. 使用上の注意点とよくあるエラー

① 再初期化のタイミングを理解する

OnInitはロード時だけでなく、「チャートの時間軸を変更したとき」や「パラメータを変更したとき」にも再実行されます。
時間軸を変えるたびに重い計算を最初からやり直すと、一瞬フリーズする原因になります。必要に応じて、前の状態を破棄(OnDeinit)する処理とセットで考えましょう。

② エラーコードを確認しない

iMAiRSIなどの関数でハンドルを取得する際、失敗したのにそのまま進めてしまうと、OnTick内で参照したときに致命的なエラー(プログラム停止)を招きます。必ずサンプルコードのように、戻り値が INVALID_HANDLE でないか確認してください。

③ 過去データの不足

OnInitのタイミングでは、まだチャートのヒストリーデータ(過去足)が十分に読み込まれていない場合があります。初期化で過去の統計値を計算する際は、データが利用可能かチェックするロジックを組み込むのが中級者への第一歩です。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズム取引において、どれほど完璧なOnInitの実装を行っても、プログラムを動かす「物理的な環境」が劣悪であれば利益は残りません。FXの世界では、ミリ秒(1000分の1秒)単位の遅延が「滑り(スリッページ)」を引き起こし、本来得られるはずだった利益を削り取っていきます。特に、家庭用PCから一般的なインターネット回線を通じて注文を出す場合、ネットワークのゆらぎやPCのOSアップデートによる再起動など、予期せぬリスクが常に付きまといます。

機関投資家やプロのトレーダーが例外なく専用のVPS(仮想専用サーバー)を利用するのは、物理的な距離を縮めてネットワーク遅延を極限まで抑えるためです。ブローカーのサーバーに近いデータセンターに設置されたVPS上でEAを稼働させることは、もはやオプションではなく「必須のインフラ」です。24時間365日の安定稼働と、一瞬のチャンスを逃さない約定スピードを確保して初めて、あなたのアルゴリズムは真の性能を発揮することができます。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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