StochasticOscillator


Summary

The Stochastic Oscillator is a momentum indicator that aims to show price reversals by comparing the closing price to the price range.

Remarks

Calculates the range between the high and low price during a given period of time. The current price is then expressed as a percentage of this range with 0% indicating the bottom of the range and 100% indicating the top of the range over this time period. Based on the theory that prices tend to close near the boundaries of the recent range.

Syntax

public interface StochasticOscillator

Members

NameTypeSummary
PercentD Property%D is 3 Period Exponential Moving Average of %K.
PercentK PropertyCalculation of %K is 100 multiplied by the ratio of the closing price minus the lowest price over the last N periods over the highest price over the last N minus the lowest price over the last N periods.

Example 1

private StochasticOscillator _stochastic;
protected override void Initialize()
{
    // Initialize the Stochastic Oscillator indicator
     _stochastic = Indicators.StochasticOscillator(kPeriods, kSlowing, dPeriods, maType);
}

Example 2

using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo.Robots
{
    // This sample cBot shows how to use the Stochastic Oscillator indicator
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class StochasticOscillatorSample : Robot
    {
        private double _volumeInUnits;
        private StochasticOscillator _stochasticOscillator;
        [Parameter("Volume (Lots)", DefaultValue = 0.01)]
        public double VolumeInLots { get; set; }
        [Parameter("Stop Loss (Pips)", DefaultValue = 10)]
        public double StopLossInPips { get; set; }
        [Parameter("Take Profit (Pips)", DefaultValue = 10)]
        public double TakeProfitInPips { get; set; }
        [Parameter("Label", DefaultValue = "Sample")]
        public string Label { get; set; }
        public Position[] BotPositions
        {
            get
            {
                return Positions.FindAll(Label);
            }
        }
        protected override void OnStart()
        {
            _volumeInUnits = Symbol.QuantityToVolumeInUnits(VolumeInLots);
            _stochasticOscillator = Indicators.StochasticOscillator(9, 3, 9, MovingAverageType.Simple);
        }
        protected override void OnBar()
        {
            if (_stochasticOscillator.PercentK.HasCrossedAbove(_stochasticOscillator.PercentD, 0) && _stochasticOscillator.PercentK.Last(1) <= 20)
            {
                ClosePositions(TradeType.Sell);
                ExecuteMarketOrder(TradeType.Buy, SymbolName, _volumeInUnits, Label, StopLossInPips, TakeProfitInPips);
            }
            else if (_stochasticOscillator.PercentK.HasCrossedBelow(_stochasticOscillator.PercentD, 0) && _stochasticOscillator.PercentK.Last(1) >= 80)
            {
                ClosePositions(TradeType.Buy);
                ExecuteMarketOrder(TradeType.Sell, SymbolName, _volumeInUnits, Label, StopLossInPips, TakeProfitInPips);
            }
        }
        private void ClosePositions(TradeType tradeType)
        {
            foreach (var position in BotPositions)
            {
                if (position.TradeType != tradeType) continue;
                ClosePosition(position);
            }
        }
    }
}
Reference