マーチンゲールは「負けたらロットを倍にすれば、

いつか勝ったときにそれまでの負けを全部取り戻せる」

という説明をよく見かけます。

理屈としては間違っていませんが、実際に連敗が5回、8回と続いたとき、

必要な証拠金がどのくらいの速さで増えていくのかを、

数字で見たことがある人は少ないのではないでしょうか。

この記事では、ロットを倍増させながら連敗数と必要証拠金をCSVに記録する「検証EA」

を作り、マーチンゲールの資金の減り方を可視化する方法を解説します。

**この検証EAは、デモ口座またはストラテジーテスターでの検証専用です。

実資金での運用は想定していません。

**

この記事で分かること
・ロット倍増ロジックとMathPowを使った倍率計算
・MODE_MARGINREQUIREDで必要証拠金の増え方を追跡する方法
・フリーマージンを超えたら自動で検証を止める安全装置
・MQL4にストップアウト水準を取得する関数が無いという制約
  1. なぜ「体感」ではなく検証EAで数字を見るべきか
    1. マーチンゲールの「勝ちやすさ」という誤解
    2. 実資金ではなくEAで検証する理由
    3. 既刊ナンピン抑止EAとの違い
  2. マーチンゲールの基本ロジックとロット倍増の仕組み
    1. 負けたらロットを倍にし、勝ったら初期値に戻す
    2. 連敗数とロットサイズの関係式
    3. MathPowを使った倍率計算のコード
  3. ロット倍増と必要証拠金の関係
    1. MODE_MARGINREQUIREDで1ロットの必要証拠金を取得する
    2. 連敗が続くと必要証拠金は指数関数的に増える
    3. フリーマージンを超えたら検証を止める設計
  4. 実際に動く検証EAのコード全体
  5. ストラテジーテスターでの検証手順
    1. デモ口座・ストラテジーテスターでのみ実行する
    2. 連敗が起きやすい期間を選んで検証する
    3. CSVログで資産推移を確認する
  6. 検証結果の読み方
    1. 連敗数ごとの必要証拠金を表で確認する
    2. ストップアウト(強制決済)に近づくタイミング
    3. MQL4にはストップアウト水準を取得する関数が無い
  7. よくある誤解と注意点
    1. 「たまたま勝った」結果を根拠にしない
    2. ブローカーのロット制限で倍増が止まる場合がある
    3. リアル口座でこの検証EAを動かさない
  8. よくある質問
    1. マーチンゲールは本当に勝率が高いのですか?
    2. 連敗数の上限(MaxConsecutiveLosses)はいくつに設定すればいいですか?
    3. このEAをリアル口座で使ってもいいですか?
  9. 【MQL4】マーチンゲールで連敗したら資金がどう減っていくかをEAで検証してみた(ロット倍増シミュレーション):まとめ
    1. 関連記事

なぜ「体感」ではなく検証EAで数字を見るべきか

まず、この検証がなぜ必要なのかを確認します。

マーチンゲールの「勝ちやすさ」という誤解

マーチンゲールは、連敗の最中は常に負け続けますが、1回勝てば初期ロットに戻るため、

短期的には「勝率が高い手法」のように見えることがあります。

しかし、これは連敗の回数と深さを見えなくしているだけです。

実資金ではなくEAで検証する理由

連敗が10回続く確率は低くても、ゼロではありません。

実資金で体験してから学ぶのではなく、

デモ口座とストラテジーテスターで先に数字を確認しておくことで、

同じ失敗を避けられます。

既刊ナンピン抑止EAとの違い

既刊の「ナンピン抑止EA」は、同方向ポジションが増えすぎたら強制決済する「止める」

設計でした。

本記事はポジションを止めることが目的ではなく、

連敗したときに必要証拠金がどう増えるかを数字で記録し、

見せることが目的です。

マーチンゲールの基本ロジックとロット倍増の仕組み

検証EAが内部で行っているロットの決め方を確認します。

負けたらロットを倍にし、勝ったら初期値に戻す

直前の決済トレードが損失だった場合は連敗数を1増やし、

利益だった場合は連敗数を0にリセットします。

連敗数とロットサイズの関係式

今回のロット = 初期ロット × 倍率 ^ 連敗数

連敗数が増えるたびに、ロットは倍率(通常2.0)のべき乗で増えていきます。

MathPowを使った倍率計算のコード

double lots = InitialLots * MathPow(LotMultiplier, consecutiveLosses);

連敗数が3なら、ロットは初期値の2の3乗=8倍になります。

ロット倍増と必要証拠金の関係

ロットが増えると、必要証拠金はどのように変化するかを確認します。

MODE_MARGINREQUIREDで1ロットの必要証拠金を取得する

double marginPerLot = MarketInfo(_Symbol, MODE_MARGINREQUIRED);
double requiredMargin = marginPerLot * lots;

MarketInfo()にMODE_MARGINREQUIREDを渡すと、

その通貨ペアで1ロット保有するために必要な証拠金額を取得できます。

連敗が続くと必要証拠金は指数関数的に増える

仮の数値で見る必要証拠金の増え方(1ロットの必要証拠金を10万円と仮定)
・連敗0回:0.01ロット→1,000円
・連敗3回:0.08ロット→8,000円
・連敗6回:0.64ロット→64,000円
・連敗9回:5.12ロット→512,000円
実際の金額は通貨ペア
・レバレッジ
・ブローカーによって変わります

フリーマージンを超えたら検証を止める設計

if(requiredMargin > AccountFreeMargin())
  {
   simulationStopped = true;
   return;
  }

次のロットの必要証拠金が、残っているフリーマージンを超えた時点で、

新規エントリーを止めます。

これが実資金なら「発注エラー134(資金不足)」になる手前の状態です。

実際に動く検証EAのコード全体

ここまでの要素をまとめた、ロット倍増と証拠金ログを記録する検証EAです。

//+------------------------------------------------------------------+
//|                                MartingaleDrawdownSimulatorEA.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

input double InitialLots          = 0.01;   //連敗0回のときのロット
input double LotMultiplier        = 2.0;    //1連敗ごとのロット倍率
input int    MaxConsecutiveLosses = 8;      //この連敗数で検証を強制停止
input int    StopLossPips         = 200;
input int    TakeProfitPips       = 100;
input int    MagicNumber          = 20261007;

int    consecutiveLosses = 0;
int    lastClosedTicket  = -1;
bool   simulationStopped = false;

int OnInit()
  {
   consecutiveLosses = 0;
   simulationStopped = false;
   return(INIT_SUCCEEDED);
  }

double CurrentLots()
  {
   double lots = InitialLots * MathPow(LotMultiplier, consecutiveLosses);
   double maxLot = MarketInfo(_Symbol, MODE_MAXLOT);
   if(lots > maxLot)
      lots = maxLot;
   return(NormalizeDouble(lots, 2));
  }

void CheckLastClosedTrade()
  {
   for(int i = OrdersHistoryTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
         continue;
      if(OrderMagicNumber() != MagicNumber || OrderSymbol() != _Symbol)
         continue;
      if(OrderTicket() == lastClosedTicket)
         break;

      lastClosedTicket = OrderTicket();
      double profit = OrderProfit() + OrderSwap() + OrderCommission();

      if(profit < 0)
         consecutiveLosses++;
      else
         consecutiveLosses = 0;

      break;
     }
  }

bool HasOpenPosition()
  {
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
            return(true);
        }
     }
   return(false);
  }

void LogState(double lots, double requiredMargin)
  {
   int handle = FileOpen("martingale_simulation_log.csv",
                          FILE_CSV|FILE_READ|FILE_WRITE|FILE_SHARE_READ, ',');
   if(handle == INVALID_HANDLE)
      return;

   FileSeek(handle, 0, SEEK_END);
   FileWrite(handle, TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS),
             consecutiveLosses, DoubleToString(lots, 2),
             DoubleToString(requiredMargin, 2),
             DoubleToString(AccountBalance(), 2),
             DoubleToString(AccountEquity(), 2));
   FileClose(handle);
  }

void OnTick()
  {
   CheckLastClosedTrade();

   if(simulationStopped)
     {
      Comment("検証停止中: 連敗数の上限またはフリーマージン不足に達しました");
      return;
     }

   if(consecutiveLosses >= MaxConsecutiveLosses)
     {
      simulationStopped = true;
      Alert("マーチンゲール検証: 連敗数が上限(", MaxConsecutiveLosses, ")に達したため停止しました");
      return;
     }

   if(HasOpenPosition())
      return;

   double lots = CurrentLots();
   double marginPerLot = MarketInfo(_Symbol, MODE_MARGINREQUIRED);
   double requiredMargin = marginPerLot * lots;

   if(requiredMargin > AccountFreeMargin())
     {
      simulationStopped = true;
      Comment("検証停止: 必要証拠金がフリーマージンを超えました");
      return;
     }

   LogState(lots, requiredMargin);

   double fastMA = iMA(_Symbol, PERIOD_CURRENT, 5, 0, MODE_SMA, PRICE_CLOSE, 0);
   double slowMA = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

   double sl = 0, tp = 0;

   if(fastMA > slowMA)
     {
      sl = Ask - StopLossPips * Point;
      tp = Ask + TakeProfitPips * Point;
      OrderSend(_Symbol, OP_BUY, lots, Ask, 3, sl, tp, "MartingaleSim", MagicNumber, 0, clrBlue);
     }
   else
     {
      sl = Bid + StopLossPips * Point;
      tp = Bid - TakeProfitPips * Point;
      OrderSend(_Symbol, OP_SELL, lots, Bid, 3, sl, tp, "MartingaleSim", MagicNumber, 0, clrRed);
     }
  }

ストラテジーテスターでの検証手順

実際にMT4のストラテジーテスターで連敗パターンを確認する手順です。

デモ口座・ストラテジーテスターでのみ実行する

注意
・このEAはリアル口座で絶対に動かさない
・デモ口座またはストラテジーテスター専用
・エントリー条件はMAクロスで固定(本質はロット計算の検証)

連敗が起きやすい期間を選んで検証する

  1. MetaEditorでコードをコンパイルし、エラー・警告が0件であることを確認する
  2. ストラテジーテスターでMaxConsecutiveLossesを8〜10程度に設定する
  3. レンジ相場・トレンド転換が多い期間を選び、MAクロスが頻発する条件で実行する
  4. 「検証停止中」のコメントが表示されるまでテストを進める

CSVログで資産推移を確認する

MQL4/Filesフォルダに出力される

`martingale_simulation_log.csv`を開くと、

連敗数・ロット・必要証拠金・残高・有効証拠金の推移を、

表計算ソフトでグラフ化できます。

検証結果の読み方

ログから何を読み取るべきかを確認します。

連敗数ごとの必要証拠金を表で確認する

連敗数 ロット(初期0.01・倍率2.0) 初期ロットの何倍か
0 0.01 1倍
3 0.08 8倍
6 0.64 64倍
9 5.12 512倍

連敗数が3つ増えるだけで、必要証拠金は8倍に増えることが分かります。

ストップアウト(強制決済)に近づくタイミング

証拠金維持率は次の式で計算します。

証拠金維持率(%) = AccountEquity() / AccountMargin() * 100

この値がブローカーの定めるストップアウト水準に近づくと、

保有ポジションが強制決済されます。

MQL4にはストップアウト水準を取得する関数が無い

MQL4とMQL5の違い
・MQL4は関数で直接取得できない
・口座情報として確認するしかない
・MQL5は専用関数で取得できる
・AccountInfoDouble(ACCOUNT_MARGIN_SO_SO)
・MQL4利用時はブローカーの取引条件ページで事前確認が必要

よくある誤解と注意点

実装・解釈でつまずきやすいポイントをまとめます。

「たまたま勝った」結果を根拠にしない

短期間のバックテストで資産が増えていても、

それはテスト期間中に連敗の上限に達しなかっただけの可能性があります。

複数の期間・複数の通貨ペアで検証することが重要です。

ブローカーのロット制限で倍増が止まる場合がある

MODE_MAXLOTの上限に達すると、それ以上ロットは増えません。

倍増が止まった状態で連敗が続くと、資金の減少スピードはむしろ緩やかになります。

リアル口座でこの検証EAを動かさない

このEAはロットを機械的に倍増させる設計のため、

リアル口座で動かすと想定外の損失につながります。

必ずデモ口座かストラテジーテスターの範囲で使ってください。

よくある質問

マーチンゲール検証EAについて、よくある疑問に回答します。

マーチンゲールは本当に勝率が高いのですか?

1回あたりの勝率自体は、使うエントリーロジックに依存します。

マーチンゲール自体が勝率を上げるわけではなく、

連敗中の負けを大きなロットの1勝で相殺する仕組みに過ぎません。

連敗が続く限り、必要証拠金は増え続けます。

連敗数の上限(MaxConsecutiveLosses)はいくつに設定すればいいですか?

検証目的であれば、

口座のフリーマージンで余裕を持って耐えられる連敗数(例: 6〜10回)を最初に設定し、

ログを見ながら必要証拠金がどこで危険水域に入るかを確認するとよいでしょう。

このEAをリアル口座で使ってもいいですか?

推奨しません。

この記事の目的は、マーチンゲールのリスクを数字で可視化することであり、

実運用のための収益戦略ではありません。

【MQL4】マーチンゲールで連敗したら資金がどう減っていくかをEAで検証してみた(ロット倍増シミュレーション):まとめ

マーチンゲールは「負けたらロットを倍にする」という単純なロジックですが、

連敗数が数回増えるだけで必要証拠金は指数関数的に増えていきます。

この記事では、連敗数・ロット・必要証拠金・残高をCSVに記録する検証EAを作り、

数字でその減り方を確認する方法を解説しました。

MQL4にはストップアウト水準を直接取得する関数が無いため、

ブローカーの取引条件を事前に確認しておくことも欠かせません。

関連記事