Т.е. мы привыкли видеть размеры лотов в таком формате: 0.01 или 0.10 или 10.05 и т.п.
Как видно, обычно всегда имеются две цифры после точки в величине лота, но не исключен случай, что у какого-нибудь брокера их будет не две, а, скажем, три или четыре или одна. Всё может быть и если не провести нормализацию при расчета торгового лота по количеству цифр после точки в его величине, мы можем получить совершенно другое значение лота при открытии трейдером сделки.
Например, трейдер должен открыть позицию с лотом 0.019, что практически неотлично от 0.02 лот, а советник может выдать команду на открытие 0.01 лот, т.е. почти в два раза меньше.
Поэтому напишем функцию для расчета количества цифр после точки в величине лота:
- Код: выделить все
int f_GetLotDigits(string sy)
{
/*
Описание : Количество цифр после запятой в величине лота
Параметры:
sy - наименование инструмента ("0" - текущий символ)
*/
if(sy == "0") sy = Symbol();
return((int)MathLog10(1 / MarketInfo(sy, MODE_LOTSTEP)));
}
Назовем функцию f_GetLotDigits(). Она будет возвращать значение типа int. Это понятно - количество цифр после точки в величине лота целое число.
Параметр функции f_GetLotDigits единственный - наименование торгового инструмента (имя валютной пары).
Для удобства, поскольку практически всегда в эксперте нужно производить расчета для торговго инструмента, на котором запущен эксперт, я использую формализацию "0" для обозначения текущего актива.
Отсюда строка в коде:
- Код: выделить все
if(sy == "0") sy = Symbol();
Далее код состоит всего из одной строки, значение, после расчета которой, сразу же возвращается функцией в команде return.
Прежде всего обратим внимание, что нам для расчета количества цифр после точки в величине лота необходим параметр MODE_LOTSTEP в зарезервированной команде MarketInfo().
MODE_LOTSTEP возвращает шаг изменения размера лота, т.е. как раз и выделяет необходимое минимальное изменение лота в котором мы увидим сколько же используется цифр после точки.
Далее происходит расчет обратного значения величины MODE_LOTSTEP, таким образом из величины, например, 0.001 мы получаем 1000.
Использование функции MathLog10 вернет нам значение логарифма по основанию 10. По правилам расчета логарифма данная процедура выглядит так:
1000 = 10^3 (десять в третьей степени), а, как мы помним из школы, логарифмом числа а по основанию b называется показатель степени в которую нужно возвести число b чтобы получить a.
Таким образом функция MathLog10 вернет число 3 (в нашем примере), т.е. показатель степени.
Вот и всё, так мы четко и однозначно определим количество цифр после точки в величине торгового лота.
В качестве примера использования данной функции предстает тема Создание советника по ТС "Колобок" (мод. трин), где мы видим, что значение количества цифр после точки в величине торгового лота нам необходимо при нормализации в расчете торгового лота, равенство которого начальному не предусмотрено в соответствие с алгоритмом.