EAやインジケーターを開発していて、変数の中身を確認したいとき、
とりあえず`Print()`だけで済ませていないでしょうか。
実はMQL5には、画面に何かを出力する関数が
`Comment()`・`Alert()`・`Print()`と3つあり、
それぞれ出力される場所も、処理が止まるかどうかも、
消えるタイミングもまったく違います。
この違いを知らずに使っていると、
「ストラテジーテスターの最適化中だけ
なぜかコメントが消える」といった、
原因が分かりにくいトラブルに遭遇します。
この記事では、3つの関数をいつ使い分けるべきかの判断基準と、
実際に動くサンプルコードを使って解説します。
・Comment/Alert/Printの出力先と役割の違い
・GetLastError()と組み合わせた実務的なログ出力の書き方
・ストラテジーテスターの最適化中に出力が消える理由
・配列を直接渡せないという共通の注意点
Comment・Alert・Printの違いを一言でいうと
まず、3つの関数がそれぞれ何のためにあるのか、役割から整理します。
出力先がまったく違う
`Print()`は「エキスパート」タブ(ジャーナル)にログとして記録されます。
`Comment()`はチャートの左上に文字列を常時表示し続けます。
`Alert()`はポップアップウィンドウで通知し、効果音も鳴らします。
処理を止めるのはAlertだけ
`Print()`と`Comment()`は呼び出してもプログラムの実行は止まりません。
`Alert()`も実行自体は止まりませんが、ポップアップが画面を覆うため、
人間の操作としては一度手が止まります。
多用するとその都度ポップアップを閉じる手間が発生する点に注意してください。
用途ごとの判断基準を表にする
どの場面でどれを使うべきか、判断に迷わないよう一覧にしました。
| 関数 | 向いている用途 | 向いていない用途 |
|---|---|---|
| Print() | 開発中の変数確認、取引履歴の記録 | 今すぐ気づいてほしい緊急通知 |
| Comment() | 残高・ポジション状況の常時表示 | 一度だけ伝えたいイベント通知 |
| Alert() | 致命的なエラー・重要な売買シグナルの通知 | 頻繁に発生する通常のログ |
Print()でログに記録する
まず、開発時に一番お世話になる`Print()`の使い方から確認します。
基本の書き方
Print("Bid=", SymbolInfoDouble(_Symbol, SYMBOL_BID), " Ask=", SymbolInfoDouble(_Symbol, SYMBOL_ASK));
カンマ区切りで値を並べるだけで、文字列と数値を混在させて出力できます。
PrintFormat()で桁数を整える
`Print()`はdouble型を最大16桁まで表示するため、
価格のような少ない桁数の値では見づらくなることがあります。
PrintFormat("Bid=%.5f Ask=%.5f", SymbolInfoDouble(_Symbol, SYMBOL_BID), SymbolInfoDouble(_Symbol, SYMBOL_ASK));
`%.5f`のような書式指定子で、小数点以下の桁数を指定できます。
GetLastError()と組み合わせたエラーログ
発注処理が失敗したときに、原因を後から追えるようにする定番の書き方です。
if(!result)
{
int err = GetLastError();
Print("発注失敗。エラーコード=", err);
}
・エラーコードの読み方は既刊のGetLastError()解説記事を参照してください
・MQL4版の記事ですが、エラーコードの体系は共通点が多くあります
Comment()でチャートに常時表示する
開発中の確認用だけでなく、運用中のEA・インジケーターの状態表示にも便利な関数です。
基本の書き方
Comment("残高: ", AccountInfoDouble(ACCOUNT_BALANCE), "\n有効証拠金: ", AccountInfoDouble(ACCOUNT_EQUITY));
`\n`を挟むことで、チャート上の表示を複数行に分けられます。
OnCalculate/OnTickの中で毎回呼び出す
`Comment()`は呼び出した瞬間の内容で画面を上書きするため、
常時表示したい場合は`OnTick()`や
`OnCalculate()`の中で毎回呼び出す設計にします。
void OnTick()
{
Comment("現在のスプレッド: ", SymbolInfoInteger(_Symbol, SYMBOL_SPREAD), " ポイント");
}
配列は直接渡せない注意点
`Comment()`に配列をそのまま渡すとコンパイルエラーになります。
・配列は要素ごとに取り出してから渡す必要があります
・例: Comment(buf[0], ” “, buf[1])のように1つずつ指定します
・これはComment/Alert/Printの3つに共通する仕様です
Alert()で重要イベントを見逃さないようにする
ログやチャート表示では見逃してしまう、重要な通知に使う関数です。
基本の書き方
Alert(_Symbol, "で発注エラーが発生しました。エラーコード=", GetLastError());
ポップアップウィンドウが開き、効果音とともに通知されます。
どんな場面で使うべきか
チャートを開きっぱなしにして裁量判断を加える人向けに、「決済された」
「致命的なエラーが出た」といった、
見逃すと損失につながる場面に限定して使うのが実務的な判断です。
多用するデメリット
・頻繁なログにAlert()を使うと、ポップアップ対応で画面に張り付きます
・「人が気づくべきことか」を基準に、Print()とAlert()を使い分けてください
3つを組み合わせた実際に動くコード全体
発注失敗時に、ログ記録(Print)・常時表示(Comment)・
緊急通知(Alert)を使い分けるスクリプトです。
//+------------------------------------------------------------------+
//| CommentAlertPrintDemo.mq5 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property script_show_inputs
input double InpLots = 0.10;
void OnStart()
{
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// 開発確認用のログ出力(Print)
PrintFormat("スクリプト開始。Bid=%.5f Lots=%.2f", bid, InpLots);
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = InpLots;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation = 10;
if(!OrderSend(request, result))
{
int err = GetLastError();
// 後から調査するためのログ(Print)
Print("発注失敗。retcode=", result.retcode, " error=", err);
// チャート上に常時表示(Comment)
Comment("直近エラー: retcode=", result.retcode, "\nエラーコード=", err);
// 見逃してはいけない通知(Alert)
Alert(_Symbol, "で発注に失敗しました。retcode=", result.retcode);
}
else
{
Print("発注成功。注文チケット=", result.order);
Comment("最新注文チケット: ", result.order);
}
}
MetaEditorでのコンパイル・実行手順
- MetaEditorで新規スクリプト「CommentAlertPrintDemo」を作成し、上のコードを貼り付けてコンパイルする
- MT5のナビゲーターからチャートへドラッグ&ドロップして実行する(自動売買が有効になっているデモ口座で試してください)
- 「エキスパート」タブにPrint()のログが表示されることを確認する
- チャート左上にComment()の表示が出ること、発注に失敗した場合はAlert()のポップアップが開くことを確認する
よくあるエラーと注意点
実際に使うときにつまずきやすいポイントをまとめます。
ストラテジーテスターの最適化中は出力が消える
・Comment()とAlert()は、ストラテジーテスターの最適化実行中は機能しません
・「単体では出たのに最適化では何も出ない」という問い合わせの原因はこれです
・最適化中もログを残したい場合はPrint()を使ってください(記録は残ります)
文字列結合には上限がある
`Comment()`と`Alert()`は、結合後の文字列が
2045文字を超えると超過分が切り捨てられます。
長大な文字列を一度に表示しようとしている場合は、分割して出力してください。
MQL4との違いはあるか
Comment・Alert・Printの3つは、
MQL4にも同名・同じ可変長引数の仕様で存在します。
現行のMQL4はMQL5と共通のコンパイラ基盤のため、
書き方そのものはほぼそのまま流用できます。
よくある質問
Comment・Alert・Printについて、よく検索される疑問に回答します。
Print()の出力はどこで確認できますか?
MetaTrader5の「表示」メニューから「ツールボックス」
を開き、「エキスパート」タブで確認できます。
スクリプト・インジケーター実行時は「ジャーナル」タブに出ることもあります。
Comment()を消すにはどうすればいいですか?
引数なしで`Comment(“”)`を呼び出すと、表示をクリアできます。
`OnDeinit()`の中で呼び出しておくと、EA停止時に表示が残り続けるのを防げます。
Alert()のポップアップが出ないことがあるのはなぜですか?
前述のとおりストラテジーテスターの最適化中は機能しません。
また、端末の通知設定やサウンド設定によって、効果音だけ鳴らないケースもあります。
ポップアップ自体が出ない場合は、まず最適化モードで実行していないかを確認してください。
【MQL5】Comment・Alert・Printの使い分けと出力が消えるタイミングの注意点を解説:まとめ
Comment・Alert・Printは、どれも「画面に何かを出す」
点は同じですが、出力先・止まるかどうか・消えるタイミングがまったく違う関数です。
開発中のログはPrint()、常時表示はComment()、
見逃してはいけない通知だけAlert()に絞ることで、
無駄なポップアップに煩わされない運用ができます。
コメント