Liquidity_Predator/Utilities/M_CalculateLotSize.mqh

40 lines
No EOL
1.3 KiB
MQL5

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);
}