証拠金維持率が「今いくつか」は口座情報タブで確認できますが、

「さっきの150%からどれだけ悪化したか」という推移は記録されていません。

この記事では、証拠金維持率の変化をサブウィンドウに折れ線グラフとして記録し、

含み損が増える心理的なキツさを可視化するインジケーターの作り方を解説します。

この記事で分かること
・AccountInfoDoubleでの取得方法
・サブウィンドウに推移を折れ線で記録する設計
・危険水域を示す目安線の引き方
・既刊の現在値表示インジケーターとの役割の違い
  1. なぜ”推移”を見せたいのか
    1. 現在値だけでは「悪化のスピード」が分からない
    2. 心理的なキツさは”変化の速さ”に表れる
    3. この記事で作るインジケーターの概要
  2. AccountInfoDouble()で証拠金維持率を取得する
    1. 関数の書式
    2. ポジションが無いときの挙動に注意
    3. 既刊margin-level-indicator-mt4.mdとの違い
  3. 実際に動くコード全体
    1. 設計のポイント(過去を遡れない点を正直に扱う)
    2. コード全文
    3. MetaEditorでのコンパイル・適用手順
  4. 折れ線とレベル線の設計
    1. indicator_level1/level2で危険水域を示す
    2. DangerLevel/WarningLevelをinputにした理由
    3. OBJ_LABELで現在の状態も文字で補足
  5. 既刊記事との役割の違い・組み合わせ方
    1. 既刊margin-level-indicator-mt4.mdとの違い
    2. 既刊maginecole-alert-line.mdとの違い
    3. 3記事を組み合わせた使い方
  6. よくある注意点
    1. 過去の履歴は遡って再現できない
    2. 複数チャートで同じラベル名が競合する
    3. ストラテジーテスターでは意味が薄い
  7. MQL4とMQL5の違い
    1. AccountInfoDouble自体は共通
    2. MQL5ではCTradeクラスとの併用が一般的
    3. グラフ化の考え方自体は共通
  8. よくある質問
    1. 過去の証拠金維持率の履歴は見られますか?
    2. 既刊の常時表示インジケーターと両方使う意味はありますか?
    3. EAの発注条件にも使えますか?
  9. 【MQL4】証拠金維持率の推移をサブウィンドウにグラフ表示するインジケーターの作り方について解説してみた(含み損の心理的キツさを可視化):まとめ
    1. 関連記事

なぜ”推移”を見せたいのか

現在値だけでは見えないものを整理します。

現在値だけでは「悪化のスピード」が分からない

証拠金維持率が180%と表示されていても、

5分前が300%だったのか170%だったのかで状況の深刻さは違います。

心理的なキツさは”変化の速さ”に表れる

含み損が増えていく心理的な負担は、数値そのものより悪化の速さに左右されます。

この記事で作るインジケーターの概要

証拠金維持率の値をサブウィンドウに記録し、折れ線グラフとして見せます。

AccountInfoDouble()で証拠金維持率を取得する

グラフの元になる数値の取得方法を確認します。

関数の書式

double AccountInfoDouble(
   int property_id   // 取得したい項目のID
   );

ACCOUNT_MARGIN_LEVELを指定すると、

証拠金維持率がパーセント単位で返ります。

ポジションが無いときの挙動に注意

注意
・証拠金が0のとき維持率は0として返る
・0を「危険水域」と誤判定しないよう分岐が必要
・既刊margin-level-indicator-mt4.mdと同じ対策

既刊margin-level-indicator-mt4.mdとの違い

既刊の証拠金維持率の常時表示インジケーターの記事は、

現在値を文字色の3段階で警告する設計でした。

本記事は同じ取得関数を使いながら、推移を折れ線で見せる別の実装形態です。

実際に動くコード全体

推移を折れ線グラフとして記録するインジケーターです。

設計のポイント(過去を遡れない点を正直に扱う)

証拠金維持率は価格と違い過去の履歴が保存されていないため、

チャートに適用した時点から記録が積み重なっていく設計にします。

コード全文

//+------------------------------------------------------------------+
//|                                   MarginLevelHistoryChart.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
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_minimum 0
#property indicator_level1 200
#property indicator_level2 100
#property indicator_levelcolor clrGray

input double DangerLevel  = 100.0; // この値を下回ったら危険水域とみなす
input double WarningLevel = 200.0; // この値を下回ったら警戒水域とみなす

double MarginLevelBuffer[];
bool   Recording = false;

int OnInit()
  {
   SetIndexBuffer(0, MarginLevelBuffer);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2, clrDodgerBlue);
   SetIndexLabel(0, "証拠金維持率(%)");

   ObjectCreate(0, "MarginLevelHistoryLabel", OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, "MarginLevelHistoryLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, "MarginLevelHistoryLabel", OBJPROP_XDISTANCE, 10);
   ObjectSetInteger(0, "MarginLevelHistoryLabel", OBJPROP_YDISTANCE, 10);

   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, "MarginLevelHistoryLabel");
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int start = (prev_calculated > 0) ? prev_calculated - 1 : 0;

   if(!Recording)
     {
      for(int i = start; i < rates_total; i++)
         MarginLevelBuffer[i] = EMPTY_VALUE;
      Recording = true;
     }

   double equity = AccountInfoDouble(ACCOUNT_EQUITY);
   double margin = AccountInfoDouble(ACCOUNT_MARGIN);
   double level;

   if(margin <= 0)
      level = EMPTY_VALUE; // ポジション無し。0を危険水域と誤判定しない
   else
      level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);

   MarginLevelBuffer[rates_total - 1] = level;

   string status = "ポジション無し";
   if(level != EMPTY_VALUE)
     {
      if(level < DangerLevel)
         status = "危険水域";
      else if(level < WarningLevel)
         status = "警戒水域";
      else
         status = "安全水域";
     }

   ObjectSetString(0, "MarginLevelHistoryLabel", OBJPROP_TEXT,
                    "証拠金維持率: " + (level == EMPTY_VALUE ? "---" : DoubleToString(level, 1)) +
                    "%  [" + status + "]");

   return(rates_total);
  }

MetaEditorでのコンパイル・適用手順

MetaEditorに貼り付けて保存・コンパイルし、エラーが0件であることを確認します。

デモ口座でポジションを持ち、折れ線が記録されていくか確認します。

折れ線とレベル線の設計

グラフの見せ方に関する設計の工夫を整理します。

indicator_level1/level2で危険水域を示す

indicator_level1・indicator_level2プロパティを使うと、

サブウィンドウに水平の目安線を自動で描画できます。

DangerLevel/WarningLevelをinputにした理由

ブローカーのロスカット水準は会社ごとに異なるため、

閾値をinputにして自分の口座に合わせて調整できるようにしています。

OBJ_LABELで現在の状態も文字で補足

折れ線だけでは数値が読みにくいため、

既刊と同じOBJ_LABELの手法で数値と状態も表示します。

既刊記事との役割の違い・組み合わせ方

既刊2記事との関係を整理します。

既刊margin-level-indicator-mt4.mdとの違い

既刊記事は「今の数値」を確認する常時表示パネルでした。

本記事は「どう変化してきたか」を折れ線で振り返れるグラフです。

既刊maginecole-alert-line.mdとの違い

既刊のEAは閾値に達した瞬間だけ通知する設計でした。

本記事は閾値に達する前の変化のペースも視覚化します。

3記事を組み合わせた使い方

普段は本記事のグラフで変化のペースを見て、

閾値に近づいたら既刊のアラートEAで通知を受け取る組み合わせが実用的です。

よくある注意点

つまずきやすい点をまとめます。

過去の履歴は遡って再現できない

注意
・証拠金維持率は価格のように過去データが保存されていない
・このインジケーターを適用した時点から記録が始まる
・チャートを開き直すと記録はリセットされる

複数チャートで同じラベル名が競合する

複数の通貨ペアのチャートに同時に適用すると、

ObjectCreateの名前が重複する場合があるため、

ラベル名にChartID()等を含めて一意にする工夫が必要です。

ストラテジーテスターでは意味が薄い

ストラテジーテスターは過去データを再生する仕組みのため、

「今から記録が始まる」という性質上、リアルタイム運用での確認が前提になります。

MQL4とMQL5の違い

証拠金維持率の取得方法に関する2言語の違いを確認します。

AccountInfoDouble自体は共通

AccountInfoDoubleの呼び方自体は、MQL4とMQL5でほぼ共通です。

MQL5ではCTradeクラスとの併用が一般的

MQL5では既刊のCTradeクラスの記事のとおり、

発注と情報取得を標準クラス経由で行う設計が一般的です。

グラフ化の考え方自体は共通

「バッファに現在値を記録し続ける」という設計は、MQL5でも応用できます。

よくある質問

証拠金維持率のグラフ化について、よくある疑問に回答します。

実践アドバイス
・DangerLevel/WarningLevelは自分の口座の水準に合わせて調整する
・複数チャートで使う場合はラベル名を一意にする
・過去の履歴は遡れない前提で運用する

過去の証拠金維持率の履歴は見られますか?

このインジケーターをチャートに適用した時点からの記録のみです。

適用前の履歴を遡って再現することはできません。

既刊の常時表示インジケーターと両方使う意味はありますか?

あります。常時表示は「今の数値」の確認に向き、

本記事のグラフは「悪化のペース」の振り返りに向いています。

EAの発注条件にも使えますか?

はい。取得関数自体は、既刊のドローダウン制限EA等と同じく、

EAの条件式にそのまま転用できます。

【MQL4】証拠金維持率の推移をサブウィンドウにグラフ表示するインジケーターの作り方について解説してみた(含み損の心理的キツさを可視化):まとめ

証拠金維持率は、現在値だけでは「どれだけの速さで悪化しているか」が分かりません。

サブウィンドウに推移を折れ線で記録することで、

含み損が増えていく心理的なキツさを、数値の変化として振り返れるようになります。

取得関数自体はEAの発注条件にも転用できるため、既刊のアラートEAと組み合わせることで、

変化のペースを見ながら、閾値到達時の通知も確実に受け取れる構成になります。

関連記事