38 lines
1.3 KiB
Plaintext
38 lines
1.3 KiB
Plaintext
#ifndef EA_ICT_CL__RISK_MQH
|
|
#define EA_ICT_CL__RISK_MQH
|
|
|
|
/** Normalizes volume to symbol min/max/step. */
|
|
inline double NormalizeVolume(const string symbol, const double vol)
|
|
{
|
|
const double minVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
|
|
const double maxVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
|
|
const double stepVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
|
|
double v = vol;
|
|
if (stepVol > 0.0) v = MathFloor(v / stepVol) * stepVol;
|
|
if (v < minVol) v = minVol;
|
|
if (v > maxVol) v = maxVol;
|
|
return v;
|
|
}
|
|
|
|
/** Computes lot size from risk money and SL distance in points. */
|
|
inline double LotsFromRiskMoneyAndSLPoints(const string symbol, const double riskMoney, const double slPoints)
|
|
{
|
|
if (riskMoney <= 0.0) return 0.0;
|
|
if (slPoints <= 0.0) return 0.0;
|
|
|
|
double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
|
|
double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
|
|
if (tickValue <= 0.0 || tickSize <= 0.0) return 0.0;
|
|
|
|
const double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
|
|
if (point <= 0.0) return 0.0;
|
|
|
|
const double moneyPerPointPerLot = tickValue * (point / tickSize);
|
|
if (moneyPerPointPerLot <= 0.0) return 0.0;
|
|
|
|
const double lots = riskMoney / (slPoints * moneyPerPointPerLot);
|
|
return NormalizeVolume(symbol, lots);
|
|
}
|
|
|
|
#endif
|