Адаптивный Renko
09.03.2002.
*******************
10.03.2002. Алгоритм "Адаптивного Ренко" для Метастока от Сергея Косинского. "формулы для Metastock'a"
*******************
Сначала несколько слов о методике Renko из книги Ахелиса "Технический анализ от А до Я":
"Графический метод Ренко,
очевидно, получил свое имя от
японского «renga», что означает «кирпич».
В употребление эти графики были
введены Стивом Нисоном.
Графики Ренко похожи на график типа
«three line break». Их отличие от последних
заключается в том, что линии (или «кирпичики»)
строятся в основном направлении
цены, только если базовая величина (box
size) была превышена. Кирпичики
всегда имеют одинаковый размер.
Например, если базовый размер
составляет 5 пунктов, а цена выросла
на 20, то будет нарисовано 4 «кирпичика»
одинакового размера. Чтобы
построить «кирпичики Ренко»,
текущая цена закрытия сравнивается
с максимумом и минимумом
предыдущего «кирпичика» (белого
или черного цвета). Если цена
закрытия выше максимума
предыдущего «кирпичика» на
величину базового размера или
больше, то в следующей колонке
рисуется один или большее
количество белых блоков одинаковой
высоты. Если рынок ушел вверх на
величину большую, чем требуется для
одного «кирпичика», но ее не
хватает, чтобы нарисовать два «кирпичика»,
то рисуется только один «кирпичик».
Например, на графике Ренко с
базовым значением равным 2 и
текущей ценой равной 100, при
повышении цены до 102, будет
нарисован один белый «кирпичик».
Такое же количество было бы
нарисовано, если бы цена повысилась
до 103. Промежуток движения от 102 до 103
не отображается на графике.
Аналогично поступают и при падении
цены, если падение не достигает
величины кратной размеру делителя (box
size).
Интерпретация:
Сигнал о развороте основного
тренда поступает, когда появляется
выпадающий из цветового ряда белый
или черный «кирпичик». Новый белый
«кирпичик» индицирует
подтверждение нового восходящего
тренда. В то время как новый черный
«кирпичик» служит подтверждением
нового нисходящего. Графики Ренко
относятся к методам слежения за
трендом и они малоэффективны на «пилообразном»
безтрендовом рынке. Однако,
методики следящие за трендом
позволяют трейдерам «оставаться на
коне» большую часть времени в
моменты трендового развития
событий. Т.к. Ренко фильтрует
незначительные колебания цены
вверх-вниз, этот метод великолепно
помогает в определении уровней
поддержки/сопротивления."
Методика Ренко графически реализована в Метастоке, однако это ни на йоту не приближает нас к практическому ее применению. Что пользы нам от пустого созерцания черных и белых "кирпичиков", любезно прорисованных на экране монитора стараниями специалистов Equis? Во-первых, прежде чем использоваться в торговле, любой метод должен быть объективно и всесторонне протестирован на исторических данных. Необходимо точное подтверждение работоспособности алгоритма, выраженное в математически однозначных цифрах отчета. Во-вторых, задание размера бокса (высоты кирпичика Ренко) в абсолютных пунктах (особенно на рынке акций) весьма неразумный подход. Потому, как реальное наполнение, либо ущерб нашему счету приносят именно относительные, а отнюдь не абсолютные изменения цены актива.
Идею использовать в качестве параметра Ренко некий объективный показатель подсказал мне в частной переписке Роман (ник Lohinson на "форуме у Мойши"). Первое, что пришло в голову - задавать размер "кирпичика" в единицах Average True Range (ATR).
Рассмотрим на примере: Предположим, цена акции =5 руб. Средний реальный диапазон (ATR) = 0,2 руб. Пусть высота кирпичика Ренко будет равна 1 ATR. Если цена акции вырастет с 5 руб. до 5,1 руб. на графике Ренко не произойдет никаких изменений, т.к. движение цены не превысило высоты кирпичика. Если цена вырастет с 5 руб. до 5,3 руб., нам необходимо будет добавить один "белый" кирпичик Ренко (движение превысило 1 ATR, но не достигло 2-х ATR). Два кирпичика будут добавлены, если цена вырастет выше 5,4 руб. и т.д. Обратная логика будет применяться при снижении цены для рисования "черных" кирпичиков. Так как ATR изменяется во времени и его динамика отражает состояние рынка, мы каждый раз будем иметь разную абсолютную высоту кирпичика в пунктах. И эта величина будет объективно адаптирована к характеру изменения цен.
Рисование кирпичиков занятие весьма увлекательное, однако, опять же, далекое от реального тестирования. Для этой цели гораздо более полезно изобразить алгоритм Ренко в виде графического канала. Нижняя граница канала будет соответствовать нижней грани кирпичика, верхняя граница, соответственно - верхней. К тому же, такое изображение Ренко дает лучшее понимание принципов методики. Движение цены выше верхней границы канала больше чем на 1ATR переместит эту границу ровно на 1ATR вверх. При этом нижняя граница канала окажется ровно на 1ATR ниже верхней. Обратное будет верно для движения цены ниже нижней границы канала на величину превышающую 1ATR. В результате мы имеем ценовой канал с довольно интересной характеристикой. Максимальный диапазон движения цены без изменения границ канала может составлять до 3 ATR, но при определенных условиях, движение цены менее одного ATR уже приведет к смещению границ канала. Таким образом, канал становится объективным - измеренным в единицах реального торгового диапазона. И адаптивным - его ширина и момент "переключения" (добавления очередного кирпичика) меняется в зависимости от условий на рынке и динамики цен.
Алгоритм получения торговых сигналов - традиционный для Ренко. Появление "белого кирпичика", или в нашей интерпретации, движение (ступенька) канала вверх, дает сигнал на покупку. Появление "черного кирпичика", или движение канала вниз дает сигнал на продажу.
Реализация данной методики может быть произведена различными способами. Можно учитывать изменение ATR на каждом баре, тогда кирпичик получится "плавающим" по размеру (этакая сырая глина в руках рынка - как хочу, так и мну). Однако, многочисленные тесты убедили меня, что лучше всего замерять ATR "один-раз-на-кирпич", именно в момент переключения канала (добавления очередного/очередных кирпичиков). В результате происходит дополнительное сглаживание резких движений (в компанию к периоду усреднения ATR). Предположим, рынок был вялым, с незначительными колебаниями и, соответственно, низким значением ATR. Последующее резкое движение цен (что чаще всего и происходит после "отстоя") добавит сразу несколько "кирпичиков" в направлении движения цены, но высота кирпичиков сильно не изменится, что позволит более точно контролировать ситуацию. На приведенном ниже рисунке хорошо видно, что в январе 2002 года, после резкого роста цен, высота очередного кирпичика оказалась даже меньше предыдущей, что позволило своевременно зафиксировать прибыль от удачного лонга, открытого еще в октябре 2001 г.
Мы видим, что цены могут совершать довольно значительные колебания вокруг границ канала. Однако размах этих колебаний всегда объективно ограничен величиной среднего торгового диапазона (ATR). Также обратите внимание, что при росте канала (добавлении "белого" кирпичика), нижняя граница канала не равна предыдущей верхней границе, как это было бы при использовании абсолютных пунктов в измерении высоты кирпичика (стандартный box size). То же неравенство границ присутствует и при снижении канала (добавлении "черных" кирпичиков). Это связано именно с адаптивной, меняющейся высотой кирпичиков, в зависимости от характера рынка.
Следует добавить, что в качестве объективной меры для определения высоты кирпичиков Ренко можно использовать и другие доступные "измерители" свойств рынка. Это может быть и стандартное отклонение цены, и средний модуль приращений цен закрытия и многое другое.
Ниже приведены коды индикатора и сигнала стратегии Renko_Adaptive для Омеги на Easy Language. (В стратегии, параметр Short служит для разрешения (true) или запрещения (false) "коротких" позиций.)
Индикатор:
{Renko-Adaptive
indicator (based on ATR)
Written by konkop 07.03.2002.
*********************
Attention: set MaxBarsBack (f.e. =30) in this study according
with
MaxBarsBack value in the Renko_Adaptive strategy
for correct step-by-step calculations of the buy/sell levels
*********************}
Inputs: K(1),
Smooth(10);
vars:Brick(0) ,DN(0), UP(0), BricksUp(0), BricksDn(0);
Value1 = AvgTrueRange(Smooth);
If BarNumber = 1 Then Begin
Up = H;
Dn = L;
Brick = K*(H - L);
End;
If BarNumber > 1 then begin
If C > UP + Brick Then begin
BricksUp = IFF(Brick = 0, 0, Floor((C - Up)/Brick)*Brick);
UP = Up + BricksUp;
Brick = K*Value1;
DN = Up - Brick;
BricksDn = 0;
End;
If C < Dn - Brick Then begin
BricksDn = IFF(Brick = 0, 0, Floor((Dn - C)/Brick)*Brick);
Dn = Dn - BricksDn;
Brick = K*Value1;
Up = Dn + Brick;
BricksUp = 0;
End;
End;
Plot1(UP, "Up");
Plot2(DN, "Dn");
{***************end of code****************}
Сигнал:
{Renko-Adaptive signal (based on
ATR)
Written by konkop 07.03.2002.
*********************
Attention: set MaxBarsBack (f.e. =30) in this study according
with
MaxBarsBack value in the Renko_Adaptive indicator
for correct step-by-step calculations of the buy/sell levels
*********************}
Inputs: K(1),
Smooth(10),
Short(false);
vars: Brick(0) ,DN(0), UP(0), BricksUp(0), BricksDn(0);
Value1 = AvgTrueRange(Smooth);
If BarNumber = 1 Then Begin
Up = H;
Dn = L;
Brick = K*(H-L);
End;
If BarNumber > 1 then begin
If C > UP + Brick Then begin
BricksUp = IFF(Brick = 0, 0, Floor((C - Up)/Brick)*Brick);
UP = Up + BricksUp;
Brick = K*Value1;
DN = Up - Brick;
BricksDn = 0;
End;
If C < Dn - Brick Then begin
BricksDn = IFF(Brick = 0, 0, Floor((Dn - C)/Brick)*Brick);
Dn = Dn - BricksDn;
Brick = K*Value1;
Up = Dn + Brick;
BricksUp = 0;
End;
{Trade Rules with or without short trades}
If Short = false then begin
If Up > Up[1] then buy at C;
If Dn < Dn[1] then exitlong at C;
End;
If Short = true then begin
If Up > Up[1] then buy at C;
If Dn < Dn[1] then sell at C;
{If C <
Dn[1] then exitlong;
If C > Up[1] then exitshort;}
End;
End;
{****************end of code***************}
Файл ELA с приведенными кодами.
Два важных замечания:
1. В связи с тем, что алгоритм Ренко считается нарастающим итогом, начиная с первого бара графика, в свойствах индикатора и стратегии в Омеге следует установить одинаковое значение параметра MaxBarsBack (например 30), чтобы расчет обеих методик начинался с одного бара. Иначе может возникнуть ситуация, когда визуально индикатор меняет направление, а сигнал стратегии не поступает.
2. В коде сигнала (для простоты) я не учитывал такую ситуацию: При значительном возрастании ATR, высота следующего "кирпичика" может превысить двойную высоту предыдущего "кирпичика". Тогда, например при движении цены вверх, верхняя граница канала окажется выше предыдущей, а нижняя - ниже предыдущей. В таком случае, чтобы избежать двойного сигнала на одном баре, надо лишь добавить дополнительные фильтры, скажем для покупки: If Up > Up[1] and C > Up[1] then buy at C; Вариантов всевозможных фильтров и дополнительных условий может быть много (например, фрагмент кода в фигурных скобках), поэтому я не стал усложнять и перегружать ими текст методики.
И напоследок. Результаты тестов на трехлетней истории часовок РАО ЕЭС. Сделки только лонг, ММ - постоянная сумма сделки = $10.000. Параметр Ренко - высота кирпичика = 1ATR(21).
Total Net Profit | $50 927.40 | Open position P/L | $0.00 | |||
Gross Profit | $76 583.63 | Gross Loss | ($25 656.22) | |||
Total # of trades | 120 | Percent profitable | 51.67% | |||
Number winning trades | 62 | Number losing trades | 58 | |||
Largest winning trade | $8 009.68 | Largest losing trade | ($1 629.03) | |||
Average winning trade | $1 235.22 | Average losing trade | ($442.35) | |||
Ratio avg win/avg loss | 2.79 | Avg trade (win & loss) | $424.40 | |||
Max consec. Winners | 6 | Max consec. losers | 5 | |||
Avg # bars in winners | 37 | Avg # bars in losers | 16 | |||
Max intraday drawdown | ($3 150.65) | |||||
Profit Factor | 2.98 | Max # contracts held | 34 602 | |||
Account size required | $3 150.65 | Return on account | 1616.41% |
(c) konkop 2002