Странное неожиданное поведение терминала

 

Вдруг с чего-то  при оптимизации терминал стал не давать переключать вкладки тестера стратегий. Стоит на настройках, при клике другая вкладка промелькивает на долю секунды. При остановке оптимизации можно переключать. В любой другой панели переключать вкладки не мешает.

Перезапуск терминала, откат на предыдущие билды, перезапуск компьютера не помогают. Я в шоке. Знаю, что проблема у меня (этот билд сегодня работал как обычно), но куда копать...

 
Edgar Akhmadeev:
но куда копать...

Работает вроде нормально на семёрке и десятке, а у Вас какая ОС, какой билд укажите.

 
Aleksey Vyazmikin #:

Работает вроде нормально на семёрке и десятке, а у Вас какая ОС, какой билд укажите.

Винда 10, билд MT5 4518, проверял 4516, 4512. Всё работало нормально с начала времён. Вчера пробовал эксперт Validate, но не в нём же дело.

 
Твою ж... Я же говорил, проблема у меня. Подсмотрел в Validate, как читать настройки оптимизации по Ctrl-C, вот они и читались на каждом OnInit, постоянно переключая на вкладку. Перенёс в OnTesterInit.
 

Продолжение следует ((

Значение переменной, записанное в OnTesterInit, не сохраняется, и в OnTester равно нулю.

GlobalVariableGet не работает в OnTester. Чтение файла, предполагаю, тоже. Не хочется проверять, да и дорого получится. Как передать переменную, не представляю. Есть мысли?

 
Edgar Akhmadeev #:

Как передать переменную, не представляю. Есть мысли?

Ничего непонятно. Передавать переменные из Терминала на Агенты можно через создание input-переменных, которые заполняются в OnTesterInit.

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

Библиотеки: MultiTester

fxsaber, 2020.11.26 13:59

В OnTesterInit сделать GetSettings и передать оттуда полученные значения через ParametersSetRange в sinput переменную.

На локальных Агентах эта sinput-переменная будет говорить о том, что за режим.


ЗЫ Режим по реальным тиками можно определить без DLL.

 
fxsaber #:

Ничего непонятно. Передавать переменные из Терминала на Агенты можно через создание input-переменных, которые заполняются в OnTesterInit.

Спасибо! Знал ведь, что input доступны в OnTester, а в input можно записать с помощью  ParameterSetRange, и не связал факты, в голову не пришло.

 

Edgar Akhmadeev #:

Значение переменной, записанное в OnTesterInit, не сохраняется, и в OnTester равно нулю

Посмотрите в учебнике, что такое OnTesterInit(). Главное понять, что ваш советник будет запускаться при оптимизации в двух вариантах:

  • один экземпляр в режиме сбора фреймов на графике терминала, с которого запускается оптимизация. Не в тестере(!), а на графике. Поэтому и сообщения в логе от него надо будет смотреть во вкладке сообщений от экспертов, запускаемых на графике. В этом экземпляре будут срабатывать только OnTesterInit(), OnTesterPass() и OnTesterDeinit(). Все остальные обработчики (OnInit(), OnTick(), OnTester()) в нём вызываться не будут.

  • остальные экземпляры в режиме тестирования и оптимизации на агентах тестирования. В этих экземплярах будут срабатывать только OnInit(), OnTick(), OnTester(),... но не будут срабатывать OnTesterInit(), OnTesterPass() и OnTesterDeinit().
Отсюда и следует, что в каждом экземпляре не может быть вызова и OnTesterInit() и OnTester(). Если вы хотите что-то посчитать в OnTesterInit() и передать это в другие экземпляры, где будет вызываться OnTester(), то сдлеайте это через дополнительную input-переменную, значение которой устанавливайте в OnTesterInit() через ParameterSetRange(). 
 
Yuriy Bykov #:

Посмотрите в учебнике, что такое OnTesterInit(). Главное понять, что ваш советник будет запускаться при оптимизации в двух вариантах:

  • один экземпляр в режиме сбора фреймов на графике терминала, с которого запускается оптимизация. Не в тестере(!), а на графике. Поэтому и сообщения в логе от него надо будет смотреть во вкладке сообщений от экспертов, запускаемых на графике. В этом экземпляре будут срабатывать только OnTesterInit(), OnTesterPass() и OnTesterDeinit(). Все остальные обработчики (OnInit(), OnTick(), OnTester()) в нём вызываться не будут.

  • остальные экземпляры в режиме тестирования и оптимизации на агентах тестирования. В этих экземплярах будут срабатывать только OnInit(), OnTick(), OnTester(),... но не будут срабатывать OnTesterInit(), OnTesterPass() и OnTesterDeinit().
Отсюда и следует, что в каждом экземпляре не может быть вызова и OnTesterInit() и OnTester(). Если вы хотите что-то посчитать в OnTesterInit() и передать это в другие экземпляры, где будет вызываться OnTester(), то сдлеайте это через дополнительную input-переменную, значение которой устанавливайте в OnTesterInit() через ParameterSetRange(). 

Спасибо за объяснение. Учебник как-то выпал из моего внимания.

Я уже всё сделал после совета fxsaber. Всё работает.

 
Я начал писать ответ, но потом отвлекся и дописал его в открытой вкладке позже. А там уже fxsaber ответил до меня, как оказалось. Здорово, что всё получилось!
 
Yuriy Bykov #:
Я начал писать ответ, но потом отвлекся и дописал его в открытой вкладке позже. А там уже fxsaber ответил до меня, как оказалось. Здорово, что всё получилось!

Нет, Ваш ответ коротко описал теорию, в которую я не углублялся. Очень полезно узнать. Спасибо.

fxsaber как всегда коротко дал идею, кто понял суть - разберётся. Благодарность, как за многое предыдущее.