Функция OnTick для советника и функция OnCalculate для индикатора работают после прихода нового тика. В этом смысле они идентичны. Другое дело, что в функцию OnCalculate добавлены дополнительные возможности.
Разумно применять функцию OnChartEvent везде, где допустима графика.
Я думаю причина отказа использовать события в идикаторах связанна с критичостью выполнения.
Внимательно почитайте описание событий OnCalculate и OnTick.
Событие NewTick генерируется при поступлении новых котировок, и обрабатывается функцией OnTick() у присоединенных советников. Если при поступлении новой котировки выполнялась функция OnTick, запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником, так как соответствующее событие не будет поставлено в очередь событий эксперта.
Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных. Обрабатывается функцией OnCalculate.
Насчет критичности выполнения. Возможно. Но пока это только на уровне гадания.
Справка:
OnTick
Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, поскольку событие Tick для них не генерируется.
Событие Tick генерируется только для экспертов, но это не означает, что эксперты обязаны иметь функцию OnTick(), так как для экспертов генерируются не только события Tick, но и события Timer, BookEvent и ChartEvent.
OnCalculate
Функция OnCalculate() вызывается только в пользовательских индикаторах при необходимости произвести расчет значений индикатора по событию Calculate. Обычно это происходит при поступлении нового тика по символу, для которого рассчитывается индикатор. При этом индикатор не обязательно должен быть прикреплен к какому-нибудь ценовому графику данного символа.
--------------------
Вот только из данного описания не следует, что события Timer, BookEvent и ChartEvent как-то связаны с поступлением нового тика. Это независимые события. Независимые от поступления нового тика. Механизм генерации этих событий не связан с поступлениями новых тиков.
Я не буду спорить, Вы спрасили я ответил. Остальное к разработчикам.
Из своего опыта могу сказать, что когда я использовал сложные расчеты (минутный график 500 дней) в индикаторе, у меня зависал терминал. После того как я переделал его в эксперт проблема отпала, из этого я сделал вывод, что эксперты работают как бы в фоне, а индикаторы в потоке.
Я не буду спорить, Вы спрасили я ответил. Остальное к разработчикам.
Из своего опыта могу сказать, что когда я использовал сложные расчеты (минутный график 500 дней) в индикаторе, у меня зависал терминал. После того как я переделал его в эксперт проблема отпала, из этого я сделал вывод, что эксперты работают как бы в фоне, а индикаторы в потоке.
Да это и не спор. Обсуждение.
Сложные расчеты в индикаторе и в экперте полностью идентичны? Или все-таки были какие-то отличия?
Меня больше графика интересует. Есть варианты работы, когда на график необходимо прикрепить несколько экземпляров одного и того-же индикатора. Несколько экземпляров советников прикрепить к графику не получится. Запрещено. И реализовать в одном советнике то, что делается несколькими индикаторами не представляется возможным. Точнее, это сделать можно, но во первых, уже нельзя будет применять шаблоны к такому советнику, чтобы кто-то другой повторил на своем графике. Во вторых, настройку такого советника на свой вкус мало кто сможет сделать грамотно. В третьих, разработка интерфейса редактирования параметров такого советника задача не из элементарных. Это из моего опыта. Опять же, это будет не советник, а индикатор, оформленный в виде советника за неимением возможностей применения в индикаторе некоторых событий, которые возможны в советнике. А если захочется еще и советник сделать, который принимал бы сигналы из этого графического индикатора-советника? Второй (торгующий) советник уже не повесишь на график, если к графику прикреплен советник-индикатор... Можно, кому-то стороннему, сказать так: ну и делай торгующий советник из этого советника-индикатора... Рассуждать глубоко на эту тему не буду. Скажу только, что это не всегда приемлемо...
- www.mql5.com
Индикатор - это расчетная сущность, к которой есть жесткие требования от отработке. Он не имеет права тормозить и не выдавать данных (а данные от него требуют в безусловном порядке).
Индикаторы работают в своем потоке, обрабатывая каждый ценовой тик и любая задержка приведет к блокировке работы всей системы (последствия будут самые разнообразные).
У нас были опасения, что работа с объектами приведет к серьезным тормозам индикаторов (работа с объектами идет через специальную асинхронную очередь сообщений). Опыты показали, что при разумном использовании объектов (не перемещая сотни и тысячи объектов за раз) они не оказывают существенного влияния на расчеты. Поэтому мы разрешили использование функций управления объектами в кастомных индикаторах. Но при желании легко устроить тормоза в терминале путем неумной работы с объектами в индикаторе.
Чтобы понять что такое индикатор, надо смотреть глубже - в доступ к историческим данным. Когда индикатор вызывают через OnCalculate, то ему передают доступную историю.
Если посмотреть на ее объем (выведя счетчики в логи), то можно увидеть, что фактически отдаются десятки и сотни мегабайт на каждом тике:
- Откуда берутся эти массивы?
Из глобального менеджера истории, который обновляет по тикам, кеширует и пересоздает таймфреймы по запросам. - Кто их предоставляет?
Их с блокировкой для чтения предоставляет терминал каждому индикатору по очереди. - Какому количеству индикаторов это предоставляется?
Теоретически неограниченному количеству индикаторов, но по очереди. - Откуда взять столько памяти, чтобы дать каждому индикатору независимость в расчетах?
Памяти катастрофически не хватает, поэтому есть единственный способ работы индикаторов по очереди.
Особенность МетаТрейдер 5 по сравнению с МетаТрейдер 4 в том, что сейчас объемы истории увеличились в разы и мы решили очень сложную задачу по быстрому (без копирований десятков мегабайт истории каждому индикатору по отдельности) перерасчету индикаторов. У нас даже два (или более) одинаковых индикатора на одинаковых таймфреймах сливаются в одну расчетную копию и считаются один раз.
Теперь Вы предлагаете взять и затормозить весь механизм, фактически сделав из индикаторов чистых экспертов. Абсолютно понятно, что это технически неразумно. Добавив индикаторам интерактивности, сразу же будет уничтожен рабочий механизм работы с ядром терминала - доступом к данным.
В результате мы получим "тормозной терминал, да они даже индикатор не могут отрисовать, и чарты с задержкой отрисовываются!", причем никто не скажет "да, это у меня навороченный индикатор работает, он виноват". И даже в этом случае нас обвинят в том, что мы "не обеспечили разумного разделения, не умеем писать многопоточный софт, и тд".
Поэтому принципиального изменения поведения и принципов работы индикаторов не будет.
Тормоза работы с индикаторами возникают часто от того, что индикатор обрабатывает всю доступную историю на каждом тике. А какой смысл в такой работе? Пересчет индикатора необходимо делать только на изменившемся для данного индикатора участке истории. Это усложняет код индикатора в плане отсечения только изменившегося для данного индикатора участка истории и обработке только этого участка. Но заметно ускоряет расчет. Нагрузка на процессор исчезает почти полностью или становится малозаметной. В МТ4 даже один зигзаг из стандартной поставки на большой истории и на быстром рынке создавал заметные тормоза. А при вышеописанной оптимизации даже несколько десятков установленных зигзагов с другими дополнительными расчетами и графическим выводом почти незаметно сказываются на работе.
Уважаемые разработчики метатрейдера, посмотрите, пожалуйста по ссылке /go?link=http://www.onix-trade.net/forum/index.php?showtopic=85093&view=findpost&p=389202
Там, начиная с 47 поста, несколько сообщений. Решение затронутой в этой теме проблемы найдено. Но там также существенные проблемы затрагиваются. И их как-то надо решать.
Здесь писать не буду. Не хочется повторяться.
Спасибо, прочел.
Мы активно обсуждаем тему множества советников на одном графике. Кроме мелких проблем управления, никаких существенных противопоказаний нет.
Думаю, что это решение полностью Вас устроит?
Возможно, такой вариант. Не множество советников, а сделать еще один вариант индикаторов.
То есть это будет индикатор, использующий все возможности советника, но без функции онкалькуляте .
То есть каким-то образом компилятору необходимо сообщать, что это не советник, а индикатор. Тогда и не будет необходимости выводить несколько советников на график. Советник, торгующий, будет один. А индикаторы будут двух видов. Один вариант индикаторов с большим количеством вычислений, как сейчас. Второй вариант с возможностями, которые сейчас у советников. Такой вариант наиболее приемлем. Ведь есть индикаторы расчетные. А есть индикаторы с малым количеством расчетов, но с выводом "индикации" в виде графики.
Другой серьезный вопрос, поднятый на ОНИКСе - глубина истории. Для волновиков это серьезно.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Кто-нибудь может объяснить смысл применения в советниках следующих событий:
Советники - программы для автоматической торговли. Им вообще никакая графика не нужна.
Допустим, проходят очередные соревнования советников. Что, если в советнике будет запрограммировано одно из этих событий, то организаторы разрешат участникам шуршать мышью во время соревнований? Откроют доступ для шуршания мышью?
На мой взгляд все эти функции необходимы в индикаторах. Пусть они будут и в советниках, но в индикаторах они нужнее. И не перечисленные здесь события функции OnChartEvent также необходимы в индикаторах.
Разумного объяснения, почему эти функции нельзя использовать в индикаторах пока не прозвучало.
Может кто-нибудь дать разумное объяснение?