Files
Bell-PriceActionWithEma-EA/Experts/EA_ICT_CL/Risk.mqh
T

38 lines
1.3 KiB
Plaintext
Raw Normal View History

2026-03-10 13:47:42 +07:00
#ifndef EA_ICT_CL__RISK_MQH
2026-03-10 20:39:33 +07:00
#define EA_ICT_CL__RISK_MQH
2026-03-10 13:47:42 +07:00
2026-03-10 20:39:33 +07:00
/** Normalizes volume to symbol min/max/step. */
2026-03-10 13:47:42 +07:00
inline double NormalizeVolume(const string symbol, const double vol)
{
2026-03-10 20:39:33 +07:00
const double minVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
const double maxVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
const double stepVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
2026-03-10 13:47:42 +07:00
double v = vol;
2026-03-10 20:39:33 +07:00
if (stepVol > 0.0) v = MathFloor(v / stepVol) * stepVol;
if (v < minVol) v = minVol;
if (v > maxVol) v = maxVol;
2026-03-10 13:47:42 +07:00
return v;
}
2026-03-10 20:39:33 +07:00
/** Computes lot size from risk money and SL distance in points. */
inline double LotsFromRiskMoneyAndSLPoints(const string symbol, const double riskMoney, const double slPoints)
2026-03-10 13:47:42 +07:00
{
2026-03-10 20:39:33 +07:00
if (riskMoney <= 0.0) return 0.0;
if (slPoints <= 0.0) return 0.0;
2026-03-10 13:47:42 +07:00
2026-03-10 20:51:27 +07:00
double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
2026-03-10 20:39:33 +07:00
if (tickValue <= 0.0 || tickSize <= 0.0) return 0.0;
2026-03-10 13:47:42 +07:00
const double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
if (point <= 0.0) return 0.0;
2026-03-10 20:39:33 +07:00
const double moneyPerPointPerLot = tickValue * (point / tickSize);
if (moneyPerPointPerLot <= 0.0) return 0.0;
2026-03-10 13:47:42 +07:00
2026-03-10 20:39:33 +07:00
const double lots = riskMoney / (slPoints * moneyPerPointPerLot);
return NormalizeVolume(symbol, lots);
2026-03-10 13:47:42 +07:00
}
2026-03-10 20:39:33 +07:00
#endif