1. MQL5でロットサイズ計算が重要な理由
MQL5で自動売買(EA: Expert Advisor)を開発する場合、ロットサイズ(取引量)の計算は最も重要な要素の一つです。ロットサイズは「1回のトレードでどれだけの資金をリスクにさらすか」を決めるため、適切に計算されていないと、戦略が良くても資金管理の問題で口座が大きく損失を出す可能性があります。
特にEAでは、トレード判断だけでなく資金管理(Money Management)も自動化されます。そのため、ロットサイズを固定値で設定するのではなく、口座残高・リスク割合・ストップロス距離などを基準に自動計算する仕組みを実装するのが一般的です。
例えば次の2つのEAを比較すると違いが明確です。
| EAタイプ | ロット設定 | リスク |
|---|---|---|
| 固定ロットEA | 常に0.10 lot | 口座状況と無関係 |
| リスク管理EA | 残高の1% | 常に一定リスク |
固定ロットの場合、口座残高が変化してもロットが同じため、損失リスクが一定になりません。
一方、リスクベースでロットを計算するEAでは、口座資金に応じてロットが自動調整されるため、長期運用に適した資金管理になります。
1.1 ロットサイズとは(lot / volume)
ロットサイズとは、1回の注文で取引する通貨量(ポジションサイズ)を指します。
MetaTraderでは通常、以下のような単位で表現されます。
| ロット | 通貨量 |
|---|---|
| 1.0 lot | 100,000通貨 |
| 0.10 lot | 10,000通貨 |
| 0.01 lot | 1,000通貨 |
MQL5では注文量を volume(ボリューム) として扱います。
例えば OrderSend() で注文する際には、ロットサイズは volume パラメータとして指定されます。
request.volume = 0.10;
つまり、EAのロットサイズ計算とは
適切な volume を計算する処理
と言い換えることができます。
1.2 EAでロット計算が必要になる理由
EAでは、ロットサイズを自動計算する理由がいくつかあります。
主な理由は次の通りです。
-
口座残高に応じてリスクを一定に保つ
-
ストップロス距離に応じてロットを調整する
-
連続損失による資金破綻を防ぐ
-
複数通貨ペアでも同じリスク管理を適用できる
例えば、以下の条件を考えてみます。
口座残高:10,000 USD
リスク:1%
ストップロス:50 pips
この場合、1回のトレードで許容する損失は
100 USD
になります。
EAはこの100USDを基準にして、ストップロス距離から逆算してロットサイズを決定します。
この仕組みによって、
-
ボラティリティが大きい相場 → ロット小
-
ボラティリティが小さい相場 → ロット大
という調整が自動で行われます。
1.3 初心者がよくやる間違い(固定ロット)
EA開発の初期段階で最も多いミスが、固定ロットをそのまま使い続けることです。
例えば次のようなコードです。
request.volume = 0.10;
この方法はテスト段階では問題ありませんが、実運用では次の問題が発生します。
よくある問題
-
口座残高が増えてもロットが増えない
-
損失後もロットが同じ
-
通貨ペアごとのボラティリティ差を無視
-
CFDや指数ではリスクが大きく変わる
特に初心者が混乱しやすいポイントは次の3つです。
つまずきポイント
-
lot と volume の混同
MT5では注文量は volume として扱われる。 -
pips と point の違い
5桁ブローカーでは 1 pip = 10 point。 -
通貨ペアによる価値差
EURUSD と USDJPY では pip の価値が異なる。
このような問題を避けるため、EAでは通常
リスクベースロット計算
を実装します。
2. ロットサイズ計算の基本式
EAでロットサイズを計算する場合、一般的には 許容リスク額(Risk Amount)とストップロス距離(Stop Loss)を基準に計算します。
この方法は多くのプロEAでも採用されており、口座残高が変化してもリスクを一定に保つことができます。
ロットサイズ計算の基本的な考え方は次の通りです。
ロット = 許容損失額 ÷ (ストップロス距離 × 1pipの価値)
この計算により、ストップロスに到達した場合の損失が常に一定になるようにロットが調整されます。
例えば、以下の条件を考えてみます。
| 条件 | 値 |
|---|---|
| 口座残高 | 10,000 USD |
| リスク | 1% |
| ストップロス | 50 pips |
この場合、1回のトレードで許容できる損失は
100 USD
となります。
この100USDをストップロス距離で割ることで、適切なロットサイズを求めることができます。
2.1 一般的なロット計算式
EAで使用される標準的な計算式は次の通りです。
Lot = Risk Amount / (StopLoss × Pip Value)
各要素の意味は以下の通りです。
| 要素 | 説明 |
|---|---|
| Risk Amount | 許容損失額 |
| StopLoss | ストップロス距離(pips) |
| Pip Value | 1 pip の価値 |
この計算式の特徴は、どの通貨ペアでも同じロジックを使用できることです。
例えば
Risk Amount = 100 USD
StopLoss = 50 pips
Pip Value = 10 USD
の場合
Lot = 100 / (50 × 10)
Lot = 0.20
となり、ロットサイズは 0.20 lot になります。
2.2 Risk Amount(許容損失額)の求め方
まず、EAは 1回のトレードで許容する最大損失額を決めます。
これは通常、口座残高の 一定割合(Risk%) で設定します。
計算式は次の通りです。
Risk Amount = Account Balance × Risk %
例えば
口座残高:10,000 USD
リスク:1%
の場合
Risk Amount = 10,000 × 0.01
Risk Amount = 100 USD
になります。
多くのEAでは次のような設定が使われます。
| リスク設定 | 特徴 |
|---|---|
| 0.5% | 非常に保守的 |
| 1% | 一般的 |
| 2% | やや攻めた設定 |
| 5% | 高リスク |
長期運用を前提とする場合、1%前後が最も一般的とされています。ただし、最適なリスクは戦略や資金量、トレード頻度によって変わるため、環境により異なる場合があります。
2.3 Pip Value(1pipの価値)
ロット計算で初心者が最も混乱しやすいのが pip value(1 pip の価値)です。
1 pip の価値は通貨ペアによって異なります。
例として、1 lot の場合の pip value は次の通りです。
| 通貨ペア | 1 pip の価値 |
|---|---|
| EURUSD | 約 10 USD |
| GBPUSD | 約 10 USD |
| USDJPY | 約 1000 JPY |
例えば
EURUSD
1 lot
1 pip = 約10 USD
となります。
つまり
0.10 lot
であれば
1 pip = 約1 USD
になります。
注意点(初心者がつまずきやすいポイント)
ロット計算では次のポイントでミスが発生しやすいため注意が必要です。
① pip と point の違い
MetaTraderでは
1 pip = 10 point
となるケースがあります(5桁ブローカー)。
例
EURUSD
1.12345
この場合
Point = 0.00001
pip = 0.0001
になります。
② JPYペアの値動き
JPYペアでは pip の桁が異なります。
例
USDJPY
1 pip = 0.01
③ CFD・指数・ゴールド
次の銘柄では pip value が通貨ペアと大きく異なります。
-
XAUUSD(ゴールド)
-
NASDAQ
-
DAX
-
S&P500
このため、EAでは固定値ではなく シンボル情報から取得する方法が推奨されます。
3. MQL5でロットサイズを計算する方法
前章では、ロットサイズ計算の基本式を説明しました。
ここでは MQL5で実際にロットサイズを計算する方法を解説します。
EAでは、以下の情報を取得してロットサイズを計算するのが一般的です。
-
口座残高
-
許容リスク割合
-
ストップロス距離
-
tick value(最小価格変動の価値)
-
tick size(最小価格変動)
MQL5では、これらの情報を AccountInfoDouble() と SymbolInfoDouble() を使って取得できます。
3.1 ロット計算に必要なデータ
EAでロットサイズを計算する場合、最低限次のデータが必要になります。
| データ | 説明 |
|---|---|
| Account Balance | 口座残高 |
| Risk % | 許容リスク |
| StopLoss | ストップロス距離 |
| Tick Value | 最小価格変動の価値 |
| Tick Size | 最小価格変動 |
この中で特に重要なのが Tick Value と Tick Size です。
これらはシンボルごとに異なるため、EAでは次のように取得します。
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
この値を利用すると、通貨ペア・指数・CFDなどでも同じ計算式を使うことができます。
3.2 必須関数(MQL5)
ロット計算では主に次の関数を使用します。
口座情報取得
AccountInfoDouble()
例
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
取得できる代表的な情報
| 定数 | 内容 |
|---|---|
| ACCOUNT_BALANCE | 口座残高 |
| ACCOUNT_EQUITY | 有効証拠金 |
| ACCOUNT_MARGIN | 使用証拠金 |
EAでは通常、ACCOUNT_BALANCE または ACCOUNT_EQUITY を基準に計算します。
シンボル情報取得
SymbolInfoDouble()
例
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
主なパラメータ
| 定数 | 説明 |
|---|---|
| SYMBOL_TRADE_TICK_VALUE | 1 tick の価値 |
| SYMBOL_TRADE_TICK_SIZE | 1 tick の価格変動 |
| SYMBOL_POINT | 最小価格単位 |
これらの値は ブローカーや銘柄によって異なるため、固定値を使うのは推奨されません。
3.3 基本的なロット計算コード
ここでは、リスク%とストップロス距離からロットを計算する関数の例を示します。
double CalculateLot(double riskPercent, double stopLossPoints)
{
// 口座残高
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
// 許容損失額
double risk = balance * riskPercent / 100.0;
// シンボル情報
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
// ロット計算
double lot = risk / (stopLossPoints * tickValue / tickSize);
return lot;
}
この関数の処理は次の流れで行われます。
口座残高取得
↓
リスク額計算
↓
tick value取得
↓
ストップロス距離で割る
↓
ロットサイズ算出
この方法の利点は、以下の通りです。
-
通貨ペアに依存しない
-
CFDや指数にも対応
-
ブローカー差異を吸収できる
注意点(よくある失敗)
ロット計算の実装では、初心者が次の問題に遭遇することが多いです。
① StopLoss単位の混乱
EAによっては
StopLoss = pips
の場合と
StopLoss = points
の場合があります。
特に5桁ブローカーでは
1 pip = 10 points
となるため、単位を統一する必要があります。
② tick value の解釈ミス
ブローカーによっては
-
口座通貨
-
商品通貨
が異なる場合があります。
例えば
-
USD口座
-
EUR建て銘柄
では計算が異なることがあります。
③ 計算したロットをそのまま注文する
計算されたロットは、そのまま注文できない場合があります。
理由
-
最小ロット制限
-
ロットステップ
-
最大ロット
これを調整しないと Invalid Volume エラー が発生します。
4. ロットサイズをブローカー仕様に合わせる
MQL5でロットサイズを計算しても、その値をそのまま request.volume に入れて注文できるとは限りません。
理由は、各シンボルに 最小ロット・最大ロット・ロット刻み幅 が設定されているためです。MQL5ではシンボルごとの取引条件として、許可される取引量の最小値・最大値・増分が管理されています。
例えば、計算結果が 0.037 lot だったとしても、ブローカーのロットステップが 0.01 なら、そのままでは発注エラーになる可能性があります。
この調整をせずに注文すると、典型的には Invalid Volume の原因になります。
4.1 最小ロット・最大ロット・ロットステップを取得する
MQL5では SymbolInfoDouble() を使って、シンボルごとの取引量制限を取得できます。
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
ここでの意味は次の通りです。
-
SYMBOL_VOLUME_MIN:発注可能な最小ロット -
SYMBOL_VOLUME_MAX:発注可能な最大ロット -
SYMBOL_VOLUME_STEP:増減できる刻み幅
4.2 ロットを正規化する基本処理
実務では、計算したロットに対して次の順で調整するのが基本です。
-
最小ロット未満なら最小ロットに合わせる
-
最大ロット超過なら最大ロットに抑える
-
ロットステップに合わせて切り下げる
コード例は以下です。
double NormalizeLot(double lot)
{
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lot = MathMax(lot, minLot);
lot = MathMin(lot, maxLot);
lot = MathFloor(lot / lotStep) * lotStep;
return lot;
}
4.3 つまずきやすい点・注意点
よくある失敗は次の通りです。
-
NormalizeDouble()だけで調整してしまう -
0.01固定で丸める -
通貨ペアでは通っても、ゴールドや指数で失敗する
-
最小ロット未満のときに
0になってしまう
特に重要なのは、小数点桁数ではなくロットステップで合わせることです。0.1 刻みの銘柄に対して 0.12 を送れば、見た目は自然でも取引条件違反です。
また、切り上げではなく切り下げを使う方が安全です。切り上げると、想定リスクを少し超える可能性があるためです。
5. EAで使えるロット計算の実装例
ここでは、MQL5のEAにそのまま組み込みやすい形で、リスク%からロットを計算し、ブローカー仕様に合わせて発注可能な volume に変換する実装例を示します。
実運用では、単にロットを計算するだけでなく、ストップロス距離の取得 → リスク額の計算 → ロット算出 → 正規化 → 注文送信までを一連の流れで考える必要があります。
基本方針は次の通りです。
-
入力パラメータでリスク%を指定する
-
エントリー価格とストップロス価格から損切り距離を求める
-
シンボル情報を使ってロットを計算する
-
最小ロット・ロットステップに合わせる
-
最終的な volume を
request.volumeに入れる
5.1 EAの入力パラメータ
まずは、EA側でリスク管理用の入力パラメータを定義します。
input double RiskPercent = 1.0; // 1回のトレードで口座残高の何%をリスクにするか
必要に応じて、次のような補助パラメータを持たせても構いません。
input double MinRiskPercent = 0.5;
input double MaxRiskPercent = 2.0;
ただし、初心者向けのEAでは、まずは RiskPercent を1つだけ持つ設計の方が分かりやすいです。
ここでの注意点は、RiskPercent は
1.0 = 1%
であり、
0.01 = 1%
ではないことです。
この扱いを混同すると、リスクが100分の1になったり100倍になったりします。
5.2 ストップロス距離からロットを計算する
EAでは通常、損切り幅が決まってからロットを決めます。
つまり、順序は次の通りです。
-
エントリー価格を決める
-
ストップロス価格を決める
-
その差から損切り距離を計算する
-
許容損失額からロットを逆算する
例えば買い注文なら、損切り距離は次のように求められます。
double stopLossPoints = (entryPrice - stopLossPrice) / _Point;
売り注文なら逆になります。
double stopLossPoints = (stopLossPrice - entryPrice) / _Point;
このときの注意点は、負の値やゼロにならないことを必ず確認することです。
もし stopLossPoints <= 0 なら、ロット計算以前にSL設定ロジックが間違っています。
5.3 実装例:ロット計算関数+正規化関数
以下は、EAで使いやすい基本形です。
double NormalizeLot(double lot)
{
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lot = MathMax(lot, minLot);
lot = MathMin(lot, maxLot);
lot = MathFloor(lot / lotStep) * lotStep;
return lot;
}
double CalculateLotByRisk(double riskPercent, double stopLossPoints)
{
if(stopLossPoints <= 0)
return 0.0;
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double riskMoney = balance * riskPercent / 100.0;
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
if(tickValue <= 0 || tickSize <= 0)
return 0.0;
double lot = riskMoney / (stopLossPoints * tickValue / tickSize);
return NormalizeLot(lot);
}
このコードのポイントは次の通りです。
-
stopLossPoints <= 0を先に除外している -
tickValueとtickSizeが取得できなかった場合に0.0を返す -
計算後に必ず
NormalizeLot()を通す
このようにしておくと、無効な値で注文しにくくなるため、EAの安定性が上がります。
5.4 注文時の流れ
実際のEAでは、ロット計算は発注直前に行うことが多いです。
流れは次のようになります。
-
現在価格を取得
-
ストップロス価格を決定
-
損切り距離を points で計算
-
ロットサイズを算出
-
MqlTradeRequest.volumeに入れて発注
例を示します。
double entryPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double stopLossPrice = entryPrice - 500 * _Point; // 例:500 points 下にSL
double stopLossPoints = (entryPrice - stopLossPrice) / _Point;
double lot = CalculateLotByRisk(RiskPercent, stopLossPoints);
if(lot > 0.0)
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = lot;
request.type = ORDER_TYPE_BUY;
request.price = entryPrice;
request.sl = stopLossPrice;
request.tp = entryPrice + 1000 * _Point;
request.deviation = 20;
OrderSend(request, result);
}
この構成なら、EA内で
SL距離が広い → ロット小
SL距離が狭い → ロット大
が自動で反映されます。
5.5 つまずきやすい点・注意点・よくある失敗
実装時によくある失敗を整理します。
1. SL距離を pips のつもりで points で計算してしまう
5桁・3桁の銘柄では特に混乱しやすいです。
コード内では、まず points に統一して扱う方が安全です。
2. tickValue を固定値だと思い込む
通貨ペア、ゴールド、指数、CFDでは値が異なります。
固定値で書くと、銘柄を変えた瞬間に破綻しやすくなります。
3. lot = 0 のまま注文しようとする
ロット計算失敗時は 0.0 を返す設計にしていることが多いため、注文前に必ずチェックが必要です。
4. 最小ロット未満のケースを軽視する
小額口座でSL距離が広いと、理論上のロットが 0.003 のようになることがあります。
この場合、最小ロットに引き上げると本来の想定リスクを超える可能性があります。
5. 口座残高だけでなく有効証拠金を使うべき場面を無視する
保有ポジションが多いEAでは、ACCOUNT_BALANCE ではなく ACCOUNT_EQUITY を基準にした方が実態に近いことがあります。
どちらを使うかは戦略設計次第です。
5.6 実務上の判断
実務では、次のA案・B案のどちらかで設計することが多いです。
A案:ACCOUNT_BALANCE 基準
-
計算が安定しやすい
-
バックテストの再現性を取りやすい
-
初心者向けEAに向く
B案:ACCOUNT_EQUITY 基準
-
含み損益を含めた実態反映ができる
-
複数ポジション運用に向く
-
相場変動時のロット変化が大きくなる
初心者向けの記事では、まず A案を基本として説明するのが分かりやすいです。
6. よくあるエラーと失敗
MQL5でロットサイズ計算を実装した際、多くの開発者が同じようなエラーに遭遇します。
特に初心者の場合、計算式そのものではなく、単位やブローカー仕様の理解不足が原因になるケースが多いです。
ここでは、EA開発で頻繁に発生する代表的な問題を整理します。
6.1 Invalid Volume エラー
EAで最も多いエラーが Invalid Volume(無効なロットサイズ)です。
このエラーは、発注した volume がブローカーの条件に合っていない場合に発生します。
主な原因は次の通りです。
-
最小ロット未満
-
最大ロット超過
-
ロットステップ違反
例えば、次のようなケースです。
最小ロット = 0.01
ロットステップ = 0.01
この条件で
0.037 lot
を注文すると、エラーになる可能性があります。
そのため、ロット計算のあとには必ず
NormalizeLot()
のような処理で調整する必要があります。
よくある失敗
-
NormalizeDouble()だけで調整している -
0.01固定で丸めている -
ロットステップを取得していない
銘柄によっては
0.1 lot step
のケースもあるため、必ずシンボル情報から取得するのが安全です。
6.2 pip と point の混同
MetaTraderで非常に多いミスが、pip と point の混同です。
MQL5では価格単位として
Point
が使われます。
しかし、FXトレードでは通常
pip
が使われます。
5桁ブローカーの場合、次の関係になります。
1 pip = 10 point
例
| 通貨ペア | pip | point |
|---|---|---|
| EURUSD | 0.0001 | 0.00001 |
つまり
50 pip
は
500 point
になります。
EAのコードでは通常、points単位で計算する方が安全です。
例えば
double stopLossPoints = 500;
のように扱います。
6.3 CFD・指数でロット計算が狂う
ロット計算をFX専用の前提で作ると、CFDや指数で大きくズレることがあります。
特に次の銘柄です。
-
XAUUSD(ゴールド)
-
NASDAQ
-
DAX
-
S&P500
これらの銘柄では
-
pip value
-
contract size
-
tick size
が通貨ペアとは大きく異なります。
例えば、ゴールドでは
1 lot = 100 oz
などの仕様があります。
そのため、次のような固定値計算は危険です。
1 pip = 10 USD
EAでは必ず
SymbolInfoDouble()
で取得した値を使うようにします。
6.4 JPYペアの計算ズレ
JPYペアも初心者が混乱しやすいポイントです。
例えば
EURUSD
pip = 0.0001
ですが
USDJPY
pip = 0.01
になります。
つまり、同じ50pipでも
| 通貨ペア | 価格差 |
|---|---|
| EURUSD | 0.0050 |
| USDJPY | 0.50 |
となります。
この違いを無視して計算すると、ロットサイズが10倍ずれるケースがあります。
6.5 ロットがゼロになる問題
小額口座では、理論計算したロットが
0.003
のような値になることがあります。
しかし、最小ロットが
0.01
の場合、次の問題が起きます。
問題
-
最小ロットに引き上げる
→ 想定リスクより大きくなる
または
-
0 lot にする
→ トレードできない
この問題の対処方法としては、次のような方法があります。
A案
最小ロット未満なら取引しない
B案
最小ロットで取引する
どちらが正しいかは戦略によって異なります。
一般的には、A案の方がリスク管理としては安全です。
6.6 計算式は正しいのに損益がズレる
ロット計算が正しく見えても、実際の損益が想定とズレる場合があります。
原因は次の通りです。
-
スプレッド
-
スリッページ
-
手数料
-
swap
例えば
Risk = 100 USD
で計算しても、実際の損失が
103 USD
程度になることは珍しくありません。
そのため、厳密なリスク管理が必要なEAでは
Risk = 0.9%
など、少し余裕を持たせることもあります。
6.7 実務的なチェックリスト
EAでロット計算を実装する際は、次の項目をチェックしておくと安全です。
-
StopLossはpointsで計算しているか
-
tick value を取得しているか
-
ロット正規化しているか
-
最小ロット未満のケースを処理しているか
-
lot = 0 の場合に注文しないようにしているか
これらを満たしていれば、ほとんどのロット計算トラブルは回避できます。
7. 実運用で使われるロット計算アルゴリズム
ロットサイズ計算は、単に「数式を実装する」だけではありません。
実際のEAでは、トレード戦略・リスク許容度・資金管理方針に応じて複数のロット管理アルゴリズムが使われます。
ロット管理はEAの期待値・ドローダウン・資金曲線に直接影響するため、戦略設計の重要な要素になります。
ここでは、実務でよく使われる代表的な方法を整理します。
7.1 固定ロット(Fixed Lot)
最もシンプルな方法が 固定ロットです。
常に同じロットで取引する
例
request.volume = 0.10;
この方法の特徴は次の通りです。
メリット
-
実装が非常に簡単
-
バックテストの再現性が高い
-
ロジック検証に向く
デメリット
-
資金が増えてもロットが増えない
-
損失後もロットが変わらない
-
リスクが一定にならない
そのため、固定ロットは
-
EAのテスト段階
-
小額運用
-
手動トレード補助
などでは使われますが、長期運用EAではあまり採用されません。
7.2 固定リスク(Fixed Risk)
現在、最も一般的な方法が 固定リスク方式です。
これは
1回のトレードで口座資金の一定割合をリスクにする
という考え方です。
例えば
口座残高 = 10,000 USD
リスク = 1%
の場合
許容損失 = 100 USD
になります。
この100USDを基準にして
ロット = 許容損失 ÷ (SL × pip value)
でロットを計算します。
この方式の特徴は次の通りです。
メリット
-
リスクが常に一定
-
資金増加に応じてロット増加
-
ドローダウン管理がしやすい
デメリット
-
SL距離が広いとロットが極端に小さくなる
-
小額口座では最小ロット問題が起きる
それでも、ほとんどのEAはこの方式をベースにしています。
7.3 ATRベースロット
より高度なEAでは、ATR(Average True Range)を使ったロット調整が行われることがあります。
ATRは
市場の平均的な値動き幅
を表す指標です。
ATRを使うと
-
ボラティリティが大きい相場 → ロットを小さく
-
ボラティリティが小さい相場 → ロットを大きく
という調整が可能になります。
例
ATR = 100 pips → ロット小
ATR = 30 pips → ロット大
この方法は
-
トレンドフォローEA
-
ボラティリティ依存戦略
で使われることが多いです。
ただし、ATRを使う場合は
SL距離
との整合性を取る必要があります。
7.4 ボラティリティ調整ロット
さらに高度なEAでは、ボラティリティそのものを基準にロットを変える方法もあります。
例えば
ATR
標準偏差
ボラティリティ指数
などを利用します。
この方式では
ロット ∝ 1 / ボラティリティ
のような関係になることが多いです。
つまり
| 相場状態 | ロット |
|---|---|
| 高ボラ | 小 |
| 低ボラ | 大 |
になります。
この方法のメリットは
-
ドローダウン抑制
-
資金曲線の安定化
です。
ただし
-
実装が複雑
-
パラメータ最適化が必要
というデメリットもあります。
7.5 プロEAでよく使われる設計
実際のEAでは、次のような組み合わせがよく使われます。
パターンA(最も一般的)
固定リスク
+
SLベースロット計算
パターンB(ボラティリティ対応)
固定リスク
+
ATRベースSL
パターンC(高度EA)
固定リスク
+
ボラティリティ補正
+
資金曲線フィルター
初心者がEAを作る場合は、まず
固定リスク方式
を実装するのが安全です。
7.6 実務的な設計指針
EAのロット管理では、次の考え方が重要になります。
短期視点
-
リスクを一定に保つ
-
SL距離に応じてロット調整
長期視点
-
ドローダウン耐性
-
資金曲線の安定性
そのため、多くのEAでは
RiskPercent = 0.5〜2%
程度が使われます。
これより大きいリスクは、資金破綻確率を大きく上げる可能性があります。
8. まとめ
MQL5でEAを開発する場合、ロットサイズ計算(Lot Size Calculation)は資金管理の中核になります。
ロットサイズの設計が適切でない場合、トレードロジックが優れていても、資金管理の問題によって口座の安定性が大きく損なわれる可能性があります。
この記事では、MQL5におけるロット計算の基本から実装方法までを体系的に解説しました。ここで、重要なポイントを整理します。
ロットサイズ計算の基本構造
MQL5のEAで最も一般的なロット計算は、許容リスクとストップロス距離から逆算する方法です。
基本的な考え方は次の通りです。
Lot = Risk Amount / (StopLoss × Pip Value)
この方法を使うことで、ストップロスに到達した場合の損失を一定に保つことができます。
EA実装で重要になる要素
ロット計算を実装する際には、次の情報を取得する必要があります。
-
口座残高
-
許容リスク(Risk%)
-
ストップロス距離
-
tick value
-
tick size
MQL5ではこれらの情報を次の関数で取得できます。
AccountInfoDouble()
SymbolInfoDouble()
これらを利用することで、通貨ペアだけでなく
-
ゴールド
-
指数
-
CFD
などにも対応した汎用的なEAを作ることができます。
ロット正規化は必須
ロット計算のあとには、必ずブローカー仕様に合わせて調整する必要があります。
確認すべき条件は次の3つです。
-
最小ロット
-
最大ロット
-
ロットステップ
MQL5では次のシンボル情報から取得できます。
SYMBOL_VOLUME_MIN
SYMBOL_VOLUME_MAX
SYMBOL_VOLUME_STEP
この処理を行わないと、Invalid Volume エラーが発生する可能性があります。
ロット計算でよくある失敗
初心者が特に混乱しやすいポイントは次の通りです。
pip と point の混同
5桁ブローカーでは
1 pip = 10 points
になります。
通貨ペアによる価格単位の違い
例えば
| 通貨ペア | pip |
|---|---|
| EURUSD | 0.0001 |
| USDJPY | 0.01 |
この違いを考慮しないと、ロット計算が大きくずれる可能性があります。
CFDや指数での誤計算
ゴールドや株価指数では
-
contract size
-
tick value
がFXとは異なるため、固定値を使う設計は避ける必要があります。
実務で最も使われるロット管理
多くのEAでは、次の方式が採用されています。
固定リスク(1%前後)
+
SL距離ベースロット計算
この方法は
-
リスクを一定に保てる
-
資金増加に対応できる
-
長期運用に向いている
という利点があります。
EA設計での実務的な目安
一般的なリスク設定は次の通りです。
| Risk% | 特徴 |
|---|---|
| 0.5% | 非常に保守的 |
| 1% | 一般的 |
| 2% | やや攻めた設定 |
リスク設定が大きいほど、ドローダウンや資金破綻の確率が高くなる可能性があります。
そのため、EAを長期運用する場合は
RiskPercent = 0.5〜1.5%
程度に設定するケースが多いです。
最終チェックリスト
MQL5のロット計算を実装する際は、次の項目を確認すると安全です。
-
StopLossをpoints単位で計算しているか
-
tick valueをSymbolInfoDoubleで取得しているか
-
ロットをmin lot / lot stepに合わせて正規化しているか
-
lot = 0 の場合は注文しないようにしているか
-
小額口座で最小ロット問題を考慮しているか
これらを満たしていれば、EAのロット管理は安定しやすくなります。
FAQ
Q1 MQL5でロットサイズはどう計算しますか?
一般的には、許容リスク額とストップロス距離から逆算する方法が使われます。
口座残高の一定割合をリスクとして設定し、SL距離からロットを計算します。
Q2 pip valueはどのように取得できますか?
MQL5では SymbolInfoDouble() を使い、次の定数から取得できます。
SYMBOL_TRADE_TICK_VALUE
Q3 lot と volume は同じ意味ですか?
MQL5では注文量は volume として扱われます。
FXの一般用語ではこれを lot と呼びます。
Q4 Invalid Volume エラーの原因は何ですか?
多くの場合、次のいずれかです。
-
最小ロット未満
-
ロットステップ違反
-
最大ロット超過
Q5 通貨ペアによってロット計算は変わりますか?
基本式は同じですが、pip value や tick value が異なるため結果は変わります。
Q6 CFDや指数でも同じ計算式を使えますか?
基本的には同じですが、contract size や tick value が異なるため、シンボル情報を取得して計算する必要があります。
Q7 EAでおすすめのリスク設定はどれくらいですか?
多くのEAでは
0.5%〜2%
程度が一般的です。
戦略やドローダウン耐性によって最適値は変わるため、バックテストで確認することが重要です。