既刊のドローダウン制限EAは、
ピークからの下落率が一定を超えたら新規エントリーを自動で止めてくれます。
ただ、このEAは「止める」ことに特化しているため、
今の下落率が実際に何%なのかを、画面でパッと確認することはできません。
この記事では、資産のピークからの下落率をチャート上に常時表示し、
今回表示を開始してからの最大ドローダウンも併記するインジケーターの作り方を解説します。
この記事で分かること
・既刊のドローダウン制限EAとの役割の違い
・証拠金維持率インジケーターとドローダウン率インジケーターの違い
・「今回の最大ドローダウン」も併記する設計
・実際に動くコード全体
設計思想: なぜ「自動停止」だけでなく「見るためのインジケーター」も必要か
まず、このインジケーターが既刊の2記事とどう役割が違うのかを整理します。
既刊のドローダウン制限EAとの関係
既刊記事のEAは、ドローダウン率が上限を超えた瞬間に新規エントリーを止めますが、
その判定はEAの内部で行われ、
現在の数値はComment()で簡易的に表示されるのみでした。
この記事では、EAを動かしていないチャートでも確認できるよう、
インジケーターとして独立させます。
証拠金維持率インジケーターとの違い
既刊の証拠金維持率インジケーターは、
Equityを必要証拠金(Margin)で割った値を表示しますが、
ポジションを持っていないとMarginが0になり、そもそも維持率が計算できません。
一方、ドローダウン率はEquityをこれまでのピーク資産で割って計算するため、
ポジションの有無に関わらず、資産そのものの増減を常に追跡できる点が異なります。
| 指標 | 計算の分母 | ポジション無しのとき |
|---|---|---|
| 証拠金維持率 | 必要証拠金(Margin) | 計算不能(0除算) |
| ドローダウン率 | ピーク資産(Equity最大値) | 計算できる(残高変動も反映) |
ドローダウン率の考え方とAccountEquityの取得
既刊のドローダウン制限EAと同じ計算式を、インジケーター側でも使います。
ピーク資産をGlobalVariableで記憶する
端末を再起動してもピークを引き継げるよう、
GlobalVariableにピーク資産を保存します。
string gvKey = "DD_Peak_Indicator_" + Symbol(); if(!GlobalVariableCheck(gvKey)) GlobalVariableSet(gvKey, AccountEquity());
ドローダウン率の計算式
ドローダウン率(%) = (ピーク資産 - 現在のEquity) / ピーク資産 * 100
既刊のEA記事と同じ式ですが、
この記事ではエントリーを止める判定ではなく、
この数値をそのままチャート上に表示することが目的になります。
補足
・GlobalVariableのキー名をEA版の”DD_Peak_”と分けているのは、
インジケーター単体でも安全に動かせるようにするため
・既刊EAと同じピークを共有したい場合は、キー名を揃えれば連動させられる
OBJ_LABELで常時表示するパネルを作る
既刊の証拠金維持率インジケーターと同じ、
OBJ_LABELによる常時表示パネルを使います。
現在のドローダウンを表示する
ObjectCreate(0, "DDPercentPanel", OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0, "DDPercentPanel", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "DDPercentPanel", OBJPROP_XDISTANCE, 10); ObjectSetInteger(0, "DDPercentPanel", OBJPROP_YDISTANCE, 20);
「今回の最大ドローダウン」も併記する設計
現在値だけでなく、このインジケーターを表示してからの最大ドローダウンも、
static変数に保持して2行目に表示します。
static double maxDD = 0; if(ddPercent > maxDD) maxDD = ddPercent;
現在値が一時的に下がっても、
今回いちばん深かった下落がどれくらいだったかを見失わずに済みます。
3段階の色分け
既刊の証拠金維持率インジケーターと同じ考え方で、
閾値に応じて文字色を変えます。
| ドローダウン率 | 文字色 | 意味 |
|---|---|---|
| DangerLevel以上 | 赤 | 危険、新規エントリーを控えるべき水準 |
| WarningLevel以上 | オレンジ | 注意、推移を見ておきたい水準 |
| それ以外 | 緑 | 安全水域 |
実際に動くコード全体
ピーク資産の追跡から表示まで、
実際にMetaEditorでコンパイルできるインジケーターです。
//+------------------------------------------------------------------+
//| DrawdownPercentPanel.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_chart_window
#property indicator_buffers 0
#define LABEL_NAME "DDPercentPanel"
#define LABEL2_NAME "DDPercentPanelMax"
input double WarningLevel = 10.0; //オレンジ警告になるドローダウン率(%)
input double DangerLevel = 20.0; //赤危険になるドローダウン率(%)
string gvKey;
double maxDD = 0;
int OnInit()
{
gvKey = "DD_Peak_Indicator_" + Symbol();
if(!GlobalVariableCheck(gvKey))
GlobalVariableSet(gvKey, AccountEquity());
ObjectCreate(0, LABEL_NAME, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, LABEL_NAME, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, LABEL_NAME, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, LABEL_NAME, OBJPROP_YDISTANCE, 20);
ObjectCreate(0, LABEL2_NAME, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, LABEL2_NAME, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, LABEL2_NAME, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, LABEL2_NAME, OBJPROP_YDISTANCE, 40);
EventSetTimer(1);
UpdatePanel();
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
ObjectDelete(0, LABEL_NAME);
ObjectDelete(0, LABEL2_NAME);
}
void OnTimer()
{
UpdatePanel();
}
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[])
{
UpdatePanel();
return(rates_total);
}
double UpdatePeakAndGetDrawdown()
{
double peak = GlobalVariableGet(gvKey);
double equity = AccountEquity();
if(equity > peak)
{
peak = equity;
GlobalVariableSet(gvKey, peak);
}
if(peak <= 0)
return(0);
return((peak - equity) / peak * 100.0);
}
void UpdatePanel()
{
double ddPercent = UpdatePeakAndGetDrawdown();
if(ddPercent > maxDD)
maxDD = ddPercent;
color c;
if(ddPercent >= DangerLevel)
c = clrRed;
else if(ddPercent >= WarningLevel)
c = clrOrange;
else
c = clrLime;
string text = StringFormat("現在のドローダウン: %.1f%%", ddPercent);
ObjectSetText(LABEL_NAME, text, 14, "Arial", c);
string text2 = StringFormat("今回の最大ドローダウン: %.1f%%", maxDD);
ObjectSetText(LABEL2_NAME, text2, 12, "Arial", clrGray);
}
MetaEditorでのコンパイル・実行手順
実際にMT4で表示を確認するまでの手順です。
- MetaEditorで「ファイル」→「新規作成」→「カスタムインジケーター」で「DrawdownPercentPanel」を作成する
- ウィザードの中身を削除し、上のコードを丸ごと貼り付ける
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- デモ口座のチャートに適用し、左上に2行のラベルが表示されることを確認する
よくあるエラーと注意点
表示が崩れる・数値がおかしいと感じたときの確認ポイントをまとめます。
ポジションが無いのにドローダウンが表示される
ドローダウン率はEquity(残高+未決済の損益)を基準にしているため、
ポジションが無くても、入金・出金で残高が変動すればピークとの差が生まれます。
これは仕様であり、不具合ではありません。
バックテストでピークがリセットされる
注意
・ストラテジーテスター内のGlobalVariableは実運用の値と分離されている
・バックテストのたびにピークがリセットされた状態から始まる
・既刊drawdown-limit-stop-ea-mt4.mdと同じ制約を引き継ぐ
MQL5での書き換えが必要な箇所
AccountEquity()はMQL5では、
AccountInfoDouble(ACCOUNT_EQUITY)に、
ObjectSetTextはObjectSetString
(chart_id, name, OBJPROP_TEXT, text)に、
それぞれ置き換える必要があります。
既刊のドローダウン制限EAとの使い分け
「今の状態を常に目で確認したい」ならこのインジケーター、
「上限を超えたら自動でエントリーを止めてほしい」なら既刊のEA、という使い分けです。
実践アドバイス
・インジケーターとEAのGlobalVariableキー名を揃えると、
同じピークを共有できる
・WarningLevel・DangerLevelは、
EA側のDrawdownLimitPercentより、
少し低めに設定すると早めに気づける
・両方を併用し、インジケーターで監視しつつEAで最終防衛線を作る使い方がおすすめ
よくある質問
ドローダウン率インジケーターについて、よくある疑問に回答します。
既刊のドローダウン制限EAと同時に使えますか?
使えます。
GlobalVariableのキー名を揃えれば同じピークを共有し、
揃えなければそれぞれ別のピークを独立して追跡します。
証拠金維持率インジケーターと両方表示する必要はありますか?
両方表示しても問題ありません。
証拠金維持率は「ロスカットまでの距離」、
ドローダウン率は「資産がピークから何%減ったか」という、別の視点の情報です。
今回の最大ドローダウンがリセットされてしまうのはなぜですか?
「今回の最大ドローダウン」はGlobalVariableを使わない、
ローカル変数で実装しているため、
インジケーターを一度外す、またはMT4を再起動すると0から再集計されます。
端末再起動後も記録を残したい場合は、
ピーク資産と同様にGlobalVariableへ保存する改造が必要です。
【MQL4】資産のピークからの下落率をチャート上にリアルタイム表示するドローダウン監視インジケーターの作り方:まとめ
既刊のドローダウン制限EAが新規エントリーを自動で止めてくれる一方で、
今の下落率を画面で直接確認したい場合は、この記事のインジケーターが役に立ちます。
ピーク資産をGlobalVariableで永続化し、
現在のドローダウン率と今回の最大ドローダウンをOBJ_LABELで常時表示することで、
証拠金維持率とは別の視点で資産の状態を把握できます。
両方を併用し、インジケーターで常に状況を見ながら、
EAで最終的な防衛線を引く使い方がおすすめです。
コメント