using System;
using TSLab.DataSource;
using TSLab.Script;
using TSLab.Script.Handlers;
using System.Collections.Generic;
namespace CandleFromTick
{
[HandlerCategory("CandleFromTick")]
[HandlerName("Tick Candles")]
class GetCan
{
public int last_tick = 0;
public int step = 0;
public string sec_code = "";
public List<DataBar> OurBars = new List<DataBar>();
}
static class Kontroller
{
public static List<GetCan> _can;
}
public class TickCandle : IOneSourceHandler, ISecurityInputs, ISecurityReturns, IStreamHandler, IContextUses
{
public IContext Context { set; get; }
[HandlerParameter(Name = "Кол-во тиков в свече", Default = "16", Min = "2", Max = "64", Step = "1")]
public int Step { get; set; }
public ISecurity Execute(ISecurity sec)
{
if (sec.IntervalBase.ToString() != "TICK" || sec.Interval.ToString() != "1")
throw new Exception("Base Interval wrong. Please set to Seconds 1");
if (Kontroller._can == null)
{
Kontroller._can = new List<GetCan>();
}
int baseList = -1;
if (Kontroller._can.Count > 0)
{
for (var i = Kontroller._can.Count; i < Kontroller._can.Count; i++)
{
if (Kontroller._can[i].sec_code == sec.Symbol && Kontroller._can[i].step == Step) baseList = i;
}
}
if (baseList < 0)
{
Kontroller._can.Add(new GetCan() { step = Step, sec_code = sec.Symbol, last_tick = 0 });
baseList = Kontroller._can.Count - 1;
}
var tickcount = sec.Bars.Count;
//int c_b = Convert.ToInt32(Math.Ceiling(sec.Bars.Count + 1m / Step));
for (var i = Kontroller._can[baseList].last_tick; i < tickcount; i++)
{
int start = Convert.ToInt32((Math.Ceiling((i + 1m) / Step) * Step) - Step);
int NCan = Convert.ToInt32(Math.Ceiling((i + 1m) / Step) - 1);
var open = sec.Bars[i].Open;
var close = sec.Bars[i].Close;
var high = sec.Bars[i].High;
var low = sec.Bars[i].Low;
var date = sec.Bars[i].Date;
if (Kontroller._can[baseList].OurBars.Count < NCan + 1)
{
var bar = new DataBar(sec.Bars[i].Date, sec.Bars[i].Open, sec.Bars[i].High, sec.Bars[i].Low, sec.Bars[i].Close, 0, 0);
Kontroller._can[baseList].OurBars.Add(bar);
}
for (var j = start; j < i + 1; j++)
{
date = sec.Bars[j].Date;
if (j == start) open = sec.Bars[j].Open;
if (high < sec.Bars[j].High) high = sec.Bars[j].High;
if (low > sec.Bars[j].Low) high = sec.Bars[j].High;
if (j == i) close = sec.Bars[j].Close;
}
Kontroller._can[baseList].OurBars[NCan + 1].Date = date;
Kontroller._can[baseList].OurBars[NCan + 1].Open = open;
Kontroller._can[baseList].OurBars[NCan + 1].High = high;
Kontroller._can[baseList].OurBars[NCan + 1].Low = low;
Kontroller._can[baseList].OurBars[NCan + 1].Close = close;
if ((i + 1) % Step == 0)
{
Kontroller._can[baseList].last_tick = i;
Console.WriteLine("last_tick " + Kontroller._can[baseList].last_tick.ToString());
}
}
Console.WriteLine("кол-во копрессионных свечей " + Kontroller._can[baseList].OurBars.Count.ToString());
/*
хочу убрать этот блок
var comp = sec.CompressTo(new Interval(Step * sec.Interval, sec.IntervalBase));
var vtoBars = new DataBar[comp.Bars.Count];
for (int k = 0; k < comp.Bars.Count; k++)
{
var open = comp.Bars[k].Open;
var close = comp.Bars[k].Close;
var high = comp.Bars[k].High;
var low = comp.Bars[k].Low;
var date = comp.Bars[k].Date;
var bar = new DataBar(date, open, high, low, close, 0, 0);
vtoBars[k] = bar;
}
var vto = comp.CloneAndReplaceBars(vtoBars);
*/
// хочу выгрузить копрессионные бары из Kontroller._can[baseList].OurBars
var comp2 = sec.CompressTo(new Interval(Step * sec.Interval, sec.IntervalBase));
var vto2 = comp2.CloneAndReplaceBars(Kontroller._can[baseList].OurBars);
return vto2;
}
}
}