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

Popular posts from this blog

MQL5 : Add time to current time in mins

MQL5: Closed order detail