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

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

MQL5におけるOnStart関数は、「スクリプト(Script)」プログラムが起動された際に、一度だけ自動的に実行されるエントリーポイントです。

EA(エキスパートアドバイザー)が「価格が動くたび(OnTick)」に動くのに対し、スクリプトは「ユーザーがチャートに投げ入れた瞬間」に処理を開始し、処理が終わればそのまま終了します。

実務での活用シーン

実務開発において、OnStartは以下のような用途で重宝されます。
* 一括処理: 「全ポジションを成行で一括決済する」「すべての待機注文を削除する」といった、手動では時間がかかる作業の自動化。
* データ抽出: 過去のチャートデータをCSVに出力したり、特定の計算ロジックを1回だけテストしたりする検証作業。
* 一発発注: 複雑なロット計算(資金の○%をリスクにさらす等)を瞬時に行い、即座にエントリーするツール。

初心者がつまずきやすい点

最も多いミスは、「EA(自動売買プログラム)」と「スクリプト」を混同することです。EAにOnStartを記述しても動作しません。また、スクリプトは一度処理が終わると終了してしまうため、ループ処理(while文など)を適切に組まないと、継続的な監視には向かないという特性を理解しておく必要があります。


2. 構文と戻り値

OnStart関数の構造は非常にシンプルです。引数はなく、戻り値もありません。

void OnStart()
{
   // ここに実行したい処理を記述します
}
  • : void(戻り値なし)
  • パラメーター: なし
  • 所属: スクリプトプログラム(.mq5ファイルでスクリプトとして作成されたもの)専用。

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

以下は、実務で役立つ「特定の通貨ペアの全ポジションをボタン一つで一括決済する」スクリプトの例です。

//+------------------------------------------------------------------+
//|                                              PositionCleaner.mq5 |
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property script_show_inputs // 入力画面を表示させる
#include <Trade\Trade.mqh>   // 取引クラスをインクルード

//--- 入力パラメーター
input string TargetSymbol = ""; // 決済する通貨ペア(空なら全ペア)

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   CTrade trade; // 取引クラスのインスタンス化

   // 現在持っているすべてのポジションをループで確認
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      // ポジションのチケット番号を取得
      ulong ticket = PositionGetTicket(i);

      if(PositionSelectByTicket(ticket))
      {
         string symbol = PositionGetString(POSITION_SYMBOL);

         // 指定した通貨ペア、またはTargetSymbolが空なら決済実行
         if(TargetSymbol == "" || symbol == TargetSymbol)
         {
            Print(symbol + " のポジション(チケット: " + (string)ticket + ")を決済します。");

            // ポジションを閉じる
            trade.PositionClose(ticket);

            // エラーチェック
            if(trade.ResultRetcode() != TRADE_RETCODE_DONE)
            {
               Print("決済失敗: ", trade.ResultRetcodeDescription());
            }
         }
      }
   }

   Print("一括処理が完了しました。");
}

コードの解説

  1. #property script_show_inputs: 実行時に設定画面を出し、パラメータを入力できるようにします。
  2. CTradeクラス: MQL5標準の取引ライブラリを使用し、複雑な注文処理を簡略化しています。
  3. 逆回りのforループ: ポジションを決済するとインデックスがずれるため、後ろの番号から順に処理するのが定石です。

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

① 無限ループによるフリーズ

while文などで価格監視を続けるスクリプトを作る場合、IsStopped() 関数を条件に入れないと、チャートから削除してもプログラムが終了せず、MT5全体の動作が重くなる(あるいはフリーズする)原因になります。

② 取引コンテキストの競合

スクリプトは非常に高速に動作するため、連続して注文を出すとサーバー側で「Trade is disabled」や「Too frequent requests(頻繁すぎるリクエスト)」エラーが出ることがあります。必要に応じて Sleep(100) などの待機時間を挟むのが実務的な Tips です。

③ 「EA」のフォルダに入れてしまう

スクリプトは MQL5/Scripts フォルダに保存する必要があります。Experts フォルダに入れてしまうと、MT5のナビゲーターパネルで表示が切り分けられず、正しく起動できない場合があります。


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

アルゴリズムトレードにおいて、ロジックの優位性と同じくらい重要なのが「物理的な実行環境」です。自宅のPCから一般的なインターネット回線を通じて注文を出す場合、プロバイダーの混雑や Wi-Fi の不安定さにより、数十から数百ミリ秒の遅延(レイテンシ)が発生します。この遅延は、急変時のスリッページや約定拒否を招き、バックテストの結果とはかけ離れた致命的な損失を生む原因となります。

クオンツエンジニアの視点では、極限まで約定スピードを高めるために、取引サーバーの物理的な所在地(ロンドンやニューヨークなど)に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」を利用することはもはや常識です。ネットワーク遅延を1ミリ秒単位で削ることで、初めて優位性のあるロジックがその真価を発揮します。安定した24時間の稼働と、機関投資家に引けを取らない通信環境を確保することが、プロのシストレ開発者への第一歩と言えるでしょう。

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

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

コメント

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