Есть ли система прерываний при обработки событий MT4. Если при обработке события NewTick обработчиком OnTick, происходит событие Timer, то какой сценарий выполняется: - страница 2
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А зачем огород городить? Многопотоковость плохо работает в терминале. Проверяйте в OnTick руками ....
А зачем огород городить? Многопотоковость плохо работает в терминале. Проверяйте в OnTick руками ....
скажу больше. Стандартные функции на все случаи жизни. Своя, под конкретную задачу, работает быстрее.
Многопотоковость, которая плохо работает в терминале - она там вообще есть? Насколько я понял из обсуждения, там только очередь в едином потоке...
Делаете цикл while(!IsStopped()) т.е. Старт работает до тех пор, пока вы в ручную не прекратите исполнение программы (например сняв советник с графика или прервав цикл по условию).
В теле цикла пишете логику Вашего советника, тики обновляете рефрешем. Работает очень быстро! Поэтому в конце кода ставьте функцию слип со временем по Вашему усмотрению. Иначе грузить будет процессор, можете и без слипа.
Код таймера указывается в теле оператора цикла while и будет Вам счастье.
Как пример:
int Timer(datetime starttime){//Функция по переданному значению Стартого временени отсчета считает сколько прошло до текущего момента
datetime CurTime= TimeCurrent()- starttime;//Считаем сколько от заданного времени до Сейчас прошло в милисемундах
return(CurTime);//возвращаем резульатат
}
Можно поподробнее про таймер, который работает четко по времени, а не ждёт нового тика? То есть событие таймера обрабатывается автономно от выполнения программы? То есть по таймеру происходит прерывание выполнения программы?
На счет прерывания не могу точно сказать, из справки
Событие 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: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
Как видите сегодня выходной, тиков нет, а таймер работает, значит он не зависит от прихода тиков.