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
Name | Type | Summary |
---|---|---|
PercentD | Property | %D is 3 Period Exponential Moving Average of %K. |
PercentK | Property | Calculation 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); } } } }