public void BarBuilderTimeBar_СоздатьЭкземплар() { BarBuilderTimeBar barBuilder = null; Assert.IsNull(barBuilder); BarSettings barSettings; Common.Enums.DataModelType barType; barBuilder = CreateBarBuilderTimeBar(out barSettings, out barType); Assert.IsNotNull(barBuilder); Assert.AreEqual(barBuilder.BarSettings.BarType, barType); Assert.IsNotNull(barBuilder.BarList); Assert.AreEqual(barBuilder.TimeSpanInterval.TotalSeconds, barBuilder.BarSettings.Interval); Assert.AreEqual(barBuilder.DateTimeStart.Date, DateTime.Now.Date); Assert.AreEqual(barBuilder.DateTimeStart.TimeOfDay, barBuilder.BarSettings.DateTimeStart.TimeOfDay); Assert.AreNotEqual(barBuilder.BarList.Count, 0); ///15 чаосов * 60 мин = 900 мин Assert.AreEqual(barBuilder.BarList.Count, 900); Assert.AreEqual(barBuilder.BarList.First().DateTimeOpen, (DateTime.Now.Date).AddHours(9)); Assert.AreEqual(barBuilder.BarList.First().DateTime, (DateTime.Now.Date).AddHours(9) + barBuilder.TimeSpanInterval); Assert.AreEqual(barBuilder.BarList.Last().DateTimeOpen, (DateTime.Now.Date).AddHours(24) - barBuilder.TimeSpanInterval); Assert.AreEqual(barBuilder.BarList.Last().DateTime, (DateTime.Now.Date).AddHours(24)); Assert.AreEqual(barBuilder.BarList.Last().Interval, barBuilder.BarSettings.Interval); Assert.AreEqual(barBuilder.BarList.Last().Symbol, barBuilder.BarSettings.Symbol); }
//public MakeTimeBarsOnTick(BarSettings barSettings, ITimeTrackable timeTracker, IDataContext tradingData, ILogger logger) public MakeTimeBarsOnTick(BarSettings barSettings, IDataContext tradingData, ILogger logger) : base(tradingData.Get <ObservableCollection <Tick> >()) { this.tradingData = tradingData; this.barSettings = barSettings; this.logger = logger; //подменяем тип бара на TimeBar if (this.barSettings.BarType != Enums.DataModelType.TimeBar) { this.barSettings.BarType = Enums.DataModelType.TimeBar; } this.barBuilder = new BarBuilderTimeBar(barSettings); // по умолчанию должен быть null //barCurrent = new Bar(); }
public void BarBuilderTimeBar_GetNewBarTest() { BarBuilderTimeBar barBuilder = null; Assert.IsNull(barBuilder); BarSettings barSettings; Common.Enums.DataModelType barType; barBuilder = CreateBarBuilderTimeBar(out barSettings, out barType); var tick = new Tick(barSettings.Symbol, new DateTime(2016, 7, 10, 10, 0, 00, 600), 151000, 25); var bar = barBuilder.GetBarTemplate(tick); Assert.IsNotNull(bar); Assert.IsTrue(bar.DateTimeOpen == new DateTime(2016, 7, 10, 10, 0, 0)); Assert.IsTrue(bar.DateTimeOpen <= tick.DateTime); Assert.IsTrue(bar.DateTime > tick.DateTime); Assert.IsTrue(bar.Symbol == tick.Symbol); Assert.IsTrue(bar.State == BarState.None); Assert.IsTrue(barBuilder.BarList.First().DateTimeOpen == new DateTime(2016, 7, 10, 10, 1, 0)); Assert.IsTrue(barBuilder.BarList.Last().DateTime == new DateTime(2016, 7, 11, 00, 0, 0)); Assert.AreEqual(barBuilder.DateTimeStart.Date, (new DateTime(2016, 7, 10, 00, 0, 0)).Date); try { // проверяем генерацию exception когда // Не удалось создать нужный интервал tick = new Tick(barSettings.Symbol, new DateTime(2016, 7, 10, 08, 0, 00, 600), 151000, 25); bar = barBuilder.GetBarTemplate(tick); Assert.Fail("no exception thrown"); Assert.IsNull(bar); } catch (Exception ex) { //Assert.IsTrue(ex is Exception); //Assert.IsTrue(ex.Message == "Не удалось создать нужный интервал"); } }
public override void OnItemAdded(Tick tick) { if (barSettings.Symbol != tick.Symbol) { if (flagLogSymbol) { this.logger.Log(String.Format("Ошибка. тик Symbol {0}, {1}", barSettings.Symbol, tick.Symbol)); Console.WriteLine(String.Format("Ошибка. тик Symbol {0}, {1}", barSettings.Symbol, tick.Symbol)); flagLogSymbol = false; } return; } // П1 // Проверяем попадание Тика в текущий бар try { //// У10 //// Если Тик попадает в текущий бар ////// Выходим //if ((barCurrent.DateTime.AddSeconds(-barSettings.Interval) < item.DateTime)&& if ((barCurrent.DateTimeOpen <= tick.DateTime) && (barCurrent.DateTime > tick.DateTime)) { return; } if (barCurrent.DateTimeOpen > tick.DateTime) { this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fffffff}, {1}, Ошибка. тик перед баром {2}", DateTime.Now, this.GetType().Name, barCurrent.ToString())); return; } } catch (System.NullReferenceException e) { // П2 //// Исключение //// Если текущий бар отсутсвует ////// Запрашиваем новый текущий бар у барбилдера ////// Выходим if (barCurrent == null) { //state = "Created"; barCurrent = barBuilder.GetBarTemplate(tick); return; } //throw; throw e; } //// У11 //// Есди Тик выходит за текущий бар ////// Завершаем текщий бар IEnumerable <Tick> barTicks = GetTicksInRangeOf(tick, barCurrent.DateTimeOpen, barCurrent.DateTime); ////// TODO вопрос как правильно поступать если не было тиков в диапазоне? //////if (barTicks == null) ///// return; if (barTicks.Count() == 0) { //заполнить бар по предыдущему бару barCurrent = BarBuilderTimeBar.SetBarOHLCV(barCurrent, barPrevious); //return; } else { //заполнить бар по списку тиков barCurrent = BarBuilderTimeBar.SetBarOHLCV(barCurrent, barTicks); } barBuilder.FinishBarState(barCurrent); ////// state = "Finished"; ////// сгенерировать событие на "закончен" бара ////// добавить завершенный бар в контекст if (TradingDataBarExists(barCurrent.DateTime) != true) { this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fffffff}, {1}, добавлен новый бар {2}", DateTime.Now, this.GetType().Name, barCurrent.ToString())); this.tradingData.Get <ObservableCollection <Bar> >().Add(barCurrent); } else { this.logger.Log(String.Format("{0:dd/MM/yyyy H:mm:ss.fffffff}, {1}, Ошибка. Не добавлен бар {2}", DateTime.Now, this.GetType().Name, barCurrent.ToString())); //throw new Exception(String.Format("{0:dd/MM/yyyy H:mm:ss.fffffff}, {1}, Exception новый бар {2}", DateTime.Now, this.GetType().Name, barCurrent.ToString())); } ////// Запрашиваем новый текущий бар у барбилдера barCurrent = barBuilder.GetBarTemplate(tick); return; ////// Выходим }