MQL5デバッグ・ログファースト開発完全ガイド|Print・Expertsログ・再現条件の整理
MQL5でEAやインジケーターを開発していると、「コンパイルは通るのに動かない」「EAを入れても注文しない」「CopyBufferで値が取れない」「WebRequestや通知が失敗する」「バックテストでは動くのに通常チャートでは動きが違う」といった問題が起きることがあります。
このような不具合を確認する時に重要なのは、いきなりコードを大きく書き換えることではありません。まず、どの処理まで進んだのか、どの条件で止まったのか、どの値が想定と違うのかをログで追える状態にすることが重要です。
この記事では、MQL5開発におけるログファースト開発の考え方を整理します。Print、PrintFormat、Expertsログ、Journalログ、GetLastError、retcode、MetaEditorデバッガ、ブレークポイント、変数確認、再現条件、サポート依頼前の情報整理まで、実務で原因を追いやすくするための確認手順をまとめます。
なお、この記事はMT5 / MQL5の開発、デバッグ、ログ確認、不具合切り分け、開発依頼前整理を目的とした技術記事です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。
- この記事で確認すること
- MQL5デバッグで最初に考えること
- ログファースト開発とは
- PrintとPrintFormatの使い分け
- ExpertsログとJournalログの違い
- GetLastErrorとretcodeを分けて見る
- MetaEditorデバッガの使いどころ
- OnInitで残すログ
- OnTickで残すログ
- OnTimerで残すログ
- OnTradeTransactionで残すログ
- CopyBufferとiCustomのデバッグ
- OrderSendとCTradeのデバッグ
- WebRequest・通知・外部連携のデバッグ
- 再現条件を記録する
- ログに出してよい情報・出してはいけない情報
- デバッグ時の確認順序
- 症状別の切り分け表
- バックテストと通常チャートの違いを記録する
- 問い合わせ前・開発依頼前に整理すること
- 記事固有の実務チェック表
- よくある質問
- 関連ページ
- まとめ
この記事で確認すること
- MQL5で不具合を追跡する時の基本方針
- PrintとPrintFormatの使い分け
- ExpertsログとJournalログの違い
- GetLastError、retcode、MqlTradeResultの確認方法
- MetaEditorデバッガ、ブレークポイント、変数確認の使いどころ
- OnInit、OnTick、OnTimer、OnTradeTransactionで残すログ
- CopyBuffer、iCustom、WebRequest、注文処理の切り分け
- 再現条件を残すための記録項目
- ログへ出してよい情報・出してはいけない情報
- 問い合わせ前・開発依頼前に整理する情報
MQL5デバッグで最初に考えること
MQL5の不具合調査では、最初に「どこが間違っているか」を断定しようとするよりも、「どこまで処理が進んだか」を確認できるようにします。たとえば、EAが注文しない場合でも、シグナルが不成立なのか、発注前チェックで止まったのか、OrderSendやCTradeで注文が失敗したのか、そもそもOnTickが動いていないのかで対応が変わります。
そのため、MQL5開発では、ログを後付けの確認手段ではなく、設計の一部として考えます。OnInitで初期状態を出す、OnTickで判定の入口を出す、フィルターで止めた理由を出す、注文処理ではretcodeを出す、外部連携では送信結果を出す、といった形で、責務ごとにログを分けます。
ログが不足している状態でコードだけを見ても、「条件が成立していない」のか「条件は成立したが発注を止めた」のか「注文は送ったが失敗した」のかが分からないことがあります。ログファースト開発は、この曖昧さを減らすための考え方です。
| 確認したいこと | ログで見る内容 | 確認場所 |
|---|---|---|
| EAが起動したか | OnInit開始、設定値、初期化結果、ハンドル作成結果。 | Expertsログ |
| OnTickが動いているか | 新バー判定、ティック受信、判定タイミング。 | Expertsログ |
| シグナルが成立したか | BUY候補、SELL候補、見送り理由、使用した足。 | Expertsログ |
| 発注前チェックで止まったか | スプレッド、ロット、証拠金、最大ポジション数、取引時間。 | Expertsログ |
| 注文送信で失敗したか | retcode、GetLastError、注文方向、ロット、価格、SL/TP。 | Expertsログ / Journalログ |
| 外部連携が失敗したか | WebRequest結果、HTTPステータス、送信ON/OFF、許可URL。 | Expertsログ / MT5オプション |
| バックテスト条件が違うか | 銘柄、時間足、期間、スプレッド、setファイル。 | Strategy Tester / Testerログ |
ログファースト開発とは
ログファースト開発とは、動作確認や不具合調査をしやすくするために、処理の入口、判定、見送り理由、実行結果、エラー情報をあらかじめログとして残す考え方です。MQL5では、PrintやPrintFormatを使ってExpertsログへ情報を出力できます。
ログファースト開発では、単に「ログを多く出す」ことが目的ではありません。必要なのは、後から読んだ時に原因を切り分けられるログです。たとえば、すべてを「ENTRY NG」とだけ出しても、スプレッドで止まったのか、ロットで止まったのか、証拠金で止まったのか、取引時間で止まったのかが分かりません。
ログは、開発者だけでなく、検証担当者、運用者、サポート担当者が確認する情報でもあります。そのため、ログには、処理名、状態、理由、主要値、現在値、設定値、チケット番号、Magic Number、銘柄、時間足などを必要に応じて含めます。一方で、口座番号、パスワード、Webhook URL、APIキー、認証トークンなどの機密情報は出さないようにします。
| 悪いログ例 | 問題点 | 改善例 |
|---|---|---|
NG | 何がNGなのか分かりません。 | ENTRY_BLOCK reason=SPREAD current=32 max=20 |
order failed | 注文要求と結果のどちらが問題か分かりません。 | ORDER_FAIL side=BUY lot=0.10 retcode=10016 last_error=0 |
buffer error | ハンドル作成失敗か、CopyBuffer不足か分かりません。 | COPYBUFFER_FAIL handle=12 requested=3 copied=-1 last_error=4806 |
webhook error | URL許可、HTTP応答、送信内容のどれか分かりません。 | WEBREQUEST_FAIL status=-1 last_error=4014 permission=CHECK_REQUIRED |
close fail | 対象チケットや決済理由が分かりません。 | CLOSE_FAIL ticket=123456 reason=TRAIL retcode=10030 |
PrintとPrintFormatの使い分け
MQL5では、ログ出力にPrintやPrintFormatを使えます。Printは複数の値を簡単に出せるため、簡単な確認に向いています。PrintFormatは、文字列の形式を整えながら出力できるため、ログを一定の形式に揃えたい場合に向いています。
ログ調査では、毎回出力形式が変わると検索しにくくなります。そのため、重要な状態は、接頭辞やキー名を固定して出すと便利です。たとえば、INIT、SIGNAL、FILTER、PRECHECK、ORDER、EXIT、WEBREQUEST のように処理の種類を分けると、Expertsログ内で検索しやすくなります。
| 出力方法 | 向いている場面 | 注意点 |
|---|---|---|
Print | 簡単な状態確認、変数値確認、処理通過確認。 | 値が増えるとログ形式がばらつきやすくなります。 |
PrintFormat | 決まった形式で、複数の値を整理して出したい場合。 | 型とフォーマット指定の対応を確認します。 |
| 接頭辞付きログ | INIT、SIGNAL、ORDERなどで検索しやすくしたい場合。 | 接頭辞の種類を増やしすぎないようにします。 |
| 条件付きログ | debug modeがONの時だけ詳細ログを出したい場合。 | 通常運用でログが多すぎないようにします。 |
| 集約ログ | 一定間隔で状態をまとめて確認したい場合。 | OnTimerなどと組み合わせる場合は処理負荷に注意します。 |
開発初期はログを多めに出して構いません。ただし、長時間稼働するEAやインジケーターでは、毎ティックで大量にログを出すと、ログが読みにくくなり、ファイルサイズも増えます。通常ログ、詳細ログ、異常時ログを分ける設計が必要です。
ExpertsログとJournalログの違い
MT5でログを確認する時は、ExpertsログとJournalログを分けて見ます。Expertsログは、EAやインジケーターが出力したログや実行時のエラー確認に使います。Journalログは、MT5全体の操作、接続、取引許可、プラットフォーム側の状態を確認する時に使います。
EAが動かない時、Expertsログだけを見ても分からないことがあります。自動売買が許可されていない、サーバー接続が不安定、取引が無効、チャートへの適用時に問題がある、といった環境側の情報はJournalログに出ることがあります。
| ログ | 主な内容 | 確認する場面 |
|---|---|---|
| Expertsログ | EA、インジケーター、スクリプトが出したログ、初期化結果、注文結果、エラー。 | EAやインジの内部処理を確認したい時。 |
| Journalログ | MT5全体の操作、接続、取引許可、プラットフォーム側のメッセージ。 | EAが起動しない、注文が許可されない、環境側を確認したい時。 |
| Strategy Testerログ | バックテスト中のEAログ、テスター実行時の情報。 | バックテストでの挙動を確認したい時。 |
| 外部出力ログ | CSV、テキスト、独自ログファイル、通知結果など。 | 長期検証、再現条件記録、外部連携の確認に使う時。 |
GetLastErrorとretcodeを分けて見る
MQL5の注文処理や外部連携では、GetLastErrorとretcodeを混同しないことが重要です。GetLastErrorは、MQL5関数の実行時エラーを確認するために使います。一方、取引リクエストの結果では、MqlTradeResultのretcodeを確認する場面があります。
注文が失敗した時に、GetLastErrorだけを見ても原因が十分に分からない場合があります。OrderSendやCTradeの結果では、注文サーバー側が返すretcodeを確認し、無効な価格、無効なStops、取引不可、リクエスト拒否、証拠金不足などを切り分ける必要があります。
| 項目 | 確認する内容 | 注意点 |
|---|---|---|
GetLastError | MQL5関数の実行時エラーを確認します。 | 注文結果そのものではなく、関数実行上のエラー確認として扱います。 |
retcode | 取引リクエストに対するサーバー側の結果を確認します。 | OrderSendやCTradeの注文結果を追う時に重要です。 |
MqlTradeResult | 注文送信結果、retcode、注文番号などを確認します。 | 発注要求と発注結果を分けてログに残します。 |
MqlTradeRequest | 注文方向、ロット、価格、SL/TP、Magic Numberなどの要求内容です。 | 送った内容と返ってきた結果をセットで確認します。 |
ResultRetcode | CTrade利用時に取引結果コードを確認する方法です。 | CTradeを使っていても、結果確認は省略しないようにします。 |
注文処理のログでは、「注文しようとした内容」と「注文結果」を分けて出すと確認しやすくなります。たとえば、BUY 0.10 lotを送ろうとしたのか、実際にサーバーがどのretcodeを返したのか、SL/TP距離やスプレッドが関係しているのかを見られるようにします。
MetaEditorデバッガの使いどころ
MetaEditorにはデバッグ機能があります。ブレークポイントを置いて処理を一時停止し、変数の値や処理の流れを確認できます。ログだけでは追いにくい条件分岐や、どの行まで処理が進んでいるかを確認する時に役立ちます。
ただし、EAのすべての不具合をデバッガだけで解決しようとすると、実際のチャート環境、ティック、取引サーバー、外部連携、Strategy Testerとの差を見落とすことがあります。デバッガは、ログ確認と組み合わせて使うものとして考えると安全です。
| デバッグ方法 | 向いている確認 | 注意点 |
|---|---|---|
| ブレークポイント | 特定行で処理を止めて、そこまで到達しているか確認します。 | 実運用中の不具合再現には向かない場合があります。 |
| ステップ実行 | 1行ずつ処理の流れを確認します。 | イベント処理やティック依存処理では流れを整理して使います。 |
| 変数ウォッチ | 条件分岐前後の値を確認します。 | 配列、ハンドル、チケット番号などを確認する時に便利です。 |
| ログ併用 | デバッガで見た値と、実行時ログを照合します。 | 本番相当の確認ではログの方が追いやすい場合があります。 |
| Strategy Tester併用 | 再現条件を作って、バックテスト中の挙動を確認します。 | テスター条件と通常チャート条件の違いを記録します。 |
OnInitで残すログ
OnInitは、EAやインジケーターが起動した時に実行される初期化処理です。ここでは、inputの確認、インジケーターハンドルの作成、ファイルパス、外部連携設定、認証状態、初期化成功/失敗を確認します。
OnInitで何もログを出していないと、EAが起動しているのか、設定不正で止まったのか、ハンドル作成に失敗したのかが分かりにくくなります。特に、CopyBufferを使うEA、WebRequestを使うEA、CSVやファイル出力を使うEAでは、OnInit時点のログが重要です。
- EA名、インジケーター名、バージョンを出す
- 主要inputの値を出す
- 口座種別や銘柄情報を必要範囲で確認する
- iMA、iATR、iRSI、iCustomなどのハンドル作成結果を出す
- ファイル出力先やCSV利用の有無を確認する
- WebRequestや通知機能のON/OFFを確認する
- 設定不正の場合は理由を出して初期化失敗を返す
- Webhook URL、APIキー、tokenなどの実値は出さない
OnTickで残すログ
OnTickはEAで価格更新ごとに呼び出される処理です。OnTick内で毎回詳細ログを出しすぎるとログが膨大になりますが、処理の入口、判定タイミング、新バー判定、シグナル判定、発注前チェック、注文実行の流れは追えるようにしておく必要があります。
特に、EAが注文しない場合は、OnTickが動いていないのか、新バー判定で止まっているのか、シグナル不成立なのか、フィルターで止まっているのかを分けます。すべてを「注文なし」として扱うと、原因を追えません。
| ログ対象 | 残す内容 | ログ粒度 |
|---|---|---|
| OnTick入口 | ティック受信、新バー判定、処理ON/OFF。 | 詳細ログONの時だけで十分な場合があります。 |
| シグナル判定 | BUY候補、SELL候補、見送り理由、判定足。 | 状態変化時、または判定時のみ。 |
| フィルター判定 | スプレッド、時間帯、最大ポジション数、取引可否。 | ブロック時は必ず理由を出します。 |
| 発注前チェック | ロット、証拠金、SL/TP距離、StopLevel、FreezeLevel。 | 発注候補が出た時に出します。 |
| 注文実行 | 注文方向、ロット、価格、retcode、GetLastError。 | 注文要求と結果をセットで出します。 |
OnTimerで残すログ
OnTimerは、一定間隔で処理を行うためのイベントです。状態確認、外部連携、定期ログ、通知、パネル更新、長時間稼働の監視などに使えます。OnTickと違い、ティックが来ない時間帯でも定期処理を行える点が特徴です。
ただし、OnTimerに重い処理を入れすぎると、EA全体の動作に影響することがあります。外部連携、CSV書き込み、通知送信、状態集計などは、実行間隔、失敗時の再試行、ログ粒度を決めておく必要があります。
| 用途 | ログ内容 | 注意点 |
|---|---|---|
| 定期状態ログ | 稼働状態、ポジション数、最終処理時刻。 | 毎秒出すと過剰になるため間隔を調整します。 |
| 外部連携確認 | WebRequest送信結果、HTTPステータス、失敗理由。 | URLやtokenの実値をログに出さないようにします。 |
| 通知処理 | 通知キュー、送信成功/失敗、再送可否。 | 売買処理と通知失敗を混同しないようにします。 |
| 長時間稼働監視 | 最終ティック時刻、最後の注文時刻、内部状態。 | 停止やフリーズ疑いを確認する補助になります。 |
| パネル更新 | 表示更新、Object数、描画対象。 | Objectを毎回作り直しすぎないようにします。 |
OnTradeTransactionで残すログ
OnTradeTransactionは、注文、約定、ポジション変化などの取引イベントを確認する時に使います。EAが注文を送った後、実際にどのようなイベントが発生したのかを追うために役立ちます。
注文送信時のログだけでは、約定したのか、拒否されたのか、部分約定したのか、履歴にどのように残ったのかが分かりにくいことがあります。OnTradeTransactionを使う場合は、イベント種別、注文番号、Deal番号、ポジションID、Magic Number、銘柄、方向などを必要に応じてログ化します。
ただし、OnTradeTransactionのログは多くなりやすいため、すべてを細かく出し続けるのではなく、開発時・検証時・異常時で粒度を分けるのがよいです。
CopyBufferとiCustomのデバッグ
EAからインジケーター値を使う場合、iCustomやCopyBufferを使うことがあります。CopyBufferで値が取れない場合、インジケーターハンドルの作成失敗、パラメータ不一致、取得本数不足、配列方向の誤解、確定足と現在足の混同などが原因になることがあります。
この種の不具合では、値が0なのか、EMPTY_VALUEなのか、取得に失敗しているのかを分けて確認することが重要です。単に「インジ値が0」と見える場合でも、実際にはCopyBufferが失敗して、配列に値が入っていないだけの場合があります。
| 確認項目 | 見る内容 | ログ例として残す内容 |
|---|---|---|
| ハンドル作成 | iMA、iATR、iRSI、iCustomで有効なハンドルが返っているか。 | HANDLE_OK name=RSI handle=12 |
| INVALID_HANDLE | ハンドル作成に失敗していないか。 | HANDLE_FAIL name=CustomInd last_error=4802 |
| BarsCalculated | 計算済み本数が足りているか。 | BARS_CALCULATED value=100 required=3 |
| CopyBuffer戻り値 | 要求本数どおり取得できたか。 | COPYBUFFER copied=3 requested=3 |
| 配列方向 | 現在足と過去足の参照位置が正しいか。 | bar_shift=1 value=45.32 |
| 確定足 | 現在足ではなく確定足を使うか。 | use_closed_bar=true shift=1 |
OrderSendとCTradeのデバッグ
注文処理の不具合では、シグナル判定と注文送信を分けて確認します。シグナルが出ていないのにOrderSendやCTradeを疑っても原因に到達できません。逆に、シグナルは出ているのに発注前チェックや注文送信で止まっている場合は、retcodeや銘柄仕様を確認する必要があります。
OrderSendを使う場合は、MqlTradeRequestとMqlTradeResultを分けてログに残します。CTradeを使う場合でも、BuyやSellの戻り値だけでなく、ResultRetcode、ResultRetcodeDescription、GetLastErrorなどを確認します。
| 確認対象 | 見る内容 | 注意点 |
|---|---|---|
| 注文方向 | BUYかSELLか。 | シグナル方向と注文方向が一致しているか確認します。 |
| ロット | 要求ロット、丸め後ロット、最小ロット、lot step。 | volume stepに合わないロットは失敗要因になります。 |
| 価格 | Bid、Ask、要求価格。 | BUYとSELLで使う価格を混同しないようにします。 |
| SL/TP | 設定値、距離、StopLevel、FreezeLevel。 | 近すぎるSL/TPはinvalid stopsの原因になります。 |
| 証拠金 | 必要証拠金、余剰証拠金。 | 証拠金不足による失敗を分けて確認します。 |
| retcode | 取引サーバー側の結果コード。 | 注文失敗時の中心的な確認項目です。 |
| GetLastError | MQL関数側のエラー。 | retcodeとは別に扱います。 |
WebRequest・通知・外部連携のデバッグ
WebRequest、Discord通知、Google Sheets連携、Webhook通知などを使う場合は、EA本体の売買処理と外部連携処理を分けて確認します。通知が届かないことと、EAの売買判定が間違っていることは別問題です。
外部連携では、MT5側のWebRequest許可URL、送信ON/OFF、送信先の応答、タイムアウト、JSON形式、文字コード、改行、認証情報の扱いなどを確認します。ログには、送信成功/失敗、HTTPステータス、GetLastError、送信対象イベントを残します。ただし、Webhook URL、APIキー、tokenの実値は出さないようにしてください。
- MT5オプションでWebRequest許可URLを設定しているか確認する
- 通知機能のON/OFF inputを確認する
- 送信イベントが発生しているかログで確認する
- HTTPステータスやGetLastErrorを確認する
- JSONや本文形式が外部側の仕様に合っているか確認する
- Webhook URL、APIキー、tokenの実値をログに出していないか確認する
- 通知失敗時に売買処理まで止める設計になっていないか確認する
再現条件を記録する
不具合調査で重要なのは、「一度だけ起きた」ではなく、「どの条件で起きたか」を記録することです。MQL5の不具合は、銘柄、時間足、スプレッド、口座タイプ、取引時間、setファイル、バックテスト条件、外部連携の状態によって再現性が変わることがあります。
再現条件が曖昧なままだと、開発側で同じ状態を作れず、原因確認が遅くなります。特に、EAの注文失敗、通知失敗、CopyBuffer失敗、バックテスト時だけの不具合は、再現条件の記録が重要です。
| 記録する項目 | 内容 | 理由 |
|---|---|---|
| EA名・インジ名 | 対象ファイル名、バージョン、更新日。 | どのファイルで起きた問題か特定するため。 |
| MT5環境 | MT5の種類、ブローカー、口座タイプ。 | 環境差を確認するため。 |
| 銘柄・時間足 | 対象銘柄、チャート時間足、判定時間足。 | 銘柄仕様や時間足差を確認するため。 |
| setファイル | 使用したinput設定。 | 同じ設定で再現するため。 |
| 発生時刻 | サーバー時間、ローカル時間、バックテスト時刻。 | ログと照合するため。 |
| Expertsログ | EAやインジが出したログ。 | 内部処理の確認に使うため。 |
| Journalログ | MT5側の環境ログ。 | 接続、許可、取引環境を確認するため。 |
| スクリーンショット | チャート、設定、エラー表示、テスター条件。 | 文字だけでは分からない状態を確認するため。 |
| 直前操作 | EA再起動、時間足変更、set変更、チャート切替など。 | 操作起因の問題を確認するため。 |
ログに出してよい情報・出してはいけない情報
ログは不具合調査に役立ちますが、何でも出してよいわけではありません。特に、口座番号、認証情報、Webhook URL、APIキー、token、外部エンドポイントの実値は、ログに出さないようにしてください。
共有用のログを作る場合は、必要な技術情報を残しつつ、機密情報はマスクします。たとえば、Webhook URLは***masked***、tokenは先頭数文字だけ、口座番号は出さない、といったルールを決めておくと安全です。
| 情報 | ログ出力 | 理由 |
|---|---|---|
| EA名・バージョン | 出してよい | 対象ファイルを確認するため。 |
| 銘柄・時間足 | 出してよい | 再現条件に必要なため。 |
| Magic Number | 必要に応じて出す | 対象ポジションの識別に役立つため。 |
| 注文チケット | 必要に応じて出す | 履歴確認に必要な場合があるため。 |
| retcode・GetLastError | 出してよい | 原因調査に必要なため。 |
| 口座番号 | 出さない | 個人情報や口座情報に該当するため。 |
| Webhook URL | 出さない | 外部通知先へ不正送信される可能性があるため。 |
| APIキー・token | 出さない | 外部サービスへアクセスされる可能性があるため。 |
| パスワード | 出さない | 第三者アクセスの危険があるため。 |
デバッグ時の確認順序
MQL5の不具合調査では、確認順序を決めておくと効率的です。いきなりコード全体を読むより、コンパイル、配置、起動、初期化、判定、発注前チェック、注文結果、決済、通知、外部連携の順に確認すると原因を絞り込みやすくなります。
- 対象ファイルとバージョンを確認する
- MetaEditorでコンパイルエラーと警告を確認する
- 配置先がExperts / Indicators / Scriptsのどれか確認する
- MT5側でEAやインジが表示されるか確認する
- OnInitログで初期化成功/失敗を確認する
- OnTickやOnCalculateが動いているか確認する
- シグナル不成立とフィルター停止を分けて確認する
- 発注前チェックの停止理由を確認する
- 注文結果のretcodeとGetLastErrorを確認する
- 通知や外部連携は売買処理と分けて確認する
- 再現条件、setファイル、ログ、スクリーンショットを保存する
症状別の切り分け表
不具合の症状ごとに、最初に見る場所は変わります。コンパイルエラー、起動失敗、注文しない、通知されない、バックテストと通常チャートで違う、といった症状を分けて確認してください。
| 症状 | 最初に見る場所 | 主な確認内容 |
|---|---|---|
| コンパイルできない | MetaEditorのErrors欄 | エラー行、関数名、引数、型、include、BOM、括弧。 |
| MT5に表示されない | 保存フォルダ、Navigator | Experts / Indicators / Scriptsの配置先、コンパイル結果。 |
| OnInitで失敗する | Expertsログ | input不正、ハンドル作成失敗、外部設定不備。 |
| EAが注文しない | Expertsログ | シグナル、フィルター、発注前チェック、取引許可。 |
| 注文が失敗する | Expertsログ / Journalログ | retcode、GetLastError、ロット、SL/TP、証拠金、銘柄仕様。 |
| 決済されない | 決済ログ、ポジション一覧 | Magic Number、対象チケット、決済条件、手動決済との関係。 |
| CopyBufferで値が取れない | OnInitログ、CopyBufferログ | ハンドル、BarsCalculated、取得本数、配列方向、確定足。 |
| 通知が届かない | WebRequestログ、MT5オプション | 許可URL、HTTPステータス、送信ON/OFF、外部側応答。 |
| バックテストでだけ起きる | Strategy Tester設定 | 銘柄、時間足、期間、スプレッド、モデル、setファイル。 |
| 実チャートでだけ起きる | Expertsログ、Journalログ | 口座状態、接続、取引時間、スプレッド、外部連携、権限。 |
バックテストと通常チャートの違いを記録する
バックテストで動くEAが、通常チャートでは同じように動かないことがあります。原因として、ティックの流れ、スプレッド、サーバー時間、外部連携、WebRequest、取引許可、約定条件、銘柄仕様の差などが考えられます。
バックテスト時は、銘柄、時間足、期間、スプレッド、モデル、初期残高、setファイル、テスターのログを記録します。通常チャートでは、実際のExpertsログ、Journalログ、チャート状態、EAのinput、通信状態を記録します。
バックテスト結果は、将来の結果を保証するものではありません。ここでは、EAの処理が想定どおりに動いているか、ログで原因を追えるか、設定条件を再現できるかを確認する材料として扱います。
問い合わせ前・開発依頼前に整理すること
不具合相談や開発依頼では、「動きません」「注文しません」だけでは確認が難しくなります。開発者やサポート側が再現しやすいように、対象ファイル、環境、setファイル、ログ、スクリーンショット、発生手順を整理してください。
| 整理する情報 | 内容 | 理由 |
|---|---|---|
| 対象ファイル | EA名、インジ名、バージョン、ファイル名。 | 確認対象を特定するため。 |
| ソースの有無 | .mq5、.mqh、.ex5の有無。 | 改修可否や確認範囲を判断するため。 |
| setファイル | 使用したinput設定。 | 同じ設定で再現するため。 |
| MT5環境 | ブローカー、銘柄、時間足、口座タイプ、VPS利用有無。 | 環境差を確認するため。 |
| 発生条件 | いつ、どの操作で、どの症状が起きたか。 | 再現手順を確認するため。 |
| Expertsログ | EAやインジ側のログ。 | 内部処理を確認するため。 |
| Journalログ | MT5側のログ。 | 環境側の状態を確認するため。 |
| スクリーンショット | チャート、設定画面、エラー表示、テスター条件。 | 文章だけで伝わりにくい状態を確認するため。 |
| 送らない情報 | 口座番号、パスワード、Webhook URL、APIキー、token。 | 機密情報を保護するため。 |
記事固有の実務チェック表
- コンパイルエラーと警告を確認した
- 対象ファイルの配置先を確認した
- OnInitで初期化ログを出している
- OnTickやOnCalculateが動いているか確認できる
- シグナル不成立とフィルター停止を分けている
- 発注前チェックの停止理由をログに出している
- 注文結果でretcodeとGetLastErrorを確認している
- CopyBufferではハンドル、BarsCalculated、戻り値を確認している
- WebRequestや通知失敗を売買処理と分けて確認している
- バックテスト条件と通常チャート条件を分けて記録している
- 再現条件、setファイル、ログ、スクリーンショットを保存している
- Webhook URL、APIキー、token、口座情報をログに出していない
よくある質問
MQL5のデバッグでは最初に何を見るべきですか?
最初に、コンパイルエラー、配置先、OnInitログ、Expertsログ、Journalログを確認します。EAが動かない場合でも、初期化失敗、シグナル不成立、発注前チェック停止、注文失敗、外部連携失敗など原因が分かれるため、順番に切り分けることが重要です。
PrintとPrintFormatはどちらを使えばよいですか?
簡単な確認ならPrintでも十分です。ログ形式を揃えたい場合、複数の値を見やすく並べたい場合、検索しやすいログを残したい場合はPrintFormatが向いています。実務では、重要なログほど形式を揃えると確認しやすくなります。
ExpertsログとJournalログは何が違いますか?
ExpertsログはEAやインジケーターの内部処理確認に使います。JournalログはMT5全体の操作、接続、取引許可、プラットフォーム側の状態確認に使います。EAが動かない時は、両方を見る方が原因を追いやすくなります。
GetLastErrorだけ見れば注文失敗の原因は分かりますか?
GetLastErrorだけでは不十分な場合があります。OrderSendやCTradeの注文結果では、MqlTradeResultやResultRetcodeなどでretcodeを確認する必要があります。注文要求の内容と注文結果を分けてログに残してください。
MetaEditorデバッガは必ず使うべきですか?
必須ではありませんが、条件分岐や変数の値を確認したい場合には役立ちます。ただし、ティック、取引サーバー、外部連携、通常チャート環境の問題はログで追う方が確認しやすい場合もあります。デバッガとログを併用するのが現実的です。
CopyBufferで値が取れない時は何を確認しますか?
ハンドルが有効か、BarsCalculatedで必要本数が揃っているか、CopyBufferの戻り値が想定どおりか、配列方向や確定足の指定が正しいかを確認します。値が0なのか、取得に失敗しているのかをログで分けることが重要です。
ログには何でも出してよいですか?
いいえ。EA名、バージョン、銘柄、時間足、retcode、GetLastErrorなどは原因確認に役立ちますが、口座番号、パスワード、Webhook URL、APIキー、tokenなどの機密情報はログに出さないようにしてください。
不具合相談前に何を準備すればよいですか?
対象ファイル名、バージョン、setファイル、Expertsログ、Journalログ、発生時刻、銘柄、時間足、スクリーンショット、再現手順を整理してください。認証情報やWebhook URLなどはマスクして共有する必要があります。
関連ページ
MQL5のデバッグやログ確認を進める時は、エラーコード、EA設計、MQL5開発環境、ログの問い合わせ前確認、setファイル、バックテスト、外部連携を分けて確認すると、原因の切り分けがしやすくなります。
| 確認したい内容 | 関連ページ |
|---|---|
| MQL5エラーコードを確認する | MQL5エラーコード辞典 |
| EA設計の責務分離を確認する | MQL5 EA設計パターン完全ガイド |
| MQL5開発環境を確認する | MQL5開発入門 |
| EAログを問い合わせ前に確認する | EAのログを問い合わせ前に確認する方法 |
| 開発依頼前に用意する資料を確認する | MT5開発依頼前に用意する資料まとめ |
| setファイルを送る前の確認をする | MT5でEAのsetファイルを送る前に確認すること |
| バックテスト・最適化の確認をする | MT5ストラテジーテスター・最適化完全ガイド |
| 外部連携や通知の安全確認をする | MT5外部連携・通知セキュリティガイド |
| 長時間稼働時の安定性を確認する | MQL5長時間稼働・安定化完全ガイド |
| 注文・ポジション・履歴管理を確認する | MQL5注文・ポジション・履歴管理完全ガイド |
| CTradeを使った注文処理を確認する | MQL5標準ライブラリ・CTrade完全ガイド |
| インジケーター値取得の確認をする | MQL5でインジケーター値をEAに取り込む方法 |
| 不具合報告・サポート依頼の入口を確認する | 不具合報告・サポート依頼 |
| 開発・改修相談の入口を確認する | 開発・改修の相談ページ |
まとめ
MQL5のデバッグでは、いきなりコード全体を疑うのではなく、処理の入口、初期化、シグナル、フィルター、発注前チェック、注文結果、決済、通知、外部連携を分けて確認することが重要です。PrintやPrintFormatを使い、Expertsログで処理の流れを追えるようにしてください。
注文失敗では、GetLastErrorだけでなく、retcodeやMqlTradeResultを確認します。CopyBufferでは、ハンドル、BarsCalculated、戻り値、配列方向、確定足を分けて確認します。WebRequestや通知では、MT5側の許可URL、HTTP応答、送信ON/OFF、外部側の応答を確認します。
ログは多ければよいわけではありません。原因を追える形式で、必要な情報だけを整理して出すことが大切です。Webhook URL、APIキー、token、口座番号、パスワードなどの機密情報はログへ出さないようにしてください。
不具合相談や開発依頼を行う場合は、対象ファイル、setファイル、Expertsログ、Journalログ、スクリーンショット、発生時刻、再現手順を整理してください。再現条件を残しておくことで、開発側・検証側・運用側の確認が進めやすくなります。
