Автор: Sergey_gt
Компрессия тиков в свечи - Sun Mar 05 2017 10:06 PM
задача произвести компрессию нестандартным способом иметь возможность не производить компрессию с первого тика , а производить это с последними
Code:
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; } } }