Table of Contents
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では次のように進めます。
- File > Newを選びます。
- Expert Advisor (generate)ではなく、Expert Advisor (template)を選びます。
- 名前を
Part1ObserverEAとし、MQL5/Experts配下に置きます。 - AuthorとLinkは任意です。口座情報や認証情報を入れてはいけません。
- 標準のEAテンプレートには、すでに
OnInit、OnDeinit、OnTickがあります。パート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には複数のタスク表示があるため、ビルドによって文言やパネル位置が少し異なる場合があります。
最初の実行では次のようにします。
- Expert Advisorの単一テストを選び、
Part1ObserverEAを指定します。 - 履歴データのあるシンボル、時間足、過去の短い期間を選びます。
- Optimizationは無効にします。
- ローカルのテストエージェントを使います。リモート/クラウドエージェントでは
Print()出力が抑止されるため、このログ観察には適しません。 - テストを開始し、Journalを確認します。
Journalには、初期化メッセージが1件、標準入力なら最大3件のTickメッセージ、そして終了メッセージが出るはずです。このソースには売買リクエストがないため、結果に約定はないはずです。
ここで残高線が水平なのは「取引をしなかった」という意味だけです。戦略結果、基準リターン、低リスクの証拠ではありません。Testerに約定が表示された場合は、選択したEAがPart1ObserverEAであり、コンパイル済み.ex5が上記ソースに対応しているか確認します。
公式Strategy Testerガイドには、シンボル、期間、日付、Tick生成、約定遅延、ビジュアルモード、Journalの設定が説明されています。後でテスト結果を比較するときは、これらの設定を必ず記録してください。
注文を追加する前に検証経路を設計する
パート2ではシグナルや注文経路を追加するかもしれませんが、コンパイルできるコードはライブ取引の準備完了にはほど遠いものです。段階を分けて進めます。
- 決定論的な単体確認: 小さな既知の入力で計算を確認する。
- 履歴バックテスト: 適切なTickモードを選び、注文が記述したルールどおりか確認する。
- 未使用のフォワード期間: 後の期間をパラメーター選択から隔離し、別に比較する。
- コストと約定のストレス: スプレッド、手数料、必要ならスワップ、ゼロではない約定遅延やスリッページの仮定を含める。
- デモ・フォワードテスト: 実資金を使わず、現在の市場環境でEAを観察する。
- 障害テスト: データ切断、注文拒否、端末再起動を試し、状態が曖昧なら新規注文を出さないことを確認する。
- 独立レビュー: ポジションサイズ、最大エクスポージャー、ストップの挙動、ログ、手動停止手段を確認する。
MetaTrader 5は、一つの履歴期間へのパラメーター過適合を抑えるため、最適化とは別のフォワード期間を用意しています。約定遅延の模擬と詳細な手数料設定もあります。これらを使ってください。コストゼロの理想化テストは配備可能な見積もりではありません。
バックテストは、ブローカーのシンボル仕様と履歴、Bid/Askの扱い、Tickモデル、口座方式、スプレッド、手数料、スワップ、遅延の仮定、選択期間に左右されます。滑らかな残高曲線は過適合でも作ることができ、将来の結果を約束しません。
後で機械学習を追加するなら
機械学習には、未来情報を誤って参照する別の経路があります。前処理、特徴選択、モデルパラメーターを学習する前に、時系列データを分割してください。将来のテスト期間を見てスケーラー、閾値、特徴一覧、ハイパーパラメーターを選べば、最終モデルに「future price」という名前の列がなくても情報漏洩です。
学習、検証、最終フォワード期間を時系列順に保ちます。変換は学習部分だけでfitし、本当に触れていない最終期間を残し、各特徴量が実際に利用可能になる時刻も考慮してください。scikit-learnの公式文書には、データ漏洩を防ぐ方法と時系列順のクロスバリデーションの簡潔な説明があります。
MLスコアは売買結果ではありません。予測から注文へ変換すると、売買回転、スプレッド、手数料、スリッページ、サイジング、約定失敗が加わります。ライブ利用を検討する前に、意思決定から約定までの全経路をStrategy Testerとデモ口座で評価してください。
パート1でできたこと
これで、本物のMQL5 .mq5ソース、MetaEditorが生成した.ex5、そして取引せずにEAのライフサイクルを通すStrategy Tester実行がそろいました。土台として大切なのは、まず環境とイベントの流れを理解できたと確認し、その後で小さくテスト可能な挙動を一つずつ追加することです。
一次資料
2026年9月1日確認:
