Сколько раз уже повторяли, что нельзя сравнивать вещественные числа между собой просто так.
Цена нормализована, когда нормализованное значение равно оригинальному. Верно?
Нашел в Вашем Тестере тормозную часть. Там идет проверка акцепта отложки не через простое сравнение цены отложки с текущей, а через медленную нормализацию.
Например, для BuyLimit вместо такой проверки
if (Ask <= PriceBuyLimit)
Accept();
Вы делаете такую
if (NormalizeDouble(Ask - PriceBuyLimit, Digits) <= 0)
Accept();
Почему-то иногда в визуализаторе тестера на графике не отображается индикатор Moving Average, который используется в советнике. Проявляется случайно - когда есть, а когда и нет. В чем причина?
// Советник показывает, что две идентичные позиции (даже открыты на одном тике) имеют разные цены// Запускать в MT5-Тестере на MQ-Beta EURUSD M1 все тики с 04.01.2019.#include <MT4Orders.mqh>
#define TOSTRING(A) #A + " = " + (string)(A) + " "#define BidSymbolInfoDouble(_Symbol, SYMBOL_BID)
// Сравниваем две позицииvoid CheckPositions()
{
if (OrdersTotal() > 1)
{
constdouble Price2 = OrderSelect(0, SELECT_BY_POS) ? OrderOpenPrice() : 0;
OrderPrint();
constdouble Price3 = OrderSelect(1, SELECT_BY_POS) ? OrderOpenPrice() : 0;
OrderPrint();
Print(TOSTRING(Price2 != Price3)); // true
}
}
voidOnTick()
{
if (!OrderSelect(0, SELECT_BY_POS))
OrderSend(_Symbol, OP_SELLSTOP, 1, 1.13912, 0, 0, 0, NULL, 0, 0, INT_MIN); // Выставили SellStopelseif (NormalizeDouble(Bid - OrderOpenPrice(), _Digits) <= 0) // Если пришел тик, где сработал SellStop
{
OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0); // Откроем Sell.
CheckPositions(); // Сравниваем позицииDebugBreak();
ExpertRemove();
}
}
Результат
2019.01.0400:00:34 sell stop 1.00 EURUSD at 1.13912 (1.13931 / 1.13940 / 1.13931)
2019.01.0400:10:04 order [#2sell stop 1.00 EURUSD at 1.13912] triggered2019.01.0400:10:04 deal #2sell 1.00 EURUSD at 1.13912 done (based on order #2)
2019.01.0400:10:04 deal performed [#2sell 1.00 EURUSD at 1.13912]
2019.01.0400:10:04 order performed sell 1.00 at 1.13912 [#2sell stop 1.00 EURUSD at 1.13912]
2019.01.0400:10:04 instant sell 1.00 EURUSD at 1.13912 (1.13912 / 1.13917 / 1.13912)
2019.01.0400:10:04 deal #3sell 1.00 EURUSD at 1.13912 done (based on order #3)
2019.01.0400:10:04 deal performed [#3sell 1.00 EURUSD at 1.13912]
2019.01.0400:10:04 order performed sell 1.00 at 1.13912 [#3sell 1.00 EURUSD at 1.13912]
2019.01.0400:10:04#22019.01.0400:00:34 sell 1.00 EURUSD 1.139120.000000.000001.139170.000.00 -5.0002019.01.0400:10:04#32019.01.0400:10:04 sell 1.00 EURUSD 1.139120.000000.000001.139170.000.00 -5.0002019.01.0400:10:04Price2!=Price3 = true
Т.е. две полностью идентичные позиции, но цены при сравнении разные!
Этот пример показывает еще один баг Тестера. Вот его позиции и сделки
На скринах выделено время якобы срабатывания отложки. Но посмотрите лог выше, где написано triggered. Там другое время.
Просьба исправить на корректные времена позиции и сделки.
30. Tester:
Исправлена отладка индикаторов на исторических данных. Теперь функции OnInit и OnDeinit индикаторов можно отлаживать корректно.
Ранее была проблема с перезапуском индикатора. Функция OnInit() нового индикатора запускалась до выполнения OnDeinit() старого. Правильно ли я понимаю, что данное нововведение - исправление именно этой ошибки, и теперь разработчики гарантируют запуск нового индикатора после закрытия старого?
Ранее была проблема с перезапуском индикатора. Функция OnInit() нового индикатора запускалась до выполнения OnDeinit() старого. Правильно ли я понимаю, что данное нововведение - исправление именно этой ошибки, и теперь разработчики гарантируют запуск нового индикатора после закрытия старого?
Это не проблема. Это - особенность архитектуры.
Отладка на исторических данных - это отладка в визуальном тестере. К терминалу отношения не имеет (там так и написано "30. Tester: ...")
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Это - не доказательство. Распечатайте "ненормализованное" значение цены с точностью до 16 знаков и не в научном формате (форматтер %.16f)
Вы код смотрели? Причем тут формат распечатывания, если эта функция выдает true?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2019.02.20 07:26
Вы код смотрели? Причем тут формат распечатывания, если эта функция выдает true?
Вы получаете DBL_EPSILON.
Сколько раз уже повторяли, что нельзя сравнивать вещественные числа между собой просто так.
Вы получаете DBL_EPSILON.
Сколько раз уже повторяли, что нельзя сравнивать вещественные числа между собой просто так.
Цена нормализована, когда нормализованное значение равно оригинальному. Верно?
Нашел в Вашем Тестере тормозную часть. Там идет проверка акцепта отложки не через простое сравнение цены отложки с текущей, а через медленную нормализацию.
Например, для BuyLimit вместо такой проверки
Вы делаете такую
Отсюда замедление.
Цена нормализована, когда нормализованное значение равно оригинальному. Верно?
Спасибо. Разобрались.
Экспериментировали с алгоритмами нормализации и внесли в одном месте рассогласование.
Исправили
Результат
Т.е. две полностью идентичные позиции, но цены при сравнении разные!
Этот пример показывает еще один баг Тестера. Вот его позиции и сделки
На скринах выделено время якобы срабатывания отложки. Но посмотрите лог выше, где написано triggered. Там другое время.
Просьба исправить на корректные времена позиции и сделки.
Что сейчас творится в MT5-Тестере
Результат
Т.е. две полностью идентичные позиции, но цены при сравнении разные!
Этот пример показывает еще один баг Тестера. Вот его позиции и сделки
На скринах выделено время якобы срабатывания отложки. Но посмотрите лог выше, где написано triggered. Там другое время.
Просьба исправить на корректные времена позиции и сделки.
Ещё один по сравнению с чем?
Если в тестер подавать правильно нормализованные цены, то и этой проблемы не будет
Ещё один по сравнению с чем?
Если в тестер подавать правильно нормализованные цены, то и этой проблемы не будет
Да, если нормализовать, то проблемы не должно быть.
Triggered-время - баг.
MetaQuotes Software Corp.:
30. Tester: Исправлена отладка индикаторов на исторических данных. Теперь функции OnInit и OnDeinit индикаторов можно отлаживать корректно.
Ранее была проблема с перезапуском индикатора. Функция OnInit() нового индикатора запускалась до выполнения OnDeinit() старого. Правильно ли я понимаю, что данное нововведение - исправление именно этой ошибки, и теперь разработчики гарантируют запуск нового индикатора после закрытия старого?
Ранее была проблема с перезапуском индикатора. Функция OnInit() нового индикатора запускалась до выполнения OnDeinit() старого. Правильно ли я понимаю, что данное нововведение - исправление именно этой ошибки, и теперь разработчики гарантируют запуск нового индикатора после закрытия старого?
Это не проблема. Это - особенность архитектуры.
Отладка на исторических данных - это отладка в визуальном тестере. К терминалу отношения не имеет (там так и написано "30. Tester: ...")