передаваемого параметра приводит к разным результатам, а именно, получаемые значения
не равны по модулю.
В некоторых случаях использование подобных функций оказывается очень удобным. Для
примера рассмотрим фрагмент расчёта количества лотов для новых ордеров:
int Percent =30; // % свободных средств
double Free =AccountFreeMargin(); // Свободные средства
double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
double Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера
double Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;
Значение переменной Percent задаётся пользователем. В данном случае пользователь
выделил для новых ордеров 30% свободных средств. В соответствии с правилами,
установленными дилинговым центром, правильно вычисленное количество лотов должно
быть кратно минимальному шагу изменения размера лотов (Step). Для расчёта
необходимы также значения свободных средств на счёте (Free) и стоимости одного лота
(One_Lot).
Рассмотрим логику рассуждений программиста, составившего формулу для расчёта
искомого количества лотов Lots_New для новых ордеров. Используем для наглядности
численные значения переменных. Пусть Free = 5000.0, One_Lot = 1360.0 (в большинстве
ДЦ стоимость 1 лота для валютной пары, в знаменателе которой USD, пропорциональна
цене по валютному инструменту), Step = 0.1. В этом случае программную строку для
вычисления Lots_New можно переписать так:
Lots_New = MathFloor(5000.0*30/100/1360.0/0.1)*0.1;
Значением выражения 5000.0*30/100 является количество средств, выделенных
пользователем для открытия нового ордера. В данном случае стоимость нового ордера
может достигать 1500.0. Потратив все эти средства можно открыть один ордер,
количество лотов у которого равно 1500.0 / 1360.0 = 1.102941. Однако дилинговый центр
не примет заявку на такое количество лотов, т.к. минимальный шаг (в большинстве
дилинговых центров) Step = 0.1. Для вычисления искомого количества лотов необходимо
отбросить "лишние" цифры в дробной части и заменить их нулями.
Для этого можно воспользоваться рассматриваемой математической функцией:
Lots_New = MathFloor(1.102941/0.1)*0.1;
843