Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 90

 
Aleksey Vyazmikin:

Билд 1950.

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

В режиме "Только цены открытия" потери начались только на проходе в районе 280000.


Думал у меня в коде беда, но нет, всё вырезал, вот код для воспроизведения.

Или нужно что-то дополнительно прописывать?

Из наблюдений, чем быстрей выполняется код, тем больше потерь...

три брут.. мысли читаете ) но сегодня другой брют


 
Aleksey Vyazmikin :

Билд 1950.

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

В режиме "Только цены открытия" потери начались только на проходе в районе 280000.


Думал у меня в коде беда, но нет, всё вырезал, вот код для воспроизведения.

Или нужно что-то дополнительно прописывать?

Из наблюдений, чем быстрей выполняется код, тем больше потерь...

С OnTesterPass() вы всегда можете «потерять» кадры, и чем быстрее компьютер, тем больше вы теряете.

Необходимо помнить, что фреймы оптимизации, отсылаемые агентами тестирования с помощью функции FrameAdd(), могут приходить пачками и для их доставки требуется время. Поэтому не все фреймы, а соответственно и события TesterPass, могут до окончания оптимизации поступить и быть обработанными в OnTesterPass(). Поэтому для гарантированного получения всех запоздавших фреймов в OnTesterDeinit() необходимо поместить блок кода с использованием функции FrameNext().

Используйте FrameFirst() / FrameNext() в OnTesterDeinit(), вы получите все кадры

 
Maxim Dmitrievsky:

три брут.. мысли читаете ) но сегодня другой брют

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

Но, расслабляться и отвлекаться от работы надо так или иначе...

 
while (FrameNext(...))
 
Alain Verleyen:

С OnTesterPass() вы всегда можете «потерять» кадры, и чем быстрее компьютер, тем больше вы теряете.

Используйте FrameFirst() / FrameNext() в OnTesterDeinit(), вы получите все кадры


FrameNext()  я и так использую, а OnTesterDeinit() из справки говорится об исполнении после завершения оптимизации - так и работает.

"

OnTesterDeinit

Функция OnTesterDeinit() является обработчиком события TesterDeinit, которое автоматически генерируется по окончании оптимизации эксперта в тестере стратегий. Функция должна быть определена с типом void, параметров не имеет:

void OnTesterDeinit();

Эксперт с обработчиком TesterDeinit() автоматически загружается на график при запуске оптимизации и получает событие TesterDeinit после её завершения. Функция предназначена для финальной обработки всех результатов оптимизации.

"

Поэтому, прошу Вас показать на примере кода, как я должен правильно работать с фреймами.

 
fxsaber:

Спасибо, но не понял.

В коде есть переменная Calc_Prohod - которая считает число фреймов, а фактически считает заходы в void OnTesterPass(), и их число меньше чем проходов.

Так 

while(   FrameNext(pass,name,id,val,stat_values))

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

Спасибо!
 
Aleksey Vyazmikin:


FrameNext()  я и так использую, а OnTesterDeinit() из справки говорится об исполнении после завершения оптимизации - так и работает.

"

OnTesterDeinit

Функция OnTesterDeinit() является обработчиком события TesterDeinit, которое автоматически генерируется по окончании оптимизации эксперта в тестере стратегий. Функция должна быть определена с типом void, параметров не имеет:

void OnTesterDeinit();

Эксперт с обработчиком TesterDeinit() автоматически загружается на график при запуске оптимизации и получает событие TesterDeinit после её завершения. Функция предназначена для финальной обработки всех результатов оптимизации.

"

Поэтому, прошу Вас показать на примере кода, как я должен правильно работать с фреймами.

//+------------------------------------------------------------------+
//| TesterDeinit function                                            |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {
   if(!FrameFirst()) return;

   ulong pass;
   string name;
   long id;
   double value;

   while(FrameNext(pass,name,id,value,stat_values))
     {
      ++Calc_Prohod;
      //... custom code
     }


   Print("Calc_Prohod=",Calc_Prohod);

  }
 
Alain Verleyen:

Спасибо за пример!

Жаль, что в документации нет примера такой реализации...

 
Aleksey Vyazmikin:

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

Но, расслабляться и отвлекаться от работы надо так или иначе...

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

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

 
Maxim Dmitrievsky:

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

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

Так у меня листья в коде, а в файлах рассчитанные предикторы и финансовый результат на каждый вход, советник просто быстро может перебрать (за 3 часа) 280 000 проходов с проверкой по отдельности на каждом годе с 2014 по 2018 включительно и с разбивкой на типы торговой операции - покупка/продажа. А фреймы передают много разных характеристик баланса и листьев, как стандартные, так и собственного изобретения. Дальше отберу устойчивые листья (они были получены на 2016-2017 годах), и уже с ними надо заниматься комбинациями. И тут можно и ещё раз прогнать для каждого листа оптимизация и использовать листья в качестве фильтров - некий бустинг прям таки. А потом надо комбинировать, и тут мне хочется иметь независимые листья, т.е. что б они как можно реже вместе выражали свое мнение по одному вопросу, а для этого надо как то их сопоставить поудачней, как бы на общем поле что бы добавления нового листа улучшало результат и занимало те участки, на которых нет решений у модели.

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