EA ナンピン最大回数の安全な設定方法|資金量・ボラティリティ別の計算式とMQL5実装
EAのナンピン設定でもっとも見落とされがちなパラメータが「最大回数(MaxOrders)」だ。初期ロットやナンピン幅には気を配っても、最大回数をデフォルトのまま放置しているケースは少なくない。これが口座を吹き飛ばす直接の原因になる。
本記事では、資金量・レバレッジ・通貨ペアのボラティリティを変数に持つ計算式で最大回数を算出する方法と、MQL5での実装例を解説する。ナンピンはリスクの高い手法であり、いかなる設定も損失を保証するものではないが、数式に基づいた設定は「無制限ナンピン」による即死リスクを大幅に下げる。
免責事項: 本記事は教育目的の情報提供であり、特定の投資行為を推奨するものではありません。FX取引には元本割れリスクがあります。
ナンピンEAが破綻する「3つの即死パターン」
最大回数の設定に入る前に、ナンピンEAが破綻するメカニズムを理解しておく必要がある。現場で観察される典型的なパターンは以下の3つだ。
パターン1: 無制限ナンピン
最大回数の上限なし、あるいは上限が高すぎるケース。強トレンド相場でポジションが際限なく積み上がり、証拠金を使い切ってマージンコールに至る。
パターン2: 資金に対してロットが大きすぎる
10万円の口座で0.1ロットからナンピンを開始するような設定。2〜3回のナンピンでも証拠金が枯渇する。
パターン3: ボラティリティを無視したナンピン幅
GBP/JPYのような高ボラペアに、EUR/USDで使っていたナンピン幅をそのまま適用する。想定より短い間隔でナンピンが連続発動し、同様に資金が尽きる。
最大回数を計算する基本式
安全なナンピン最大回数(N)は、次の不等式から逆算する。
総必要証拠金 ≤ 口座残高 × 証拠金余裕率
マーチン倍率(k)を使ったナンピンでは、N回目まで保有したときの総ロット量は等比数列の和になる。
総ロット = L₀ × (kᴺ − 1) / (k − 1)
L₀: 初期ロットk: マーチン倍率(1.5〜2.0が一般的)N: ナンピン最大回数
1ロットあたりの必要証拠金を M、レバレッジを λ とすると:
M = 契約単位 × 現在レート / λ
よって、最大保有時の総必要証拠金は:
総必要証拠金 = M × L₀ × (kᴺ − 1) / (k − 1)
これが口座残高の50〜60%以下に収まるように N を選ぶ。残り40〜50%は含み損のバッファとして確保する。
ボラティリティ(ATR)を加味した安全幅の算出
最大回数と並んで重要なのが「ナンピン発動幅」の設定だ。ATR(Average True Range)を使って通貨ペアのボラティリティを定量化できる。
推奨ナンピン幅(pips) = ATR(14) × 係数
係数は0.5〜1.0が実用的な範囲で、ボラティリティが高いペアほど係数を大きくする。
| 通貨ペア | 参考ATR(14) 日足 | 係数 | 推奨ナンピン幅 | |----------|-----------------|------|---------------| | EUR/USD | 約70pips | 0.5 | 約35pips | | USD/JPY | 約80pips | 0.5 | 約40pips | | GBP/JPY | 約140pips | 0.7 | 約100pips | | XAU/USD | 約1500pips相当 | 1.0 | 約1500pips |
※ATR値は市場環境によって大きく変動します。必ずバックテストで実際の数値を確認してください。
ナンピン幅が狭すぎると、短時間に最大回数に達してしまい、リスク管理の意味が薄れる。ATRベースで設定することで、相場の「普通の値動き」の中でナンピンが発動し過ぎるのを防げる。
注意: 上記の数値は説明のための参考値です。実際の運用前には必ずバックテストと十分な検証を行ってください。
具体的な計算例
口座条件
- 口座残高: 500,000円
- レバレッジ: 25倍(国内業者の最大値)
- 通貨ペア: USD/JPY(レート: 150円)
- 初期ロット: 0.01ロット(1,000通貨)
- マーチン倍率: 1.5倍
1ロット(100,000通貨)あたりの必要証拠金
M = 100,000 × 150 / 25 = 600,000円
0.01ロットあたりの必要証拠金
M₀ = 600,000 × 0.01 = 6,000円
最大回数N=5の場合の総ロットと総証拠金
総ロット = 0.01 × (1.5⁵ − 1) / (1.5 − 1)
= 0.01 × (7.59 − 1) / 0.5
= 0.01 × 13.18
= 0.1318ロット
総必要証拠金 = 6,000 × 13.18 = 79,080円
79,080円 ÷ 500,000円 = 約15.8%。口座残高の50%を大きく下回るため、証拠金面では安全圏と言える。残り84.2%が含み損バッファとして機能する。
ただし、5回のナンピンで逆行したときの含み損も試算しておく必要がある。各ポジションの含み損は開かれた価格差 × ロット量で計算され、これが実際の口座ストレステストになる。
MQL5実装例:最大回数を制御するナンピンロジック
//--- 入力パラメータ
input int MaxOrders = 5; // ナンピン最大回数
input double LotSize = 0.01; // 初期ロット
input double MartinRate = 1.5; // マーチン倍率
input int NanpinPips = 40; // ナンピン発動幅(pips)
//--- 現在のポジション数を取得
int CountPositions(string symbol)
{
int count = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
if(PositionGetString(POSITION_SYMBOL) == symbol)
count++;
}
return count;
}
//--- ナンピン判定と発注
void CheckAndNanpin()
{
string sym = _Symbol;
int posCount = CountPositions(sym);
// 最大回数チェック:上限に達していたら新規ナンピン禁止
if(posCount >= MaxOrders)
return;
// 既存ポジションがない場合は新規エントリーロジックへ
if(posCount == 0)
return;
// 最古ポジションの開値を取得
double oldestOpenPrice = 0;
datetime oldestTime = TimeCurrent();
for(int i = 0; i < PositionsTotal(); i++)
{
if(PositionSelectByTicket(PositionGetTicket(i)))
{
if(PositionGetString(POSITION_SYMBOL) == sym)
{
datetime openTime = (datetime)PositionGetInteger(POSITION_TIME);
if(openTime < oldestTime)
{
oldestTime = openTime;
oldestOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
}
}
}
}
// ナンピン幅チェック
double currentBid = SymbolInfoDouble(sym, SYMBOL_BID);
double point = SymbolInfoDouble(sym, SYMBOL_POINT);
double nanpinThreshold = NanpinPips * point * 10; // pipsをpriceに変換
if(oldestOpenPrice - currentBid < nanpinThreshold)
return; // まだナンピン幅に達していない
// ナンピンロット計算(マーチン倍率適用)
double nanpinLot = LotSize * MathPow(MartinRate, posCount);
// ロット正規化
double minLot = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
nanpinLot = MathMax(minLot, MathMin(maxLot,
MathRound(nanpinLot / lotStep) * lotStep));
// 発注(実際の運用では適切なエラーハンドリングが必要)
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = sym;
request.volume = nanpinLot;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(sym, SYMBOL_ASK);
request.deviation = 10;
request.magic = 12345;
request.comment = StringFormat("Nanpin %d/%d", posCount + 1, MaxOrders);
OrderSend(request, result);
}
上記コードは MaxOrders に達するとナンピンを停止する。posCount >= MaxOrders の条件判定がコア部分で、この一行が「無制限ナンピンによる即死」を防ぐ安全装置になる。
注意: 上記コードはロジックの説明を目的とした参考実装です。実際の運用には十分なデバッグ・バックテスト・フォワードテストが必要です。本コードの使用による損失について筆者・当サイトは一切の責任を負いません。
最大回数の設定値目安(資金別早見表)
| 口座残高 | 初期ロット | マーチン倍率 | 推奨最大回数 | 最大総証拠金(USD/JPY想定) | |---------|-----------|-------------|-------------|--------------------------| | 10万円 | 0.01ロット | 1.5× | 3〜4回 | 約2〜4万円(残高の20〜40%) | | 30万円 | 0.01ロット | 1.5× | 5〜6回 | 約4〜10万円(残高の13〜33%) | | 100万円 | 0.01ロット | 1.5× | 7〜8回 | 約16〜44万円(残高の16〜44%) | | 100万円 | 0.03ロット | 1.5× | 5〜6回 | 約11〜30万円(残高の11〜30%) |
※レバレッジ25倍、USD/JPY=150円での試算。実際の数値は市場環境・業者仕様で変わります。
よくある質問(FAQ)
Q1. ナンピン最大回数は多いほど安全ですか?
逆です。最大回数が多いほど強トレンド時の損失が拡大します。資金に対して余裕のある「少ない回数」を設定し、発動しなかった余力を証拠金バッファとして保持するのが鉄則です。
Q2. マーチン倍率1.0(等量ナンピン)は安全ですか?
マーチン倍率1.0(均等ロット)はロットが爆発的に増加しない分、安定感はあります。ただし、平均取得単価の改善効率が低く、相場回復に時間がかかる局面では長期間の含み損を抱え続けるリスクがあります。一概に「安全」とは言えません。
Q3. 最大回数に達したらEAはどう動くべきですか?
最大回数到達後は「新規ナンピン禁止・既存ポジションの決済条件のみ有効」の状態にするのが基本です。強制ロスカットに頼るのではなく、設計段階で損切り価格帯も合わせて設定しておく必要があります。
Q4. 通貨ペアごとに最大回数を変えるべきですか?
はい。ボラティリティの高いペア(GBP/JPY、XAU/USDなど)ではナンピン発動頻度が高くなるため、同じ最大回数でも想定より早く上限に達します。ATRを基準に通貨ペアごとに個別設定するのが望ましいです。
Q5. バックテストで問題なければ本番でも安全ですか?
バックテストは過去のデータに基づく検証であり、将来の相場を保証しません。特にナンピン系EAは「稀に発生する強トレンド」に弱く、バックテスト期間に含まれていない相場パターンで破綻するケースがあります。フォワードテストと少額でのデモ運用を経てから本番稼働させてください。
まとめ:数式に基づいた設定が破綻リスクを下げる
ナンピンEAの最大回数は、以下の3要素から数式で逆算するのが原則だ。
- 口座残高と証拠金余裕率 → 総必要証拠金の上限を決める
- 初期ロット・マーチン倍率 → N回目の総ロット量を計算する
- ATRベースのナンピン幅 → 通貨ペアのボラティリティに合わせて発動頻度を制御する
感覚で決めた最大回数は、想定外のトレンドに対して無防備になる。計算式に基づいた設定でも損失を完全に排除することはできないが、「口座の何%を最大リスクとして許容するか」を明示的にコントロールできる点が本質的な違いだ。
MQL5実装では MaxOrders パラメータによる条件分岐が中核であり、コードの見通しも良い。まずは少額・低レバレッジで動作を確認し、十分なフォワードテストを経てから本番資金を投入することを強く推奨する。
免責事項: 本記事で紹介した計算式・コードは教育目的の参考情報であり、投資成果を保証するものではありません。FX取引はレバレッジにより損失が元本を超える可能性があります。取引の最終判断はご自身の責任で行ってください。
Sources:
