MQL5 Expert Advisor開発 パート1:安全な骨組みを作ってテストする

MQL5 Expert Advisor開発 パート1:安全な骨組みを作ってテストする

第1回の目標は意図的に小さくします。本物のMQL5 Expert Advisorを作成し、コンパイルして、注文を一切出さずにMetaTrader 5 Strategy Testerで実行します。資金や売買ロジックを持ち込む前に、ツール一式が動くことを確かめ、OnInit()OnTick()OnDeinit()を理解するのが目的です。

この記事の2019年版は、MQL5というタイトルに対してMetaTrader 4のダウンロード先、MQL4 Wizard、MT4の画面写真を混在させていました。それらの画像は今回使いません。過去のMT4画面であり、現在のMQL5手順を正しく案内するものではありません。また、現在のMetaTrader 5もビルドによって配置が異なる場合があります。

これはソフトウェア開発のチュートリアルであり、Expert Advisorが利益を出すという主張ではありません。この演習では自動売買を無効のままにし、Strategy Testerとデモ口座を使ってください。戦略、リスク上限、障害時の挙動、運用手順を独立に検証するまでは、後続の実験もライブ口座へ移してはいけません。

MetaTrader 5、MQL5、ファイル形式

このシリーズでは最初から最後までMetaTrader 5のツール一式を使います。

  • MetaTrader 5は取引端末で、Strategy Testerを含みます。
  • MetaEditorは端末に同梱されるエディター兼コンパイラーです。
  • MQL5はこの記事のExpert Advisorで使う言語です。
  • 編集するソースファイルの拡張子は.mq5で、コンパイルに成功すると同じプログラムフォルダーに.ex5実行ファイルが作られます。

MetaTrader 4はMQL4と.mq4.ex4ファイルを使います。似ている概念はありますが、MT4のコードや画面写真をそのままMQL5チュートリアルとして使うことはできません。

MetaTrader 5はMetaQuotes公式ダウンロードページから取得するか、すでに信頼している組織が提供するインストーラーを使ってください。この記事にブローカー紹介、パートナーリンク、ライブ口座、入金、有料サービスは必要ありません。

Expert Advisorテンプレートを作る

MetaTrader 5でF4を押してMetaEditorを開きます。端末のNavigatorにあるExpert AdvisorsからCreate in MetaEditorを選ぶこともできます。

MetaEditorでは次のように進めます。

  1. File > Newを選びます。
  2. Expert Advisor (generate)ではなく、Expert Advisor (template)を選びます。
  3. 名前をPart1ObserverEAとし、MQL5/Experts配下に置きます。
  4. AuthorとLinkは任意です。口座情報や認証情報を入れてはいけません。
  5. 標準のEAテンプレートには、すでにOnInitOnDeinitOnTickがあります。パート1では追加のイベントハンドラーは不要です。

公式のMQL5 Wizard文書では、テンプレートがMQL5/Expertsに配置され、主要な3つのイベントハンドラーの骨組みを含むと説明されています。MetaEditorがMQL4/Expertsを開く、または.mq4ファイルを生成する場合は、そこで止めてください。別のプラットフォーム/エディターが開かれています。

テンプレートを注文しない観測用EAに置き換える

次のコード全体を使います。

#property copyright "Lachlan Chen"
#property version   "1.00"
#property description "Part 1 observer: logs lifecycle events and never trades."

input bool InpLogFirstTicks = true;
input uint InpTicksToLog    = 3;

ulong g_ticks_seen = 0;

int OnInit()
  {
   PrintFormat("Part1ObserverEA initialized: symbol=%s period=%s",
               _Symbol,
               EnumToString(_Period));
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   g_ticks_seen++;

   if(InpLogFirstTicks && g_ticks_seen <= InpTicksToLog)
     {
      PrintFormat("tick=%I64u symbol=%s server_time=%s",
                  g_ticks_seen,
                  _Symbol,
                  TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS));
     }
  }

void OnDeinit(const int reason)
  {
   PrintFormat("Part1ObserverEA stopped: reason=%d ticks_seen=%I64u",
               reason,
               g_ticks_seen);
  }

このプログラムが行うのは3つだけです。

  • OnInit()はテスト対象のシンボルと時間足を記録し、INIT_SUCCEEDEDを返します。
  • OnTick()は到着したTickイベントを数え、必要なら最初の数件だけログへ出します。
  • OnDeinit()は停止理由と、処理したTickイベント数を記録します。

CTradeオブジェクト、OrderSend()、ポジション操作、売買リクエストはありません。InpTicksToLogを変えてもJournalへ出す行数が変わるだけで、売買が有効になることはありません。

MetaQuotesは、初期化失敗を報告できるため、整数を返す`OnInit()`を推奨しています。`OnTick()`はチャート/テスト対象シンボルに新しいTickが来たときに呼ばれます。自動売買を無効にすると売買リクエストは禁止されますが、EAへのTickイベントは止まりません。この性質は、今回のような無害な観測用EAに向いています。

コンパイルして結果を読む

ファイルを保存してF7を押すか、Compileをクリックします。MetaEditorは.mq5ソースと同じ場所にPart1ObserverEA.ex5を作成します。ツールバーを押しただけで成功したと思わず、Errorsタブを確認してください。

エラーなしでコンパイルできたという事実が示すのは、そのMetaEditorビルドが構文と参照関数を受理したことだけです。今後追加する売買ルールの正しさ、安全性、収益性は証明しません。ソースを変更するたびに再コンパイルしてください。そうしないと端末が以前の.ex5を実行し続ける可能性があります。

Strategy Testerで骨組みを実行する

MetaTrader 5へ戻り、View > Strategy Testerを開きます。現在のTesterには複数のタスク表示があるため、ビルドによって文言やパネル位置が少し異なる場合があります。

最初の実行では次のようにします。

  1. Expert Advisorの単一テストを選び、Part1ObserverEAを指定します。
  2. 履歴データのあるシンボル、時間足、過去の短い期間を選びます。
  3. Optimizationは無効にします。
  4. ローカルのテストエージェントを使います。リモート/クラウドエージェントではPrint()出力が抑止されるため、このログ観察には適しません。
  5. テストを開始し、Journalを確認します。

Journalには、初期化メッセージが1件、標準入力なら最大3件のTickメッセージ、そして終了メッセージが出るはずです。このソースには売買リクエストがないため、結果に約定はないはずです。

ここで残高線が水平なのは「取引をしなかった」という意味だけです。戦略結果、基準リターン、低リスクの証拠ではありません。Testerに約定が表示された場合は、選択したEAがPart1ObserverEAであり、コンパイル済み.ex5が上記ソースに対応しているか確認します。

公式Strategy Testerガイドには、シンボル、期間、日付、Tick生成、約定遅延、ビジュアルモード、Journalの設定が説明されています。後でテスト結果を比較するときは、これらの設定を必ず記録してください。

注文を追加する前に検証経路を設計する

パート2ではシグナルや注文経路を追加するかもしれませんが、コンパイルできるコードはライブ取引の準備完了にはほど遠いものです。段階を分けて進めます。

  1. 決定論的な単体確認: 小さな既知の入力で計算を確認する。
  2. 履歴バックテスト: 適切なTickモードを選び、注文が記述したルールどおりか確認する。
  3. 未使用のフォワード期間: 後の期間をパラメーター選択から隔離し、別に比較する。
  4. コストと約定のストレス: スプレッド、手数料、必要ならスワップ、ゼロではない約定遅延やスリッページの仮定を含める。
  5. デモ・フォワードテスト: 実資金を使わず、現在の市場環境でEAを観察する。
  6. 障害テスト: データ切断、注文拒否、端末再起動を試し、状態が曖昧なら新規注文を出さないことを確認する。
  7. 独立レビュー: ポジションサイズ、最大エクスポージャー、ストップの挙動、ログ、手動停止手段を確認する。

MetaTrader 5は、一つの履歴期間へのパラメーター過適合を抑えるため、最適化とは別のフォワード期間を用意しています。約定遅延の模擬と詳細な手数料設定もあります。これらを使ってください。コストゼロの理想化テストは配備可能な見積もりではありません。

バックテストは、ブローカーのシンボル仕様と履歴、Bid/Askの扱い、Tickモデル、口座方式、スプレッド、手数料、スワップ、遅延の仮定、選択期間に左右されます。滑らかな残高曲線は過適合でも作ることができ、将来の結果を約束しません。

後で機械学習を追加するなら

機械学習には、未来情報を誤って参照する別の経路があります。前処理、特徴選択、モデルパラメーターを学習する前に、時系列データを分割してください。将来のテスト期間を見てスケーラー、閾値、特徴一覧、ハイパーパラメーターを選べば、最終モデルに「future price」という名前の列がなくても情報漏洩です。

学習、検証、最終フォワード期間を時系列順に保ちます。変換は学習部分だけでfitし、本当に触れていない最終期間を残し、各特徴量が実際に利用可能になる時刻も考慮してください。scikit-learnの公式文書には、データ漏洩を防ぐ方法時系列順のクロスバリデーションの簡潔な説明があります。

MLスコアは売買結果ではありません。予測から注文へ変換すると、売買回転、スプレッド、手数料、スリッページ、サイジング、約定失敗が加わります。ライブ利用を検討する前に、意思決定から約定までの全経路をStrategy Testerとデモ口座で評価してください。

パート1でできたこと

これで、本物のMQL5 .mq5ソース、MetaEditorが生成した.ex5、そして取引せずにEAのライフサイクルを通すStrategy Tester実行がそろいました。土台として大切なのは、まず環境とイベントの流れを理解できたと確認し、その後で小さくテスト可能な挙動を一つずつ追加することです。

一次資料

2026年9月1日確認:

Leave a Reply