#7249 - Mon Jun 28 2010 05:47 PM
Стратегия Renko
|
journeyman
Registered: Mon Jun 28 2010
Записи: 59
|
В этот раз речь пойдет про методику Renko. Немного теории. Для этого открываем книгу Стивена Б. Ахелиса "Технический анализ от А до Я" и читаем: "Графический метод Ренко, очевидно, получил свое имя от японского «renga», что означает «кирпич». В употребление эти графики были введены Стивом Нисоном. Графики Ренко похожи на график типа «three line break». Их отличие от последних заключается в том, что линии (или «кирпичики») строятся в основном направлении цены, только если базовая величина (box size) была превышена. Кирпичики всегда имеют одинаковый размер. Например, если базовый размер составляет 5 пунктов, а цена выросла на 20, то будет нарисовано 4 «кирпичика» одинакового размера. Чтобы построить «кирпичики Ренко», текущая цена закрытия сравнивается с максимумом и минимумом предыдущего «кирпичика» (белого или черного цвета). Если цена закрытия выше максимума предыдущего «кирпичика» на величину базового размера или больше, то в следующей колонке рисуется один или большее количество белых блоков одинаковой высоты. Если рынок ушел вверх на величину большую, чем требуется для одного «кирпичика», но ее не хватает, чтобы нарисовать два «кирпичика», то рисуется только один «кирпичик». Например, на графике Ренко с базовым значением равным 2 и текущей ценой равной 100, при повышении цены до 102, будет нарисован один белый «кирпичик». Такое же количество было бы нарисовано, если бы цена повысилась до 103. Промежуток движения от 102 до 103 не отображается на графике. Аналогично поступают и при падении цены, если падение не достигает величины кратной размеру делителя (box size). Интерпретация: Сигнал о развороте основного тренда поступает, когда появляется выпадающий из цветового ряда белый или черный «кирпичик». Новый белый «кирпичик» индицирует подтверждение нового восходящего тренда. В то время как новый черный «кирпичик» служит подтверждением нового нисходящего. Графики Ренко относятся к методам слежения за трендом и они малоэффективны на «пилообразном» безтрендовом рынке. Однако, методики следящие за трендом позволяют трейдерам «оставаться на коне» большую часть времени в моменты трендового развития событий. Т.к. Ренко фильтрует незначительные колебания цены вверх-вниз, этот метод великолепно помогает в определении уровней поддержки/сопротивления."
Думаю, приведенное описание методики достаточно четко и понятно объясняет ее. Поэтому, переходим к рассмотрению кода на C# для TSLab. Код, как и в прошлый раз, «снабжен» достаточно большим количеством комментариев, что позволяет в нем легко ориентироваться. Вот так эта система будет выглядеть в виде кода: /*================================================================================
* Стратегия: Графический метод Ренко
* Платформа: TSLab версия 1.1.7.0
* Дата создания: 03.06.2010
* Реализовано: Laber
*================================================================================*/
using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;
namespace TSLab.Renko
{
//================================================================================
public class Renko : IExternalScript
{
// используем переменные-флаги для сигналов
public bool bBuy; // флаг сигнала открытия длинной позиции
public bool bSell;
public bool bShort;
public bool bCover;
public IPosition LongPos, ShortPos;
//================================================================================
// Параметры оптимизации
public OptimProperty Param_Period = new OptimProperty(10, 2, 20, 2);
public OptimProperty Param_Koef = new OptimProperty(10, 2, 20, 2);
//================================================================================
public virtual void Execute(IContext ctx, ISecurity source)
{
int StartBar = 1;
#region Variables
int ATR_period; // период расчета ATR
double vATR; // значение ATR для текущего бара
double CurATR; // текущее примененное значение ATR
double kATR; // коэффициент для расчета CurATR
int Dir; // направление последовательности Ренко (+1 вверх, -1 вниз)
int PrevDir; // предыдущее направление последовательности
double HighRange; // значение верхней границы для текущего бара
double LowRange; // значение нижней границы для текущего бара
double TrueRange; // значение "истинного диапазона"
// независимых данных нет - кэширование не применяется
// серия значений верхней границы
IList<double> nHighRange = new List<double>(source.Bars.Count);
// серия значений нижней границы
IList<double> nLowRange = new List<double>(source.Bars.Count);
#endregion
//--------------------------------------------------------------------------------
#region Init vars
Dir = 0;
#endregion
//--------------------------------------------------------------------------------
// Obtain parameters
ATR_period = Param_Period;
kATR = Param_Koef * 1.0 / 10;
#region значения для первой свечи
TrueRange = source.HighPrices[StartBar] - source.LowPrices[StartBar];
vATR = TrueRange;
CurATR = vATR * kATR;
HighRange = source.HighPrices[StartBar];
LowRange = source.LowPrices[StartBar];
#endregion
//================================================================================
#region основной цикл - проход по барам
int barsCount = source.Bars.Count;
for (int bar = 0; bar < barsCount-1; bar++)
{
//--------------------------------------------------------------------------------
#region calculate values
TrueRange = source.HighPrices[bar] - source.LowPrices[bar];
if (bar > StartBar)
{
if (source.LowPrices[bar] > source.ClosePrices[bar-1])
TrueRange = TrueRange + (source.LowPrices[bar] - source.ClosePrices[bar-1]);
if (source.HighPrices[bar] < source.ClosePrices[bar-1])
TrueRange = TrueRange + (source.ClosePrices[bar-1] - source.HighPrices[bar]);
}
vATR = vATR + (TrueRange - vATR) / ATR_period;
int CDir = 0;
if ((source.ClosePrices[bar] - HighRange) > CurATR)
{
HighRange = HighRange + Math.Floor((source.ClosePrices[bar] - HighRange) / CurATR) * CurATR;
CurATR = vATR * kATR;
LowRange = HighRange - CurATR;
CDir = 1;
}
if ((LowRange - source.ClosePrices[bar]) > CurATR)
{
LowRange = LowRange - Math.Floor((LowRange - source.ClosePrices[bar]) / CurATR) * CurATR;
CurATR = vATR * kATR;
HighRange = LowRange + CurATR;
CDir = -1;
}
PrevDir = Dir;
int NewDir = Dir;
if ((Dir > -1) && (CDir < 0)) NewDir = -1;
if ((Dir < 1) && (CDir > 0)) NewDir = 1;
Dir = NewDir;
#endregion
//--------------------------------------------------------------------------------
#region data series
nHighRange.Add(HighRange);
nLowRange.Add(LowRange);
#endregion
//--------------------------------------------------------------------------------
#region generate signals
// сброс значений сигналов
bBuy = false;
bSell = false;
bShort = false;
bCover = false;
// установка сигналов по условиям
if (Dir > 0 && PrevDir <= 0)
{
bBuy = true;
bCover = true;
}
if (Dir < 0 && PrevDir >= 0)
{
bShort = true;
bSell = true;
}
#endregion
//================================================================================
#region execute signals
//--------------------------------------------------------------------------------
// выполнение сигналов для длинной позиции
IPosition LongPos = source.Positions.GetLastActiveForSignal("LN");
if (LongPos == null)
{
// Если нет активной длинной позиции
if (bBuy)
{
// Если есть сигнал Buy,
// выдаем ордер на открыте новой длинной позиции.
source.Positions.BuyAtMarket(bar+1, 1, "LN");
}
}
else
{
// Если есть активная длинная позиция
if (bSell)
{
// Если есть сигнал Sell,
// выдаем ордер на закрыте длинной позиции.
LongPos.CloseAtMarket(bar+1, "LX");
}
}
//--------------------------------------------------------------------------------
// выполнение сигналов для короткой позиции
IPosition ShortPos = source.Positions.GetLastActiveForSignal("SN");
if (ShortPos == null)
{
// Если нет активной короткой позиции
if (bShort)
{
// Если есть сигнал Short
// выдаем ордер на открыте новой короткой позиции.
source.Positions.SellAtMarket(bar+1, 1, "SN");
}
}
else
{
// Если есть активная короткая позиция,
if (bCover)
{
// Если есть сигнал Cover
// выдаем ордер на закрыте короткой позиции.
ShortPos.CloseAtMarket(bar+1, "SX");
}
}
#endregion
}
#endregion
//================================================================================
#region прорисовка графиков
// Берем основную панель (Pane)
IPane mainPane = ctx.First;
// Отрисовка верхней и нижней границы условных прямоугольников
mainPane.AddList("HighRange", nHighRange, ListStyles.LINE, 0x0000a0, LineStyles.DOT, PaneSides.RIGHT);
mainPane.AddList("LowRange", nLowRange, ListStyles.LINE, 0xa00000, LineStyles.DOT, PaneSides.RIGHT);
#endregion
//--------------------------------------------------------------------------------
}
}
} На графике отображены границы условных квадратиков Ренко:  А вот результаты работы стратегии, основанной на описанном методе Renko в виде скриншотов. Кривая капитала: Отчет с результатами тестирования: В прикрепленных файлах можно найти всю необходимую информацию по этой стратегии.
Attachments
scheme_script.xml (806 downloads)Description: блок-схема в xml-формате
chart.png (5766 downloads)Description: сриншот графика с границами equity.png (5052 downloads)Description: скриншот кривой капитала (доходности стратегии)
report.png (4682 downloads)Description: скриншот отчета по результатам тестированияrenko.cs (762 downloads)Description: скрипт на C#
Отредактировано Laber (Mon Jun 28 2010 06:10 PM)
|
Наверх
|
|
|
|
#7251 - Mon Jun 28 2010 06:04 PM
Re: Стратегия Renko
[Re: Laber]
|
Pooh-Bah
Registered: Wed Jan 13 2010
Записи: 1835
|
В виде индикатора или блока в визуале мы увидим ренко.?Давно жду.
_________________________
Делаю простые вещи.
|
Наверх
|
|
|
|
#7254 - Mon Jun 28 2010 06:08 PM
Re: Стратегия Renko
[Re: profit]
|
Pooh-Bah
Registered: Wed Jan 13 2010
Записи: 1835
|
Не установлен внешний скрипт.Это как понимать?
_________________________
Делаю простые вещи.
|
Наверх
|
|
|
|
#7261 - Mon Jun 28 2010 07:06 PM
Re: Стратегия Renko
[Re: Laber]
|
Carpal Tunnel
Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
|
Спасибо!
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика» Дизраэли.
|
Наверх
|
|
|
|
#7262 - Mon Jun 28 2010 07:07 PM
Re: Стратегия Renko
[Re: profit]
|
Carpal Tunnel
Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
|
Не установлен внешний скрипт.Это как понимать? Скачай renko.cs в лабе в блоке внешний скрипт укажи место где он находится, и будет тебе Щ!астье!
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика» Дизраэли.
|
Наверх
|
|
|
|
#7264 - Mon Jun 28 2010 07:30 PM
Re: Стратегия Renko
[Re: 777]
|
Pooh-Bah
Registered: Wed Jan 13 2010
Записи: 1835
|
Ес ЩАстье!Рахмет!
_________________________
Делаю простые вещи.
|
Наверх
|
|
|
|
#7269 - Mon Jun 28 2010 08:02 PM
Re: Стратегия Renko
[Re: profit]
|
Pooh-Bah
Registered: Wed Jan 13 2010
Записи: 1835
|
У меня ещё вопрос-это блоки не имеющие возможность прицепить к ним трейлы тейк профиты?
_________________________
Делаю простые вещи.
|
Наверх
|
|
|
|
|
|