← Zurück

Различия значений Indicator.GetCurrentValue и ChartingIndicatorValue

При тестировании обнаружил, что в рамках одной и той же обрабатываемой свечи значения одного и того же индикатора разные при вызове Indicator.GetCurrentValue и ChartingIndicatorValue.

Исходный код такой



        public CandleSeries series { get; set; }
        private SimpleMovingAverage LongSma { get; set; }
        private SimpleMovingAverage ShortSma { get; set; }
        private AwesomeOscillator AweOsc { get; set; }
        private ChartIndicatorElement LongSmaInd { get; set; }
        private ChartIndicatorElement ShortSmaInd { get; set; }
        private ChartIndicatorElement AweInd { get; set; }

        protected override void OnStarted()
        {
            base.OnStarted();

            LongSma = new SimpleMovingAverage();
            LongSma.Length = 60;
           
            ShortSma = new SimpleMovingAverage();
            ShortSma.Length = 20;

            AweOsc = new AwesomeOscillator(LongSma, ShortSma);
        
            series
                .WhenCandlesFinished()
                .Do(ProcessCandle)
                .Apply(this);

            if (Params.chartIndex)
            {
                LongSmaInd = new ChartIndicatorElement { Title = "LongSMA", Indicator = LongSma, Color = Colors.DarkBlue};
                MainWindow.Instance.GuiAsync(() => HistoryChart.Areas[0].Elements.Add(LongSmaInd));

                ShortSmaInd = new ChartIndicatorElement { Title = "ShortSMA", Indicator = ShortSma, Color = Colors.Crimson};
                MainWindow.Instance.GuiAsync(() => HistoryChart.Areas[0].Elements.Add(ShortSmaInd));

                AweInd = new ChartIndicatorElement { Title = "DiffSMA", Indicator = AweOsc, Color = Colors.Crimson};

            }

            ......
       }
private void ProcessCandle(Candle candle)
        {

            if (Params.chartIndex)
            {
                var OpenTime = candle.OpenTime;
                var myDic = new Dictionary<IChartElement, object>();


                    var valLongSMA = LongSmaInd.Indicator.Process(new CandleIndicatorValue(candle) );
                    var ValueLongSMA = new ChartIndicatorValue(LongSmaInd.Indicator, valLongSMA);
                    myDic.Add(LongSmaInd, ValueLongSMA);

                    var valShortSma = ShortSmaInd.Indicator.Process(new CandleIndicatorValue(candle) );
                    var ValueShortSma = new ChartIndicatorValue(ShortSmaInd.Indicator, valShortSma);
                    myDic.Add(ShortSmaInd, ValueShortSma);

                    var valAweInd = AweInd.Indicator.Process(new CandleIndicatorValue(candle));
                    var ValueAweInd = new ChartIndicatorValue(AweInd.Indicator, valAweInd);
                    myDic.Add(AweInd, ValueAweInd);
      
                MainWindow.Instance.GuiAsync(() =>
                    {
                        HistoryChart.ProcessValues(OpenTime, myDic);
                    });
            }
            

            // вычисляем новое положение относительно друг друга (SLL = ShortLessThenLong)
            var SSMval = ShortSma.GetCurrentValue();
            var LSMval = LongSma.GetCurrentValue();
            var SLdiff = SSMval - LSMval;
......
   }

В результате для каждой обработанной свечки обнаруживаем что, значения базовых индикаторов LongSMA и ShortSma, полученные через функцию ChartIndicatorValue, отличаются от значений тех же индикаторов на основе функции GetCurrentValue (т.е. ValueLongSMA<>LSMval и ValueShortSma<>SSMval). При этом значение индикатора разницы AwesomeOscillator, полученное через функцию ChartIndicatorValue совпадает с вычисленой разницей между значениями базовых индикаторов (т.е. ValueAweInd= SSMval - LSMval).

Это более чем странно! Так явно не должно быть, т.е. где-то ошибка.

Таблица с реальными значениями, полученными при прогоне на SPFB.SBRF в аттаче.

War dieses Thema hilfreich?

Thema teilen

Kommentare (0)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Noch keine Kommentare. Seien Sie der Erste!