В итоге функция расчета торгового лота родилась в таком виде:
- Код: выделить все
double f_TradeLot(string sy, double ml, int sl)
{
/*
функция рассчитывает объем сделки в соответствие с ММ
Параметры:
sy - имя торгового инструмента ("0" - текущий торговый символ)
ml - максимальный убыток на сделку (у.е.)
sl - величина СЛ в пнт.
*/
int intSpred;
double dblTickValue,
dblLotMin,
dblLotMax,
Y;
if(sy == "0") sy = Symbol();
intSpred = (int) MarketInfo(sy, MODE_SPREAD);
dblLotMin = MarketInfo(sy, MODE_MINLOT);
dblLotMax = MarketInfo(sy, MODE_MAXLOT);
dblTickValue = MarketInfo(sy, MODE_TICKVALUE);
Y = ml / ((sl + intSpred) * dblTickValue);
if(Y < dblLotMin) return(0);
else if(Y > dblLotMax) return(dblLotMax);
return(Y);
}
Передаем в неё :
1. Ну с именем актива - понятно, это классика жанра чтобы можно было не только по текущему активу вычислять.
2. Максимальный убыток допустимый в сделке (по конкретному активу) в валюте депозита. Как мы его подсчитали - дело кода в основной части советника (скрипта), взяли процент от маржи, баланса или средств.
Например, при риске в 1% от депозита 500 у.е. это будет 5 у.е. ну и т.п .
3. Размер СЛ в пунктах - тоже очевидно необходимое значение, так как от него зависит результат убытка в том числе.
Функция учитывает и то, что спред также входит в убыток, т.е. суммируем его к СЛ. Если вычисленный объем лота меньше меньшего, то функция вернет 0. В основном коде можно организовать обработку сообщений по этому поводу и т.п.
Если больше максимального лота, то вернет макс. лот. Округление не происходит, так как это отдельная процедура и может быть организована в отдельной функции (хотя я не встречал чтобы было отличное число знаков от 2 после запятой в размере лота).
