Example #1
0
        /// <summary>
        /// делаем из тиков рейндж бары:
        /// первый вариант:
        /// обрабатываем поступление нового тика:
        /// поступивший тик добавляем в текущий бар
        ///     если текущий бар отсутсвует или
        ///     если текущий бар в состоянии "закончен"
        ///     создаем новый текущий бар
        ///         сгенерировать событие на "создание" бара
        ///     добавить новый текущий бар в контекст
        ///     проверяем завершение бара новым тиком
        ///         если текущий бар готов т.е. может быть закончен
        ///             переводим текущий бар в состояние "закончен"
        ///             сгенерировать событие на "закончен" бара
        ///     выходим из процесса обработки
        ///
        /// в этом случае рейндж завершенного бара >= лимиту рейндж
        /// после завершения бара новый бар не создается до поступления нового тика
        ///
        /// сущности
        ///     тик
        ///     текущий бар
        /// </summary>
        /// <param name="tick"></param>
        public void OnItemAdded_v1(Tick tick)
        {
            /// обрабатываем поступление нового тика:
            /// валидация Symbol тика
            if (barSettings.Symbol != tick.Symbol)
            {
                if (tick.Symbol == "")
                {
                    tick.Symbol = barSettings.Symbol;
                }
                else
                {
                    return;
                }
            }

            /// <summary>
            /// внутренние состояния обработчика в процессе обработки тика
            /// </summary>
            String state = "Update";

            ///     если текущий бар отсутсвует или
            ///     если текущий бар в состоянии "закончен"
            if ((barCurrent == null) ||
                (barCurrent.State == Enums.BarState.Finished))
            {
                state = "Create";
                /// создаем новый текущий бар
                barCurrent = barBuilder.CreateBar(tick, tick.DateTime);
                ///         сгенерировать событие на "создание" бара
            }

            /// поступивший тик добавляем в текущий бар
            else if (state == "Update")
            {
                barCurrent = barBuilder.UpdateBar(barCurrent, tick);
                state      = "Updated";
            }
            ///     проверяем завершение бара новым тиком
            if (barBuilder.CheckRangeReach(barCurrent))
            {
                ///         если текущий бар готов т.е. может быть закончен
                ///             переводим текущий бар в состояние "закончен"
                barBuilder.FinishBarState(barCurrent);
                state = "Finished";
                ///             сгенерировать событие на "закончен" бара
                ///             добавить завершенный бар в контекст
                this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fff}, {1}, добавлен новый бар {2}", DateTime.Now, this.GetType().Name, barCurrent.ToString()));
                this.tradingData.Get <ObservableCollection <Bar> >().Add(barCurrent);
            }
        }
Example #2
0
        public void BarBuilder_СоздатьНовый_Bar()
        {
            var tick = ticks[0];
            Bar bar  = barBuilder.CreateBar(tick, tick.DateTime);

            Assert.IsNotNull(bar);
            Assert.AreEqual(barSettings.Symbol, bar.Symbol);
            Assert.AreEqual(barSettings.Interval, bar.Interval);

            Assert.AreEqual(bar.Open, tick.Price);
            Assert.AreEqual(bar.High, tick.Price);
            Assert.AreEqual(bar.Low, tick.Price);
            Assert.AreEqual(bar.Close, tick.Price);
            Assert.AreEqual(bar.Volume, tick.Volume);
            Assert.AreEqual(bar.DateTime, tick.DateTime);
        }