/// <summary> /// Обработчик появления новых данных /// Вычисляет среднюю за период /// Вычисляет отклонение источника от средней за период /// </summary> ///// <param name="item">Bar</param> //public override void OnEvent(long id) public void Do(long id) { ///вычисляем новые занчения ///Input //double iMa = Indicator.EMAi(closePrices.ToList<double>(), Period, Ma.ToList<double>()); //double iDe = closePrices.Last() - iMa; double iMa = Indicator.Ema_i(Input.Value.ToList <double>(), Period, Ma.ToList <double>()); double iDe = Input.Value.Last() - iMa; Ma.Add(iMa); De.Add(iDe); ///вызываем обработчики значений foreach (var handler in HandlersMa) { handler.Invoke(Ma.Last()); } foreach (var handler in HandlersDe) { handler.Invoke(De.Last()); } ///упаковка посчитанных значений ValueMa.Add(new ValueDouble() { Id = id, //DateTime = item.DateTime, Name = "Ma", Value = iMa }); ValueDe.Add(new ValueDouble() { Id = id, //DateTime = item.DateTime, Name = "De", //TODO 4. сейчас отрисовывается по имени MaFast, надо переделать на стороне отрисовки //Name = "MaDeviation", Value = iDe }); ///отправка посчитанных значений foreach (var handler in HandlersValueMa) { handler.Invoke(ValueMa.Last()); } foreach (var handler in HandlersValueDe) { handler.Invoke(ValueDe.Last()); } }
/// <summary> /// Обработчик появления нового бара /// Вычисляет отклонение цены (закрытия) от средней за период /// </summary> /// <param name="item">Bar</param> public override void OnItemAdded(Bar item) { bar = item; if (item.Symbol != this.strategyHeader.Symbol) { return; } bs = this.tradingData.Get <IEnumerable <BarSettings> >().SingleOrDefault(s => s.StrategyId == this.strategyHeader.Id); if (bs == null) { throw new System.Exception("BarSettings bs == null"); //return; } //barsSet <= bars //IEnumerable<Bar> bars = this.tradingData.Get<IEnumerable<Bar>>().GetNewestBars(bs.Symbol, bs.Interval); IEnumerable <Bar> barsSet = this.tradingData.Get <IEnumerable <Bar> >().GetNewestBars(bs.Symbol, bs.Interval, bs.Period + 1); //int barsCount = bars.Count(); int barsCount = this.tradingData.Get <IEnumerable <Bar> >().GetNewestBars(bs.Symbol, bs.Interval).Count(); if (barsSet == null || barsSet.Count() == 0) { return; } IEnumerable <double> closePrices = from b in barsSet select b.Close; ///вычисляем новые занчения double iMa = Indicator.EMA_i(closePrices.ToList <double>(), Period, Ma.ToList <double>()); double iDe = closePrices.Last() - iMa; Ma.Add(iMa); De.Add(iDe); ///вызываем обработчики значений foreach (var handler in HandlersMa) { handler.Invoke(Ma.Last()); } foreach (var handler in HandlersDe) { handler.Invoke(De.Last()); } ///упаковка посчитанных значений ValueMa.Add(new ValueDouble() { Id = barsCount - 1, DateTime = item.DateTime, Name = "MaSlow", Value = iMa }); ValueDe.Add(new ValueDouble() { Id = barsCount - 1, DateTime = item.DateTime, Name = "MaFast", //TODO 4. сейчас отрисовывается по имени MaFast, надо переделать на стороне отрисовки //Name = "MaDeviation", Value = iDe }); ///отправка посчитанных значений foreach (var handler in HandlersValueMa) { handler.Invoke(ValueMa.Last()); } foreach (var handler in HandlersValueDe) { handler.Invoke(ValueDe.Last()); } }