Глюк в тестере!

 
Терминал: MT5 build 5131 24 Jun 2025

Глюк выражается в том, что котировки в тестере не соответствуют исходным, с графика символа.
Как проверялось:
1. Сохраняем в файл все свечи с графика символа в терминале (MqlRates[])
2. Удаляем базы тестера
3. Запускаем тестового эксперта на одиночный тест. Он сравнивает свечи, которые получает от тестера
с исходными из файла (time, open, close, high, low). Сравнение корректное, с нормализацией до _Digits.

Синхронизация котировок тестера проходит без вопросов, в логе все в порядке:

EK 0 12:20:44.829 Core 1 connecting to 127.0.0.1:3000
EL 0 12:20:44.832 Core 1 connected
PL 0 12:20:44.835 Core 1 authorized (agent build 5131)
DI 0 12:20:44.848 Tester TEST_SYMB,M1 (MetaQuotes-Demo): testing of Experts\Rates_test.ex5 from 2018.02.09 00:00 to 2025.06.26 00:00
RD 0 12:20:44.885 Core 1 common synchronization completed
CQ 0 12:20:44.890 Core 1 TEST_SYMB: history for 2018 year synchronized
QL 0 12:20:44.897 Core 1 TEST_SYMB: history for 2019 year synchronized
IF 0 12:20:44.905 Core 1 TEST_SYMB: history for 2020 year synchronized
NQ 0 12:20:45.009 Core 1 TEST_SYMB: history for 2021 year synchronized
GK 0 12:20:45.058 Core 1 TEST_SYMB: history for 2022 year synchronized
NF 0 12:20:45.083 Core 1 TEST_SYMB: history for 2023 year synchronized
QP 0 12:20:45.155 Core 1 TEST_SYMB: history for 2024 year synchronized
NK 0 12:20:45.184 Core 1 TEST_SYMB: history for 2025 year synchronized
DI 0 12:20:45.184 Core 1 TEST_SYMB: history synchronization completed [6218 Kb]
GQ 0 12:20:45.184 Core 1 TEST_SYMB: 6.07 Mb of history processed in 0:00:00.297
IR 3 12:20:45.320 Tester quality of analyzed history is 41%
NJ 0 12:20:52.151 Core 1 test Experts\Rates_test.ex5 on TEST_SYMB,M1 thread finished
CN 0 12:20:52.151 Core 1 prepare for shutdown
QJ 0 12:20:52.151 Core 1 shutdown finished
DR 0 12:20:52.151 Core 1 free cached memory
CO 0 12:20:52.151 Core 1 login (build 5131)
IG 0 12:20:52.151 Core 1 account info found with currency USD
OL 0 12:20:52.151 Core 1 1478 bytes of tester parameters loaded
MH 0 12:20:52.151 Core 1 19652 bytes of input parameters loaded
HM 0 12:20:52.151 Core 1 40611 bytes of symbols list loaded (10620 symbols)
OD 0 12:20:52.151 Core 1 expert file added: Experts\Rates_test.ex5. 81012 bytes loaded
EE 0 12:20:52.151 Core 1 initial deposit 10000.00 USD, leverage 1:1
JO 0 12:20:52.151 Core 1 successfully initialized
JS 0 12:20:52.151 Core 1 125 Kb of total initialization data received
NP 0 12:20:52.151 Core 1 Intel Core i7-4771  @ 3.50GHz, 8127 MB
OF 0 12:20:52.151 Core 1 TEST_SYMB: symbol to be synchronized
ES 0 12:20:52.151 Core 1 TEST_SYMB: symbol synchronized, 3880 bytes of symbol info received
DH 0 12:20:52.151 Core 1 TEST_SYMB: load 6.07 Mb of history data to synchronize in 0:00:00.370
QE 0 12:20:52.151 Core 1 TEST_SYMB: history synchronized from 2018.02.09 to 2025.06.26
JF 3 12:20:52.151 Core 1 TEST_SYMB: start time changed to 2018.05.19 00:00 to provide data at beginning
QS 0 12:20:52.151 Core 1 TEST_SYMB,M1: history cache allocated for 2669679 bars and contains 109 bars from 2018.02.09 10:00 to 2018.05.18 14:01
RG 0 12:20:52.151 Core 1 TEST_SYMB,M1: history begins from 2018.02.09 10:00
LO 0 12:20:52.151 Core 1 TEST_SYMB,M1 (MetaQuotes-Demo): OHLC bar states generating. OnTick executed on the bar begin only
NN 0 12:20:52.151 Core 1 TEST_SYMB,M1: testing of Experts\Rates_test.ex5 from 2018.02.09 00:00 to 2025.06.26 00:00 started with inputs:


DP 0 12:21:03.787 Core 1 TEST_SYMB,M1: 1671302 ticks, 495101 bars generated. Environment synchronized in 0:00:00.421. Test passed in 0:00:18.531 (including ticks preprocessing 0:00:00.109).
QG 0 12:21:03.787 Core 1 TEST_SYMB,M1: total time from login to stop testing 0:00:18.952 (including 0:00:00.421 for history data synchronization)
HE 0 12:21:03.787 Core 1 486 Mb memory used including 152 Mb of history data, 64 Mb of tick data
RG 0 12:21:03.787 Core 1 log file "E:\PairTrader\MT5\Tester\Agent-127.0.0.1-3000\logs\20250627.log" written
DJ 0 12:21:04.076 Core 1 test Experts\Rates_test.ex5 on TEST_SYMB,M1 thread finished


Тестовый эксперт выдает следующее:


25.06.25 23:57:59 Проверка котировок тестера:
25.06.25 23:57:59 Баров в исходном файле          495346
25.06.25 23:57:59 Баров на графике тестера        495210
25.06.25 23:57:59 Начальный индекс                0
25.06.25 23:57:59 Конечный индекс                 495209
25.06.25 23:57:59 Ошибок time                     0
25.06.25 23:57:59 Ошибок open                     103034
25.06.25 23:57:59 Ошибок close                    0
25.06.25 23:57:59 Ошибок high                     52850
25.06.25 23:57:59 Ошибок low                      50184

В отладчике видно, что эксперт действительно получает некорректные данные.

В последнее время терминал обновлялся часто, с какого билда появился глюк, не знаю.

Но раньше этот тест работал и давал 0 ошибок.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Структура для хранения информации о ценах, объемах и спреде.   Пример: Смотри также CopyRates , Доступ к...
 
Вы эксперт приложите, чтобы разработчики могли воспроизвести проблему.
 

В данном конкретном случае не вижу смысла. В эксперте нет ничего, кроме чтения файла и сравнения свеч в цикле.

Если внимательно посмотреть на лог тестера, можно увидеть, что все происходит на custom символе, так что для полного воспроизведения ситуации

пришлось бы прикладывать целую библиотеку, импортируемые котировки и много чего еще, что не имеет прямого отношения к проблеме.

 

Судя по логам, Вы тестируете неизвестный кастомный символ.

Судя по логам, качество истории этого символа так себе

IR 3 12:20:45.320 Tester quality of analyzed history is 41% 
 

Да, символ кастомный. В качестве истории я уверен, ошибок в свечах нет.

Как бы еще узнать, по каким критериям тестер оценивает качество котировок?

Причем качество, которое показывает тестер, почему-то сильно зависит от количества свечей (длительности периода тестирования).

На тех же котировках, но за больший период, тестер показывает около 80%.

 
Build 5135. Глюк не исправлен.
 
Игорь Евдокимов #:
Build 5135. Глюк не исправлен.

Вы не представили никаких данных для воспроизведения.

На наших данных нет никаких ошибок

 

Ситуацию понял, представляю.

В архиве:

Скрипт для импорта тестовых котировок, файл котировок, тестовый эксперт.

1. Распаковать в папку терминала.

2. Запустить скрипт на любом открытом графике. Он импортирует тестовый символ из файла.

Для чистоты эксперимента скрипт читает уже импортированные котировки с графика и пишет файл верификации.

Можно сравнить с исходным, они одинаковы.

3. Скопировать файл котировок в Files агента тестирования (Tester\Agent-127.0.0.1-3000\MQL5\Files).

При каждой перекомпиляции советника тестер зачем-то грохает всю папку Files. В этом случае 

скопировать файл еще раз.

4. В архиве лежит скриншот с настройками тестера.

5. Запустить в тестере Rates_Test.ex5. Тест выводит в лог 2 десятка строк с ошибками, в конце счетчики.

У меня получаются следующие результаты: 

2025.06.30 20:54:29.139 Core 1 2025.06.28 19:52:59   Ошибок даты 0

2025.06.30 20:54:29.139 Core 1 2025.06.28 19:52:59   Ошибок open 482303

2025.06.30 20:54:29.139 Core 1 2025.06.28 19:52:59   Ошибок close 484135

2025.06.30 20:54:29.139 Core 1 2025.06.28 19:52:59   Ошибок high 487642

2025.06.30 20:54:29.139 Core 1 2025.06.28 19:52:59   Ошибок low 487631

Ошибок даты нет, т.е. сравниваются свечи с одинаковым datetime. Такое впечатление, что где-то пошла рассинхронизация.



Файлы:
Test_Rates.zip  6022 kb
 

Настройки кастомного символа tick_value и tick_size противоречат ценовым данным.

Возможно и другие настройки противоречат, я не смотрел дальше

 

В чем именно заключается противоречие? Цена символа округлена до 5-го знака (_Digits = 5).

Насколько я понимаю, TICK_SIZE это минимально возможное изменение цены, должно быть равно размеру пункта (pipsValue), в данном случае единица 5-го знака после запятой.

TICK_VALUE - используется в случае, если символ котируется не в USD, фактически это TICK_SIZE, пересчитанное в USD.

В данном случае символ котируется в USD, значит TICK_VALUE = TICK_SIZE.

Я не прав?


PS: Да, написал то я все правильно, а потом полез проверять. Действительно, в скрипте был глюк, TICK_VALUE и TICK_SIZE ставились неправильно.

Устранил. Заодно немного доработал тест котировок. Теперь он показывает так:

2025.07.01 19:26:44.090 Core 1 2025.06.28 19:52:59   Начало проверки 2018.02.09 10:00

2025.07.01 19:26:44.090 Core 1 2025.06.28 19:52:59   Первая ошибка open 2020.03.12 10:47 проверено свечей 971

2025.07.01 19:26:44.090 Core 1 2025.06.28 19:52:59   Первая ошибка high 2020.03.12 10:47 проверено свечей 971

2025.07.01 19:26:44.090 Core 1 2025.06.28 19:52:59   Первая ошибка low 2020.03.12 10:49 проверено свечей 973

2025.07.01 19:26:44.090 Core 1 2025.06.28 19:52:59   Первая ошибка close 2024.01.01 00:06 проверено свечей 309411


То есть 971 свеча с начала проверки совпала, а потом пошел рассинхрон.


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


Файлы:
Test_Rates.zip  6024 kb
 

Заодно небольшой глючок в терминале: в окне "Символы" вкладка "Custom" присутствует в 2-х экземплярах. Содержимое одинаково.