Ошибки, баги, вопросы - страница 2859

 
fxsaber:

В общем, какие мысли по возможной реализации?

реализаций можно много придумать

но все равно сведется к задаче обмена данными между ЕА

самое простое - в начале каждого советника в OnTick() прописать проверку разрешения на инициализацию и саму инициализацию выполнять там же OnTick() - это позволит не восстанавливать чарты и потом запускать на них ЕА , да и сохранение перед закрытием ЕА возможно будет выполнить в OnDeinit()

ну а кто будет управлять этим зоопарком, не принципиально - или главный ЕА или сервис

 

В логе тестера

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

Что это значит?

 
Aleksey Vyazmikin:

В логе тестера

Что это значит?

Это значит, что при получении очередного значения m1 ohlc (или состояния бара при тестировании по ценам открытия) в поле time оказался 0

undefined function означает, что проблема произошла вне предопределённых функций (OnTick, OnTimer etc), то есть в основном цикле тестера

 
Slava:

Это значит, что при получении очередного значения m1 ohlc (или состояния бара при тестировании по ценам открытия) в поле time оказался 0

undefined function означает, что проблема произошла вне предопределённых функций (OnTick, OnTimer etc), то есть в основном цикле тестера

Весь день всё работало нормально, а потом это началось. Что я могу сделать, как пользователь?

 
Slava:

Это значит, что при получении очередного значения m1 ohlc (или состояния бара при тестировании по ценам открытия) в поле time оказался 0

undefined function означает, что проблема произошла вне предопределённых функций (OnTick, OnTimer etc), то есть в основном цикле тестера

Я не понимаю, у меня в коде ошибка или это ошибка в терминале? Стер всю историю - не помогло.

Добавлено:

Нашёл у себя функцию, отключение которой позволяет избегать ошибки, но в другом советнике эта функция работает корректно! Как так? Могу сбросить в личку.

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

На разных терминалах ошибка подтверждается.

Запустил по тикам - ошибки нет...

Но, странность в логе:

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

По тикам если смотреть инструмент, то первый тик был ровно в 10:00, да и торговая сессия ещё закрыта в это время. Это в визуальном режиме, без галки первый принт приходит в 10 часов.

 
Igor Makanu:

самое простое - в начале каждого советника в OnTick() прописать проверку разрешения на инициализацию

Это и есть основная загвоздка задачи.
 
fxsaber:
Это и есть основная загвоздка задачи.

Попробуйте обратить внимание на ID графиков и по старшинству запускать. Но это не отменяет взаимодействие советников. Или сделать файл или может быть база SQLite с ID графиков в последовательности запуска.

Что-то типа, при первой инициализации, если в списке отсутствует Chart_ID() то он вносится в список. Если закрывается не по причине закрытия терминала, то из списка удаляется. Таким образом можно будет настроить взаимодействие советников.

 
fxsaber:
Это и есть основная загвоздка задачи.

набросал как вижу... создал 2 ЕА с таким кодом:

#define PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

и один управляющий ЕА, который работает в таймере ( 5 сек )

#define PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


проверил, все работает, единственное или не разобрался или не получилось через GlobalVariableSetOnCondition() сделать запись в глобальные переменные

 
fxsaber:
Это и есть основная загвоздка задачи.

GlobalVariableSetOnCondition — все, что нужно для решения задачи.

Работа разрешена только тогда, когда GlobalVariableSetOnCondition вернул true.
После успешной инициализации и освобождения ресурсов возвращаем гл. переменную в исходное состояние, и другой советник стартует.

В ДеИните — безусловное удаление переменной, чтобы не нарваться на старт терминала без советников вообще (если предыдущая загрузка завершилась некорректно).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Спасибо за рекомендации. Посмотрю в сторону GlobalVariableSetOnCondition.