MQL5 : Calculate lotsize based on risk
// devide risk percentage by risk=RiskPer/10;
ddouble CalculateLotSize(double entryPrice, double stopLossPrice, double riskPercent)
{
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double equity = AccountInfoDouble(ACCOUNT_BALANCE);
double slPriceDiff = MathAbs(entryPrice - stopLossPrice);
double riskAmount = equity * riskPercent / 100.0;
if(tickSize == 0 || tickValue == 0 || slPriceDiff == 0)
{
Print("❌ Invalid market parameters.");
return 0;
}
// Convert SL to number of ticks
double ticks = slPriceDiff / tickSize;
// Money lost per 1 lot = ticks * tickValue
double moneyPerLot = ticks * tickValue;
// Exact lots based on max risk amount
double rawLots = riskAmount / moneyPerLot;
// Round down to nearest allowed step
double finalLots = MathFloor(rawLots / lotStep) * lotStep;
finalLots = NormalizeDouble(finalLots, 2);
// Enforce min/max volume limits
finalLots = MathMax(minLot, MathMin(finalLots, maxLot));
// Debug info
Print("=== Final Lot Calculation ===");
PrintFormat("entry: %.2f | SL: %.2f | ticks: %.0f | tickVal: %.2f | perLotRisk: %.2f | RiskAmt: %.2f | Lots: %.2f",
entryPrice, stopLossPrice, ticks, tickValue, moneyPerLot, riskAmount, finalLots);
return finalLots;
}
Comments
Post a Comment