如何正確計算 MQL5 倉位大小(Lot Size):風險管理核心
📌 本文重點:MQL5 中三種手數計算方法(固定手數、固定風險比例、固定金額),以及如何正規化手數符合交易規則。
為什麼手數計算如此重要?
倉位大小直接決定每筆交易的風險暴露。錯誤的手數計算可能導致下單失敗(ERR_INVALID_VOLUME)或單筆交易風險過高。
品種手數參數
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); // 最小手數(通常0.01)
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); // 最大手數
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); // 步進(通常0.01)
手數正規化函數(必用)
double NormalizeLots(double lots)
{
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lots = MathMax(lots, minLot);
lots = MathMin(lots, maxLot);
lots = MathRound(lots / lotStep) * lotStep;
return NormalizeDouble(lots, 2);
}
方法一:固定手數
input double InpLots = 0.1;
double GetLots() { return NormalizeLots(InpLots); }
方法二:固定風險比例(推薦)
根據帳戶餘額的固定百分比計算風險金額,再換算為手數。
input double InpRiskPct = 1.0; // 風險 1% 帳戶餘額
input int InpSLPips = 50; // 止損點數
double CalcRiskLots()
{
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double riskAmt = balance * (InpRiskPct / 100.0);
double tickVal = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSz = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double pointVal = tickVal * (tickSz / point); // 每點貨幣價值(1手)
if (pointVal <= 0 || InpSLPips <= 0) return 0.01;
// 手數 = 風險金額 / (止損點數 × 每點價值)
return NormalizeLots(riskAmt / (InpSLPips * pointVal));
}
常見錯誤對照表
| 錯誤 | 後果 | 解決方法 |
|---|---|---|
| 未調整手數步進 | ERR_INVALID_VOLUME | MathRound(lots/step)*step |
| 未設最小手數下限 | 下單失敗 | MathMax(lots, minLot) |
| 止損=0時算動態手數 | 除以零、手數異常 | 止損0時返回固定手數 |
本文由 James Lee 撰寫。