Category Oscilators  Published on 08/05/2024

The Stoch

Description

The Stoch

You are already familiar with the limitations of the traditional stochastic. So, here's 'The Stoch':

  • It analyzes candlesticks using HighPrice and LowPrice, providing an optimal reading of new highs and lows.
  • A new concept that dynamically increases the stochastic calculation periods at each bar once a specific threshold is crossed.

This Stochastique indicator provides advanced stochastic analysis by combining two sets of calculations: an initial stochastic indicator with user-defined periods, and a more accurate stochastic indicator that dynamically adjusts its periods based on detected trends. Here's what the different results display:

Initial Stochastic (ResultInit and SignalInit):

  • ResultInit: Shows the %K line, representing the primary stochastic value.
  • SignalInit: Shows the %D signal line, which is a moving average of %K.
  • These lines provide a classic stochastic representation based on the periods defined in the initial parameters.

Accurate Stochastic (StochAccuRes, StochAccuUp, StochAccuDown, SignalAccu):

  • StochAccuRes: Displays the %K line for the dynamically adjusted accurate stochastic.
  • StochAccuUp and StochAccuDown: Show the adjusted %K lines, depending on the upward or downward trend.
  • SignalAccu: Displays the corresponding %D signal line, based on a moving average of %K.

Overbought and Oversold Levels (LevelUp and LevelDown):

  • LevelUp: Plots a fixed level (default: 70) indicating the overbought threshold.
  • LevelDown: Plots another fixed level (default: 30) indicating the oversold threshold.

Interpretation of Results:

  • If the %K line (initial or accurate) crosses above the overbought level (LevelUp) for the first time, it signals the birth of an upward trend.
  • If %K drops below the oversold level (LevelDown) for the first time, it signals the birth of a downward trend.
  • The accurate stochastic adjusts periods to capture trend changes more effectively.

In summary, the indicator provides both traditional and dynamic stochastic analysis, offering better adaptability to market conditions.

 

On telegram : https://t.me/nimi012 (direct messaging)

 

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Indicator(IsOverlay = false, AccessRights = AccessRights.None)]
    public class TheStochv10 : Indicator
    {
        [Parameter(DefaultValue = 255, Group = "Initial Stoch")]
        public int KPeriodInit { get; set; }
        [Parameter(DefaultValue = 3, Group = "Initial Stoch")]
        public int KSlowingInit { get; set; }
        [Parameter(DefaultValue = 34, Group = "Initial Stoch")]
        public int DPeriodInit { get; set; }

        [Parameter(DefaultValue = MovingAverageType.Weighted, Group = "Initial Stoch")]
        public MovingAverageType MaTypeInit { get; set; }

        [Parameter(DefaultValue = 9, Group = "Accurate Stoch")]
        public int MinPeriodAccu { get; set; }
        [Parameter(DefaultValue = 3, Group = "Accurate Stoch")]
        public int KSlowingAccu { get; set; }
        [Parameter(DefaultValue = 21, Group = "Accurate Stoch")]
        public int DPeriodAccu { get; set; }
        [Parameter(DefaultValue = MovingAverageType.Weighted, Group = "Accurate Stoch")]
        public MovingAverageType MaTypeAccu { get; set; }

        [Parameter(DefaultValue = 98, Group = "Start Trend Level Stoch")]
        public int TrendStartLevelUp { get; set; }
        [Parameter(DefaultValue = 2, Group = "Start Trend Level Stoch")]
        public int TrendStartLevelDown { get; set; }

        [Parameter(DefaultValue = 70, Group = "OverBuy/Sell Level")]
        public int OverBuy { get; set; }
        [Parameter(DefaultValue = 30, Group = "OverBuy/Sell Level")]
        public int OverSell { get; set; }

        [Output("LevelUp", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid)]
        public IndicatorDataSeries LevelUp { get; set; }
        [Output("LevelDown", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid)]
        public IndicatorDataSeries LevelDown { get; set; }

        [Output("Stoch Init", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Dots)]
        public IndicatorDataSeries ResultInit { get; set; }
        [Output("Signal Init", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Dots)]
        public IndicatorDataSeries SingalInit { get; set; }

        [Output("StochAccu", LineColor = "Gray", PlotType = PlotType.Line)]
        public IndicatorDataSeries StochAccuRes { get; set; }
        [Output("StochAccuUp", LineColor = "Lime", PlotType = PlotType.DiscontinuousLine)]
        public IndicatorDataSeries StochAccuUp { get; set; }
        [Output("StochAccuDown", LineColor = "Red", PlotType = PlotType.DiscontinuousLine)]
        public IndicatorDataSeries StochAccuDown { get; set; }
        [Output("SiganlAccu", LineColor = "Gold", PlotType = PlotType.DiscontinuousLine)]
        public IndicatorDataSeries SignalAccu { get; set; }

        private IndicatorDataSeries highData, medData, lowData, res1, res2;
        private IndicatorDataSeries highData2, medData2, lowData2;
        private MovingAverage kslowInit, dslowInit, kslowAccu, dslowAccu;

        private int CountUp;
        private int CountDown;

        private int indexUp;
        private int indexDown;

        private bool StartCountUp;
        private bool StartCountDown;

        protected override void Initialize()
        {
            highData = CreateDataSeries();
            medData = CreateDataSeries();
            lowData = CreateDataSeries();
            res1 = CreateDataSeries();
            res2 = CreateDataSeries();
            kslowInit = Indicators.MovingAverage(res1, KSlowingInit, MaTypeInit);
            dslowInit = Indicators.MovingAverage(kslowInit.Result, DPeriodInit, MaTypeInit);
            kslowAccu = Indicators.MovingAverage(res2, KSlowingAccu, MaTypeAccu);
            dslowAccu = Indicators.MovingAverage(kslowAccu.Result, DPeriodAccu, MaTypeAccu);

            highData2 = CreateDataSeries();
            medData2 = CreateDataSeries();
            lowData2 = CreateDataSeries();

            CountUp = 0;
            CountDown = 0;
            StartCountUp = false;
            StartCountDown = false;
        }

        public override void Calculate(int index)
        {
            highData[index] = (Bars.HighPrices.Last(0) - Bars.LowPrices.Minimum(KPeriodInit)) / (Bars.HighPrices.Maximum(KPeriodInit) - Bars.LowPrices.Minimum(KPeriodInit)) * 100;
            medData[index] = (Bars.MedianPrices.Last(0) - Bars.LowPrices.Minimum(KPeriodInit)) / (Bars.HighPrices.Maximum(KPeriodInit) - Bars.LowPrices.Minimum(KPeriodInit)) * 100;
            lowData[index] = (Bars.LowPrices.Last(0) - Bars.LowPrices.Minimum(KPeriodInit)) / (Bars.HighPrices.Maximum(KPeriodInit) - Bars.LowPrices.Minimum(KPeriodInit)) * 100;

            res1[index] = medData[index];
            ResultInit[index] = kslowInit.Result.Last(0);
            SingalInit[index] = dslowInit.Result.Last(0);

            LevelUp[index] = OverBuy;
            LevelDown[index] = OverSell;

            if (medData[index] > TrendStartLevelUp)
            {
                StartCountDown = false;
                StartCountUp = true;
            }
            else if (medData[index] < TrendStartLevelDown)
            {
                StartCountUp = false;
                StartCountDown = true;
            }

            if (StartCountUp && indexUp < index)
            {
                CountUp++;
                CountDown = 0;
                var period = MinPeriodAccu >= CountUp ? MinPeriodAccu : CountUp;
                highData2[index] = (Bars.HighPrices.Last(0) - Bars.LowPrices.Minimum(period)) / (Bars.HighPrices.Maximum(period) - Bars.LowPrices.Minimum(period)) * 100;
                medData2[index] = (Bars.MedianPrices.Last(0) - Bars.LowPrices.Minimum(period)) / (Bars.HighPrices.Maximum(period) - Bars.LowPrices.Minimum(period)) * 100;
                lowData2[index] = (Bars.LowPrices.Last(0) - Bars.LowPrices.Minimum(period)) / (Bars.HighPrices.Maximum(period) - Bars.LowPrices.Minimum(period)) * 100;

                res2[index] = lowData2[index];
                StochAccuUp[index] = kslowAccu.Result.Last(0);

                indexUp = index;

            }
            else if (StartCountDown && indexDown < index)
            {
                CountDown++;
                CountUp = 0;
                var period = MinPeriodAccu >= CountDown ? MinPeriodAccu : CountDown;

                highData2[index] = (Bars.HighPrices.Last(0) - Bars.LowPrices.Minimum(period)) / (Bars.HighPrices.Maximum(period) - Bars.LowPrices.Minimum(period)) * 100;
                medData2[index] = (Bars.MedianPrices.Last(0) - Bars.LowPrices.Minimum(period)) / (Bars.HighPrices.Maximum(period) - Bars.LowPrices.Minimum(period)) * 100;
                lowData2[index] = (Bars.LowPrices.Last(0) - Bars.LowPrices.Minimum(period)) / (Bars.HighPrices.Maximum(period) - Bars.LowPrices.Minimum(period)) * 100;

                res2[index] = highData2[index];
                StochAccuDown[index] = kslowAccu.Result.Last(0);

                indexDown = index;
            }

            StochAccuRes[index] = kslowAccu.Result.Last(0);
            SignalAccu[index] = dslowAccu.Result.Last(0);


        }
    }
}

YE
YesOrNot

Joined on 10.10.2022 Blocked

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: The Stoch v1.0.algo
  • Rating: 0
  • Installs: 119
  • Modified: 08/05/2024 20:27
Comments
Log in to add a comment.
No comments found.