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へ適用するまでの手順を確認します。

  1. MetaEditorで新規EA「CommentStatusPanel」を作成し、上のコードを貼り付けてコンパイルする
  2. 任意の通貨ペアのチャートにドラッグ&ドロップで適用する
  3. チャート左上に残高・証拠金維持率等のパネルが表示されることを確認する
  4. 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の稼働状況を一画面で確認できるパネルになります。

関連記事