Привет всем,
Готов еще один интересный индикатор для TSLab – индикатор Ишимоку (Ichimoku).
Для версии программы 2.0
ЗДЕСЬ Для версии программы 1.2 без ошибок
Здесь Стараниями jhgjrht
Ниже дано его описание, взятое с
http://www.forex-indicators.ru/description-indicator-ichimoku/Индикатор Ишимоку определяет уровни поддержки и сопротивления, а также точный временной интервал входа в рынок при пробое уровней.
Также имеется толковая книга, описывающая работу с индикатором: «Индикатор Ишимоку как основа торговой системы», Терехов А.Ю.
http://www.koob.ru/terehov_a_y/indikator_ishimoku_kak_osnovaОписание индикатора ИшимокуИндикатор Ишимоку Кинко Хайо представляет из себя набор из пяти линий (Тенкан-сен, Кинджун-Спен, Сенкоу-Спен «B», Чикоу-Спен). Он довольно эффективно работает при начале начинающейся новой тенденции, т.е четко выялвяет начало, направление и точки входа в рынок.
Опишем кратко линии индикатора и какую функцию они выполняют.
1. Тенкан-Сен (разворотная линич) (красная линия) определяет краткосрочную линию тенденции, сигнализирующая начало «быстрой» тенденции. Показывает направление текущей краткосрочной тенденции и являясь средним значением за первый промежуток времени (high +low)/2 (high, low – максимум, минимум). Если линия Тенкан-Сен находится в восходящей направлении, то на рынке присутствует повышательная тенденция, если же линия направлена вниз- то на рынке присутствует нисходящий тренд. Если же линия параллельна оси времени – то на рынке затишься.
2. Киджун сен – (основная линия) (синяя линия) – долгосрочная линия тенденции. Показывает тренд более старшего временного промежутка, его направление. Т.е если линия киджун сен идет вверх- то рынок бычий, если же направлена вниз- то рынок медвежий.
3. Сенкоу-Спен «А» - (опережающая линия) определяется как середина торгового диапазона линий тенкан-сен и Кинжун-сен и сдвинутого вперед на величину второго временного промежутка. Линия сенкоу-спен является верхней границей «облака», а также сопротивлением и поддержкей.
Сенкоу-Спен «В» - (опережающая линия) – определяется как середина максимума и минимума за длинный (третий) временной интервал и сдвинутый вперед на величину второго временного промежутка Сенкоу Спен «В». Также является нижней границе облака Ишимоку.
4 . Чикоу-Спен – (запаздывающая линия) это график цен закрытия, сдвинутый на некоторый временной промежуток. Обычно составляет 5, 9, 26, 34
Облако ишимоку.Облаком Ишимоку является промежуток между линиями Сенкоу-А и Сенкоу В и обычно штрихуется в другой цвет.
Параметры индикатора ишимоку Параметрами по-умолчанию индикатора Ишимоку является:
Тенкан-Сен: 9
Киджун-Сен: 26
Сенкон-Спен В: 52
Важная особенность индикатора состоит в том, что если цена располагается выше, так называемого, «облака, то на рынке повышательная тенденция. Если же цена располагается ниже «облака», то рынок медвежий. А если цена располагается внутри самого «облака», то это боковая тенденция и стоит находиться вне рынка.
Исходный кодКод индикатора приведен ниже.
Просьба спецов по .Net и по TSLab прокомментировать, где можно улучшить код-производительность и т.д. Планирую еще выкладывать индикаторы, хочется писать сразу хорошо.using System.Collections.Generic;
using System.Linq;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
namespace TSLab.Community.Ichimoku
{
public abstract class BaseSen
{
public virtual int Period { get; set; }
public IList<double> Execute(ISecurity source)
{
// for cacheing purpose using Context.GetData
var high = Context.GetData("Highest", new[] { Period.ToString() },
() => Series.Highest(source.HighPrices, Period));
var low = Context.GetData("Lowest", new[] { Period.ToString() },
() => Series.Lowest(source.LowPrices, Period));
IList<double> list = new List<double>(high.Count);
for (int i = 0; i < high.Count; i++)
{
var avg = (high[i] + low[i]) / 2;
list.Add(avg);
}
return list;
}
public IContext Context { get; set; }
}
public class TenkanSen : BaseSen, IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "9", Min = "3", Max = "25", Step = "1")]
public override int Period { get; set; }
}
public class KijunSen : BaseSen, IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "26", Min = "5", Max = "52", Step = "1")]
public override int Period { get; set; }
}
public class SenkouA : IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "9", Min = "3", Max = "25", Step = "1")]
public int TenkanPeriod { get; set; }
[HandlerParameter(true, "26", Min = "5", Max = "52", Step = "1")]
public int KijunPeriod { get; set; }
public IList<double> Execute(ISecurity source)
{
var tenkan = new TenkanSen { Period = TenkanPeriod, Context = Context }.Execute(source);
var kijun = new KijunSen { Period = KijunPeriod, Context = Context }.Execute(source);
var count = source.HighPrices.Count + KijunPeriod;
var result = new double[count];
for (int i = 0; i < source.HighPrices.Count; i++)
{
var middle = kijun[i] + (tenkan[i] - kijun[i]) / 2;
result[i+KijunPeriod] = middle;
}
return result;
}
public IContext Context { get; set; }
}
public class SenkouB : IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "52", Min = "25", Max = "255", Step = "1")]
public int Period { get; set; }
[HandlerParameter(true, "26", Min = "5", Max = "52", Step = "1")]
public int KijunPeriod { get; set; }
public IList<double> Execute(ISecurity source)
{
var avg = new TenkanSen { Period = Period, Context = Context }.Execute(source);
var count = source.HighPrices.Count + KijunPeriod;
var result = new double[count];
for (int i = 0; i < source.HighPrices.Count; i++)
{
result[i + KijunPeriod] = avg[i];
}
return result;
}
public IContext Context { get; set; }
}
public class Chinkou : IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "26", Min = "5", Max = "52", Step = "1")]
public int KijunPeriod { get; set; }
public IList<double> Execute(ISecurity source)
{
var close = source.ClosePrices;
var result = new double[close.Count-KijunPeriod];
for (int i = 0; i < result.Count(); i++)
{
result[i] = close[i + KijunPeriod];
}
return result;
}
public IContext Context { get; set; }
}
Индикатор в редакторе
Где находится