EAが今どう動いているのか、
チャートを見るだけで確認したいとき、
最も手軽な方法がComment関数です。
この記事では、Comment関数の制限事項を踏まえた上で、
EAの稼働状況を1枚のパネルとして表示する実装と、
OBJ_LABEL系オブジェクトを使うパネルとの使い分けを解説します。
・Comment関数の文字数制限と配列を渡せない仕様
・複数回呼び出すと上書きされてしまう仕組み
・EAの稼働状況パネルの実装コード
・OBJ_LABEL系オブジェクトとの使い分け
Comment関数で分かること・できないこと
まず、Comment関数が何をする関数なのかを確認します。
チャート左上に文字を表示する関数
Comment関数は、
チャートウィンドウの左上隅に
任意の文字列を表示する関数です。
位置・フォント・色は指定できない
・表示位置は常にチャート左上隅に固定
・フォントサイズ・文字色を個別に指定する機能はない
・見た目を細かく調整したい場合はOBJ_LABEL等のオブジェクト関数を使う
1つのチャートで表示を共有する点に注意
Comment関数の表示領域は、
そのチャートで動いているEA・インジケーター・スクリプトの間で
共有されています。
Comment関数のシグネチャと制限事項
実際の書式と制限をdocs.mql4.comで確認済みの内容で見ていきます。
Comment()のシグネチャ(docs.mql4.com確認済み)
void Comment( argument, //1番目の値 ... //2番目以降の値(カンマ区切りで複数指定可) );
戻り値はなく(void)、引数の数は64個以下という上限があります。
文字数上限は2045文字
表示できる文字数は2045文字までで、
超えた分は削除されます。
EAの稼働状況パネルのように情報量が多くなる使い方では、
表示項目を絞っておくことが大切です。
配列はそのまま渡せない
Comment関数には配列を直接渡すことができず、
要素を1つずつ指定する必要があります。
複数の値をまとめたい場合は、
後述のように1本の文字列に連結してから渡します。
複数の値を1回の呼び出しにまとめる書き方
Comment関数には落とし穴があるため、書き方を確認します。
呼び出すたびに前回の表示が上書きされる
・Comment関数は呼び出すたびに表示内容を丸ごと置き換える
・OnTick()内で複数回Comment()を呼ぶと、最後の1回しか残らない
・表示したい情報は必ず1本の文字列にまとめてから渡す
文字列を+と\nで組み立てる
string status = ""; status = status + "Equity: " + DoubleToString(AccountEquity(), 2) + "\n"; status = status + "Spread: " + DoubleToString(MarketInfo(_Symbol, MODE_SPREAD), 0); Comment(status);
`+`で文字列をつなぎ、`\n`を挟むことで改行された1枚のパネルになります。
OnDeinit()でComment(“”)を呼び忘れない
EAを停止・削除したあとも、
Comment関数の表示はチャートに残り続けます。
`OnDeinit()`で`Comment(“”)`を呼び、
表示を必ず消すようにします。
実際に動くサンプルコード(EAの稼働状況パネル)
ここまでの要素をまとめたEAの稼働状況パネルです。
//+------------------------------------------------------------------+
//| CommentStatusPanel.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property strict
input int InpMagicNumber = 20261010;//このEAのマジックナンバー
int CountMyOrders(int magic)
{
int count = 0;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == magic && OrderSymbol() == _Symbol)
count++;
}
}
return(count);
}
void OnTick()
{
string status = "";
status = status + "=== EA Status ===" + "\n";
status = status + "Symbol: " + _Symbol + " Time: " + TimeToString(TimeCurrent(), TIME_SECONDS) + "\n";
status = status + "Spread: " + DoubleToString(MarketInfo(_Symbol, MODE_SPREAD), 0) + " points" + "\n";
status = status + "Equity: " + DoubleToString(AccountEquity(), 2)
+ " Balance: " + DoubleToString(AccountBalance(), 2) + "\n";
status = status + "Margin Level: " + DoubleToString(AccountMarginLevel(), 1) + " %" + "\n";
status = status + "Positions(this EA): " + IntegerToString(CountMyOrders(InpMagicNumber)) + "\n";
status = status + "Last Error: " + IntegerToString(GetLastError());
Comment(status);
}
void OnDeinit(const int reason)
{
Comment("");//表示を消してから終了する
}
`GetLastError()`は呼んだ時点のエラーコードを返すだけで、
既刊get-last-error.mdで解説した通り
エラーが無ければ0を返します。
MetaEditorでの実行手順
実際にMT4へ適用するまでの手順を確認します。
- MetaEditorで新規EA「CommentStatusPanel」を作成し、上のコードを貼り付けてコンパイルする
- 任意の通貨ペアのチャートにドラッグ&ドロップで適用する
- チャート左上に残高・証拠金維持率等のパネルが表示されることを確認する
- EAをチャートから削除し、表示が自動で消えることを確認する
よくあるエラーと注意点
実装・運用でつまずきやすいポイントをまとめます。
他のEA・インジケーターの表示と競合する
・同じチャートで別のEAやインジケーターもComment()を使っている場合
・後から呼ばれた側の内容で表示が上書きされてしまう
・複数の自作プログラムを同時に動かす場合は競合に注意する
細かい見た目が必要ならOBJ_LABEL系を使う
既刊margin-level-indicator-mt4.mdのように、
表示位置・文字色・背景を細かく指定したい場合は、
OBJ_RECTANGLE_LABEL・OBJ_LABEL等の
オブジェクト関数を使う方が向いています。
文字数が2045文字を超えると表示が切れる
項目を増やしすぎると、
文字数上限の2045文字を超えた部分が
表示されなくなります。
よくある質問
Comment関数について、よく検索される疑問に回答します。
Comment関数とPrint関数は何が違いますか?
Comment関数はチャート上に表示され続けますが、
Print関数はエキスパートログに1行ずつ記録されるだけで、
チャート上には表示されません。
既刊comment-alert-print-mql5.mdで、
MQL5版の使い分けを解説しています。
数値の桁数は自由に指定できますか?
Comment関数自体には桁数を指定する機能はありません。
この記事のサンプルのように、
DoubleToString()で桁数を整えた文字列にしてから渡します。
インジケーターからComment関数を使えますか?
使えます。
EA・インジケーター・スクリプトのいずれからも呼び出せますが、
同じチャートで複数のプログラムが使うと上書き競合が起きる点は共通です。
【MQL4】Comment関数でEAの稼働状況を一画面に表示する方法(OBJ_LABELとの使い分け):まとめ
Comment関数は、
位置やフォントを指定できない代わりに、
数行で書けるもっとも手軽な状況表示の手段です。
呼び出すたびに上書きされる仕様を理解し、
1本の文字列にまとめてから渡すことで、
EAの稼働状況を一画面で確認できるパネルになります。
コメント