/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace QuantConnect.Indicators { /// /// This indicator computes the Kaufman Adaptive Moving Average (KAMA). /// The Kaufman Adaptive Moving Average is calculated as explained here: /// http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:kaufman_s_adaptive_moving_average /// public class KaufmanAdaptiveMovingAverage : KaufmanEfficiencyRatio { private readonly decimal _slowSmoothingFactor; private readonly decimal _diffSmoothingFactor; private decimal _prevKama; /// /// Initializes a new instance of the class using the specified name and period. /// /// The name of this indicator /// The period of the Efficiency Ratio (ER) /// The period of the fast EMA used to calculate the Smoothing Constant (SC) /// The period of the slow EMA used to calculate the Smoothing Constant (SC) public KaufmanAdaptiveMovingAverage(string name, int period, int fastEmaPeriod = 2, int slowEmaPeriod = 30) : base(name, period) { // Smoothing factor of the slow EMA _slowSmoothingFactor = 2m / (slowEmaPeriod + 1m); // Difference between the smoothing factor of the fast and slow EMA _diffSmoothingFactor = 2m / (fastEmaPeriod + 1m) - _slowSmoothingFactor; } /// /// Initializes a new instance of the class using the specified period. /// /// The period of the Efficiency Ratio (ER) /// The period of the fast EMA used to calculate the Smoothing Constant (SC) /// The period of the slow EMA used to calculate the Smoothing Constant (SC) public KaufmanAdaptiveMovingAverage(int period, int fastEmaPeriod = 2, int slowEmaPeriod = 30) : this($"KAMA({period},{fastEmaPeriod},{slowEmaPeriod})", period, fastEmaPeriod, slowEmaPeriod) { } /// /// Computes the next value of this indicator from the given state /// /// The input given to the indicator /// The window for the input history /// A new value for this indicator protected override decimal ComputeNextValue(IReadOnlyWindow window, IndicatorDataPoint input) { // Calculate the efficiency ratio var efficiencyRatio = base.ComputeNextValue(window, input); if (Samples < Period) { return input.Value; } if (Samples == Period) { // Calculate the first KAMA // The yesterday price is used here as the previous KAMA. _prevKama = window[1].Value; } // Calculate the smoothing constant var smoothingConstant = efficiencyRatio * _diffSmoothingFactor + _slowSmoothingFactor; smoothingConstant *= smoothingConstant; // Calculate the KAMA like an EMA, using the // smoothing constant as the adaptive factor. _prevKama = (input.Value - _prevKama) * smoothingConstant + _prevKama; return _prevKama; } /// /// Resets this indicator to its initial state /// public override void Reset() { _prevKama = 0; base.Reset(); } } }