Советники: New_Bar (условие, определяющее появление нового бара, реализованно в виде микросоветника) - страница 3
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Владимир, вот код
и вот результат работы
Конечно задержка в четверть секунды многовато, но ведь мне надо было показать, что задержка может пропустить первый тик, а задержка может произойти в самый неожиданный момент…
С этим можно легко столкнуться в мультивалютном советнике, который работает на графике одной валютной пары. Советник в OnTick() запускает цикл по нескольким парам. Допустим, по первой паре наступил новый бар и советник решил открыть по ней позицию или несколько отложенных ордеров. На это с учетом возможных задержек может уйти несколько секунд. За эти секунды по второй паре уже пришло два тика, и когда советник доберется в цикле до обработки второй пары, то ваше условие нового бара уже не будет выполнено. Новый бар для второй пары будет пропущен.
Поэтому я для себя реализовывал более сложный код для определения нового бара, в основе которого примерно та же идея, как и в этом ответе, только вместо iTime используется iVolume.
Реализация.
Для текущего ТФ и символа сгодится такая функция:
для мультивалютных сов и с разными ТФ лучше реализовать через класс, когда для каждого символа и (или) ТФ нужен свой экземпляр класса.
Например так:
код не проверял. Вдруг где-то накосячил. Хотя вряд ли. ))
Реализация.
код не проверял. Вдруг где-то накосячил. Хотя вряд ли. ))
А если в одном вызове OnTick() надо проверить в нескольких местах событие наступления нового бара? Ваш код, похоже, позволяет сделать это только один раз. После этого IsNewBar() будет возвращать false внутри того же вызова OnTick().
Если же такого не требуется, то ваш код вполне достаточен.
А если добавить еще второй класс, который будет занимается централизованным хранением объектов CIsNewBar для разных символов и таймфреймов, чтобы можно было одной функцией определять новый бар для разных комбинаций, то объем кода еще увеличится.
P.S. Посмотрел, что я потом переделал немного реализацию, сделав ее одинаковой для MT5/MT4, избавившись от CHashMap и упростив.
А если в одном вызове OnTick() надо проверить в нескольких местах событие наступления нового бара? Ваш код, похоже, позволяет сделать это только один раз. После этого IsNewBar() будет возвращать false внутри того же вызова OnTick().
Как это так - в нескольких местах?
Идентификация нового бара должна происходить в OnTick и обработка этого события должна происходить в одном месте. Иначе нужно менять алгоритм.
Ну если никак не обойти этого (не представляю ситуации - когда это может быть нужно), то создавайте несколько экземпляров класса с одними и теми же параметрами TF и Symbol - для каждого места свой.
ЗЫ: заглянул в ваш код краем глаза и увидел там циклы и поиск символа. Явный перебор с алгоритмом. Какой же там перфоманс?! Жесть!
Владимир, вот код
и вот результат работы
Конечно задержка в четверть секунды многовато, но ведь мне надо было показать, что задержка может пропустить первый тик, а задержка может произойти в самый неожиданный момент…
Добрый вечер, Алексей! Задержку и мне приходилось ставить, чтобы сымитировать вне штатную ситуацию. У меня правда была 900 мск. Видел такие пропуски по несколько минут на таймфрейме М1. В общем подвожу результат всего сказанного в обсуждении:
Как это так - в нескольких местах?
Идентификация нового бара должна происходить в OnTick и обработка этого события должна происходить в одном месте. Иначе нужно менять алгоритм.
Ну если никак не обойти этого (не представляю ситуации - когда это может быть нужно), то создавайте несколько экземпляров класса с одними и теми же параметрами TF и Symbol - для каждого места свой.
ЗЫ: заглянул в ваш код краем глаза и увидел там циклы и поиск символа. Явный перебор с алгоритмом. Какой же там перфоманс?! Жесть!
Зачем??? Разве не достаточно объявить bool переменную и ей присвоить значение функции IsNewBar? И потом во всех местах где нужно только проверить значение этой переменной.
НО!!! Артём Тришкин писал мне класс для мультивалютников и где-то я уже давал этот класс для применения и обсуждения.
Зачем??? Разве не достаточно объявить bool переменную и ей присвоить значение функции IsNewBar? И потом во всех местах где нужно только проверить значение этой переменной.
НО!!! Артём Тришкин писал мне класс для мультивалютников и где-то я уже давал этот класс для применения и обсуждения.
Причем, лучше чтобы она(переменная) находилась внутри класса CIsNewBar, была бы паблик и выставлялась бы внутри метода IsNewBar() значением result, а метод IsNewBar() в таком случае может вызываться только из OnTick и поэтому логичнее его переименовать в NewTick или OnTick, а саму переменную в IsNewBar.
Доброго времени, коллеги!
Я пишу код только месяц. Но хочу поделится своим способом определения нового бара.
Как по мне это самый коротки вариант.
Подводных камней пока не встретил.
От гуру послушал бы рекомендаций.
Доброго времени, коллеги!
Я пишу код только месяц. Но хочу поделится своим способом определения нового бара.
Как по мне это самый коротки вариант.
Подводных камней пока не встретил.
От гуру послушал бы рекомендаций.
ровно тоже самое, что я давал здесь (вариант функции - когда используется только текущий ТФ и текущий символ), только с глобальной переменной, а не статической, и не в виде функции, а в теле OnTick.
Статическая переменная по сути тоже самое, что и глобальная, только удобнее, т.к. не "засоряет" шапку и зона видимости только в пределах функции, что безопаснее.
Использование функции в данной ситуации только лишь улучшает читаемость кода, но можно конечно же обойтись и без функции. На скорость не влияет.