Бета-версия платформы MetaTrader 5 build 1995: Экономический календарь, MQL5-программы в виде сервисов и API для языка R - страница 12

 
Slava:
Это - не доказательство. Распечатайте "ненормализованное" значение цены с точностью до 16 знаков и не в научном формате (форматтер %.16f)

Вы код смотрели? Причем тут формат распечатывания, если эта функция выдает true?

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2019.02.20 07:26

// true - нормализованная цена не равна оригинальной
bool IsBadPrice( const double &Price )
{
  return(NormalizeDouble(Price, 5) != Price);
}
 
fxsaber:

Вы код смотрели? Причем тут формат распечатывания, если эта функция выдает true?

Вы получаете DBL_EPSILON.

Сколько раз уже повторяли, что нельзя сравнивать вещественные числа между собой просто так.

 
Slava:

Вы получаете DBL_EPSILON.

Сколько раз уже повторяли, что нельзя сравнивать вещественные числа между собой просто так.

Цена нормализована, когда нормализованное значение равно оригинальному. Верно?


Нашел в Вашем Тестере тормозную часть. Там идет проверка акцепта отложки не через простое сравнение цены отложки с текущей, а через медленную нормализацию.


Например, для BuyLimit вместо такой проверки

if (Ask <= PriceBuyLimit)
  Accept();


Вы делаете такую

if (NormalizeDouble(Ask - PriceBuyLimit, Digits) <= 0)
  Accept();


Отсюда замедление.

 
Почему-то иногда в визуализаторе тестера на графике не отображается индикатор Moving Average, который используется в советнике. Проявляется случайно - когда есть, а когда и нет. В чем причина?
 
fxsaber:

Цена нормализована, когда нормализованное значение равно оригинальному. Верно?

Спасибо. Разобрались.

Экспериментировали с алгоритмами нормализации и внесли в одном месте рассогласование.

Исправили

 
Что сейчас творится в MT5-Тестере
// Советник показывает, что две идентичные позиции (даже открыты на одном тике) имеют разные цены
// Запускать в MT5-Тестере на MQ-Beta EURUSD M1 все тики с 04.01.2019.

#include <MT4Orders.mqh>

#define TOSTRING(A) #A + " = " + (string)(A) + " "

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)

// Сравниваем две позиции
void CheckPositions()
{
  if (OrdersTotal() > 1)
  {
    const double Price2 = OrderSelect(0, SELECT_BY_POS) ? OrderOpenPrice() : 0;
    OrderPrint();
    
    const double Price3 = OrderSelect(1, SELECT_BY_POS) ? OrderOpenPrice() : 0;
    OrderPrint();
    
    Print(TOSTRING(Price2 != Price3)); // true
  }
}

void OnTick()
{
  if (!OrderSelect(0, SELECT_BY_POS))
    OrderSend(_Symbol, OP_SELLSTOP, 1, 1.13912, 0, 0, 0, NULL, 0, 0, INT_MIN); // Выставили SellStop
  else if (NormalizeDouble(Bid - OrderOpenPrice(), _Digits) <= 0) // Если пришел тик, где сработал SellStop
  {
    OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0); // Откроем Sell.
    
    CheckPositions(); // Сравниваем позиции
    
    DebugBreak();
    ExpertRemove();
  }
}


Результат

2019.01.04 00:00:34   sell stop 1.00 EURUSD at 1.13912 (1.13931 / 1.13940 / 1.13931)
2019.01.04 00:10:04   order [#2 sell stop 1.00 EURUSD at 1.13912] triggered
2019.01.04 00:10:04   deal #2 sell 1.00 EURUSD at 1.13912 done (based on order #2)
2019.01.04 00:10:04   deal performed [#2 sell 1.00 EURUSD at 1.13912]
2019.01.04 00:10:04   order performed sell 1.00 at 1.13912 [#2 sell stop 1.00 EURUSD at 1.13912]
2019.01.04 00:10:04   instant sell 1.00 EURUSD at 1.13912 (1.13912 / 1.13917 / 1.13912)
2019.01.04 00:10:04   deal #3 sell 1.00 EURUSD at 1.13912 done (based on order #3)
2019.01.04 00:10:04   deal performed [#3 sell 1.00 EURUSD at 1.13912]
2019.01.04 00:10:04   order performed sell 1.00 at 1.13912 [#3 sell 1.00 EURUSD at 1.13912]
2019.01.04 00:10:04   #2 2019.01.04 00:00:34 sell 1.00 EURUSD 1.13912 0.00000 0.00000 1.13917 0.00 0.00 -5.00 0
2019.01.04 00:10:04   #3 2019.01.04 00:10:04 sell 1.00 EURUSD 1.13912 0.00000 0.00000 1.13917 0.00 0.00 -5.00 0
2019.01.04 00:10:04   Price2!=Price3 = true

Т.е. две полностью идентичные позиции, но цены при сравнении разные!



Этот пример показывает еще один баг Тестера. Вот его позиции и сделки

На скринах выделено время якобы срабатывания отложки. Но посмотрите лог выше, где написано triggered. Там другое время.

Просьба исправить на корректные времена позиции и сделки.

 
fxsaber:
Что сейчас творится в MT5-Тестере


Результат

Т.е. две полностью идентичные позиции, но цены при сравнении разные!



Этот пример показывает еще один баг Тестера. Вот его позиции и сделки

На скринах выделено время якобы срабатывания отложки. Но посмотрите лог выше, где написано triggered. Там другое время.

Просьба исправить на корректные времена позиции и сделки.

Ещё один по сравнению с чем?

Если в тестер подавать правильно нормализованные цены, то и этой проблемы не будет

 
Slava:

Ещё один по сравнению с чем?

Если в тестер подавать правильно нормализованные цены, то и этой проблемы не будет

Да, если нормализовать, то проблемы не должно быть.

Triggered-время - баг.

 

MetaQuotes Software Corp.:

30. Tester: Исправлена отладка индикаторов на исторических данных. Теперь функции OnInit и OnDeinit индикаторов можно отлаживать корректно.

Ранее была проблема с перезапуском индикатора. Функция OnInit() нового индикатора запускалась до выполнения OnDeinit() старого. Правильно ли я понимаю, что данное нововведение - исправление именно этой ошибки, и теперь разработчики гарантируют запуск нового индикатора после закрытия старого?

 
Sergey Savinkin:

Ранее была проблема с перезапуском индикатора. Функция OnInit() нового индикатора запускалась до выполнения OnDeinit() старого. Правильно ли я понимаю, что данное нововведение - исправление именно этой ошибки, и теперь разработчики гарантируют запуск нового индикатора после закрытия старого?

Это не проблема. Это - особенность архитектуры.

Отладка на исторических данных - это отладка в визуальном тестере. К терминалу отношения не имеет (там так и написано "30. Tester: ...")

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