Количество цифр после точки в величине лота

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Количество цифр после точки в величине лота

Сообщение Haos » 04 янв 2021, 09:50

Практически в каждом эксперте разработчик сталкивается с необходимостью определения количества цифр после точки в величине лота. Будем говорить о точке в значениях лота, а не запятой как положено использовать в числах типа double потому, что фактически так и предлагают нам торговые терминалы, в частности МетаТрейдер и, вообще, так принято.
Т.е. мы привыкли видеть размеры лотов в таком формате: 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 (в нашем примере), т.е. показатель степени.

Вот и всё, так мы четко и однозначно определим количество цифр после точки в величине торгового лота.

В качестве примера использования данной функции предстает тема Создание советника по ТС "Колобок" (мод. трин), где мы видим, что значение количества цифр после точки в величине торгового лота нам необходимо при нормализации в расчете торгового лота, равенство которого начальному не предусмотрено в соответствие с алгоритмом.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron