Скачать MetaTrader 5

Периодичность обработки событий

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Oreshkin
7211
Alexey Oreshkin  

Друзья, подскажите кто в курсе как обрабатываются события в эксперте.

К примеру я использую 2 события - онтик и онтаймер. В процессе выполения онтик сработал онтаймер, но событие онтик ещё не закончилось. Что делает эксперт? Он хранит все события в каком либо месте(стеке) или же игнорирует все другие события, если текущее ещё в процессе выполнения? Если посмотреть глобально то я подозреваю что существует следующие варианта их обработки:

1 - все события выполняются последовательно, в порядке их очередности. При наложении их друг на друга, последнее просто игнорируется, так как выполняется предыдущее.
2 - все события выполняются последовательно, но при наложении ничего не отбрасывается, а складируется в некий стек и выполняется тогда когда закончится выполнение текущего события (возможно переполнение стека?)
3 - события могут выполнятся параллельно, но тогда возникает вопрос их синхронизации
4 - неведомый мне вариант 

Сейчас же у меня творится вообще что то непонятное: Приходит событие онтик, в конце которого у меня стоит Comment, с выводом пары переменных на экран. Онтик считается долго, порядка 30 секунд, но уже секунд через 10 срабатывает Comment() c нулевыми значениями переменных, и только потом, ещё секунд через 10 появляются значения переменных. Хотя по логике Comment должен появится в конце события с уже рассчитанными значениями. И всё это в одном событии. Онтаймер пока отключил, боюсь даже включать его.

Yury Reshetov
13493
Yury Reshetov  
Alexey Oreshkin:

Сейчас же у меня творится вообще что то непонятное: Приходит событие онтик, в конце которого у меня стоит Comment, с выводом пары переменных на экран. Онтик считается долго, порядка 30 секунд, но уже секунд через 10 срабатывает Comment() c нулевыми значениями переменных, и только потом, ещё секунд через 10 появляются значения переменных. Хотя по логике Comment должен появится в конце события с уже рассчитанными значениями. И всё это в одном событии. Онтаймер пока отключил, боюсь даже включать его.

Это вам не алгоритмический подход, который изжил себя ещё в 70-е годы прошлого столетия. Нынче всё хозяйство с выводом информации буферировано и распределено по разным потокам, да ещё и с разными приоритетами, а посему синхронность не всегда достижима. Поэтому не стоит удивляться, что порядок, заданный в алгоритме не обязательно будет соблюдаться при выводе информации.
Alexey Oreshkin
7211
Alexey Oreshkin  
Yury Reshetov:
Это вам не алгоритмический подход, который изжил себя ещё в 70-е годы прошлого столетия. Нынче всё хозяйство с выводом информации буферировано и распределено по разным потокам, да ещё и с разными приоритетами, а посему синхронность не всегда достижима. Поэтому не стоит удивляться, что порядок, заданный в алгоритме не обязательно будет соблюдаться при выводе информации.
Надо же, любопытно как. Ну это ладно, буду знать. Работе не мешает просто интересно. А с первым вопросом как, что с периодичностью обработки разных событий?
Ihor Herasko
15199
Ihor Herasko  
Alexey Oreshkin:

Друзья, подскажите кто в курсе как обрабатываются события в эксперте.

К примеру я использую 2 события - онтик и онтаймер. В процессе выполения онтик сработал онтаймер, но событие онтик ещё не закончилось. Что делает эксперт?

Если речь идет об одном эксперте, то это, по идее, должен быть один поток. Поэтому обрабатывать события он должен последовательно. То есть в этом случае обработчик OnTimer не будет выполнен до окончания обработки OnTick. События будут обрабатываться в порядке поступления. Единственное, о чем постоянно говорят разработчики, так это то, что при обработке одного OnTick до момента его окончания все последующие OnTick игнорируются.

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

Alexey Oreshkin
7211
Alexey Oreshkin  

да, я говорю о событиях внутри одного советника. Ок. Благодарю. Я так и думал, но мало ли, иногда лучше спросить чем промолчать )

И если я дальше мыслю также правильно то у нас есть всего две возможности самостоятельно распараллелить вычисления: 1 - закинуть робота в длл, использую мкл просто как поставщик тиков и уже в VS всё сделать, либо использовать OpenCL ?

Alexander Puzanov
34933
Alexander Puzanov  
Вообще-то, хотелось бы заслушать начальника транспортного цеха. Чтобы было кого .. на кого ссылаццо в смысле
Alexey Oreshkin
7211
Alexey Oreshkin  
События выполняются последовательно. Это легко можно проверить самому вот таким кодом: 
int OnInit()
  {
   EventSetTimer(1);      
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
      Print("Начало");
      int tm=TimeCurrent();
      while(true) if (TimeCurrent()-tm>=3) break;         
      Print("Конец. Прошло не менее 3 секунд");
      ExpertRemove();
  }

void OnTimer()
  {
      Print("Таймер");
  }
Alexander Puzanov
34933
Alexander Puzanov  
А в таймер аналогичный тормоз вставить не пробовали? Т.е. у них одинаковый приоритет исполнения?
Alexey Oreshkin
7211
Alexey Oreshkin  
Alexander Puzanov:
А в таймер аналогичный тормоз вставить не пробовали? Т.е. у них одинаковый приоритет исполнения?

Грамотная мысль. Как то сам сразу не догадался.

int OnInit()
  {
   EventSetTimer(1);      
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
      Print("Тик");
  }

void OnTimer()
  {
      Print("Начало. Таймер");
      int tm=TimeCurrent();
      while(true) if (TimeCurrent()-tm>=3) break;         
      Print("Конец. Прошло не менее 3 секунд");
      ExpertRemove();      
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
      Print("OnChartEvent");
  }  

 Результат тот же. Заодно проверил и событие ончартэвент. Честно говоря я думал оно должно быть параллельно, а тут оказалось тоже нет. Вообщем вывод простой - все события выполняются последовательно, те кто не попал в очередь - игнорируются. По крайней мере в мкл4.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий