Я попытался с помощью опубликованного кода написать свой индикатор используя свойство отрисовки DRAW_FILLING.
Но у меня возникли проблемы залипания соседних рисуемых участков разделённых пустыми значениями.
Те если в одном окне появляется две рисуемые секции то не взирая на то что они разделены участком индикатора со значением EMPTY_VALUE, этот пустой участок всё равно отрисовывается со значениями соседних секций.
Взялся за это дело так как опубликованные коды по индикатору сессий у меня чёто не работают, вот и решил всё переписать.
Вот накидал заготовку.
Могу предложить только такой вариант
Спасибо но немного не пойдёт, остановлюсь пожалуй на граф объектах.
Спасибо но немного не пойдёт, остановлюсь пожалуй на граф объектах.
- www.mql5.com
Так как отрисовка в стиле DRAW_FILLING делается полигонами, то получить красивые прямоугольники не получится, к сожалению.
Столкнулся с той же проблемой (залипания на участках пустых значений). Хотя вроде выше сказано, что получить прямоугольники не получится, но поскольку есть пример таки рисующий эти самые прямоугольники (индикатор торговых сессий), решил тему поковырять.
Откровенно говоря, каким образом в вышеуказанном индикаторе удалось получить прямоугольники, понять не смог. А посему буду благодарен за любые пояснения (разработчиков платформы, автора, сторонних разработчиков).
С другой стороны, в ходе экспериментов выяснилось, что получить прямоугольники не так сложно - надо всего лишь после участка пустых значений менять местами буферы филинга. Другими словами, вот такой код:
... //--- for ( int bar = startBar; bar < rates_total && !IsStopped(); bar++ ) { if ( prev_calculated != rates_total && bar == rates_total - 1 ) { _up = up; } if ( bar % 4 == 0 ) { if ( up ) { draw(bar, high[bar], low[bar]); up = false; } else { draw(bar, low[bar], high[bar]); up = true; } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ void draw(int bar, double price1, double price2) { //--- int start = bar-2; for ( int i = start; i <= bar; i++ ) { FillingBuffer1[i] = price1; FillingBuffer2[i] = price2; } //--- }
даёт такой результат:
Казалось бы проблема решена. Написал индикатор, ежедневно выделяющий указанные пользователем временные интервалы, и новый сюрприз:
Как ни крутил, убрать "побочные эффекты" не получается. Причём заметьте, в первом случае (код и рисунок выше) ничего подобного не наблюдалось.
Отсюда, собственно, вопросы:
- почему в индикаторе торговых сессий (ссылка в начале поста) не возникает проблемы залипания на участках пустых значений?
- почему в одних случаях прямоугольники рисуются нормально, а в других получаем побочные явления? Коды прилагаю в конце поста. (Да, если бы такие явления возникали всегда, согласился бы с утверждением о полигонах)
Повторюсь: буду благодарен за все пояснения.
P.S.1 Как мне видится, решение проблемы прямоугольников, является хорошей альтернативой объектам (которые как-то не очень хочется использовать). Ведь это и то же выделение временных интервалов, и линейный разворот, и области Дарваса, и выделение различных паттернов и т.д. и т.п.
P.S.2 Индикатор TimeZone думал и в базу кодов выложить, но стОит ли (с этими "левыми" полосками)?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
DRAW_FILLING:
Стиль DRAW_FILLING рисует цветную область между значениями двух индикаторных буферов. Фактически этот стиль рисует две линии и закрашивает пространство между ними одним из двух заданных цветов. Цвета меняются случайным образом каждые N тиков. Параметр N вынесен во внешние параметры индикатора для возможности ручной установки (закладка "Параметры" в окне свойств индикатора).
Пример индикатора, рисующего в отдельном окне канал между двумя скользящими средними с разными периодами усреднения. Изменение цвета при пересечении средних визуально показывает смену восходящей и нисходящей тенденций.
См. также статью Стили рисования в MQL5.
Автор: MetaQuotes