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