Остановить оптимизацию при достижении необходимого показателя или времени.

 

Всех приветствую. 

Такая задача - запускаем тестирование эксперта в тестере стратегий, хочется, чтобы он прекращал оптимизацию либо при достижении определённого результат OnTester(), либо при слишком долгой оптимизации. Как бы это сделать? У кого какой опыт и предложения? 

Я начал с ограничения по времени. 

В функции OnTesterInit() запрашиваю время сервера (не TimeCurrent(), текущее время на компьютере через создание временного файла).

Создаю глобальную переменную с этим временем. Сразу вызываю функцию GlobalVariablesFlush(), чтобы записать глобальную переменную на диск. 

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

Однако, эксперт во время прохода оптимизации почему-то не находит глобальную переменную (хотя, по F3 глобальная переменная есть). Функция GlobalVariablesTotal() тоже почему-то возвращает NULL (стало быть, глобальные переменные в проход тестера не передаются).  Я что-то делаю не так? 

А какие предложение у форумчан?

 
Georgiy Merts:

начал с ограничения по времени.

Делал бы через MTTester.mqh.
 
fxsaber #:
Делал бы через MTTester.mqh.

Сейчас погляжу, что там.

Нашёл. Углубился в исследование. 

:))))

 
Georgiy Merts:

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

Однако, эксперт во время прохода оптимизации почему-то не находит глобальную переменную (хотя, по F3 глобальная переменная есть). Функция GlobalVariablesTotal() тоже почему-то возвращает NULL (стало быть, глобальные переменные в проход тестера не передаются).  Я что-то делаю не так? 

А какие предложение у форумчан?

Глобальные переменные в каждом процессе свои: в терминале - свои, на каждом агенте - свои. Обмениваться инфой можно через локальные файлы в общей папке, если агенты локальные.

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

 
Stanislav Korotky #:

Глобальные переменные в каждом процессе свои: в терминале - свои, на каждом агенте - свои. Обмениваться инфой можно через локальные файлы в общей папке, если агенты локальные.

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

Даже Глобальные Переменные Терминала? 

Странно... 

Ну... Попробую и через файлы.

 
Georgiy Merts #:

Даже Глобальные Переменные Терминала? 

Странно... 

Ну... Попробую и через файлы.

Глобальные терминала - внутри терминала, само название намекает.

Ваша конкретная задача имеет относительно простое решение: в начале оптимизации, внутри OnTesterInit, можно использовать ParameterSetRange, чтобы указать физическое время старта в некоторой вспомогательной input-переменной, и от неё отсчитывать лимит времени на каждом агенте.

 
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

input int inMaxTesterTime = 10;

void OnStart()
{    
  if (MTTESTER::ClickStart()) // Запустили.
  {
    const datetime StartTime = TimeLocal();
    
    while (!IsStopped() && !MTTESTER::IsReady()) // Пока Тестер работает
    {
      Sleep(1000);
      
      if ((TimeLocal() - StartTime >= inMaxTesterTime)) // проверяем длительность.
      {
        MTTESTER::ClickStart(false); // Закончили.
        
        break;
      }
    }
  }
}
 
fxsaber #:

Разве TimeLocal() в проходе тестера возваращает время на компьютере? Мне казалось, что эта функция возвращает время в среде самого тестируемого эксперта. 

Как мне кажется, такая функция прервёт работу эксперта в одиночном проходе. 

А требуется прервать процесс оптимизации при достижении условия (либо максимального времени, либо необходимого значения OnTester()

Я не прав? 

 
Georgiy Merts:

Всех приветствую. 

Такая задача - запускаем тестирование эксперта в тестере стратегий, хочется, чтобы он прекращал оптимизацию либо при достижении определённого результат OnTester(), либо при слишком долгой оптимизации. Как бы это сделать? У кого какой опыт и предложения? 

Я начал с ограничения по времени. 

В функции OnTesterInit() запрашиваю время сервера (не TimeCurrent(), текущее время на компьютере через создание временного файла).

Создаю глобальную переменную с этим временем. Сразу вызываю функцию GlobalVariablesFlush(), чтобы записать глобальную переменную на диск. 

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

Однако, эксперт во время прохода оптимизации почему-то не находит глобальную переменную (хотя, по F3 глобальная переменная есть). Функция GlobalVariablesTotal() тоже почему-то возвращает NULL (стало быть, глобальные переменные в проход тестера не передаются).  Я что-то делаю не так? 

А какие предложение у форумчан?

Подозрения что не проверяете успех "создаю глоб.переменную" и видимо в OnTesterInit сие не сработает.

 
Stanislav Korotky #:

Глобальные терминала - внутри терминала, само название намекает.

Ваша конкретная задача имеет относительно простое решение: в начале оптимизации, внутри OnTesterInit, можно использовать ParameterSetRange, чтобы указать физическое время старта в некоторой вспомогательной input-переменной, и от неё отсчитывать лимит времени на каждом агенте.

Я попробую. 

Время начала тестирования определять через время создания файла, и его передавать во вспомогательной переменной каждому агенту, а внутри агента также запрашивать время через создание файла, и сравнивать его со временем старта. Если прошло слишком много - в Ините возвращаем AGENT_NOT_SUITABLE.

 
Maxim Kuznetsov #:

Подозрения что не проверяете успех "создаю глоб.переменную" и видимо в OnTesterInit сие не сработает.

В OnTesterInit() глобальная переменная создаётся. И по F3 она отображается правильно. 

А вот в Агенты тестирования эта глобальная переменная не попадает. 

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

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