証拠金維持率が下がり続けると、

最終的にブローカーが強制的にポジションを決済する「ストップアウト」が発生します。

これは、こちらの意図しない価格・タイミングで、

最も不利な形で実行されることが多い、避けたい事態です。

この記事では、ブローカーのストップアウト水準より手前の、

自分で決めた「危険水域」まで維持率が下がった時点で、

自動的に全ポジションを決済するEAの作り方を解説します。

この記事で分かること

・ストップアウトを待たずに自分で決済するメリット

・AccountInfoDouble(ACCOUNT_MARGIN_LEVEL)での

判定方法

・OrdersTotalループでの全ポジション強制決済の実装

・既刊2本(損失上限EA・ドローダウン制限EA)との使い分け

設計思想: なぜブローカーのストップアウトを待ってはいけないか

まず、このEAが解決する問題を整理します。

ストップアウトとは何か

ストップアウトとは、証拠金維持率がブローカーの定める水準

(例: 50%)を下回った際に、ブローカー側のシステムが

強制的にポジションを決済する仕組みです。

既刊2記事との違い

既刊の損失上限EAは「含み損の固定金額」、

既刊のドローダウン制限EAは「資産ピークからの下落率」を基準にしていました。

この記事では、ブローカーが実際にストップアウトを判定する指標である、

「証拠金維持率そのもの」を基準にします。

ブローカーより早く自分で決済するメリット

メリット

・ストップアウトの価格・タイミングを自分で選べない問題を避けられる

・どのポジションが決済されるかをブローカーの仕様に委ねずに済む

弱点

・閾値を高く設定しすぎると、本来粘れる場面でも早期に決済してしまう

・一時的なスプレッド拡大で維持率が急落し、意図せず決済されることがある

・このEAはOrdersTotalループで口座内の全ポジションを決済するため、

自分の手動エントリーや他のEAが開いたポジションも区別せず決済される

証拠金維持率の取得とAccountInfoDouble

既刊の証拠金維持率インジケーターと同じ関数で、維持率を取得します。

AccountInfoDouble(ACCOUNT_MARGIN_LEVEL)で取得する

double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);

既刊記事と同じく、この関数は「有効証拠金÷必要証拠金×100」を、

MQL4側であらかじめ計算した値をそのまま返します。

ポジションが無いときの0除算対策

必要証拠金が0のとき、維持率の値は意味を持たなくなるため、

決済対象のポジションが無い場合はそもそも判定を行わないようにします。

全ポジション強制決済のロジック

維持率が閾値を下回ったときの、決済処理を組み立てます。

OrdersTotalループでの全決済

void CloseAllPositions()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;

      double closePrice = (OrderType() == OP_BUY) ? Bid : Ask;
      bool ok = OrderClose(OrderTicket(), OrderLots(), closePrice, 3, clrYellow);

      if(!ok)
         Print("決済に失敗しました。チケット=", OrderTicket(), " エラーコード=", GetLastError());
     }
  }

既刊の損失上限EAと同じく、決済すると注文数が減って配列がズレるため、

ループは必ず添字の大きい方から回します。

OrderCloseの引数構成

買いポジションはBid、売りポジションはAskで決済する点も、

通常のOrderCloseと同じ考え方です。

決済失敗時はPrintで記録するだけにする

相場急変時はOrderCloseが失敗することがあります。

このEAでは失敗してもその場でリトライはせず、

次のティックのOnTickで再度判定・再試行される設計にしています。

実際に動くコード全体

維持率の監視から全決済まで、実際にMetaEditorでコンパイルできるEAです。

//+------------------------------------------------------------------+
//|                                   MarginLevelStopEA.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 DangerMarginLevel = 150.0;  //この維持率(%)以下で全決済する

bool HasAnyPosition()
  {
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            return(true);
        }
     }
   return(false);
  }

void CloseAllPositions()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;

      double closePrice = (OrderType() == OP_BUY) ? Bid : Ask;
      bool ok = OrderClose(OrderTicket(), OrderLots(), closePrice, 3, clrYellow);

      if(!ok)
         Print("決済に失敗しました。チケット=", OrderTicket(), " エラーコード=", GetLastError());
     }
  }

void OnTick()
  {
   if(!HasAnyPosition())
     {
      Comment("保有ポジションなし");
      return;
     }

   double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);

   if(level <= DangerMarginLevel)
     {
      Comment("証拠金維持率が危険水域(", DoubleToString(level, 1),
              "%)のため全ポジションを決済します");
      CloseAllPositions();
      return;
     }

   Comment("証拠金維持率: ", DoubleToString(level, 1), "%");
  }

MetaEditorでのコンパイル・実行手順

実際にMT4で動かすまでの手順です。

  1. MetaEditorで新規EA「MarginLevelStopEA」を作成し、上のコードを貼り付けてコンパイルする
  2. エラー・警告が0件であることを確認する
  3. デモ口座でポジションを持った状態でチャートに適用する
  4. DangerMarginLevelを一時的に高い値(例: 5000)にして、全決済が実際に発生することを確認する
  5. 確認後は想定する運用値に戻す

よくあるエラーと注意点

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

閾値はブローカーのストップアウト水準より高くする

注意

・DangerMarginLevelは、ブローカーの実際のストップアウト水準より

必ず高い値に設定する

・同じ値、またはそれより低い値にすると、先にブローカーの強制決済が発生し、

このEAの出番が無くなる

複数の通貨ペアでEAを動かす場合の注意

証拠金維持率は口座全体で1つの値のため、

複数チャートに同じEAを適用すると、

どのチャートが先に判定しても口座全体のポジションが決済されます。

重複して動かす必要はなく、1チャートへの適用で十分です。

バックテストでの制約

ストラテジーテスターでも維持率の計算自体は行われますが、

複数チャートをまたいだ口座全体のシミュレーションはできないため、

単一チャートでのテストに限られる点に注意してください。

既刊EA・インジケーターとの使い分け

似た目的の記事が複数あるため、使い分けを整理します。

記事 判定基準 動作
本記事 証拠金維持率(%) 全ポジションを強制決済
損失上限EA(既刊) 含み損の固定金額 全ポジションを強制決済
ドローダウン制限EA(既刊) 資産ピークからの下落率(%) 新規エントリーのみ停止
証拠金維持率インジケーター(既刊) 証拠金維持率(%) 表示のみ、何もしない

実践アドバイス

・まずは証拠金維持率インジケーターで普段の数値感を把握する

・把握できたら、ブローカーのストップアウト水準に余裕を持たせた値で、

本記事のEAを設定する

・損失上限EA・ドローダウン制限EAと併用し、複数の基準で多重に守る設計も検討する

よくある質問

証拠金維持率ストップEAについて、よくある疑問に回答します。

損失上限EAと同時に使えますか?

使えます。

片方が先に条件を満たした時点で全決済が実行されるため、

どちらを先に設定しても安全側に働きます。

DangerMarginLevelはいくつに設定すればいいですか?

ブローカーのストップアウト水準を公式サイトやマイページで確認し、

その値より十分に高い値(例: ストップアウトが50%なら150%前後)を、

目安に設定することをおすすめします。

決済後、再度エントリーしてしまいませんか?

このEA自体は新規エントリーのロジックを持っていないため、

決済後に自動で新規エントリーすることはありません。

他のEAが同じ口座で稼働している場合は、

そちらのエントリーロジックは影響を受けない点に注意してください。

【MQL4】証拠金維持率が危険水域まで下がったら自動で全ポジション決済するEAの作り方(ストップアウト対策):まとめ

ブローカーのストップアウトは、意図しない価格・タイミングで発生する、避けたい事態です。

証拠金維持率がブローカーの水準より手前の「自分で決めた危険水域」まで下がった時点で、

OrdersTotalループによる全ポジション決済を自動で実行する設計にすることで、

ブローカーに決済を委ねず、自分の意思で損失を確定させられます。

既刊の損失上限EA・ドローダウン制限EAと組み合わせ、

複数の基準で多重に資金を守ることをおすすめします。

関連記事