Ошибки, баги, вопросы - страница 1932

 
Комбинатор:

Вообще тип decimal не помешал бы, удобная штука.

Да, его отсутствие в софте, который работает с ценами, с самого начала существования МТ, мягко говоря, смущает.

PS. Теперь, при наличии ООП языка, MQ наверно считают, что желающие могут себе класс написать. Только его потом в простую структуру не положишь - нужно будет сериализовать/десериализовать во что-то простое типа ulong.
 
Slava:

Я в самом деле очень благодарен Вам, что столь подробно отвечаете. Нормализация используется для формирования торговых запросов.

// Point = 0.001, Digits = 3
OrderSend(8274 * Point);
OrderSend(NormalizeDouble(8274 * Point, Digits));

В этом примере окажется, что отправляются разные цены в двух этих OrderSend.

При этом всегда считалось, что умножение целого на Point не требует доп. нормализации (так задавали SL и TP, например).

Так какая из двух строк вызовет ошибку?

 
Stanislav Korotky:

Да, его отсутствие в софте, который работает с ценами, с самого начала существования МТ, мягко говоря, смущает.

Не может быть чтобы в СД никто не писал
 
fxsaber:

Я в самом деле очень благодарен Вам, что столь подробно отвечаете. Нормализация используется для формирования торговых запросов.

В этом примере окажется, что отправляются разные цены в двух этих OrderSend.

При этом всегда считалось, что умножение целого на Point не требует доп. нормализации (так задавали SL и TP, например).

Так какая из двух строк вызовет ошибку?

Прикольно

#include <MT4Orders.mqh>

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);  
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
  
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Num, 0, 0, 0);
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Norm, 0, 0, 0);
}

Результат

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

Оба запроса с разными ценами, но выполнились без проблем по одной и той же цене. Как так?

 
fxsaber:

Прикольно

Результат

Оба запроса с разными ценами, но выполнились без проблем по одной и той же цене. Как так?

Очень просто -  с точки зрения double - эти числа одинаковы, потому что в double-е хранится 52 бита мантиссы или 15 десятичных разрядов. Различия в плюс-минус в последующих разрядах - не считаются. Вот статья на хабре.

 
Stanislav Korotky:

Очень просто -  с точки зрения double - эти числа одинаковы, потому что в double-е хранится 52 бита мантиссы или 15 десятичных разрядов. Различия в плюс-минус в последующих разрядах - не считаются. Вот статья на хабре.

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber, 2017.07.19 13:00

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}

И?

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.07.17 21:49

Если во время одиночного прогона нажать на "Стоп", то OnDeinit и деструкторы не вызываются.

Это недоработка или ошибка?

Сейчас при нажатии на кнопку "Стоп" происходит жесткий дисконнект с Агентом. Настолько жесткий, что не дождавшись завершения одиночного прогона невозможно посмотреть отчет.

В MT4 всегда можно видеть торговую историю незавершенного одиночного прогона. А в MT5 - никак.

Возможно ли не жестко обрывать соединение, а отправлять на Агента флаг, который можно было бы поймать и выполнить на нем OnDeinit?

 
Stanislav Korotky:

И?

Stanislav Korotky:

Очень просто -  с точки зрения double - эти числа одинаковы, потому что в double-е хранится 52 бита мантиссы или 15 десятичных разрядов. Различия в плюс-минус в последующих разрядах - не считаются. Вот статья на хабре.

Отличие больше, чем 1e-15. Более того, Num != Norm. Это разные числа, а не одинаковые.
 
Stanislav Korotky:

И?

Ну вообще-то согласен, если мы задаем литерал, логично было бы что его double представление сразу нормализовано по количеству разрядов в литерале

Причина обращения: