既刊のマーチンゲール検証EAは、
実際に注文を出しながら連敗時の必要証拠金の増え方を、
CSVファイルに記録していく仕組みでした。
ただ、「実際に動かす前に、今の口座残高で連敗何回まで耐えられるのか」を、
先に知りたい人も多いはずです。
この記事では、発注を一切行わず、
今のフリーマージンを基準に連敗何回でフリーマージンを超えるかを、
一覧表示する確認専用インジケーターの作り方を解説します。
・既刊の検証EAとの役割の違い(発注して記録 vs その場で計算して見せる)
・連敗回数ごとのロット・必要証拠金の一覧の作り方
・今のフリーマージンで何連敗まで耐えられるかを判定する方法
・実際に動くコード全体
・一覧の表示にはComment()を使うため
・他のEA・インジケーターの表示と競合することがある
・積算値は「毎回決済せず負けが積み重なった場合」の厳しめの見積りである
・詳しい理由は6節で解説します
設計思想: なぜ「動かす前」に見積もるべきか
まず、このインジケーターがどんな場面で役に立つのかを整理します。
既刊の検証EAとの違い
既刊のマーチンゲール検証EAは、
実際にエントリーを繰り返しながら連敗数を記録する設計でした。
・発注は一切行わない
・今の口座状態から連敗0〜InpMaxLevelsToShow回までを即座に計算する
・検証期間を待たずにその場で確認できる
既刊の確認専用インジケーターの仲間
既刊のリスク%ロット計算・増し玉段階確認インジケーターも、
発注を行わず計算結果だけを表示する設計でした。
本記事は同じ設計方針を、
マーチンゲールという資金管理テーマに当てはめたものです。
連敗回数ごとのロット・必要証拠金の計算
既刊の検証EAと同じ計算式を、
発注せずループで一括計算します。
MathPowによるロット倍率計算
double lots = InpInitialLots * MathPow(InpLotMultiplier, i);
既刊の検証EAと同じ式で、
連敗数iが増えるたびにロットは倍率のべき乗で増えていきます。
MODE_MARGINREQUIREDで必要証拠金を求める
double marginPerLot = MarketInfo(_Symbol, MODE_MARGINREQUIRED); double required = marginPerLot * lots;
MarketInfo()にMODE_MARGINREQUIREDを渡すと、
その通貨ペアで1ロット保有するための必要証拠金額を取得できます。
MODE_MAXLOTで上限をキャップする
double maxLot = MarketInfo(_Symbol, MODE_MAXLOT); if(lots > maxLot) lots = maxLot;
ブローカーのロット上限に達すると、
それ以上はロットが増えなくなります。
今のフリーマージンで何連敗まで耐えられるか
連敗回数ごとの必要証拠金を積み上げながら、
限界ラインを判定します。
必要証拠金を連敗回数ごとに積算する
cumulative += required;
このcumulativeは、
0回目から現在のi回目までの必要証拠金を合計した値です。
実際の運用では前回のポジションは決済済みですが、
ここでは「いちばん負けが込んだ瞬間」を想定した厳しめの見積りとして、
積算値を使います。
フリーマージンを超えた回数を限界ラインにする
if(limitLevel == -1 && cumulative > freeMargin) limitLevel = i;
積算した必要証拠金が、
今のフリーマージンを初めて超えた回数を記録します。
実際に動くコード全体
連敗回数ごとの一覧と限界ラインまでを表示する、
実際にMetaEditorでコンパイルできるインジケーターです。
・このコードは発注を一切行いません
・一覧の表示にはComment()を使うため
・他のEA・インジケーターの表示と競合する場合があります
・積算値は「毎回決済せず負けが積み重なった場合」の見積りです
//+------------------------------------------------------------------+
//| MartingaleMarginSimulatorIndicator.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 "MartingaleMarginHeadline"
input double InpInitialLots = 0.01; //連敗0回のときのロット
input double InpLotMultiplier = 2.0; //1連敗ごとのロット倍率
input int InpMaxLevelsToShow = 10; //一覧に表示する最大連敗回数
void UpdatePanel()
{
double marginPerLot = MarketInfo(_Symbol, MODE_MARGINREQUIRED);
double maxLot = MarketInfo(_Symbol, MODE_MAXLOT);
double freeMargin = AccountFreeMargin();
double cumulative = 0;
int limitLevel = -1;
string table = "";
for(int i = 0; i <= InpMaxLevelsToShow; i++)
{
double lots = InpInitialLots * MathPow(InpLotMultiplier, i);
if(lots > maxLot)
lots = maxLot;
double required = marginPerLot * lots;
cumulative += required;
if(limitLevel == -1 && cumulative > freeMargin)
limitLevel = i;
table += StringFormat("連敗%d回: %sロット 必要証拠金(積算)%s円\n",
i, DoubleToString(lots, 2), DoubleToString(cumulative, 0));
}
Comment(table);
string headline;
color headlineColor;
if(limitLevel == -1)
{
headline = StringFormat("連敗%d回まではフリーマージン(%s円)の範囲内です",
InpMaxLevelsToShow, DoubleToString(freeMargin, 0));
headlineColor = clrLime;
}
else
{
headline = StringFormat("連敗%d回目でフリーマージン(%s円)を超えます",
limitLevel, DoubleToString(freeMargin, 0));
headlineColor = clrRed;
}
ObjectSetText(LABEL_NAME, headline, 11, "Arial", headlineColor);
}
int OnInit()
{
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);
EventSetTimer(5);
UpdatePanel();
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
ObjectDelete(0, LABEL_NAME);
Comment("");
}
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);
}
MetaEditorでのコンパイル・実行手順
実際にMT4で動かすまでの手順です。
- MetaEditorで新規インジケーター「MartingaleMarginSimulatorIndicator」を作成し、上のコードを貼り付けてコンパイルする
- エラー・警告が0件であることを確認する
- デモ口座のチャートに適用し、左上にヘッドライン、チャート左上のコメント欄に一覧が表示されることを確認する
- InpLotMultiplierを大きくすると、限界ラインの連敗回数が早まることを確認する
- 確認後は想定する運用値に戻す
よくあるエラーと注意点
実装・運用でつまずきやすいポイントをまとめます。
このインジケーターは発注・記録をしない
・既刊の検証EAのように実際に発注してCSVへ記録する機能はない
・今の口座状態から一覧を計算して見せるだけ
・実際に連敗を体験して検証したい場合は既刊の検証EAを使う
口座残高が変わると限界ラインも変わる
このインジケーターは毎回フリーマージンを取得し直すため、
残高が増減すれば表示される限界ラインの回数も変わります。
ポジションを保有した状態で確認すると、
保有中の必要証拠金も含めたフリーマージンが基準になります。
Comment()は他のEA・インジケーターと競合する
Comment()は1枚のチャートに対して1つしか表示できないため、
他のEAやインジケーターもComment()を使っている場合、
表示が上書きされ合います。
ヘッドライン(OBJ_LABEL)だけは独立して表示されるため、
一覧が見えない場合もヘッドラインの色で大まかな状態を確認できます。
既刊の資金管理系ツールとの使い分け
似た目的の記事が複数あるため、使い分けを整理します。
| 記事 | 発注 | 表示内容 |
|---|---|---|
| 本記事 | しない | 連敗回数ごとの必要証拠金一覧・限界ライン |
| マーチンゲール検証EA(既刊) | 実際に発注する | CSVへの記録(連敗数・ロット・必要証拠金・残高) |
| 増し玉確認インジケーター(既刊、本セッション) | しない | 増し玉の段階・次のライン・見積り維持率 |
よくある質問
マーチンゲール資金シミュレーターについて、よくある疑問に回答します。
このインジケーターでマーチンゲールを自動化できますか?
できません。このインジケーターは発注を一切行わず、
必要証拠金の一覧を計算して表示するだけです。
InpMaxLevelsToShowはいくつに設定すればいいですか?
既刊の検証EAの既定値(連敗8回)程度から始め、
限界ラインがその範囲内に表示されるかを確認するとよいでしょう。
限界ラインが表示されない場合は、
数値を増やして確認してみてください。
この計算は実際の連敗パターンと完全に一致しますか?
一致しません。スプレッドやスワップ、
保有中のポジションの状況によって実際の必要証拠金は変動します。
あくまで「今の口座状態を基準にした見積り」として扱ってください。
【MQL4】マーチンゲールで連敗した場合の必要証拠金を事前に一覧表示するシミュレーター・インジケーターの作り方:まとめ
既刊のマーチンゲール検証EAは、
実際に発注しながら連敗時の必要証拠金をCSVに記録する仕組みでした。
発注を一切行わず、
今のフリーマージンを基準に連敗何回でフリーマージンを超えるかを、
一覧表示する確認専用インジケーターにすることで、
実際に動かす前に資金の限界を数字で把握できます。
コメント