技術講座

MQL5デバッグ・ログファースト開発完全ガイド|Print・Expertsログ・再現条件の整理

EAファンクラブ

MQL5でEA、インジケーター、スクリプト、補助ツールを開発・改修する場合、不具合の原因を正確に追うには、ログの出し方と再現条件の整理が重要です。

「動かない」「注文されない」「決済されない」「通知が届かない」「バックテストでは動くがリアル環境では違う」「コンパイルエラーが出る」といった状況では、画面だけを見ても原因を特定できないことがあります。

Expertsログ、Journalログ、MetaEditorのエラー、GetLastError、MqlTradeResult.retcode、setファイル、銘柄名、時間足、発生時刻、直前の操作を組み合わせて確認する必要があります。

この記事では、MQL5のデバッグとログファースト開発の考え方を、開発、検証、不具合調査、開発依頼前整理、販売後サポートで使いやすい形に整理します。

このページは、MT5 / MQL5の技術学習記事です。投資判断、売買タイミング、利益保証、勝率保証、損失回避保証、推奨ロット、推奨銘柄、特定ブローカー誘導を目的とした内容ではありません。

この記事で確認すること

確認項目確認する内容
ログファースト開発の考え方不具合が起きた後ではなく、開発段階からログ設計を含める考え方を整理します。
MetaEditorで最初に見ることコンパイルエラー、警告、行番号、include、文字コード、直前変更箇所を確認します。
Print / PrintFormatログカテゴリ、symbol、timeframe、結果、理由、値を残す基本を確認します。
ExpertsログとJournalログEA側ログとMT5端末側ログの違いを分けて確認します。
GetLastErrorエラー番号だけでなく、直前の関数、戻り値、対象情報を一緒に記録します。
MqlTradeResult.retcode注文処理では、OrderSendの戻り値だけでなく取引サーバー応答を確認します。
再現条件EA名、バージョン、setファイル、銘柄、時間足、発生時刻、操作内容を整理します。
外部連携ログWebRequest、Discord通知、Google Sheets連携、外部認証の確認順を整理します。
バックテスト中のログStrategy Tester上のログ量、テスト条件、外部連携分岐、データ不足を確認します。
問い合わせ前整理送る情報と送ってはいけない情報を分けて整理します。

ログファースト開発とは

ログファースト開発とは、EAやインジケーターの動作を後から確認できるように、最初からログ設計を含めて開発する考え方です。

MQL5では、条件が未成立だったのか、データ取得に失敗したのか、risk制御で止まったのか、注文リクエストが失敗したのか、通知だけが失敗したのかを分けて記録すると、不具合調査が進めやすくなります。

ログ分類確認する内容ログ例
INIT起動時の設定、銘柄、時間足、バージョン、input概要version、symbol、timeframe、input summary
GATE必須条件の通過・停止理由spread NG、time NG、data insufficient
SIGNALエントリー候補や判定結果BUY candidate、SELL candidate、NO ENTRY
RISKロット、最大数、外部停止、認証状態max positions、lot normalized、external stop
EXECUTION注文・決済リクエストの結果retcode、order、deal、GetLastError
EXIT決済条件、トレーリング、保有管理close reason、trail state、exit priority
NOTIFY通知送信結果、外部連携結果sent、failed、http status
FILECSV出力、ファイル読み書きFileOpen、write count、path kind

ログファースト開発では、ログを大量に出せばよいわけではありません。必要な時に、必要な情報を、同じ形式で追えることが重要です。

1. MetaEditorで最初に確認すること

MQL5開発で最初に確認するのは、MetaEditor上でコンパイルエラーが出ていないかです。

EAやインジケーターは、コンパイルできなければMT5上で正常に動作確認できません。実行時の不具合を調べる前に、まずコンパイル結果を確認します。

確認項目見る場所確認すること
エラー数MetaEditor下部のエラー欄errorが0か確認します。
警告数MetaEditor下部の警告欄warningの内容が意図したものか確認します。
ファイル名エラー欄対象ファイルが正しいか確認します。
行番号・列番号エラー欄エラー発生位置を確認します。
メッセージエラー欄未定義、型不一致、括弧不足、include不足などを確認します。
includeソース上部必要ファイルの存在、パス、ファイル名を確認します。
文字コードファイル保存状態BOM混入や不可視文字の可能性を確認します。
直前変更箇所ソース差分最後に編集した周辺から確認します。

コンパイルエラーは、1つの原因から複数行に連鎖して出ることがあります。上から順番に確認し、最初の根本原因を探すことが大切です。

2. コンパイルエラーの行番号とメッセージの読み方

MetaEditorのエラー欄では、ファイル名、行番号、列番号、エラーメッセージを確認します。

よくあるコンパイルエラーには、未定義識別子、型不一致、括弧不足、セミコロン不足、関数引数の不一致、includeファイル不足、文字コード由来のエラーなどがあります。

エラーの種類よくある原因確認すること
undeclared identifier変数・関数・定数が未定義宣言位置、スコープ、スペルを確認します。
wrong parameters count関数の引数数が違う関数定義、公式仕様、呼び出し箇所を確認します。
cannot convert型が合っていないint、double、string、enumなどの型を確認します。
semicolon expectedセミコロン不足表示行だけでなく直前行も確認します。
unexpected token括弧や記号の崩れ直前のブロック構造を確認します。
include file not foundincludeファイルが見つからないファイル配置、パス、ファイル名を確認します。
unknown symbol不可視文字や文字コード由来の可能性先頭BOM、コピー元、保存形式を確認します。

エラーが表示された行だけでなく、その直前の行やブロック全体を見ることも重要です。括弧不足やセミコロン不足は、実際の原因が表示行より前にある場合があります。

3. Printログの基本

PrintやPrintFormatは、EAやインジケーターの状態をExpertsログへ出すためによく使われます。

Printログでは、単に「OK」「NG」と出すだけではなく、どの関数で、どの銘柄・時間足で、どの条件を確認し、どの結果になったのかを残すと調査しやすくなります。

PrintFormat("DIAG/SIGNAL symbol=%s tf=%s gate=%s reason=%s",
            _Symbol,
            EnumToString(_Period),
            "NG",
            "spread_limit");

上記は、ログ形式の考え方を示す最小例です。売買ロジックや推奨設定を示すものではありません。

ログ項目入れる理由
カテゴリどの層のログか分けるためDIAG/SIGNAL、DIAG/RISK
symbol対象銘柄を確認するため_Symbol
timeframe対象時間足を確認するためM15、H1など
resultOK、NG、SKIPを確認するためOK / NG / SKIP
reason理由を短く残すためdata_short、spread_limit
value判定に使った値を残すためspread=35、count=0
time発生時刻を照合するためserver_time、bar_time

Printログは便利ですが、出しすぎると読みにくくなります。ログカテゴリ、理由コード、出力頻度を整理して使ってください。

4. ExpertsログとJournalログの違い

MT5で不具合を調査する時は、ExpertsログとJournalログを分けて確認します。

Expertsログは、EAやインジケーター側のPrint、エラー、状態出力を確認する場所です。Journalログは、MT5端末、取引サーバー、ストラテジーテスター、接続、読み込みなどの端末側情報を確認する場所です。

ログ種別主な内容確認する場面
ExpertsログEA・インジケーターのPrint、内部状態、処理結果条件分岐、注文結果、CopyBuffer失敗、WebRequest失敗
JournalログMT5端末側、取引サーバー、テスター、接続関連接続状態、注文送信、ファイル読み込み、テスター実行
MetaEditorエラーコンパイルエラー、警告実行前のソース確認
Strategy Testerログバックテスト中の実行状態データ不足、速度、実行結果、最適化中の確認
外部サービス側ログWebhook、GAS、API側の受信・失敗外部連携エラーの切り分け

「EAが動かない」と感じる場合でも、ExpertsログだけでなくJournalログも確認してください。EA側の条件未成立なのか、MT5端末側の問題なのかを分ける必要があります。

5. GetLastErrorを使う時の注意

GetLastErrorは、直近のエラー番号を確認するために使います。

ただし、GetLastErrorの値だけを見ても、原因を断定できるとは限りません。どの関数を呼び出した直後に確認したのか、対象symbolやtimeframeは何だったのか、戻り値はどうだったのかを一緒に記録する必要があります。

ResetLastError();

int copied = CopyRates(_Symbol, PERIOD_M15, 0, 10, rates);

if(copied < 10)
{
   int err = GetLastError();

   PrintFormat("DIAG/DATA copy_rates_failed symbol=%s tf=%s requested=%d copied=%d error=%d",
               _Symbol,
               "PERIOD_M15",
               10,
               copied,
               err);
}

この例は、データ取得失敗時のログ形式を示すものです。実際のEAでは、必要本数、対象時間足、再試行方針、データ不足時の扱いを仕様として決めてください。

確認項目理由ログに残す例
直前の関数どの処理で失敗したか確認するためCopyRates、FileOpen、WebRequest
戻り値成功・失敗・不足を判断するためcopied、handle、status
対象情報銘柄や時間足を確認するためsymbol、timeframe、filename
GetLastErrorエラー候補を確認するためerror=xxxx
時刻発生タイミングを特定するためserver_time、bar_time
前後ログ原因の流れを見るためbefore / after context

GetLastErrorの値を確認した後は、必要に応じてエラーの意味を確認します。ただし、エラー番号だけでなく、前後のログも必ず確認してください。

6. MqlTradeResult.retcodeを記録する理由

注文処理の不具合では、GetLastErrorだけでなく、MqlTradeResult.retcodeを確認することが重要です。

MQL5の注文処理では、取引リクエストを送った後に、取引サーバー側の応答としてretcodeが返る場合があります。注文できなかった理由を確認するには、retcode、order、deal、comment、request内容を合わせて記録します。

記録項目確認する内容目的
retcode取引サーバー側の応答注文失敗理由を確認します。
order注文番号注文が作成されたか確認します。
deal約定番号約定したか確認します。
commentサーバーコメント補足理由を確認します。
request volume注文ロットvolume stepや最小ロットを確認します。
price / sl / tp注文価格と保護価格stops levelやdigitsを確認します。
symbol / magic対象銘柄とEA識別番号別EAや別銘柄との混同を避けます。

注文処理を調査する場合は、execution層のログとして、requestとresultを分けて記録すると確認しやすくなります。

7. 再現条件を整理する方法

不具合調査で最も重要なのは、再現条件を整理することです。

「たまに動かない」「急に止まった」「昨日は動いた」といった情報だけでは、原因を追うことが難しくなります。いつ、どのEAで、どの銘柄・時間足で、どのsetファイルを使い、どの操作をした時に発生したのかを整理してください。

再現条件記録する内容理由
EA名・インジ名対象ファイル名と表示名対象を特定するためです。
バージョン版番号、ファイル名旧版との混在を防ぐためです。
銘柄名MT5上の正確なsymbolサフィックス違いを確認するためです。
時間足チャート時間足と内部参照時間足MTF条件を確認するためです。
発生時刻サーバー時間、PC時刻、スクリーンショット時刻ログ照合のためです。
setファイル使用したinput設定同条件で再現するためです。
操作内容設定変更、ボタン操作、時間足変更、再起動など発生前の状態を確認するためです。
ログExperts、Journal、Strategy Tester原因候補を追うためです。

再現条件は、開発者だけでなく検証担当者にとっても重要です。同じ条件で再確認できる形に整理してください。

8. setファイル・銘柄・時間足・発生時刻の記録

MQL5の不具合調査では、同じEAでもsetファイル、銘柄、時間足、発生時刻が違うと、再現できない場合があります。

特に、外部連携、時間制御、スプレッド制御、マルチタイムフレーム、インジケーター連携、ファイル出力を含むEAでは、条件差が調査結果に大きく影響します。

記録対象確認すること注意点
setファイル使用中のinput設定認証情報やURLが含まれないか確認します。
銘柄名チャート左上のsymbolサフィックス込みで記録します。
時間足チャート時間足EA内部の参照時間足も確認します。
発生時刻いつ問題が起きたかサーバー時間と日本時間を混同しないようにします。
ログ範囲問題発生前後直前数行だけでは不足する場合があります。
スクリーンショットチャート、入力、エラー表示口座番号や個人情報を隠します。
直前変更EA更新、set変更、URL変更、VPS再起動など変更前後を分けて確認します。

setファイルには、通知設定、WebRequest URL、外部連携設定、認証に関わる値が含まれる場合があります。共有前に必ず内容を確認してください。

9. ログが多すぎる時の整理方法

ログは重要ですが、多すぎるログは逆に原因調査を難しくします。

毎tickで大量にPrintを出す、同じメッセージを連続出力する、判定値をすべて出し続ける、外部連携ログを毎回詳細表示する、といった状態では、必要な情報が埋もれてしまいます。

問題起きやすい状況整理方法
同じログが連続する毎tickで同じNG理由を出す同一理由は一定間隔で出します。
ログが長すぎる1行に情報を詰め込みすぎるカテゴリ別に分けます。
重要ログが埋もれるDEBUGログとERRORログが混在するINFO、WARN、ERRORを分けます。
バックテストが遅くなるバックテスト中に大量Printするバックテスト用ログプロファイルを作ります。
外部連携ログが多いHTTP応答やpayloadを毎回出す失敗時中心に出します。
ファイルが増えすぎるCSVやtxtを大量生成する保存条件と削除方針を決めます。
UIログが多いOnChartEventや表示更新で大量出力する状態変化時だけ出します。

ログ量の調整では、必要な情報を消しすぎないことも重要です。通常運用、検証、バックテスト、詳細調査でログレベルを分けると確認しやすくなります。

10. 外部連携エラーを調査する時の流れ

WebRequest、Discord通知、Google Sheets連携、外部API、認証処理を含むEAでは、外部連携特有の確認が必要です。

外部連携エラーでは、EA側のデータ生成、MT5のWebRequest許可、URL、HTTP応答、外部サービス側の状態を分けて確認します。

確認順序確認することログに残すこと
1送信前データが正しいかevent、symbol、time、payload概要
2WebRequest許可URLが設定されているか許可確認結果。URL実値は出さない
3HTTP応答が返っているかstatus code、timeout、error
4外部サービス側で受信しているか受信有無、外部側ログ
5通知抑制が働いていないかthrottle、last send time
6認証情報が正しいかマスク済み状態。実値は記録しない
7Strategy Tester中の分岐かtester mode、external disabledなど

Webhook URL、GAS URL、APIキー、認証トークンの実値は、本文、ログ、スクリーンショット、問い合わせ本文へそのまま含めないでください。

11. バックテスト中のログ確認

バックテスト中のログは、リアル環境のログと見え方が異なる場合があります。

Strategy Testerでは、テスト条件、ヒストリカルデータ、テストモデル、スプレッド、外部連携の扱い、ファイル出力先、ログ量が結果や確認しやすさに影響します。

確認項目バックテスト時の注意見るログ
INITテスター環境で初期化できているかExpertsログ
データ取得必要本数が取れているかCopyRates、CopyBufferログ
注文処理テスター上の約定条件で処理されているかEXECUTIONログ、結果タブ
外部連携バックテスト時に無効化・分岐されているかNOTIFY、WEB、AUTHログ
ファイル出力保存先が通常環境と違う場合があるFILEログ、Tester側Files
ログ量大量出力でバックテストが遅くならないかログプロファイル
最適化最適化中に過剰ログを出していないか最適化用ログ設定

バックテスト結果は、将来の結果を保証するものではありません。結果画面だけでなく、条件、setファイル、ログ、テストモデルをセットで確認してください。

12. 問い合わせ前に送る情報

MQL5の不具合調査を相談する場合は、状況を再現できる情報を整理してください。

ログだけ、スクリーンショットだけ、結果画面だけでは不足する場合があります。setファイル、対象EA、発生時刻、銘柄、時間足、Expertsログ、Journalログをセットで整理すると確認しやすくなります。

情報必要性注意点
EA名・インジ名対象特定ファイル名と表示名が違う場合があります。
バージョン仕様差分確認古い版と混在しないようにします。
setファイル入力条件の再現認証情報やURLを確認してから送ります。
銘柄名・時間足再現条件サフィックス込みで記録します。
発生時刻ログ照合サーバー時間と日本時間を分けます。
ExpertsログEA内部状態の確認発生前後を含めます。
Journalログ端末側状態の確認接続、注文、テスター関連を含めます。
スクリーンショット画面状態の確認口座番号や個人情報を隠します。
再現手順同じ状況を作るため操作順、設定変更、時間足変更などを記録します。

問い合わせが必要な場合は、必要情報を整理したうえで、対象範囲、再現条件、確認したログをまとめてください。

13. 送ってはいけない情報

ログやsetファイル、スクリーンショットを送る時は、機密情報が含まれていないか確認してください。

送ってはいけない情報理由対応
口座番号の全桁個人情報・口座情報に関係するため必要に応じて一部を伏せます。
投資家パスワード口座閲覧に関係するため送らないでください。
マスターパスワード取引権限に関係するため送らないでください。
Webhook URLの実値外部通知先の機密情報になり得るため伏せ字にします。
GAS URLの実値Google Sheets連携の機密情報になり得るため伏せ字にします。
APIキー外部サービス権限に関係するため送らないでください。
認証トークン認証情報に関係するため送らないでください。
個人情報不要な情報共有を避けるため隠してから送ります。
不要な取引履歴全体確認に不要な情報が含まれる場合があるため必要な範囲だけ共有します。

送ってよいか判断できない情報は、そのまま送らず、まずマスクまたは削除してください。

MQL5デバッグ・ログファースト確認チェック表

MQL5のデバッグや不具合調査では、以下を確認してください。

チェック項目確認内容
MetaEditorでコンパイルエラーがないか確認したerror 0、warning内容、対象ファイル、行番号を確認します。
エラー行番号と直前行を確認した表示行だけでなく直前の括弧、セミコロン、includeも確認します。
ExpertsログとJournalログを分けて確認したEA側の処理とMT5端末側の状態を分けます。
Printログにカテゴリ、symbol、timeframe、reasonを入れた後から検索しやすいログ形式にします。
GetLastErrorを確認する位置を決めた失敗する可能性のある関数の直後に確認します。
注文処理ではMqlTradeResult.retcodeを記録したOrderSendの戻り値だけで判断しないようにします。
setファイル、銘柄、時間足、発生時刻を記録した再現条件を揃えます。
再現手順を整理した操作順、直前変更、発生条件を残します。
ログが多すぎる場合は出力頻度を調整した通常、検証、バックテスト、詳細調査で切り替えます。
外部連携ではURLやtokenの実値を出していないWebhook URL、GAS URL、APIキー、認証トークンを保護します。
バックテストとリアル環境のログを分けて確認したテスター条件とリアル環境の差を分けます。
口座番号や個人情報をマスクしたスクリーンショット、ログ、setファイルを共有前に確認します。

よくある質問

Printログを増やせば原因は分かりますか?

ログを増やすだけでは原因が分からない場合があります。どの関数で、どの条件を確認し、どの結果になったのかを分類して出すことが重要です。ログ量が多すぎる場合は、カテゴリや出力頻度を整理してください。

ExpertsログとJournalログはどちらを見ればよいですか?

両方を確認してください。ExpertsログはEAやインジケーター側の状態確認に使い、JournalログはMT5端末、取引サーバー、テスター、接続状態の確認に使います。

GetLastErrorはいつ確認しますか?

失敗する可能性のある関数を呼び出した直後に確認します。どの関数の直後なのか、戻り値はどうだったのか、対象symbolやtimeframeは何かを合わせてログに残してください。

注文エラーではretcodeも必要ですか?

必要です。注文処理では、GetLastErrorだけでなく、MqlTradeResult.retcode、order、deal、comment、request内容を確認すると、取引サーバー側の応答を追いやすくなります。

ログが多すぎる場合はどう整理しますか?

同じ理由の連続出力を抑制し、INFO、WARN、ERROR、DEBUGなどの分類を分けます。通常運用、検証、バックテストでログ量を切り替える設計も有効です。

問い合わせ時にソースコードは必要ですか?

内容によります。既存EAやインジケーターの改修、ロジック調査、コンパイルエラー確認では必要になる場合があります。一方で、動作確認だけなら、setファイル、Expertsログ、Journalログ、スクリーンショット、発生条件で確認できる場合もあります。

Webhook URLやAPIキーを送ってよいですか?

送らないでください。Webhook URL、GAS URL、APIキー、認証トークンなどの実値は、ログ、スクリーンショット、問い合わせ本文に含めないようにしてください。

バックテストのログとリアル運用ログは同じですか?

同じとは限りません。バックテストではテスター環境、ヒストリカルデータ、外部連携制限、ログ量の違いがあり、リアル運用ではサーバー応答、通信、スプレッド、通知先などが影響します。

コンパイルエラーが複数ある時はどこから直しますか?

基本的には上から順番に確認し、最初の根本原因を探します。1つの括弧不足や型不一致が、後続の複数エラーを発生させることがあります。

ログとスクリーンショットは両方必要ですか?

両方あると確認しやすくなります。ログは内部状態や時系列、スクリーンショットは画面状態や設定の見た目を確認するために使います。口座番号や個人情報は隠してください。

関連する技術講座

MQL5のデバッグやログ設計を確認する場合は、エラーコード、関数、注文管理、EA設計、ファイル出力、イベント処理、長時間稼働の講座もあわせて確認してください。

技術講座確認できること
MQL5エラーコード辞典GetLastError、TRADE_RETCODE、コンパイルエラー、WebRequest関連エラーを確認できます。
MQL5関数辞書MQL5で使う主要関数の役割、戻り値、確認ポイントを整理できます。
MQL5注文・ポジション・履歴管理完全ガイドOrderSend、MqlTradeRequest、MqlTradeResult、Position、Deal、Historyの確認に使えます。
MQL5 EA設計パターン完全ガイドsignal、execution、risk、exit、auth、external control、notificationの責務分離を確認できます。
MQL5ファイル操作・CSVログ出力完全ガイドFileOpen、Filesフォルダ、Commonフォルダ、CSV、文字コード、ログ出力を確認できます。
MQL5イベント処理完全ガイドOnInit、OnTick、OnTimer、OnTradeTransaction、OnChartEventのログ設計を確認できます。
MQL5長時間稼働・安定化完全ガイドメモリ、ハンドル、ログ抑制、Object管理、長時間稼働時の確認に使えます。

関連する確認ページ

デバッグや不具合調査を進める場合は、setファイル、開発依頼資料、バックテスト、外部連携、サポート依頼の整理も確認してください。

確認ページ確認できること
MT5でEAのsetファイルを送る前に確認することsetファイル内の設定、認証情報、URL、送付前の確認ポイントを整理できます。
MT5開発依頼前に用意する資料まとめ仕様書、setファイル、Expertsログ、Journalログ、スクリーンショットを整理できます。
MT5ストラテジーテスター・最適化完全ガイドバックテスト条件、最適化、結果画面、Expertsログ、Journalログを確認できます。
MT5外部連携・通知セキュリティガイドWebhook URL、GAS URL、APIキー、認証トークンなどの扱いを確認できます。
不具合報告・サポート依頼ログ、スクリーンショット、再現手順、利用環境を整理して相談する方法を確認できます。

購入前・利用前に確認するページ

EA、インジケーター、補助ツールを利用する前には、商品一覧、導入ガイド、動作環境、購入前確認、利用上の注意も確認してください。

ページ確認できること
技術講座一覧MT5・MQL5・EA開発に関する技術講座を順番に確認できます。
導入ガイドEA、インジケーター、補助ツールを導入する前の確認事項を整理できます。
商品一覧EAファンクラブで扱う補助ツール、インジケーター、コピーEAなどを確認できます。
動作環境MT4 / MT5、Windows PC、VPS、外部連携などの動作環境を確認できます。
購入前確認事項購入前に確認しておきたい対応環境、利用条件、確認事項を整理できます。
免責事項・リスク説明商品の利用上の注意、責任範囲、リスク説明を確認できます。

まとめ

MQL5の不具合調査では、エラーコードの意味だけでなく、ログの出し方、確認順序、再現条件の整理が重要です。

MetaEditorでコンパイルエラーを確認し、ExpertsログとJournalログを分けて見ます。処理失敗時はGetLastError、注文処理ではMqlTradeResult.retcodeを確認し、対象銘柄、時間足、setファイル、発生時刻と合わせて記録してください。

ログは多ければよいわけではありません。INIT、GATE、SIGNAL、RISK、EXECUTION、EXIT、NOTIFY、FILEなど、目的別に分類し、通常運用、検証、バックテストでログ量を切り替えると確認しやすくなります。

外部連携を含むEAでは、Webhook URL、GAS URL、APIキー、認証トークンなどの実値をログや問い合わせ本文に含めないようにしてください。

学習内容を確認しても整理が難しい場合は、EA名、バージョン、setファイル、Expertsログ、Journalログ、発生時刻、スクリーンショットを整理したうえで相談してください。

ABOUT ME
記事URLをコピーしました