MQL4MQL5 スクリプト 資金管理・リスク
資金の◯%のリスクでロット数を計算したい
結論:「許容損失額 ÷(損切り幅 × 1ロットあたりの1ポイントの価値)」で計算し、最小ロット・刻み幅に合わせます。
考え方
「損切りにかかったときの損失を、口座残高の 2% までにする」といった資金管理では、損切りの幅からロット数を逆算します。1ロットで1ポイント動いたときの損益は、SYMBOL_TRADE_TICK_VALUE(1ティックの価値)÷ SYMBOL_TRADE_TICK_SIZE(1ティックの大きさ)× _Point で求められ、通貨ペアや口座通貨が違っても同じ式で計算できます。
- 許容損失額 = 残高 × リスク% を求める
- 1ロットで損切り幅だけ動いたときの損失額を求める
- ロット = 許容損失額 ÷ 1ロットあたりの損失額
- 刻み幅で切り捨て、最小ロット・最大ロットの範囲に収める
そのまま使えるコード
MetaEditor の「新規作成」で「スクリプト」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Scripts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4・MQL5 共通
#property strict
#property script_show_inputs
// 残高の◯%のリスクで、損切り幅からロット数を計算するスクリプト
input double InpRiskPct = 2.0; // リスク(残高に対する%)
input double InpSLPips = 30; // 損切り幅(pips)
double PipSize()
{
return (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
}
// 損切り幅(価格)とリスク額から、ロット数を計算する
double LotsByRisk(double riskMoney, double slDistance)
{
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
if(tickValue <= 0 || tickSize <= 0 || slDistance <= 0) return 0;
double lossPerLot = slDistance / tickSize * tickValue; // 1ロットで損切りしたときの損失
double lots = riskMoney / lossPerLot;
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double minL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
lots = MathFloor(lots / step) * step; // 刻み幅で切り捨て
if(lots < minL) return 0; // 最小ロットでもリスク超過
return MathMin(lots, maxL);
}
void OnStart()
{
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double risk = balance * InpRiskPct / 100.0;
double lots = LotsByRisk(risk, InpSLPips * PipSize());
if(lots == 0)
Print("リスクが小さすぎて、最小ロットでも許容損失を超えます");
else
Print("残高 ", DoubleToString(balance, 0), " × ", InpRiskPct, "% = 許容損失 ", DoubleToString(risk, 0),
" → ロット ", DoubleToString(lots, 2));
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- EA に組み込むときは LotsByRisk() 関数をコピーし、注文の直前に損切り幅を渡して呼びます。
- 残高ではなく有効証拠金を基準にしたいときは ACCOUNT_BALANCE を ACCOUNT_EQUITY にします。
注意点
- 最小ロットでもリスクを超える場合は 0 を返しています。そのまま最小ロットで注文すると、決めたリスクを超えます。
- スプレッドやスリッページの分、実際の損失は少し大きくなることがあります。
このコードで使っている関数
うまく動かないときに出やすいエラー
あわせて読みたいレシピ
- ロット数を最小ロット・刻み幅に合わせたいSYMBOL_VOLUME_STEP(刻み幅)で切り捨て、SYMBOL_VOLUME_MIN・SYMBOL_VOLUME_MAX の範囲に収めます。
- pips とポイントを正しく換算したい(3桁・5桁対応)_Digits が 3 か 5 の口座では 1pips = 10 ポイント(_Point × 10)、2 か 4 の口座では 1pips = 1 ポイントです。
- 注文する前に証拠金が足りるか確認したいMQL4 は AccountFreeMarginCheck()、MQL5 は OrderCalcMargin() で必要証拠金を計算し、余剰証拠金と比べます。
- 損切り・利確を pips で指定して注文したい1pips の大きさ(5桁・3桁口座は _Point × 10)を求め、損切り・利確の価格を計算して NormalizeDouble() で丸めます。












