示例#1
0
        /// <summary>
        /// Обработать входное значение.
        /// </summary>
        /// <param name="input">Входное значение.</param>
        /// <returns>Результирующее значение.</returns>
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            _dev.Process(input);
            var maValue = MovingAverage.Process(input);
            var value   = new ComplexIndicatorValue(this);

            value.InnerValues.Add(MovingAverage, maValue);
            value.InnerValues.Add(UpBand, UpBand.Process(input));
            value.InnerValues.Add(LowBand, LowBand.Process(input));
            return(value);
        }
        /// <summary>
        /// Обработать входное значение.
        /// </summary>
        /// <param name="input">Входное значение.</param>
        /// <returns>Результирующее значение.</returns>
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            var macdValue   = Macd.Process(input);
            var signalValue = Macd.IsFormed ? SignalMa.Process(macdValue) : new DecimalIndicatorValue(this, 0);

            var value = new ComplexIndicatorValue(this);

            value.InnerValues.Add(Macd, input.SetValue(this, macdValue.GetValue <decimal>() - signalValue.GetValue <decimal>()));
            value.InnerValues.Add(SignalMa, signalValue);
            return(value);
        }
示例#3
0
        /// <summary>
        /// Обработать входное значение.
        /// </summary>
        /// <param name="input">Входное значение.</param>
        /// <returns>Результирующее значение.</returns>
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            var value = new ComplexIndicatorValue(this);

            foreach (var indicator in InnerIndicators)
            {
                var result = indicator.Process(input);

                value.InnerValues.Add(indicator, result);

                if (Mode == ComplexIndicatorModes.Sequence)
                {
                    if (!indicator.IsFormed)
                    {
                        break;
                    }

                    input = result;
                }
            }

            return(value);
        }
示例#4
0
        /// <summary>
        /// To handle the input value.
        /// </summary>
        /// <param name="input">The input value.</param>
        /// <returns>The resulting value.</returns>
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            var candle = input.GetValue <Candle>();
            var buffer = input.IsFinal ? _buffer : _buffer.ToList();

            buffer.Add(candle);

            // если буфер стал достаточно большим (стал больше длины)
            if (buffer.Count > Length)
            {
                // Запоминаем интересующие изменения свечек до буфера
                if (buffer[0].HighPrice > buffer[1].HighPrice)
                {
                    _wasHighDown = true;
                }
                else if (buffer[0].HighPrice < buffer[1].HighPrice)
                {
                    _wasHighDown = false;
                }

                if (buffer[0].LowPrice < buffer[1].LowPrice)
                {
                    _wasLowUp = true;
                }
                else if (buffer[0].LowPrice > buffer[1].LowPrice)
                {
                    _wasLowUp = false;
                }

                buffer.RemoveAt(0);
            }

            // Логика расчета: последующие/предыдущие значения должны быть меньше/больше центрального значения
            if (buffer.Count >= Length)
            {
                // флаги для расчета фракталов (если флаг равен false, то на центральной свече нет фрактала)
                var isMax = true;
                var isMin = true;

                var centerHighPrice = buffer[_numCenter].HighPrice;
                var centerLowPrice  = buffer[_numCenter].LowPrice;

                for (var i = 0; i < buffer.Count; i++)
                {
                    if (i == _numCenter)
                    {
                        continue;
                    }

                    // Все значения до и после центральной свечи должны быть
                    // больше для фрактала вверх и меньше для фрактала вниз
                    if (buffer[i].HighPrice > centerHighPrice)
                    {
                        isMax = false;
                    }

                    if (buffer[i].LowPrice < centerLowPrice)
                    {
                        isMin = false;
                    }
                }

                // Фильтр для ситуаций где цена у экстремума одинакова за период больше длины буфера
                if (isMax && _wasHighDown && buffer.GetRange(0, _numCenter).Min(i => i.HighPrice) == centerHighPrice)
                {
                    isMax = false;
                }

                if (isMin && _wasLowUp && buffer.GetRange(0, _numCenter).Max(i => i.LowPrice) == centerLowPrice)
                {
                    isMin = false;
                }

                var shift = buffer.Count - _numCenter - 1;

                var upValue   = isMax ? new ShiftedIndicatorValue(this, shift, new DecimalIndicatorValue(this, centerHighPrice)) : new ShiftedIndicatorValue(this);
                var downValue = isMin ? new ShiftedIndicatorValue(this, shift, new DecimalIndicatorValue(this, centerLowPrice)) : new ShiftedIndicatorValue(this);

                upValue.IsFinal   = input.IsFinal;
                downValue.IsFinal = input.IsFinal;

                var complexValue = new ComplexIndicatorValue(this);
                complexValue.InnerValues.Add(Up, Up.Process(upValue));
                complexValue.InnerValues.Add(Down, Down.Process(downValue));

                return(complexValue);
            }

            return(base.OnProcess(new ShiftedIndicatorValue(this, 0, input.SetValue(this, 0))));
        }