В первую очередь поговорим о нормализации данных. Нормализация - это приведение точности числа к необходимому значению.
Для этого существует функция
- Код: выделить все
double NormalizeDouble(
double value, // нормализуемое число
int digits // кол-во знаков после запятой
);
В первый параметр функции NormalizeDouble() передаем число, которое хотим нормализовать, во второй параметр - до скольких десятичных знаков после запятой округлять число. Да, функция не только отсекает "лишние" знаки, но ещё и округляет по общепризнанным правилам математики. Например:
- Код: выделить все
Result = NormalizeDouble(12.75234, 2); // Переменная Result примет значение 12.75
Result = NormalizeDouble(12.75234, 1); // Переменная Result примет значение 12.8
На практике нормализация необходима чаще всего в трех случаях:
1. При вычислении ценового уровня. Например, вычислили значение стоп-лосса или тейк-профита по какой-либо формуле. После выполнения действий с плавающей запятой результат необходимо округлить до количества знаков после запятой для торгуемого инструмента, иначе функция открытия или модификации позиции не сработает и вернет ошибку. Количество знаков после запятой для инструмента, на котором работает советник (скрипт, индикатор), определяется значением предопределенной переменной Digits или _Digits, а также функцией Digits(). Эту переменную и подставляем во второй параметр функции NormalizeDouble(). Например:
- Код: выделить все
// TakeProfitPips - количество пунктов для тейк-профита
double TakeProfit = NormalizeDouble(Ask+TakeProfitPips*Point, Digits); // вычислить значение тейк-профита и нормализовать его
2. При вычислении размера лота. Точность лота - величина строго заданная, и если после арифметических действий получить недопустимое значение лота, то торговая функция вернет ошибку 131 (Неправильный объем). Количество знаков после запятой для величины лота в явном виде нигде не задано, поэтому его надо или задавать вручную, или вычислять. Несколько способов вычисления точности лота можно увидеть в ветке Расчет величины лота в зависимости от размера СЛ
3. Для вывода информационных сообщений. Очень часто сообщения выводятся в текстовые метки, а для них данные подготавливаются как строки, а не как числа. Поэтому, для нормализации вещественного числа и преобразования его в строку в MQL4 существует функция
- Код: выделить все
string DoubleToStr(
double value, // величина
int digits // формат точности
);
Как видно, параметры функции DoubleToStr() аналогичны функции NormalizeDouble() с той лишь разницей, что результат выполнения - строка символов:
- Код: выделить все
string value=DoubleToStr(1.35473418, 5);
// содержимое строки value - "1.35473"