如何正確計算 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 撰寫。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *