У вас не стоит Flash Player
Настройки
#81358 - Sun Mar 05 2017 10:06 PM Компрессия тиков в свечи
Sergey_gt Offline
newbie

Registered: Mon Sep 20 2010
Записи: 27
задача произвести компрессию нестандартным способом иметь возможность не производить компрессию с первого тика , а производить это с последними

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;
        }
    }
}

Наверх
#81551 - Tue Mar 28 2017 01:29 PM Re: Компрессия тиков в свечи [Re: Sergey_gt]
Stan Offline
veteran

Registered: Wed Oct 02 2013
Записи: 1357
При компиляции выдает ошибки!!!

Наверх


Moderator:  ViL, sar