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
|