Как сделать график ренко
Индикатор для построения графика «Ренко»
Введение
График «Ренко», как и вышеупомянутые графики, игнорирует временную шкалу, ориентируясь только на движение цены. В отличие от графика «Крестики-Нолики», график «Ренко» строит каждый «кирпич» с нового столбца (в новой вертикальной плоскости), в остальном анализ их построения имеет много общего: есть фиксированный размер «кирпича» («крестика», «нолика»), аналогичным образом анализируется цена и выстраиваются фигуры.
Итак, график «Ренко» представляет собой совокупность вертикальных прямоугольников («кирпичи»). Восходящий «кирпич» обычно закрашивается в белый цвет, нисходящий закрашивается в чёрный цвет. Построение регулируется движением цены. Текущая цена рассматриваемого периода, сравнивается с минимумом и максимумом предыдущего «кирпича» (белого или чёрного). Если текущая цена больше максимума предыдущего «кирпича» на размер «кирпича» или больше, то в новом столбце от максимума предыдущего кирпича рисуется следующий «кирпич» (белого цвета) или несколько. И наоборот, если текущая цена меньше минимума предыдущего «кирпича» на размер кирпича или более, рисуются нисходящие «кирпичи» чёрного цвета.
Начальный же, самый первый «кирпич» отсчёта построения графика, рисуется в зависимости от движения цены в рассматриваемом периоде, за цену максимума и минимума предыдущего кирпича берётся цена открытия бара.
Пример того, как выглядит классический график «Ренко», можно увидеть на рис. 1:
Рис. 1. Пример изображения классического графика «Ренко»
1. Пример построения
Классический вид построения графика «Ренко» принято производить на основании цен закрытия. Сначала следует выбрать таймфрейм и в соответствии с ним величину «шага» (порога).
В данном примере используется пара EURUSD (таймфрейм H4), с «шагом» в 30 пунктов. Результат построения графика «Ренко» в период с 03.01.2014 по 31.01.2014 (примерно месяц) приведён на рис. 2, слева приведено построение с учетом временного промежутка (здесь видно горизонтальное удлинение «кирпичей»), справа показан результат построения графика Ренко:
Рис.2. Результат построения графика «Ренко» на EURUSD (H4, шаг 30 пунктов)
Рассмотрим более подробно принцип построения графика. Красным цветом на рис. 2 обозначены горизонтальные линии, указывающие ценовой размер каждого «кирпича» (30 пунктов), синим цветом обозначены наиболее интересные даты (для ориентировки).
Как видно из графика, в конце дня 03.01.2014 свеча закрывается ниже 1.3591 ранее намеченных ценовых диапазонов графика (красные горизонтальные линии) в 1.3589 (отмечено ценовой меткой), что даёт нисходящий «кирпич» на графике.
Потом видно, как направление движения цены меняется в нисходящую сторону и четыре раза прорывает ценовые диапазоны, опускаясь всё ниже и ниже на ценовом графике. В 12:00 23.01.2014 (закрытие свечи, образованной в 08:00), наблюдаем прорыв вверх сразу двух ценовых диапазонов, что в свою очередь образовывает сразу два «кирпича», закрываясь на 1.3639. Первый «кирпич» отчётливо виден, а второй вытягивается в длинную вертикальную линию (из-за одновременного появления с первым). Далее построение продолжается по тем же основным правилам.
2. Принцип построения индикатора «Ренко»
При разработке данного индикатора все функции были реализованы максимально независимо. Также одной из основных задач было максимально увеличить возможности индикатора для удобства анализа рынка.
Было решено отделить расчёты от текущего таймфрейма, то есть таймфрейм выбирается в настройках, и вне зависимости от того, на каком таймфрейме запущен индикатор, он будет показывать данные по таймфрейму, указанному в настройках. Это достигается за счёт копирования данных рассматриваемого периода в отдельные буферные массивы, и далее с ними уже производятся расчёты и заполнение выходных буферов индикатора.
Классическое построение графика «Ренко» подразумевает построение графика по ценам закрытия (Close), но для расширения возможностей анализа была добавлена возможность использования цен Open, High, Low.
Так как «кирпичи» на графике «Ренко» имеют одинаковый размер, при сильном движении цены (в несколько «кирпичей») было бы удобно знать, где рынок показывал себя наиболее энергично. Для этого существует (отключаемая) индикация в виде небольшой вертикальной «тени» (как у японских свечей) от «кирпича» поднимающейся или опускающейся на уровень последнего образованного «кирпича» от одного движения бара выбранного таймфрейма.
И последней наиболее выраженной особенностью данного индикатора является возможность производить построение типа «ZigZag» на основном графике, что также позволит расширить возможности графического анализа.
На рис. 3 приведён внешний вид индикатора в полной функциональности:
Рис.3. Внешний вид индикатора на графике EURUSD (Daily, шаг 25 пунктов)
3. Код и алгоритм индикатора
Код индикатора довольно-таки большой, и составляет в оформлении около 900 строк. Как говорилось ранее, функции максимально отделены друг от друга, это может усложнить понимание алгоритма. За основу были взяты некоторые функции из предыдущей статьи. В случае недопонимания каких-либо аспектов можно обратиться к предыдущей статье Индикатор для построения графика «Каги» или задать вопрос мне в личных сообщениях.
В статье будет происходить пояснения кода по функциям, в некоторых местах со связующими пояснениями. Функции будут описаны по мере их использования, чтобы облегчить понимание кода.
3.1. Входные параметры индикатора
Как было сказано ранее, график «Ренко» представляет собой совокупность поднимающихся и опускающихся «кирпичей» разного цвета, для такого построения необходимо всего пять буферов, объединённых в одно графическое построение типа «Разноцветные свечи». Остальные четыре буфера используются для хранения данных, которые необходимы для расчета индикатора.
Рассмотрим входные параметры (их 25), поделённых на группы.
Следом идёт объявление массивов расчетных буферов и вспомогательных переменных для функций: func_draw_renko, func_draw_zig_zag, func_draw_renko_main_chart, о которых будет рассказано позже.
3.2. Функция инициализации индикатора
В этой функции происходит связывание индикаторных буферов с одномерными динамическими массивами, для буферов типа INDICATOR_DATA и INDICATOR_COLOR_INDEX также задаётся адресация как в таймсериях. Остальные динамические массивы (Price[], Date[], Price_high[], Price_low[]), остаются без изменения направления адресации, так как не нуждаются в этом и служат только для хранения данных.
Далее задается значения, которые не будут отображаться на графике, задаётся имя индикатора, точность его отображения и запрещается показ текущих значений индикатора в окне индикатора.
Следом за этим производится присвоение значения переменной date_start (даты с которой следует начать расчёт). Происходит именно присвоение переменной, а не использование входного значения, так как график может оказаться гораздо больше, чем может в себя вместить индикаторный буфер, происходит некоторая коррекция начальной даты с предупреждением пользователя. Коррекцией времени занимается функция расчёта даты начала анализа или «func_calc_date_start».
3.3. Функция расчёта даты начала анализа
Сама функция по своему размеру небольшая и состоит в основном из цикла. Имеется всего два входных параметра, первоначально назначенная дата начала и дата окончания расчёта (текущая дата), первая из которых меняется внутри самой функции и выдаётся в виде ответа.
Тело функции начинается с измерения размера приёмного буферного массива (можно взять любой из буферных массивов для измерения размера, так как их размер одинаков и равняется количеству баров выбранного таймфрейма). Далее измеряется количество баров в выбранном промежутке времени.
В условии цикла сравнивается количество баров в выбранном промежутке времени и размер буферного массива. Если баров больше, то есть они все не поместятся в буферный массив, то выбранный промежуток времени урезается на десять дней, то есть к дате начала анализа прибавляется десять дней. Так продолжается до тех пор, пока буферный массив не сможет включить в себя все данные по барам. Функция возвращает рассчитанную дату.
3.4. Функции копирования данных
Для работы с данными их нужно сначала скопировать. Именно для этого существуют функции копирования данных (func_copy_price и func_copy_date), которые сейчас рассмотрим.
Начнём с функции копирования цены или func_copy_price, данная функция позволяет копировать в переданный ей массив цены Open, Close, High и Low за определённый таймфрейм и период, переданные в параметрах функции. В случае удачного копирования функция возвращает «true».
В начале вызова функции инициализируется возвращаемое значение false, далее происходит инициализация переменной результата скопированных данных, и присваивается отрицательное значение. Объявляется общий массив price_interim[] для временного хранения скопированных данных о ценах и переменная bars_to_copy для предотвращения копирования уже скопированных данных.
Далее функция обнуляет ранее объявленные переменные хранения количества скопированных данных, подсчитывает количество баров на временном промежутке и в зависимости от выбранного копируемого вида цены (0-Close, 1-Open, 2-High и 3-Low) при помощи оператора-переключателя switch присваивает значение количества ранее скопированных данных по ценам общей переменной bars_copied. Следом подсчитывается количество данных, которые нужно скопировать. Если данные копируются не в первый раз, происходит удаление информации о последнем скопированном баре, из-за того, что он мог измениться в ходе движения графика.
Опять при помощи оператора-переключателя происходит копирование нужного нам вида данных о ценах во временный массив price_interim[]. Следом проверяется результат копирования и опять при помощи оператора-переключателя switch, происходит заполнение переменных о количестве скопированных данных.
Следующая функция копирования даты или «func_copy_date». Код функции схож с ранее рассмотренным блоком, различие составляет вид копируемых данных, так что без комментариев.
3.5. Функция расчёта «Кирпичей»
Как видно из параметров индикатора, размер кирпича можно задавать не только в пунктах, но и в процентах от текущей цены. С пунктами всё легко, это фиксированная величина, а вот как же поступить с процентами? Для этого есть функция расчёта «кирпичей» или «func_calc_dorstep».
Функция имеет три входных параметра: текущая цена (цена от которой будет рассчитываться процент, в случае выбора процентного размера «кирпича»), выбранный тип расчёта (пунктовый или процентный), и размер шага (задаётся одной величиной, которая в зависимости от выбранного типа расчёта, считается за проценты или пункты).
В начале функции объявляется переменная для ответа типа double и в зависимости от выбранного типа расчёта, который проверяется условным оператором, переменная ответа получает значение в пунктах. Далее переменная ответа преобразуется в тип int, чтобы возвращаемое значение всегда было целым, даже если в ходе расчёта в процентном виде получился дробный результат.
Условно всю функцию можно поделить на две части: часть, отвечающая за подсчёт количества «кирпичей» и часть, отвечающую за заполнение расчетных и графических буферов.
Первая часть функции, как и вторая, состоит из цикла, вторая представляет собой дополненную первую. Разберём всё по-порядку.
Первый цикл проходит по всем скопированным значениям, количество скопированных данных определяет переменная «bars» (подсчитывается в функции «func_concolidation», которая будет рассмотрена позже). Далее в цикле происходит вызов функции вычисления размера «кирпича». Так как каждый бар имеет разную цену закрытия, соответственно, если использовать процентный размер шага, то его нужно высчитывать для каждого бара по отдельности.
Следом условными операторами if проверяется направление движения цены, но при этом цена должна пройти расстояние в один шаг или более. После определения направления движения цены происходит проверка условия предыдущего движения, то есть какой был построен последний «кирпич» (вверх или вниз). Это делается ввиду того, что в параметрах индикатора есть параметр фильтра (значение количества «кирпичей» для разворота). После проверки всех этих условий запускается цикл, который проходит ровно столько раз, сколько «кирпичей» может образовать текущее движение цены.
После цикла подсчёта «кирпичей» идёт главный цикл (заполнение расчетных и графических буферов), но перед этим происходит подсчёт количества баров для отображения, затем производится изменение размеров массивов расчетных буферов под максимально возможное отображение баров, а также их обнуление. После этого первым членам некоторых (основных, используемых при первом сравнении) расчетных массивов присваиваются первичные значения.
В случае, если максимально возможное количество отображаемых баров меньше возможного количества «кирпичей», для корректного отображения графика происходит подсчёт лишних «кирпичей» с выводом сообщения о низком значении шага.
Следом происходит обнуление переменной подсчёта «кирпичей» и начинается главный цикл. Отличие главного цикла от предыдущего в том, что в нём кроме выше указанных расчётов происходит ещё заполнение массивов расчетных буферов и сброс счётчика «кирпичей» по предварительно рассчитанным параметрам перед началом цикла.
В самом конце функции происходит заполнение графических буферов.
3.7. Функции создания графических объектов «трендовая линия» и «прямоугольник»
Функция создания графического объекта типа «трендовая линия» или «func_create_trend_line» и функция создания графического объекта типа «прямоугольник» или «func_create_square_or_rectangle» созданы по материалам, указанным в справке для объектов OBJ_RECTANGLE и OBJ_TREND. Служат для создания графических объектов в функции построения графика «Ренко» и для построения графика типа «ZigZag» на главном графике.
3.8. Построение графика «Ренко» на главном графике
Ввиду использования общих массивов буферов калькуляции, функция построения графика «Ренко» на главном графике или «func_draw_renko_main_chart», получилась достаточно компактной.
Входными параметрами служат: цвет поднимающегося и опускающегося «кирпича» а так же его рамка, два вида толщины рамок (первая для «кирпича» вторая для его рамки), и три параметра отображения («кирпичей», их заливки и рамок).
Для начала объявляются переменные содержащие названия для объектов, далее открывается цикл, в котором происходит генерация имени для каждого объекта и в зависимости от вида предыдущего «кирпича» происходит вызов функций построения графических объектов типов «трендовая линия» и «прямоугольник» с передачей им параметров из массивов буферов калькуляции.
3.9. Построение графика типа «ZigZag» на главном графике
Следующая функция, которая является своеобразном дополнением к индикатору, это функция построения графика «ZigZag» или «func_draw_zig_zag».
Входными параметрами тут является: вид прорисовки (по максимальным или минимальным ценам, или по точкам построения графика), толщина линии, цвет восходящей и нисходящей линии.
Пример изменения параметра «zig_zag_shadow» можно наблюдать на рисунке 4, здесь видно при выставлении в положении «true», индикатор рисует линии «ZigZag» по кончикам теней (то есть по максимальным или минимальным ценам), в положении «false», линии «ZigZag» рисуются по максимумам и минимумам графика «Ренко».
Рис.4. Пример влияния параметра «zig_zag_shadow» на EURUSD, H1, 10 пунктов.
Поскольку для построения объекта «трендовая линия» необходимы две точки (начальная и конечная), вводим две переменные, отвечающие за параметр цены, и две переменные, отвечающие за параметр даты. Задаём первую точку в зависимости от вида начального «кирпича» при помощи условных операторов.
Следом идёт цикл, при помощи которого и осуществляется построение всех объектов. Как можно заметить, цикл начинается с анализа второго «кирпича», так как первая точка уже задана. Далее условным оператором проверяется, изменился ли тип «кирпича» (направление движения цены). Затем заполняется переменная названия объекта, и, в зависимости от вида смены движения, при помощи условных операторов происходит раздвоение цикла. В свою очередь, оно также делится на два варианта в зависимости от параметра вида прорисовки.
Если используется отображение по максимальным и минимальным ценам, то задействуются описанные ранее динамические массивы данных Price_high[] и Price_low[], с их помощью осуществляется поиск приближенных минимальных или максимальных точек, поиск ограничен соседними барами.
Если же построение производится по точкам построения графика, то здесь всё очень просто, происходит присвоение данных из массивов расчетных буферов.
После определения с двумя точками построения, вызывается уже знакомая функция построения графического объекта «трендовая линия». На этом функция заканчивает анализ и построение графика «ZigZag».
3.10. Функция для удаления графических объектов
Ранее было продумано использование «магического» номера для определения принадлежности объектов к индикатору, это делалось для удобства запуска нескольких индикаторов на одном графике и для удобства удаления объектов.
Для удобства была создана функция, которая консолидирует в себе функции для удаления всех объектов, созданных индикатором.
3.11. Функция создания уровней
Ещё одна небольшая функция для более удобного представления графика в окне индикатора, это функция создания уровней или «func_create_levels». Имеет всего два входных параметра: количество создаваемых уровней и цвет уровней.
В теле функции задаётся количество отображаемых уровней при помощи функции IndicatorSetInteger, потом по очереди в цикле каждому уровню задаётся ценовой уровень и цвет.
3.12. Функция консолидации
Для объединения всех выше разобранных функций была создана функция консолидации или «func_concolidation».
3.13. Функции OnCalculate() и OnChartEvent()
Перед тем как перейти к функции OnCalculate(), рассмотрим ещё маленькую функцию анализа появления нового бара или «func_new_bar».
Функция представляет собой упрощённый вид функции, описанной в IsNewBar.
Функция OnCalculate() отвечает за запуск функции консолидации в случае, если появляется новый бар на периоде обновления графика, заданном в параметрах индикатора.
Функция OnChartEvent() имеет два действия: это очистка графика в случае нажатия кнопки «C» (осуществляется вызовом функции удаления графических объектов) и перерисовка графика (вызов функции консолидации) в случае нажатия кнопки «R».
3.14. Функция OnDeinit()
И, наконец, функция выхода или OnDeinit(). Функция вызывает только функцию удаления всех графических объектов, созданных индикатором.
4. Практическое применение графика «Ренко»
График «Ренко» ориентирован в основном для определения основной тенденции движения.
Иллюстрацию этого классического метода можно наблюдать на рис. 5:
Рис.5. Пример классической работы на графике «Ренко» на EURUSD (H4, 20 пунктов)
На рисунке 5 обозначены шесть возможных точек (A,B,C,D,E,F) для входа в рынок.
В точке «A» видно, что после восходящего «кирпича» образовался нисходящий «кирпич».
Вход осуществляется сразу, здесь как и в других точках (B,C,D), первый образованный «кирпич» в противоположном направление образован одним движением, что нельзя сказать о точке «E», так как там на одном движении было образованно сразу два «кирпича». Это видно по образованным теням, вниз заканчивающимися на одном уровне.
В этом случае вход возможен между точками «E» и «F», как видно из графика это не совсем удачный вход, так как цена идёт в противоположном направлении, на точке «F» аналогичная ситуация. Там тоже из-за одного движения образуется сразу два «кирпича». Это видно по теням вверх, заканчивающихся на одном уровне. Хотя это и было сильное движение, но цена сохранила своё направление.
Из этого можно сделать вывод, что когда рынок более спокоен, и одно движение образует только один «кирпич» (об этом можно судить по теням) в противоположном направлении, то это наиболее благоприятный момент для входа в рынок, а если видно образование сразу нескольких «кирпичей», то такой вход может быть небезопасным.
Построение типа «ZigZag» на данном графике можно использовать для графического анализа, на рис. 6 показано несколько таких примеров: определение линии «поддержки» и «сопротивления», а также модели «Голова и плечи».
Рис.6. Пример использования графического анализа на GBPUSD (H4, 20 пунктов)
Ещё один пример графического анализа «Равноудаленный канал», показан на рис. 7.
Для более точного построения индикатор был настроен на анализ часового таймфрейма, а сам вывод построения был сделан на четырёхчасовом таймфрейме.
Такие настройки позволяют рассматривать сигналы на нескольких таймфреймах одновременно, то есть на одном можно применить один индикатор, а на втором другой.
Рис.7. Пример графического анализа «Равноудаленный Канал» USDCHF, H4, настройки H1, 20 пунктов.
На рис. 8 приведён ещё один пример получения на одном графике сигналов с различных таймфреймов.
Можно видеть, что часовой график показывает возможные ближайшие перевороты, четырехчасовой график их заглаживает (отфильтровывает лишние сигналы), а дневной график утверждает долгосрочное направление тенденции.
Рис.8. Пример использования индикатора на GBPUSD, H1, H4 и D1
Ещё один пример, ориентированный именно на индикатор, представлен на рис. 9. Правило гласит: «строй восходящую линию между двумя ближайшими красными «кирпичами», имеющие между собой хоть один синий «кирпич», в дальнейшем при образовании «кирпича», под линией, продавай».
И наоборот: «строй нисходящую линию между двумя ближайшими синими «кирпичами», имеющие между собой хоть один красный «кирпич», в дальнейшем при образовании «кирпича», над линией, покупай».
Цвета в правиле указаны в соответствии с рис. 9. На рис. 9 синими и красными мелкими стрелками также обозначены места, служащие опорой для построения линии и крупными стрелками места, служащие сигналами для купли или продажи.
Рис.9. Пример использования индикатора на GBPUSD, H4, 25 пунктов
Заключение
График «Ренко» будет интересен как для начинающих, так и для профессионалов рынка. Спустя много лет, он не остался позади, и по сей день находит применение на рынке.
В этой статье я хотел привлечь внимание к этому графику и модернизировать анализ графиков «Ренко». Постарался подробнее рассказать о принципе построения графика «Ренко», принципе работы индикатора и его особенностях.
Буду рад комментариям и предложениям, а также любым модификациям и расширению возможностей. В статье представлено несколько вариантов применения индикатора, также вы можете найти свои варианты его использования.
Всем спасибо за проявленный интерес к статье. Желаю удачной торговли и постижения новых торговых стратегий.