using System.Collections.Generic;
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 IContext Context { get; set; }
static double CalcMiddle(IListvalues, int start, int finish) {
double min = float.MaxValue, max = -float.MaxValue;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
if (v.High > max)
max = v.High;
if (v.Low < min)
min = v.Low;
}
return 0.5 * (max + min);
}
static double CalcSmoothMiddle(IListvalues, int start, int finish) {
double m = 0;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
m += v.High + v.Low + v.Close + v.Open;
}
m /= 4 * (finish — start + 1);
return m;
}
public IListExecute(ISecurity source) {
// Исходный вариант
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));
var list = new double[ high.Count ];
for (int i = 0; i < high.Count; i++)
list[ i ] = 0.5 * (high[ i ] + low[ i ]);
return list;
/*// Другие варианты
int c = source.Bars.Count;
var list = new double[ c ];
for (int i = Period; i < c; i++)
//list[i] = CalcMiddle(source.Bars, i — Period, i — 1);
list[ i ] = CalcSmoothMiddle(source.Bars, i — Period, i — 1);
return list;*/
}
}
/// /// Tenkan-sen — короткая линия тренда (дословный перевод — линия переворота).
/// Линия трактуется как указатель направления тренда: чем больше крутизна этой линии,
/// тем более ярко выражен тренд. Если линия горизонтальна — рынок вошел в канал.
/// Кроме того, как и любая средняя, эта линия может
/// рассматриваться как поддержка или сопротивление.
///
[HandlerCategory(«Ichimoku»)]
public class TenkanSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «9», Min = «3», Max = «25», Step = «1»)]
public override int Period { get; set; }
}
/// /// Kijun (Kijun-sen), «линия стандарта» — среднее значение цены за второй,
/// более продолжительный промежуток времени.
/// Используется как показатель движения рынка. Если цена выше нее, цены,
/// вероятно, будут продолжать расти. Когда цена пересекает эту линию,
/// вероятно дальнейшее изменение тренда.
/// Другим вариантом использования Kijun является подача сигналов. Сигнал к покупке
/// генерируется когда линия Tenkan пересекает Kijun снизу вверх.
/// Если сверху-вниз — сгнал к продаже.
///
///
[HandlerCategory(«Ichimoku»)]
public class KijunSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public override int Period { get; set; }
}
/// /// SenkouA (Senkou Span A) — среднее от /> и />,
/// сдвинутое вперед на величину периода KijunSen (26).
///
[HandlerCategory(«Ichimoku»)]
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 IListExecute(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;
var result = new double[ count ];
for (int i = KijunPeriod + KijunPeriod; i < count; i++)
result[ i ] = 0.5 * (tenkan[ i — KijunPeriod ] + kijun[ i — KijunPeriod ]);
return result;
}
public IContext Context { get; set; }
}
/// /// SenkouB (Senkou Span B) — среднее значение цены за третий временной интервал (52),
/// сдвинутое вперед на величину второго интервала (26).
/// Расстояние между линиями /> и /> штрихуется и
/// называется «облаком». Если цена находится между этими линиями, рынок считается нетрендовым,
/// а края облака в таком случае образуют поддержку и сопротивление.
/// Если цена находится над облаком, то обе линии — поддержки. Если под, то сопротивления.
///
[HandlerCategory(«Ichimoku»)]
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 IListExecute(ISecurity source) {
var avg = new TenkanSen { Period = Period, Context = Context }.Execute(source);
var count = source.HighPrices.Count;
var result = new double[ count ];
for (int i = Period + KijunPeriod; i < count; i++)
result[ i ] = avg[ i — KijunPeriod ];
return result;
}
public IContext Context { get; set; }
}
/// /// Chinkou Span (Chinkou) — показывает цену закрытия текущей свечи,
/// сдвинутую назад на величину второго временного интервала (26).
/// Не рекомендуется использовать при тестировании на исторических данных,
/// поскольку индикатор «смотрит в будущее».
/// Если линия пересекает график цены снизу-вверх, это является сигналом к покупке.
/// Если сверху-вниз — сигналом к продаже.
///
[HandlerCategory(«Ichimoku»)]
public class Chinkou: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var close = source.ClosePrices;
var result = new double[ close.Count ];
for (int i = 0; i < result.Length — KijunPeriod; i++)
result[ i ] = close[ i + KijunPeriod ];
return result;
}
using System.Collections.Generic;
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 IContext Context { get; set; }
static double CalcMiddle(IListvalues, int start, int finish) {
double min = float.MaxValue, max = -float.MaxValue;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
if (v.High > max)
max = v.High;
if (v.Low < min)
min = v.Low;
}
return 0.5 * (max + min);
}
static double CalcSmoothMiddle(IListvalues, int start, int finish) {
double m = 0;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
m += v.High + v.Low + v.Close + v.Open;
}
m /= 4 * (finish — start + 1);
return m;
}
public IListExecute(ISecurity source) {
// Исходный вариант
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));
var list = new double[ high.Count ];
for (int i = 0; i < high.Count; i++)
list[ i ] = 0.5 * (high[ i ] + low[ i ]);
return list;
/*// Другие варианты
int c = source.Bars.Count;
var list = new double[ c ];
for (int i = Period; i < c; i++)
//list[i] = CalcMiddle(source.Bars, i — Period, i — 1);
list[ i ] = CalcSmoothMiddle(source.Bars, i — Period, i — 1);
return list;*/
}
}
/// /// Tenkan-sen — короткая линия тренда (дословный перевод — линия переворота).
/// Линия трактуется как указатель направления тренда: чем больше крутизна этой линии,
/// тем более ярко выражен тренд. Если линия горизонтальна — рынок вошел в канал.
/// Кроме того, как и любая средняя, эта линия может
/// рассматриваться как поддержка или сопротивление.
///
[HandlerCategory(«Ichimoku»)]
public class TenkanSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «9», Min = «3», Max = «25», Step = «1»)]
public override int Period { get; set; }
}
/// /// Kijun (Kijun-sen), «линия стандарта» — среднее значение цены за второй,
/// более продолжительный промежуток времени.
/// Используется как показатель движения рынка. Если цена выше нее, цены,
/// вероятно, будут продолжать расти. Когда цена пересекает эту линию,
/// вероятно дальнейшее изменение тренда.
/// Другим вариантом использования Kijun является подача сигналов. Сигнал к покупке
/// генерируется когда линия Tenkan пересекает Kijun снизу вверх.
/// Если сверху-вниз — сгнал к продаже.
///
///
[HandlerCategory(«Ichimoku»)]
public class KijunSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public override int Period { get; set; }
}
/// /// SenkouA (Senkou Span A) — среднее от /> и />,
/// сдвинутое вперед на величину периода KijunSen (26).
///
[HandlerCategory(«Ichimoku»)]
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 IListExecute(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;
var result = new double[ count ];
for (int i = KijunPeriod + KijunPeriod; i < count; i++)
result[ i ] = 0.5 * (tenkan[ i — KijunPeriod ] + kijun[ i — KijunPeriod ]);
return result;
}
public IContext Context { get; set; }
}
/// /// SenkouB (Senkou Span B) — среднее значение цены за третий временной интервал (52),
/// сдвинутое вперед на величину второго интервала (26).
/// Расстояние между линиями /> и /> штрихуется и
/// называется «облаком». Если цена находится между этими линиями, рынок считается нетрендовым,
/// а края облака в таком случае образуют поддержку и сопротивление.
/// Если цена находится над облаком, то обе линии — поддержки. Если под, то сопротивления.
///
[HandlerCategory(«Ichimoku»)]
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 IListExecute(ISecurity source) {
var avg = new TenkanSen { Period = Period, Context = Context }.Execute(source);
var count = source.HighPrices.Count;
var result = new double[ count ];
for (int i = Period + KijunPeriod; i < count; i++)
result[ i ] = avg[ i — KijunPeriod ];
return result;
}
public IContext Context { get; set; }
}
/// /// Chinkou Span (Chinkou) — показывает цену закрытия текущей свечи,
/// сдвинутую назад на величину второго временного интервала (26).
/// Не рекомендуется использовать при тестировании на исторических данных,
/// поскольку индикатор «смотрит в будущее».
/// Если линия пересекает график цены снизу-вверх, это является сигналом к покупке.
/// Если сверху-вниз — сигналом к продаже.
///
[HandlerCategory(«Ichimoku»)]
public class Chinkou: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var close = source.ClosePrices;
var result = new double[ close.Count ];
for (int i = 0; i < result.Length — KijunPeriod; i++)
result[ i ] = close[ i + KijunPeriod ];
return result;
}
public IContext Context { get; set; }
}
}