using System.Collections.Generic;
using System.Linq;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
namespace TSLab.Community.Ichimoku
{
[HandlerCategory("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; }
}
[HandlerCategory("Ichimoku")]
public class TenkanSen : BaseSen, IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "9", Min = "3", Max = "25", Step = "1")]
public override int Period { get; set; }
}
[HandlerCategory("Ichimoku")]
public class KijunSen : BaseSen, IBar2DoubleHandler, IContextUses
{
[HandlerParameter(true, "26", Min = "5", Max = "52", Step = "1")]
public override int Period { get; set; }
}
[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 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; }
}
[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 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; }
}
[HandlerCategory("Ichimoku")]
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; }
}
}