Я обновил библиотеку BestInterval. Внесенные изменения также уточнили, что BestInterval необходимо включать ПОСЛЕ MathtoEA, а не ПЕРЕД ней, как это было раньше. Это привело к тому, что предупреждение стало ошибкой.
Приведенный ниже код компилируется только со строкой, выделенной желтым цветом.
При использовании параметра BestInterval эта желтая строка конфликтует (предупреждение) с патчем #3 и переопределениями для EATOMATH_FULL_CONTROL, как показано на скриншоте ниже.
Я пытался отладить причину, однако, несмотря на все макросы и переопределения, я в растерянности. Можете ли вы привести рабочий пример EAToMath + EATOMATH_FULL_CONTROL + BestInterval?
Я "решил" проблему, отказавшись от использования параметра BestInterval в режиме BESTINTERVAL_ONTESTER и вручную рассчитав оптимальный интервал согласно приведенному ниже коду. Не знаю, почему я не догадался об этом раньше. Это решает проблему с режимами onTick и OnTester и работает так же хорошо.
doubleOnTester ()
{
BESTINTERVAL BestInterval;
VIRTUAL::SelectByHandle(1); // 1 == EAToMath virtualint total = OrdersHistoryTotal(); // MT4Orders history countif (total <= 0)
{
Print("No virtual orders in history");
return0;
}
DEAL dDeals[];
ArrayResize(dDeals, total);
int amount = 0;
for (int i = 0; i < total; i++)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
continue; // failed to select
DEAL deal;
deal.Profit = OrderProfit() + OrderSwap() + OrderCommission();
deal.OpenTime = (datetime)OrderOpenTime();
deal.Lots = OrderLots();
dDeals[amount++] = deal;
}
ArrayResize(dDeals, amount);
BestInterval.Set(dDeals);
Print (BestInterval.ToString());
constint AmountIntervals = 1 ; // How many worst trading intervals to discardfor ( int i = 0 ; i < AmountIntervals; i++)
if (BestInterval.DeleteWorseInterval()) // If something was thrown out Print (BestInterval.ToString()); // Print the received trade data elsebreak ;
}
Из-за этой особенности File Mapping (происходит, когда принудительно останавливается оптимизация в мат. режиме) стал использовать только RAMDrive-режим работы библиотеки.
У меня была та же проблема, что описана здесь: https://www.mql5.com/ru/forum/5905/page12#comment_58468557. Я попробовал ваше альтернативное решение и установил filemap=false. В одиночном режиме все работает как положено, но в режиме оптимизации, похоже, не обрабатываются такты. Я заметил в коде, что функция OnTester_FileOpen не вызывается в режиме оптимизации.
if (MTTESTER::IsMathMode())
{
if (!INFILEMAP || !::MQLInfoInteger(MQL_OPTIMIZATION))
this.OnTester_FileOpen();
elsethis.OnTester_FileMap();
}
Даже если я вручную скачиваю отдельные файлы, может ли быть так, что я работаю со старой версией библиотеки?
Я попробовал ваше альтернативное решение и установил filemap=false. В одиночном режиме все работает как положено, но в режиме оптимизации, похоже, не обрабатываются такты.
Почему так думаете?
Я заметил в коде, что функция OnTester_FileOpen не вызывается в режиме оптимизации.
Вызывается в режиме оптимизации, т.к. первое условие будет true.
При filemap=true полный цикл оптимизации из 10496 проходов занимает примерно 7 часов, и в среднем 25 из 100 проходов имеют положительное значение onTester.
При filemap=false полный цикл оптимизации занимает примерно 2 часа, при этом ни один из 10496 проходов не имеет положительного значения onTester.
В обоих случаях filemap=true и filemap=false работают как ожидалось в режиме одиночного бэктестинга.
В логах при filemap=true в режиме оптимизации ошибок нет.
2025.12.2117:55:32.314 Tester (EURUSD,M1) [2025.12.2117:55:32.314] EAToMath.mqh 1122: EURUSD: math optimization of Experts\Tester.ex5 from2023.12.1200:00:00 to 2025.12.1200:00:00, 2 Years
2025.12.2117:55:32.314 Tester (EURUSD,M1)
2025.12.2117:55:32.314 Tester (EURUSD,M1) FileOpen mode: C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\Common\EAToMath.mqh\Custom\EURUSD\Ticks_0.tsh
После более тщательного изучения библиотеки, ваш ответ и используемая мной библиотека верны. Ошибка, должно быть, в моем собственном коде, но отладка тестового агента кажется сложной задачей.
#define EATOMATH_VIRTUAL_USE // Если используется виртуальное окружение, то повышает производительность, иначе - понижает.#include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283
Вы не тратите ресурсы на проброс тика в виртуалку и получение его оттуда через SymbolInfoTick. Грубо говоря, вы не делаете на каждом тике два присваивания MqlTick и проверку работы с ордерами (хоть их и ноль).
Результаты замеров советника-пустышки в одиночном прогоне.
По реальным тикам и пипсам.
2026.02.1023:59:58 [2026.02.1116:23:06.595] EAToMath.mqh 1352: XAUUSD.pro: 2026.01.01 - 2026.02.11, 1 Month 10 Days, 41068189 ticks.
2026.02.1023:59:58 [2026.02.1116:23:06.595] EAToMath.mqh 1357: TotalTime = 00:00:12.786, Performance = 3.21 Ticks (millions)/sec.2026.02.1023:59:58 ticks: 02026.02.1023:59:582026.02.1023:59:58 [2026.02.1116:23:06.595] EAToMath.mqh 1509: Virtuals: VIRTUAL::Total() = 0 VIRTUAL::GetHandle() = 0 VIRTUAL::GetID() =
final balance 10000000.00 pips
OnTester result 0
XAUUSD.pro,M1: 41068189 ticks, 38588 bars generated. Environment synchronized in0:00:00.143. Test passed in0:00:13.061 (including ticks preprocessing 0:00:04.000).
XAUUSD.pro,M1: total time from login to stop testing 0:00:13.204 (including 0:00:00.143for history data synchronization)
1341 Mb memory used including 22 Mb of history data, 832 Mb of tick data
Советник-пустышка просто прогоняет 41 млн тиков. В торговом режиме это делается в 17 раз медленнее, чем в мат режиме. И потребление памяти в 55 раз меньше в мат. режиме.
Безумная (во всех смыслах) трата ресурсов в торговом режиме.
Я обновил библиотеку BestInterval. Внесенные изменения также уточнили, что BestInterval необходимо включать ПОСЛЕ MathtoEA, а не ПЕРЕД ней, как это было раньше. Это привело к тому, что предупреждение стало ошибкой.
Приведенный ниже код компилируется только со строкой, выделенной желтым цветом.
При использовании параметра BestInterval эта желтая строка конфликтует (предупреждение) с патчем #3 и переопределениями для EATOMATH_FULL_CONTROL, как показано на скриншоте ниже.
Я пытался отладить причину, однако, несмотря на все макросы и переопределения, я в растерянности. Можете ли вы привести рабочий пример EAToMath + EATOMATH_FULL_CONTROL + BestInterval?
EAToMath + EATOMATH_FULL_CONTROL
Are you using this mode so that you can use your OnTesterInit function?
Я "решил" проблему, отказавшись от использования параметра BestInterval в режиме BESTINTERVAL_ONTESTER и вручную рассчитав оптимальный интервал согласно приведенному ниже коду. Не знаю, почему я не догадался об этом раньше. Это решает проблему с режимами onTick и OnTester и работает так же хорошо.
Можете ли вы привести рабочий пример EAToMath + EATOMATH_FULL_CONTROL + BestInterval?
Из-за этой особенности File Mapping (происходит, когда принудительно останавливается оптимизация в мат. режиме) стал использовать только RAMDrive-режим работы библиотеки.
У меня была та же проблема, что описана здесь: https://www.mql5.com/ru/forum/5905/page12#comment_58468557. Я попробовал ваше альтернативное решение и установил filemap=false. В одиночном режиме все работает как положено, но в режиме оптимизации, похоже, не обрабатываются такты. Я заметил в коде, что функция OnTester_FileOpen не вызывается в режиме оптимизации.
Даже если я вручную скачиваю отдельные файлы, может ли быть так, что я работаю со старой версией библиотеки?
Я попробовал ваше альтернативное решение и установил filemap=false. В одиночном режиме все работает как положено, но в режиме оптимизации, похоже, не обрабатываются такты.
Почему так думаете?
Я заметил в коде, что функция OnTester_FileOpen не вызывается в режиме оптимизации.
Вызывается в режиме оптимизации, т.к. первое условие будет true.
Вызывается в режиме оптимизации, т.к. первое условие будет true.
Мой мозг устал. Вы правы. Условие выполнено.
Почему так думаете?
При filemap=true полный цикл оптимизации из 10496 проходов занимает примерно 7 часов, и в среднем 25 из 100 проходов имеют положительное значение onTester.
При filemap=false полный цикл оптимизации занимает примерно 2 часа, при этом ни один из 10496 проходов не имеет положительного значения onTester.
В обоих случаях filemap=true и filemap=false работают как ожидалось в режиме одиночного бэктестинга.
В логах при filemap=true в режиме оптимизации ошибок нет.
После более тщательного изучения библиотеки, ваш ответ и используемая мной библиотека верны. Ошибка, должно быть, в моем собственном коде, но отладка тестового агента кажется сложной задачей.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: Virtual
fxsaber, 2026.02.05 15:14
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MathTicker - генератор тиков в математическом режиме
fxsaber, 2026.02.10 14:40
Пример использования по ссылке выше. В этом режиме отсутствует это.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: MathTicker - генератор тиков в математическом режиме
fxsaber, 2025.11.09 23:06
Вы не тратите ресурсы на проброс тика в виртуалку и получение его оттуда через SymbolInfoTick. Грубо говоря, вы не делаете на каждом тике два присваивания MqlTick и проверку работы с ордерами (хоть их и ноль).
Результаты замеров советника-пустышки в одиночном прогоне.
По реальным тикам и пипсам.
Мат. режим.
Советник-пустышка просто прогоняет 41 млн тиков. В торговом режиме это делается в 17 раз медленнее, чем в мат режиме. И потребление памяти в 55 раз меньше в мат. режиме.
Безумная (во всех смыслах) трата ресурсов в торговом режиме.