double M_CalculateLotSize(double riskPercent, double stopLossPoints, double Percentage, ENUM_ORDER_TYPE orderType) { // --- Safety checks if(riskPercent <= 0 || stopLossPoints <= 0) return 0.0; // --- Account & symbol info double balance = AccountInfoDouble(ACCOUNT_BALANCE); double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); double tick_value = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); // --- Money to risk double riskMoney = balance * riskPercent / 100.0; double lot = riskMoney / stopLossPoints; // --- Loss per Lot double CalcedLoss = fLossPerLot * lot; riskMoney = riskMoney - CalcedLoss; lot = riskMoney / stopLossPoints; double MaxLotMargin = M_CalcMaxLotMargin(orderType); lot = MathMin(lot, MaxLotMargin); // Scale lot lot = lot * (Percentage / 100); // --- Normalize to lot step lot = MathFloor(lot / lotStep) * lotStep; // --- Clamp to symbol limits lot = MathMax(minLot, MathMin(lot, maxLot * stGVL.nNumberOfPositions)); // * Number of positions because afterwards it is split up return NormalizeDouble(lot, 2); }