Есть ли система прерываний при обработки событий MT4. Если при обработке события NewTick обработчиком OnTick, происходит событие Timer, то какой сценарий выполняется: - страница 2

 
Много поточности в рамка одного исполняемого эксперта в МТ не существует, в следствии чего, пока не закончиться текущая функция, другая не получит управление, и даже более, если в одном из экспертов у вас будет зацикливание(вечный цикл), терминал просто будет висеть в ожидании завершения потока в котором запущен зацикленный эксперт.
 
А зачем огород городить? Многопотоковость плохо работает в терминале. Проверяйте в OnTick руками ....
 
Сергей:
А зачем огород городить? Многопотоковость плохо работает в терминале. Проверяйте в OnTick руками ....
Автоматическими функциями вообще стараюсь не особо пользоваться, простые вещи лучше сделать самому ИМХО
 
Сергей:
А зачем огород городить? Многопотоковость плохо работает в терминале. Проверяйте в OnTick руками ....
скажу больше. Стандартные функции на все случаи жизни. Своя, под конкретную задачу, работает быстрее.
 
Сергей:
скажу больше. Стандартные функции на все случаи жизни. Своя, под конкретную задачу, работает быстрее.
Многопотоковость, которая плохо работает в терминале - она там вообще есть? Насколько я понял из обсуждения, там только очередь в едином потоке...
 
Yury Kirillov:
Многопотоковость, которая плохо работает в терминале - она там вообще есть? Насколько я понял из обсуждения, там только очередь в едином потоке...
Она есть в самом терминале, но доступ к ней из кода ограничен.

Это можно обойти руками ... Зациклите функцию старт. Тогда скрипт не будет выходить из исполнения функции старт. Новые тики будете получать сами через рефреш ... Но ... Скорость выполненния увеличится раз в пять и ... Вы будете иметь возможность реагировать на процессы даже в интервале между тиками (в стандартном варианте скрипт спит между тиками), например на какую-либо реакцию пользователя в графических объектах .... Или ... Тот же таймер )) работает четко по времени, а не ждет нового тика
 
Сергей:
Она есть в самом терминале, но доступ к ней из кода ограничен.

Это можно обойти руками ... Зациклите функцию старт. Тогда скрипт не будет выходить из исполнения функции старт. Новые тики будете получать сами через рефреш ... Но ... Скорость выполненния увеличится раз в пять и ... Вы будете иметь возможность реагировать на процессы даже в интервале между тиками (в стандартном варианте скрипт спит между тиками), например на какую-либо реакцию пользователя в графических объектах .... Или ... Тот же таймер )) работает четко по времени, а не ждет нового тика
К тому же новая версия терминала умеет работать с многоядерными процессорами, значит разбивать потоки терминал умеет. Другой вопрос есть ли доступ к потокам для программистов. Но тут опять все ручками )
 
Сергей:
Она есть в самом терминале, но доступ к ней из кода ограничен.

Это можно обойти руками ... Зациклите функцию старт. Тогда скрипт не будет выходить из исполнения функции старт. Новые тики будете получать сами через рефреш ... Но ... Скорость выполненния увеличится раз в пять и ... Вы будете иметь возможность реагировать на процессы даже в интервале между тиками (в стандартном варианте скрипт спит между тиками), например на какую-либо реакцию пользователя в графических объектах .... Или ... Тот же таймер )) работает четко по времени, а не ждет нового тика
Можно поподробнее про таймер, который работает четко по времени, а не ждёт нового тика? То есть событие таймера обрабатывается автономно от выполнения программы? То есть по таймеру происходит прерывание выполнения программы? 
 

Делаете цикл while(!IsStopped()) т.е. Старт работает до тех пор, пока вы в ручную не прекратите исполнение программы (например сняв советник с графика или прервав цикл по условию).

 

В теле цикла пишете логику Вашего советника, тики обновляете рефрешем. Работает очень быстро! Поэтому в конце кода ставьте функцию слип со временем по Вашему усмотрению. Иначе грузить будет процессор, можете и без слипа.

 

Код таймера указывается в теле оператора цикла while и будет Вам счастье.

 

Как пример:

int Timer(datetime starttime){//Функция по переданному значению Стартого временени отсчета считает сколько прошло до текущего момента

   datetime CurTime= TimeCurrent()- starttime;//Считаем сколько от заданного времени до Сейчас прошло в милисемундах

   return(CurTime);//возвращаем резульатат

}

 
Yury Kirillov:
Можно поподробнее про таймер, который работает четко по времени, а не ждёт нового тика? То есть событие таймера обрабатывается автономно от выполнения программы? То есть по таймеру происходит прерывание выполнения программы? 

На счет прерывания не могу точно сказать, из справки

Timer

Событие Timer периодически генерируется клиентским терминалом для эксперта, который активизировал таймер при помощи функции EventSetTimer. Обычно эта функция вызывается в функции OnInit. Обработка события Timer производится функцией OnTimer. При завершении работы эксперта необходимо уничтожить созданный таймер при помощи EventKillTimer, которую обычно вызывают в функции OnDeinit.

 проверочный код

//+------------------------------------------------------------------+
//|                                                       test10.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1); // зададим таймер с переодичностью 1 секунду
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
Print("Пришло событие OnTick(): ",TimeLocal());
  
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Print("Пришло событие OnTimer(): ",TimeLocal());
  }
//+------------------------------------------------------------------+


 Результат

2017.01.22 17:31:32.752 Expert test10 USDCHF,H1: loaded successfully
2017.01.22 17:31:34.645 test10 USDCHF,H1: initialized
2017.01.22 17:31:35.689 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:35
2017.01.22 17:31:36.654 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:36
2017.01.22 17:31:37.669 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:37
2017.01.22 17:31:38.684 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:38
2017.01.22 17:31:39.701 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:39
2017.01.22 17:31:40.708 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:40
2017.01.22 17:31:41.726 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:41
2017.01.22 17:31:42.741 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:42
2017.01.22 17:31:43.907 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:43
2017.01.22 17:31:44.895 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:44
2017.01.22 17:31:45.911 test10 USDCHF,H1: Пришло событие OnTimer(): 2017.01.22 17:31:45
2017.01.22 17:31:46.865 test10 USDCHF,H1: uninit reason 1
2017.01.22 17:31:46.875 Expert test10 USDCHF,H1: removed


 Как видите сегодня выходной, тиков нет, а таймер работает, значит он не зависит от прихода тиков.

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