Обсуждение документации MQL4 - страница 17

 
Yurixx:

Rosh, если я правильно понимаю Ваше молчание, то четкой формулировки, в каких случаях и для каких выражений/переменных нужна нормализация, не существует. Если это так, то может быть можно ответить на более простой вопрос: требуется ли нормализация расчетных значений вида

int StLs=25;
double prc = Ask + StLs*Point;

Или мне выяснять это самостоятельно, на эксперименте ?

Я не думал, что Вы ждете моего ответа на вопрос. Мой ответ такой: в таких случаях я не делаю нормализации и ордера открываются нормально. Но было дело, когда я загрузил вручную сделанную историю и попытался прогнать на ней тестер - тогда и был для меня сюрприз. Практически во всех случаях на всякий пожарный случай лучше использовать нормализацию - будь это значения индикатора собственного изготовления, которые вставляются в ценовые параметры OrderSend() [например, всевозможные Pivot] или сложные расчеты(и не сложные) внутри эксперта - во всех случаях кашу маслом не испортишь.

А так, действительно, четкой формулировки, когда абсолютно излишне применять нормализацию цен в OrderSend() я дать не могу. В принципе, ночичок уже через полгода набьет чутье на это, но можно и не набивать , а тупо нормализовать всегда.
 
Кроме того, сегодня при проверке хелпа обнаружил в разделе Преобразования данных :

Группа функций, обеспечивающих преобразование данных из одного формата в данные другого формата.

Особо следует отметить функцию NormalizeDouble(), которая обеспечивает требуемую точность представления цены. В торговых операциях нельзя использовать ненормализованные цены, чья точность превышает требуемую торговым сервером хотя бы на один знак.
 
А также NormalizeDouble

double NormalizeDouble( double value, int digits)
Округление числа с плавающей запятой до указанной точности.
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits.
Параметры:
value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).
Пример:
  double var1=0.123456789;
Print(DoubleToStr(NormalizeDouble(var1,5),5));
// вывод: 0.12346
 
"Пример:
  double var1=0.123456789;
Print(DoubleToStr(NormalizeDouble(var1,5),5));
// вывод: 0.12346"

Вот такие примеры хотелось бы видеть в документации. Все просто и понятно. Вставил в эксперт или индикатор и сразу увидел результат.
 
То есть, так?
 

Rosh, посмотри, пожалуйста, на 16-й страничке этого же форума, там я уже писал именно об этой функции и о предложениях по улучшению помощи к ней.

 
Исправлено так на данный момент (будет в новом билде):

double NormalizeDouble( double value, int digits)
Округление числа с плавающей запятой до указанной точности.
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits.

Параметры:
value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).
Пример:
  double var1=0.123456789;
Print(DoubleToStr(NormalizeDouble(var1,5),8));
// вывод: 0.12346000



Этот пример демонстрирует обрезку с помщью NormalizeDouble() до 5 знаков, а Print() просто визуализирует(прошу прощения за этот нерусский стиль) это.
 

Да, пример стал существенно информативнее, как только количества знаков стали отличаться.

 
bool SendFTP( string filename, string ftp_path=NULL)
Посылает файл по адресу, указанному в окне настроек на закладке "Публикация". В случае неудачи возвращает FALSE.
Функция не работает в режиме тестирования. Из пользовательских индикаторов также нельзя вызывать эту функцию.
Отсылаемый файл должен находиться в папке каталог_терминала\experts\files или ее подпапках.
Отсылка не производится, если в настройках не указан адрес FTP и/или пароль доступа.
[...]
void SendMail( string subject, string some_text)
Посылает электронное письмо по адресу, указанному в окне настроек на закладке "Почта".
Отсылка может быть запрещена в настройках, также может быть не указан адрес электронной почты. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
[...]

Задачка на наблюдательность: найдите 2 отличия.
 
Видимо, необходимо сдаться, чтобы Вы из-за спины выбросили правильный ответ? :)