Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Правда. Спасибо. Я не помнил об этом. На самом деле это не решает проблему полностью, поскольку мне нужно, чтобы ордера выполнялись почти мгновенно (и я думаю, что с этим методом я могу проверять их только каждую секунду, но, по крайней мере, не каждый тик), но действительно я могу легко построить временное решение, используя его.
Хотя OnTimer имеет самую быструю скорость, согласованную с системными часами, т.е. каждые 15 мс, я бы предпочел циклы с интервалом в 1 мс (используя Sleep(1) в цикле).
Хотя OnTimer имеет самую быструю скорость, согласованную с системными часами, т.е. каждые 15 мс, я бы предпочел зацикливание с интервалом в 1 мс (используя Sleep(1) в цикле).
Не будет ли это проблемой? Я имею в виду, нет ли в MT4 внутренних процессов, которым может понадобиться выполнение OnTick(), чтобы избежать переполнения или переполнения внутренних буферов после нескольких недель работы (советника) без остановки и просто цикла?
Я спрашиваю это по незнанию, я понятия не имею, может ли это быть проблемой, просто предполагаю, что MT4 не был создан для этого.
Так вы думаете (/пробовали), что это не будет проблемой? (Если да, то это отличные новости).
BTW: Как заставить OnTimer() выполняться с интервалом менее 1 секунды :?
Несколько лет назад я запускал советников в цикле, запускаемом в init(), по аналогичной причине - чтение внешних данных с минимальной задержкой. Он работал неделями без каких-либо побочных эффектов. Sleep(1) удовлетворителен, чтобы сделать воздействие вычислительной мощности очень легким.
Настройки таймера принимают значения миллисекунд.
Несколько лет назад я запускал советников в цикле, запускаемом в init(), по аналогичной причине - чтение внешних данных с минимальной задержкой. Он работал неделями без каких-либо побочных эффектов. Sleep(1) удовлетворителен, чтобы сделать воздействие вычислительной мощности очень легким.
Настройки таймера принимают значения миллисекунд.
BTW: Как заставить OnTimer() выполняться с интервалом менее 1 секунды :?
EventSetMillisecondTimer
Функция указывает клиентскому терминалу, что для данного эксперта или индикатора должны генерироваться события таймера с интервалом менее одной секунды.
boolEventSetMillisecondTimer(
intmilliseconds// количество миллисекунд
);
Параметры
миллисекунды
[in] Количество миллисекунд, определяющее частоту событий таймера.
Возвращаемое значение
В случае успешного выполнения возвращает true, в противном случае - false. Для получения кода ошибки следует вызвать функцию GetLastError().
Примечание
Данная функция предназначена для случаев , когдатребуется таймер с высоким разрешением. Другими словами, события таймера должны поступать чаще, чем раз в секунду. Если вам достаточно обычного таймера с периодом в несколько секунд, используйте функцию EventSetTimer().
Обычно эту функцию следует вызывать из функции OnInit() или в конструкторе класса. Для обработки событий, поступающих от таймера, советник или индикатор должен иметь функцию OnTimer() .
Каждый эксперт и каждый индикатор работают со своим таймером, получая события только от этого таймера. При завершении работы приложения mql4 таймер принудительно уничтожается, если он был создан, но не был отключен функцией EventKillTimer().
Для каждой программы может быть запущен только один таймер. Каждое приложение mql4 и график имеют свою очередь событий, куда помещаются все вновь поступающие события. Если очередь уже содержит событие Timer или это событие находится в стадии обработки, то новое событие Timer не добавляется в очередь приложения mql4.
EventSetMillisecondTimer
Функция указывает клиентскому терминалу, что для данного эксперта или индикатора должны генерироваться события таймера с интервалом менее одной секунды.
boolEventSetMillisecondTimer(
intmilliseconds// количество миллисекунд
);
Параметры
миллисекунды
[in] Количество миллисекунд, определяющее частоту событий таймера.
Возвращаемое значение
В случае успешного выполнения возвращает true, в противном случае - false. Для получения кода ошибки необходимо вызвать функцию GetLastError().
Примечание
Эта функция предназначена для тех случаев , когдатребуется таймер высокого разрешения. Другими словами, события таймера должны поступать чаще, чем раз в секунду. Если вам достаточно обычного таймера с периодом в несколько секунд, используйте функцию EventSetTimer().
Обычно эта функция вызывается из функции OnInit() или в конструкторе класса. Для обработки событий, поступающих от таймера, советник или индикатор должен иметь функцию OnTimer() .
Каждый эксперт и каждый индикатор работают со своим таймером, получая события только от этого таймера. При выключении приложения mql4 таймер принудительно уничтожается, если он был создан, но не был отключен функцией EventKillTimer().
Для каждой программы может быть запущен только один таймер. Каждое приложение mql4 и график имеют собственную очередь событий, в которую помещаются все вновь поступающие события. Если в очереди уже есть событие Timer или это событие находится в стадии обработки, то новое событие Timer не добавляется в очередь mql4-приложения.
Спасибо за подробное объяснение; моя вина; я слишком быстро прочитал это в Интернете. (В ссылках домен docs.mql4.com заменен на forum.mql4.com. На всякий случай, если кто-нибудь еще проверит эту тему...)
EDIT: Я собираюсь воспользоваться тем, что модератор находится рядом: Знаете ли вы, существует ли разница между выполнением OnTimer() каждые N миллисекунд и выполнением того же цикла каждые N миллисекунд, как описано в предыдущих сообщениях?
Я не понимаю, зачем вся эта суета с таймингом "мс". Если только это не какой-то "высокочастотный скальпер новостей" на брокерском соединении с очень низкой задержкой, интервалов в одну секунду на OnTimer() должно быть более чем достаточно в качестве времени отклика.
Если вы добавите все задержки и латентность выполнения приложения JAVA, IPC (LAN и WAN) связи, выполнения управления ордерами и латентность сервера брокера, то не будет никакого реального преимущества в использовании "мс" тайминга для обычных стратегий.
Однако если это что-то вроде "высокочастотного новостного скальпера", который будет использоваться на VPS с низкой задержкой соединения с брокером, тогда вам вообще не следует возиться с JAVA и IPC, а следует кодировать стратегию непосредственно на очень компактном MQL, чтобы получить минимально возможную задержку.
EDIT:
EDIT: Я собираюсь воспользоваться тем, что модератор находится рядом: Знаете ли вы, существует ли разница между выполнением OnTimer() каждые N миллисекунд и выполнением того же цикла каждые N миллисекунд, как описано в предыдущих сообщениях?
То, что я являюсь модератором, не означает, что я более осведомлен, чем другие. На самом деле, другие постеры в этой теме, очевидно, имеют больше знаний, чем я, по данному вопросу. Я ничего не знаю о Java.
Я не понимаю смысла использования Sleep() в событии таймера, так как это переводит советника в режим ожидания, а это может означать пропуск большого количества событий OnTick(). Конечно, в зависимости от советника, события OnTick могут быть не важны.
Несколько лет назад я запускал советников в цикле, запускаемом в init(), по аналогичной причине - чтение внешних данных с минимальной задержкой. Он работал неделями без каких-либо побочных эффектов. Sleep(1) удовлетворителен, чтобы сделать воздействие на вычислительную мощность очень легким.
Для развлечения... следующий скрипт принимает несколько одновременных TCP/IP-соединений и записывает входящие сообщения с разделителями CR в журнал Experts. Например, после запуска скрипта вы можете подключиться через Telnet (по умолчанию к порту 51234), и каждая строка текста, которую вы вводите, будет распечатана.
Для развлечения... следующий скрипт принимает несколько одновременных TCP/IP-соединений и записывает входящие сообщения с разделителем CR в журнал Experts.
... Говоря очевидное, если бы вы хотели сделать вышеописанное в советнике, а не в скрипте, то вы бы просто изменили его следующим образом: