変数の中身を確認したいとき、`Print()`を1行足して、
コンパイルし直して、もう一度実行して、
ジャーナルタブをスクロールして……という作業を繰り返していないでしょうか。
MetaEditorには、プログラムの実行を好きな行で一時停止し、
その場で変数の値を確認できるデバッガー機能が標準で搭載されています。
この記事では、ブレークポイントの置き方・ステップ実行3種類の違い・
`DebugBreak()`関数の使い方を、動くコード例付きで解説します。
・MetaEditorのデバッグモードの起動方法
・ブレークポイントの設定とステップ実行3種類の違い
・変数の値をその場で確認するウォッチ機能
・DebugBreak()関数で条件付きに一時停止する方法
Print()だけのデバッグで限界を感じたら
まず、デバッガー機能とこれまでの手法の違いを整理します。
既刊Comment/Alert/Print記事との関係
既刊のComment・Alert・Printの使い分けの記事では、
画面に何かを「出力する」3つの関数の違いを解説しました。
本記事はその3関数の比較を繰り返さず、
MetaEditorに標準搭載されている
「実行を一時停止する」デバッガー機能に絞って解説します。
「どこで値が変わったか」を知りたいときの限界
・Print()は「出力した時点の値」しか分からない
・怪しい区間すべてにPrint()を増やすと、修正のたびに再コンパイルが必要
・デバッガーなら1回の実行で複数の変数を好きなタイミングで確認できる
この記事で扱うデバッガー機能の概要
ブレークポイント・ステップ実行・ウォッチ・`DebugBreak()`の4つを扱います。
デバッグモードの起動方法
デバッガーを使うには、通常の実行とは別の起動方法を使います。
F5またはメニューからデバッグを開始する
MetaEditorでソースを開いた状態で`F5`キーを押すか、
メニューの「デバッグ」→「デバッグの開始」を選びます。
デバッグ対象(EA/インジケーター/スクリプト)の選び方
EAの場合はストラテジーテスターが、
インジケーター・スクリプトの場合は実際のチャートが起動し、
その中でプログラムが動きながらデバッグできます。
以前はMQL4で使えなかった(MetaEditor統合の歴史)
旧MetaEditor 4
(MQL4/MQL5の共通コンパイラに統合される前のバージョン)には、
このデバッガー機能自体が存在しませんでした。
統合後の現行MetaEditorからMQL4でも使えるようになっています。
ブレークポイントの設定とステップ実行
実際に止める場所と、止めた後の進め方を確認します。
ブレークポイントの設定方法(F9)
止めたい行にカーソルを置いて`F9`キーを押すと、
その行にブレークポイント(赤い印)が設定され、
デバッグ実行時にその行の直前で一時停止します。
ステップイン・ステップオーバー・ステップアウトの違い
| 操作 | キー | 動き |
|---|---|---|
| ステップイン | F11 | 1行ずつ進める。関数呼び出しがあれば関数の中へ入る |
| ステップオーバー | F10 | 1行ずつ進める。関数の中には入らず、処理が終わった結果だけ受け取る |
| ステップアウト | Shift+F11 | 今いる関数の処理を最後まで進め、呼び出し元に戻る |
変数の値をウォッチする方法
一時停止している状態で、確認したい変数名をウォッチ欄に入力すると、
その時点での値が表示されます。
実際に動くコード例でブレークポイントを試す
実際にブレークポイントを置いて試せる、簡単なサンプルです。
//+------------------------------------------------------------------+
//| DebugBreakpointSample.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
input int InpThreshold = 10; //何回目のTickで止めるか
int g_TickCounter = 0;
void OnTick()
{
g_TickCounter++;
double spreadPoints = (Ask - Bid) / _Point;
if(g_TickCounter >= InpThreshold)
{
// この行にF9でブレークポイントを置き、
// g_TickCounterとspreadPointsの値をウォッチで確認する
Print("g_TickCounter = ", g_TickCounter, " spreadPoints = ", spreadPoints);
}
}
動作確認用のサンプルコード
Tickが来るたびにカウンターを増やし、
`InpThreshold`回目以降の`Print()`の行で止めて、
カウンターとスプレッドの値を確認する想定です。
ブレークポイントを置く場所の選び方
「値がおかしくなっている可能性がある行」の直前や、
条件分岐の直後(値が確定した直後)に置くと、
原因を絞り込みやすくなります。
DebugBreak()関数で任意の場所で停止する
F9とは別に、コードの中から一時停止を指示する方法もあります。
DebugBreak()のシグネチャ
void DebugBreak();
戻り値はなく、デバッグモードで実行されているときだけ、
呼び出した瞬間にプログラムが一時停止します。
F9のブレークポイントとの違い・使い分け
F9は「この行に来たら必ず止まる」設定であるのに対し、
`DebugBreak()`はコード側でif文の中に置けるため、
「特定の条件を満たしたときだけ止まる」という使い方ができます。
コード例
if(g_TickCounter >= InpThreshold && spreadPoints > 20)
{
DebugBreak(); //カウンターがしきい値以上、かつスプレッドが異常に広いときだけ止める
}
毎回条件を手で確認する`if`の中に`DebugBreak()`を置くことで、
まれにしか発生しない条件だけを狙って止められます。
よくあるエラーと注意点
実際に使う前に、知っておきたい注意点です。
・デバッグモードのまま実運用のリアル口座チャートを動かさない
・ブレークポイントを置いたまま忘れてコンパイルし直すと不要な停止が起きる
・デバッグ実行は通常実行より処理が遅くなる
デバッグモードを止め忘れる
デバッグを終えたら「デバッグ」→「デバッグの停止」で、
通常の実行に戻すことを忘れないようにしてください。
ブレークポイントで止まらない
対象のファイルを保存・再コンパイルしていないと、
古いバージョンのままデバッグが始まり、
ブレークポイントの行がずれて止まらないことがあります。
ストラテジーテスター内でのみ動くEAのデバッグ
EAをデバッグ実行すると、
通常はストラテジーテスターの中で動くため、
実際の発注(デモ・リアル口座への発注)は発生しません。
MQL4とMQL5の違い
デバッガー機能そのものに関する2言語の違いを確認します。
現行のMetaEditorはMQL4/MQL5で共通
現在のMetaEditorはMQL4・MQL5のどちらのファイルを開いても、
同じデバッガー機能(F9・F11・F10・Shift+F11)が使えます。
DebugBreak()は両言語に存在する
`DebugBreak()`関数は、
MQL4・MQL5どちらの公式リファレンスにも同じ書式で掲載されています。
ストラテジーテスターの挙動は共通の制約
既刊のComment・Alert・Printの記事で触れたとおり、
最適化中はComment/Alert/Printの出力が機能しないという制約は、
デバッガー機能とは別の話として覚えておく必要があります。
よくある質問
デバッガー機能について、よくある疑問に回答します。
・怪しい箇所が1つに絞れているならF9のブレークポイントで十分
・まれにしか起きない条件を追うならDebugBreak()が有利
・デバッグが終わったら忘れずに通常実行に戻す
Print()はもう使わなくていいですか?
デバッガーが使えない環境(他の人に渡したログファイルから後で確認する場合等)では、
今でもPrint()によるログ出力が必要です。
目の前で原因を探るときはデバッガー、
記録を残したいときはPrint()、と使い分けてください。
インジケーターでもデバッグできますか?
できます。
デバッグ対象としてインジケーターを選ぶと、
指定したチャートにそのインジケーターが適用された状態でデバッグが始まります。
ブレークポイントは何個でも置けますか?
複数のブレークポイントを同時に置くことができ、
実行は最初に到達したブレークポイントで止まります。
不要になったブレークポイントは、同じ行でF9を押すと解除できます。
EAの発注ロジックのデバッグで気をつけることはありますか?
デバッグ実行はストラテジーテスターの中で動くため、
実際の発注結果(約定価格・スリッページ等)はテスターの仕様に依存します。
発注直前の値の確認には有効ですが、
本番環境との細かな差異はデモ口座でも別途確認してください。
【MQL】MetaEditorのブレークポイント・ステップ実行でEA・インジケーターをデバッグする方法について解説してみた(MQL4/MQL5共通):まとめ
この記事では、Print()を増やして再コンパイルを繰り返す代わりに、
MetaEditorのデバッガー機能
(ブレークポイント・ステップ実行・ウォッチ・DebugBreak())を
使って変数の値をその場で確認する方法を解説しました。
怪しい箇所が1つに絞れているならF9のブレークポイント、
まれにしか起きない条件を追うならDebugBreak()、
という使い分けを覚えておくと、デバッグの効率が大きく変わります。
コメント