Ошибка при использование CandleBuilder.Contaimer


Ошибка при использование CandleBuilder.Contaimer
Atom
11/1/2012


Коллеги,

в методе CandleBuilder.IsCandleFinishedBeforeChange(..)
есть строки вида

Code
IList<ICandleBuilderSourceValue> data = Container.GetValues(series, candle).ToList();
int i = data.Count;


Непонятно по какой причине иногда (точно не скажу при каких условиях, сделок очень много строитель обрабатывает),
i получается равным 0 , но это же неверно, так как если мы дошли до вызова метода IsCandleFinishedBeforeChange(..), значит был вызов CreateCandle, значит свечка из чего то же сформировалась (то есть была минимум одна сделка)

Tags:


Thanks:


Alexander

Avatar
Date: 11/13/2012
Reply


Приведите лог когда i = 0, в каких ситуациях это возникает - тестирование на истории, торговля, ....

Используется стандартный CandleBuilderContainer? Container.ValuesKeepTime чему равен?
Thanks:

Tauler

Avatar
Date: 11/13/2012
Reply


Возникает i=0 в процессе построения свечей в , используя в качестве источника RawConvertableCandleBuilderSource<Trade>
сделки в этом источнике созданы из текстового файла, их много (история за 5 дней, самих сделок больше полумиллиона)

Используется стандартный CandleBuilderContaine, Container.ValuesKeepTime >0 (ставил и 10 секунд, и минуту)

i=0 становится в середине процесса построения свечей.

А какой лог Вы имеете ввиду?
Thanks:

Alexander

Avatar
Date: 11/14/2012
Reply


Это на 4.1.6? Если нет - проверьте там.

А какие свечи строите? И если ValuesKeepTime = 1 дню (или по крайней мере больше чем таймфрейм построения свечей).
Thanks:

Tauler

Avatar
Date: 11/14/2012
Reply


Это было на 4.1.4 ,свечи - кастомные.
Thanks:

Alexander

Avatar
Date: 11/14/2012
Reply


Тогда проверьте на 4.1.6 с ValuesKeepTime = 1 дню
Если тоже самое - кидайте код своего билдера свечек
Thanks:

Tauler

Avatar
Date: 11/14/2012
Reply


на 4.1.6 воспроизводится.

Code
public class RangeHLCandleBuilder : CandleBuilder<RangeHLCandle>
    {
        private decimal prevClose = 0;
        public RangeHLCandleBuilder()
        {
            this.Container.ValuesKeepTime = new TimeSpan(1,0,0,0);
        }

        public RangeHLCandleBuilder(ICandleBuilderContainer container) : base(container)
        {}

        protected override RangeHLCandle CreateCandle(StockSharp.Algo.Candles.CandleSeries series, ICandleBuilderSourceValue value)
        {
            RangeHLCandle candle = new RangeHLCandle
                                       {
                                           Range = (decimal) series.Arg
                                       };
            FirstInitCandle(series, candle, value);
            

            candle.OpenTime = value.Time;
            candle.CloseTime = value.Time;
            candle.LowTime = value.Time;

            if (prevClose == 0)
                return candle;

            candle.OpenPrice = prevClose;

            this.AddInfoLog(String.Format("Created, Open = {0}", candle.OpenPrice));
            return candle;
        }

        public override IEnumerable<Range<DateTime>> GetSupportedRanges(CandleSeries series)
        {
            IEnumerable<Range<DateTime>> supportedRanges = base.GetSupportedRanges(series);

            if (!supportedRanges.IsEmpty())
            {
                if (!(series.Arg is decimal))
                {
                    throw new ArgumentException();
                }
                if (((decimal)series.Arg) <= 0)
                {
                    throw new ArgumentOutOfRangeException();
                }
            }
            return supportedRanges;
        }

        protected override bool IsCandleFinishedBeforeChange(CandleSeries series, RangeHLCandle candle, ICandleBuilderSourceValue value)
        {
            int i = this.Container.GetValues(series, candle).Count();
            if (i == 0)
            {
                int k = 2/i; //проверка на дефект
            }

            bool firstCandle = ((candle.HighPrice - candle.LowPrice) > (decimal) candle.Arg) &&
                               (series.GetCandles<RangeHLCandle>().Count() == 1);
            bool nextCandle = (Math.Abs(candle.OpenPrice - candle.ClosePrice) >= (decimal) candle.Arg) &&
                               (series.GetCandles<RangeHLCandle>().Count() > 1);

            bool byDate = candle.LowTime.Date != candle.CloseTime.Date;

            if ( firstCandle || nextCandle || byDate)
                {
                    prevClose = candle.ClosePrice;
                    return true;
                }
            

            return false;
        }

        protected override void UpdateCandle(CandleSeries series, RangeHLCandle candle, ICandleBuilderSourceValue value)
        {
            base.UpdateCandle(series, candle, value);

            candle.LowTime = candle.CloseTime;
            candle.CloseTime = value.Time;

        }

    }


метод для создания сделок из файла:
Code
 public static List<Trade> MakeDealsFromHistory(string file)
        {
            List<Trade> trades = new List<Trade>();
            using (StreamReader sr = new StreamReader(file))
            {
                String line;
                int i = 0;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line == "<TICKER>;<PER>;<DATE>;<TIME>;<CLOSE>;<VOL>")
                        continue;
                    i++;
                    string[] lines = line.Split(';');
                    Trade trade = new Trade
                    {
                        Id = i,
                        Price = Convert.ToDecimal(lines[4]),
                        Volume = Convert.ToInt32(lines[5])
                    };
                    trade.Time = new DateTime(Convert.ToInt32(lines[2].Substring(0, 4)),
                                              Convert.ToInt32(lines[2].Substring(4, 2)),
                                              Convert.ToInt32(lines[2].Substring(6, 2)),
                                              Convert.ToInt32(lines[3].Substring(0, 2)),
                                              Convert.ToInt32(lines[3].Substring(2, 2)),
                                              Convert.ToInt32(lines[3].Substring(4, 2))
                                              );

                    trades.Add(trade);
                }
            }
            return trades;
        }

файл со сделками прикреплю к посту.
Заметил, что с Container.ValuesKeepTime равным дню свечи очень долго строятся. Чем меньше Container.ValuesKeepTime, тем быстрее строятся. на Container.ValuesKeepTime = 1 минута баг возникает очень быстро.
RIZ2_1.zip 3 MB (200)
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy