Бета-версия платформы MetaTrader 5 build 2055: Интеграция с Python и массовые улучшения в тестере стратегий - страница 23

 

В дополнение к распределению задач: 

Не редко бывает, что, например, из четырёх агентов три уже закончили, а у одного прогресс 85%. И он в одиночку заканчивает, а мог бы поделиться с тремя другими.

 
Фреймы по прежнему теряются - крайне разочарован, так-как ожидал улучшения в данном вопросе в деле, а не на словах.
 
Aleksey Vyazmikin:
Фреймы по прежнему теряются - крайне разочарован, так-как ожидал улучшения в данном вопросе в деле, а не на словах.

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

Как Вы обрабатывете фреймы? Покажите код отсылки фреймов, а также код приёма. Покажите Ваши функции OnTesterInit, OnTesterPass и OnTesterDeinit

Хоть какие-то доказательства Ваших слов приведите.

 
Slava:

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

Как Вы обрабатывете фреймы? Покажите код отсылки фреймов, а также код приёма. Покажите Ваши функции OnTesterInit, OnTesterPass и OnTesterDeinit

Хоть какие-то доказательства Ваших слов приведите.

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

double OnTester()
  {
//---
   for(int Test_P=Start_Test_P;Test_P<Stop_Test_P;Test_P++)
     {
      OnTesterPassf(Test_P);
     }
   return(0);
  }

void OnTesterPassf(int Test_P)
  {
//Вычисления переменных опущено
//--- Создадим фрейм
   stat_values[0]=Period_Calc;
   stat_values[s()]=Type_Poisk_Tree;
   stat_values[s()]=Test_P;
   stat_values[s()]=Proc_Vhodov;
   stat_values[s()]=Proc_True;
   stat_values[s()]=Proc_False;
   stat_values[s()]=Final_Balans;
   stat_values[s()]=DD_Balans;
   stat_values[s()]=DD_Balans_Proc;
   stat_values[s()]=DD_Balans_Proc_DMM;
   stat_values[s()]=StDV_Balans;
   stat_values[s()]=StDV_Korrekt_Balans;
   stat_values[s()]=StDV_K_Balans;
   stat_values[s()]=StDV_K_Korrekt_Balans;
   stat_values[s()]=Proc_Max_Balans;
   stat_values[s()]=Proc_Min_Balans;
   stat_values[s()]=True_Podryad_Balans;
   stat_values[s()]=Error_Podryad_Balans;
   stat_values[s()]=ProfitFaktor_Balans;
   stat_values[s()]=RecoveryFaktor_Balans;
   stat_values[s()]=Pribolnost_Balans;
   stat_values[s()]=Test_L;
   NomerStolbca=0;

   FrameAdd(Test_P,1,0,stat_values);
}

Обработка полученных фреймов

void OnTesterDeinit()
  {
   if(!FrameFirst()) return;

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

   while(FrameNext(pass,name,id,value,stat_values))
     {
      ++Calc_Prohod;
      ENUM_Period_NAME              Period_Calc_w=ENUM_Period_NAME(stat_values[0]);
      ENUM_Type_Poisk_Tree_NAME Type_Poisk_Tree_w=ENUM_Type_Poisk_Tree_NAME(stat_values[1]);
      //..//
     }
   }

Тестирование идет в режиме "Математические вычисления".

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

Добавлено: Хочу уточнить, что компиляция происходила на билде 2007, а оптимизация уже на новом билде - может это критично?

 

В логах тестера. Вот пример

11:20:18.691    Tester  optimization finished, total passes 1002 (successful 1001 passes)
11:20:18.701    Statistics      optimization done in 0 minutes 25 seconds
11:20:18.701    Statistics      shortest pass 0:00:01.857, longest pass 0:00:12.700, average pass 0:00:05.174
11:20:18.701    Statistics      3003 frames (163.70 Mb total, 57160 bytes per frame) received
11:20:18.701    Statistics      local 2 tasks (0%), remote 0 tasks (0%), cloud 1000 tasks (99%)
11:20:18.701    MQL5 Cloud Europe       1 hour and 25 minutes of cloud time spent on successful calculation of 998 tasks, 999 cloud agents used
11:20:18.701    MQL5 Cloud USA  7.159 sec of cloud time spent on successful calculation of 1 tasks, 1 cloud agents used
11:20:18.724    Tester  1001 new records saved to cache file 'tester\cache\Moving_Average_Frame.EURSEK.H1.20190215.20190610.00.9A4BE19E38D8F14F7D6382B8309A8149.opt'

1001 проход. Каждый послал по 3 разных фрейма. Все 3003 фрейма пришли

Если советник посылает несколько фреймов, то эти фреймы должны помечаться разными идентификаторами. Так как фрейм с одним и тем же номером прохода и идентификатором считается дублем. Дубли, особенно в математике и в клауде - неизбежны, поэтому такая проверка.

 
Slava:

В логах тестера. Вот пример

1001 проход. Каждый послал по 3 разных фрейма. Все 3003 фрейма пришли

Если советник посылает несколько фреймов, то эти фреймы должны помечаться разными идентификаторами. Так как фрейм с одним и тем же номером прохода и идентификатором считается дублем. Дубли, особенно в математике и в клауде - неизбежны, поэтому такая проверка.

Вот лог

IN      0       20:07:34.301    Tester  optimization finished, total passes 3315
OD      0       20:07:34.311    Statistics      optimization done in 33 hours 50 minutes 50 seconds
LR      0       20:07:34.311    Statistics      shortest pass 0:02:28.847, longest pass 0:18:47.905, average pass 0:10:10.012
KR      0       20:07:34.311    Statistics      3307122 frames (1299.41 Mb total, 412 bytes per frame) received
CI      0       20:07:34.311    Statistics      local 1124 tasks (33%), remote 2191 tasks (66%), cloud 0 tasks (0%)
MK      0       20:07:34.395    Tester  3315 new records saved to cache file 'tester\cache\Tree_Brut_v_02_03_01p4.30.B971B4DE2FBA317F615BD07A80046D4D.opt'

В одном проходе, должно быть 1000 фреймов, получается недополучили 7878 фреймов (3315*1000-3307122).

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

 
Aleksey Vyazmikin:

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

Сначала попытаемся воспроизвести собственными силами.

Я неправильно сказал про дубли. Одна посылка с тысячей фреймов обрабатывается как есть, без анализа идентификатора. Следующая посылка с таким же номером прохода будет считаться дубликатной, вся.

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

 
Slava:

Сначала попытаемся воспроизвести собственными силами.

Я неправильно сказал про дубли. Одна посылка с тысячей фреймов обрабатывается как есть, без анализа идентификатора. Следующая посылка с таким же номером прохода будет считаться дубликатной, вся.

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

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

Сейчас закончится оптимизация, где я не буду вмешиваться. Отпишусь о результатах.
 
Aleksey Vyazmikin:

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

Всё плохо.

2019.06.16 11:48:55.228 Tester  optimization finished, total passes 1338 (successful 1275 passes unique, 63 passes duplicated)
2019.06.16 11:48:55.238 Statistics      optimization done in 11 hours 51 minutes 58 seconds
2019.06.16 11:48:55.238 Statistics      shortest pass 0:03:39.242, longest pass 0:14:26.610, average pass 0:10:23.337
2019.06.16 11:48:55.238 Statistics      1269960 frames (498.98 Mb total, 412 bytes per frame) received
2019.06.16 11:48:55.238 Statistics      local 421 tasks (33%), remote 917 tasks (71%), cloud 0 tasks (0%)
2019.06.16 11:48:55.318 Tester  1275 new records saved to cache file 'tester\cache\Tree_Brut_v_02_03_01p4.30.C4394A2059D913B1C146D007BACF99F0.opt'
 
Aleksey Vyazmikin:

Всё плохо.

Все Ваши агенты под вашим контролем?

Попробуйте проанализировать код ошибки после FrameAdd. Если есть ошибка, то организовать деление на 0, чтобы спровоцировать критическую ошибку. Чтобы узнать какой из агентов виноват.

Посылка фреймов производится раньше посылки результата в том же потоке. Если результат дошёл, то фрейм тем более дойдёт. Если только он был правильно сохранен функцией FrameAdd

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