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