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

 
Slava:

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

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

Slava:

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

Не совсем понял, что нужно сделать - добавить 

if(GetLastError()>0) {Print("Error  (",GetLastError(),") ");}

а делить на ноль неважно что, типа что б остановить оптимизацию?

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

Slava:

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

Тут не согласен - дойди же может один фрейм только, а их 1000.

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

 
У Вас дошло некратное 1000 количество фреймов. Если Вы абсолютно уверены что каждый OnTester посылает ровно 1000 фреймов, то какие-то из фреймов не добавляются. Не добавиться они могли только по нехватке ресурсов мало памяти и/или мало дискового пространства. И это не дело случая, а дело бедного агента, которого необходимо вычислить
 
Aleksey Vyazmikin:

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

Не совсем понял, что нужно сделать - добавить 

а делить на ноль неважно что, типа что б остановить оптимизацию?

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

Тут не согласен - дойди же может один фрейм только, а их 1000.

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

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

Деление на 0 четко покажет проблемного агента

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

 
Slava:
У Вас дошло некратное 1000 количество фреймов. Если Вы абсолютно уверены что каждый OnTester посылает ровно 1000 фреймов, то какие-то из фреймов не добавляются. Не добавиться они могли только по нехватке ресурсов мало памяти и/или мало дискового пространства. И это не дело случая, а дело бедного агента, которого необходимо вычислить

Там агент занимает в памяти порядка 60 мегабайт, место на винчестере есть везде. К тому же, если запускать оптимизацию разбивая самому её на разные компьютеры, без удаленных агентов, то всё работает и агенты в 99,99% не теряются (1 раз была ситуация потери). Исходя из этого, я полагаю, что дело именно в вопросе передачи данных от удаленных агентов.


Slava:

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

Деление на 0 четко покажет проблемного агента

Так не совсем понял, у агента генерируется ошибка? Если это так, то тогда бы другие агенты с этого ПК не могли работать же и отдавать фреймы - не похоже на это.

По поводу кода, значит мне его надо добавить сюда?

FrameAdd(Test_P,1,0,stat_values);
if(GetLastError()>0) 
        {
         Print("Error  ",GetLastError(),");
         double A=A/0;
        }
Slava:

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

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

 

В визуализаторе при загрузке мультитаймфреймного эксперта шаблон (с имерем эксперта) на основной таймфрейм грузится нормально, а на остальные таймфреймы при использовании  Charts -> Templates не грузится. Установка любых других шаблонов так же не проходит. Ошибок в логах и нет.

Наблюдается это с билда 2055 (Текущий установленный 2085). Уточните пожалуйтса это баг или какая-то новая функциональность.  

Заранее благодарен. 

 
Aleksey Vyazmikin:

Там агент занимает в памяти порядка 60 мегабайт, место на винчестере есть везде. К тому же, если запускать оптимизацию разбивая самому её на разные компьютеры, без удаленных агентов, то всё работает и агенты в 99,99% не теряются (1 раз была ситуация потери). Исходя из этого, я полагаю, что дело именно в вопросе передачи данных от удаленных агентов.


Так не совсем понял, у агента генерируется ошибка? Если это так, то тогда бы другие агенты с этого ПК не могли работать же и отдавать фреймы - не похоже на это.

По поводу кода, значит мне его надо добавить сюда?

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

Проверять ошибку, если FrameAdd вернёт false

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

 
Разбирательство упрощает тот факт, что вы посылаете по 1000 фреймов. Если теряется некратное 1000 количество, то проблема не в связи, а в добавлении фреймов
 
Slava:

Проверять ошибку, если FrameAdd вернёт false

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

Внес такую правку в код - правильно?

if(FrameAdd(Test_P,1,0,stat_values)==false)
{
Print("Error  ",GetLastError());
         double A=0.0;
         double B=1.0/A;

}


Произвел оптимизацию с внесенными правками в код, получил такой результат

2019.06.18 01:22:18.163 Tester  optimization finished, total passes 623 (successful 510 passes unique, 113 passes duplicated)
2019.06.18 01:22:18.174 Statistics      optimization done in 6 hours 10 minutes 25 seconds
2019.06.18 01:22:18.174 Statistics      shortest pass 0:03:11.597, longest pass 0:14:00.439, average pass 0:10:11.772
2019.06.18 01:22:18.174 Statistics      506636 frames (199.06 Mb total, 412 bytes per frame) received
2019.06.18 01:22:18.174 Statistics      local 213 tasks (41%), remote 410 tasks (80%), cloud 0 tasks (0%)
2019.06.18 01:22:18.265 Tester  510 new records saved to cache file 'tester\cache\Tree_Brut_v_02_03_01p4.30.620BCF703387B96FF42E76864ACA62EB.opt'

Вызывает удивление число дубликатов - 113, как я понимаю - откуда их так много может быть?

Что и где я теперь должен искать (в логах каждого агента, как я понимаю)?

В логе одного из агентов говорится, что выполнено 9 из 10 проходов - почему?

FS      0       01:22:17.120    25.42.57.239    prepare for shutdown
JK      0       01:22:27.371    Tester  tester agent shutdown started
RR      0       01:22:27.371    Tester  shutdown tester machine
PQ      2       01:22:30.585    Tester  OnTester canceled
JK      0       01:22:30.585    Tester  9 of 10 passes processed (9 successfully finished) in 1:45:22.284
OR      0       01:22:30.586            optimize Experts\Tree_Brut_v_02_03_01p4.ex5 on GAZR Splice,H1 thread finished
GN      0       01:22:30.656    Tester  expert execution canceled
CG      0       01:22:30.656    Tester  tester process stopped
LN      0       01:22:30.656    Tester  tester agent shutdown finished
Содержимого в логах со словом "Error" не найдено. Я думаю, что в логах не хватает вообще информация о числе фреймов и работе с ними - приеме/передаче.
 
Aleksey Vyazmikin:

Внес такую правку в код - правильно?


Произвел оптимизацию с внесенными правками в код, получил такой результат

Вызывает удивление число дубликатов - 113, как я понимаю - откуда их так много может быть?

Что и где я теперь должен искать (в логах каждого агента, как я понимаю)?

В логе одного из агентов говорится, что выполнено 9 из 10 проходов - почему?

Содержимого в логах со словом "Error" не найдено. Я думаю, что в логах не хватает вообще информация о числе фреймов и работе с ними - приеме/передаче.

Дубликаты возникают когда долгое время не изменяется счётчик выполненных проходов. "Долгое время" рассчитывается на основе среднего времени выполнения одного прохода

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

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

Вы уверены, что каждый проход посылает ровно 1000 фреймов? Это можно проверить через кастомный результат. В OnTester возвращайте результат примерно таким способом

void OnTester()
  {
...
   double ret=ExtTotalFrames*1000+ExtSuccessFrames;
   return(ret);
  }

где ExtTotalFrames - общее количество вызванных FrameAdd

ExtSuccessFrames - количество FrameAdd выполненных без ошибок

PS Бесполезно вызывать Print на оптимизации. При оптимизации принт работает только в OnInit, дальше эта возможность перекрывается
 
Slava:

Дубликаты возникают когда долгое время не изменяется счётчик выполненных проходов. "Долгое время" рассчитывается на основе среднего времени выполнения одного прохода

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

Может на этом этапе возникает какой либо сбой? Просто если оптимизация на локальном компьютере, где все проходы занимают примерно одинаковое время, такого не происходит и фреймы как раз не теряются.

Slava:

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

Что это даст?

Slava:

Вы уверены, что каждый проход посылает ровно 1000 фреймов? Это можно проверить через кастомный результат. В OnTester возвращайте результат примерно таким способом

где ExtTotalFrames - общее количество вызванных FrameAdd

ExtSuccessFrames - количество FrameAdd выполненных без ошибок

Да, каждый проход посылает ровно 1000 фреймов, это исходит из настроек перебора.

sinput int StartCalc_Test_P=999;//Test_P - начало расчета
sinput int Total_Test_P=51368;//Test_P - окончание расчета
sinput int K_Test_P=1000;//Число проходов на 1 агента
input int N_Test_P=0;//Номер задания
int Start_Test_P=0;
int Stop_Test_P=0;

int OnInit()
  {
   Start_Test_P=StartCalc_Test_P+N_Test_P*K_Test_P;
   Stop_Test_P=Start_Test_P+K_Test_P;
   if(Stop_Test_P>(Total_Test_P+N_Test_P*K_Test_P+K_Test_P))return(INIT_PARAMETERS_INCORRECT);
   return(INIT_SUCCEEDED);
  }

По поводу OnTester - у меня перебор как раз в нём и происходит - может в этом дело?

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

А вот как интегрировать ваш код - не понял, напишите пожалуйста конкретно какими функциями получить ExtTotalFrames и ExtSuccessFrames.

Ну и если логически рассуждать, то ошибка не может быть в моем коде, так как локальная оптимизация не теряет фреймов.

Что будет в каждом случае, если в момент передачи фрейма или оптимизации происходит обрыв соединения с агентом?

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