- Разные значения индикатора после переключения таймфрейма и обратно
- Новая версия платформы MetaTrader 4 build 1350
- Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
робот написал с ошибками..
конкретно - он приаттачивает индикаторы к чарту, а в личном OnDeinit обратно не убирает. (и ещё возможно путаются OnInit/OnDeinit при переключении ТФ..и индикаторы аттачаться прямо в OnInit...и...в общем баги там и недочёты)
робот написал с ошибками..
конкретно - он приаттачивает индикаторы к чарту, а в личном OnDeinit обратно не убирает. (и ещё возможно путаются OnInit/OnDeinit при переключении ТФ..и индикаторы аттачаться прямо в OnInit...и...в общем баги там и недочёты)
Спасибо за ответ. В onDeinit() освобождаю ресурсы через IndicatorRelease(handle), ну а перед этив в onInit() подключаю, а в глобальном уровне объявляю сам хэндл типа int. Ничего особенного вроде бы, но этот нюанс меня выбешивает
Спасибо за ответ. В onDeinit() освобождаю ресурсы через IndicatorRelease(handle), ну а перед этив в onInit() подключаю, а в глобальном уровне объявляю сам хэндл типа int. Ничего особенного вроде бы, но этот нюанс меня выбешивает
у тебя где-то есть ChartIndicatorAdd - "разместить индикатор на чарте"
что происходит:
- в советнике заводишь индикатор, командуешь добавить его на чарт, индикатор появляется.
- меняешь таймфрейм, терминал сохраняет текущий шаблон (вместе с добавленным индикатором и твоим советником), вызывает OnDeinit
- загружается сохранённый шаблон с индикатором и советником, вызываются их OnInit - советник заводит новый индикатор и добавляет на чарт
что надо делать :
- при добавлении индикатора проверять а нет ли уже запущенного экземпляра индикатора. Если есть то новый не добавлять в чарт (опция: и внутри использовать уже имеющийся, не создавать новый).
- в ОnDeinit советника дёргать ChartIndicatorDel своего добавленного индикатора. (это как мёртвому припарка, но на возможные изменения в грядущих билдах)
будут проблемы с IndicatorShortName - ты им не управляешь и в советнике тебе придётся "угадать" ShortName своего индикатора
PS/ вообще на мой взгляд ChartIndicatorAdd и всё что с ним, это сплошная архитектурная ошибка, поэтому с ними плохо
ChartIndicatorDelete
Не понятно зачем это создано в таком виде, если для применения нужно создавать костыли?
Справка
Необходимо правильно формировать короткое имя индикатора, которое с помощью функции IndicatorSetString() записывается в свойство INDICATOR_SHORTNAME. Мы рекомендуем, чтобы короткое имя содержало значения входных параметров индикатора, так как идентификация удаляемого с графика индикатора в функции ChartIndicatorDelete() производится именно по короткому имени.
1. Индикаторы - это чуть более глубже, чем МА и Стохастик, и им не нужно ни длинное ни короткое имя, достаточно названия файла.
2. Зачем по короткому имени, как с этим работать в другом индикаторе, или в советнике?
Нужно 2 опции:
1. Удалить по хендлу
2. Удалить по названию
Вообще вы советуете их по возможности не использовать для повышения оптимизации и предсказуемости работы советника ?
посоветую не использовать ChartIndicatorAdd в советниках.
Сугубо идеология: внешний вид (какие индикаторы и зачем видны на чарте) должен определять пользователь сам. Заодно он там может настраивать разные параметры и цвета.
А робот/советник должен быть адаптирован к работе без чарта. Никаких ChartIndicatorAdd, ChartGet/SetXXX,ObjectGet/SetXXX и прочего подобного
Ему графика и индикаторы нужны только в процессе отладки и валидации. 99.99% времени он эксплуатируется "в тёмную". Или вообще на обрезке MQ-VPS (и снова загадочные загадки - нафик он нужен за такие деньги ? Win-VDS примерно столько-же а то и меньше.)
Спасибо Вам!
Можете не бояться функции ChartIndicatorAdd и применять её, когда надо показать используемый в эксперте индикатор на графике (это бывает полезно). Только не забывайте освобождать дескриптор после добавления индюка на график, потому что его привязка к эксперту в этом случае уже лишняя (получается 2 "хозяина", и индюк не освобождается).
// если Momentum(14) еще нет на графике, добавляем его const int w = ChartWindowFind(0, "Momentum(14)"); if(w == -1) { const int momentum = iMomentum(NULL, 0, 14, PRICE_TYPICAL); ChartIndicatorAdd(0, (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL), momentum); IndicatorRelease(momentum); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования