Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Экспериментируя с индикаторами иногда получаю интересный результат после удаления с графика всех советников и индикаторов, и удаления (закрытия) собственно всех графиков:
индикаторы которые ранее были размещены на чарте продолжают работать, взаимодействовать друг с другом и даже выводить информацию через Print().
Причем этот процесс продолжается уже вот минут 20.
Повторяемость эффекта достаточно высокая.Исторический кеш убиваемого графика удаляется не сразу после удаления графика, а после некого таймаута. Соответственно, индикаторы, работающие на данном символе-периоде, - тоже.
Если Вы говорите про 20 минут, то проверьте, может быть какой-нибудь эксперт или индикатор, запущенные совсем на другом графике, запрашивают эти данные, соответственно не дают удалить убиваемый кеш.
Исторический кеш убиваемого графика удаляется не сразу после удаления графика, а после некого таймаута. Соответственно, индикаторы, работающие на данном символе-периоде, - тоже.
Если Вы говорите про 20 минут, то проверьте, может быть какой-нибудь эксперт или индикатор, запущенные совсем на другом графике, запрашивают эти данные, соответственно не дают удалить убиваемый кеш.
У меня запускается советник, который запускает два индикатора, которые обращаются друг к другу за данными.
1. Как корректно прервать работу такой системы программным образом?
2. В настоящий момент я удаляю с графика советник, который удаляет с графика индикаторы. Что я ещё должен сделать для прекращения работы индикаторов?
3. При удалении индикатора с графика через ChartIndicatorDelete() выполняется ли секция OnDeinit() индикатора?
//-----
Первое, что приходит на ум: завести глобальную переменную с флагом разрешения запросов к данным советника и прекращать запрос к данным при сбросе этого флага, но уж больно костыльно как-то.
У меня запускается советник, который запускает два индикатора, которые обращаются друг к другу за данными. Как корректно прервать работу такой системы программным образом?
В советнике и индикаторах грохнуть соответствующие хэндлы в OnDeinit.
OnDeinit индикатора вызывается только если убита последняя копия этого индикатора (счётчик использования равен 0)
В Вашем случае:
Создание индикатора с получением хэндла - счётчик равен 1
Добавление индикатора на график ChartIndicatorAdd - счётчик равен 2
Удаление индикатора с графика ChartIndicatorDelete - счётчик равен 1
Счётчик индикатора обнулится либо после OnDeinit программы, её создавшей, либо после явного вызова IndicatorRelease
В советнике и индикаторах грохнуть соответствующие хэндлы в OnDeinit.
Выше выложены коды советника и индикаторов.
Для индикатора секция DeInit()
Это считается за грохнуть?
OnDeinit индикатора вызывается только если убита последняя копия этого индикатора (счётчик использования равен 0)
1. Что такое "счетчик использования" и как его контролировать?
2. Как "убить последнюю копию" индикатора? Особенно, если его уже нет на чарте и самого чарта тоже уже нет?
Выше выложены коды советника и индикаторов.
Это считается за грохнуть?
Без обид, но выложенный Вами код - это почти проявление неуважения к другим. Код по проблеме должен быть лаконичным, все лишнее, что не касается проблемы (проверки, логирование и т.д.) должны быть убраны. Только тогда возможно нормально обсуждать. Сейчас же 90% времени любой чтец должен разбираться не в поднятой проблеме, а в огромном коде. Поставьте себя на место другого.
1. Что такое "счетчик использования" и как его контролировать?
2. Как "убить последнюю копию" индикатора? Особенно, если его уже нет на чарте и самого чарта тоже уже нет?
Я дополнил свой пост
В Вашем случае:
Создание индикатора с получением хэндла - счётчик равен 1
Добавление индикатора на график ChartIndicatorAdd - счётчик равен 2
Удаление индикатора с графика ChartIndicatorDelete - счётчик равен 1
Счётчик индикатора обнулится либо после OnDeinit программы, её создавшей, либо после явного вызова IndicatorReleaseOnDeinit индикатора вызывается только если убита последняя копия этого индикатора (счётчик использования равен 0)
В Вашем случае:
Создание индикатора с получением хэндла - счётчик равен 1
Добавление индикатора на график ChartIndicatorAdd - счётчик равен 2
Удаление индикатора с графика ChartIndicatorDelete - счётчик равен 1
Счётчик индикатора обнулится либо после OnDeinit программы, её создавшей, либо после явного вызова IndicatorRelease
1. Я правильно понимаю, что после "Добавление индикатора на график ChartIndicatorAdd - счётчик равен 2" я имею две запущенных копии одного и того же индикатора и они обе активны?
2. Вопрос по поводу "Счётчик индикатора обнулится либо после OnDeinit программы, её создавшей, либо после явного вызова IndicatorRelease":
При удалении индикатора с графика при помощи ChartIndicatorDelete() последующий вызов IndicatorRelease() приводит к ошибке, как в этом случае понизить счетчик?
При вызове IndicatorRelease() последующий вызов ChartIndicatorDelete() тоже в свою очередь приводит к ошибке.
3. OnDeinit советника создавшего индикатор у меня вызывается, но индикаторы работают - стало быть счетчик не обнуляется?
1. Нет. В данном случае копия одна, но со счётчиком равным 2
2,3. У Вас какие то сложные случаи. Зачем добавлять индикатор на график? Если добавили, то надо делать ChartIndicatorDelete до вызова IndicatorRelease/
Зачем вызывать IndicatorRelease? Индикатор зарелизится автоматически. Вы что-то перемудрили.
После всех освобождений индикаторы работают больше 20 минут? Проверьте все другие обращения к этому же символу-периоду.