Category Volatility  Published on 08/06/2020

ATR Trailing

Description

I made this indicator for my cBot so, I thought maybe others will find this useful.

How it works: 
ATR Value * Input Multiply and instead of changing every value on each bar, it acts as a trailing with a little bit of calculation to switch it up to the top or to the bottom of the prices


Cheers


using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class ATRTrailing : Indicator
    {
        [Parameter("Peroids", DefaultValue = 14, MinValue = 1, MaxValue = 100)]
        public int Peroid { get; set; }

        [Parameter("ATR Multiply By", DefaultValue = 2.0, MinValue = 0.1, MaxValue = 100.0)]
        public double Multiply { get; set; }

        [Parameter("ATR MA Type", DefaultValue = MAType.Exponential)]
        public MAType MaType { get; set; }

        public enum MAType
        {
            Simple,
            Exponential,
            Time_Series,
            Triangular,
            VIDYA,
            Weighted,
            Wilder_Smoothing
        }

        [Parameter("Show ATR Trailing", DefaultValue = true)]
        public bool ShowATRT { get; set; }

        [Parameter("Show ATR Trailing S & R", DefaultValue = false)]
        public bool BothSides { get; set; }

        [Output("ATR T", LineStyle = LineStyle.Solid, LineColor = "FF68D0F7")]
        public IndicatorDataSeries Trailing { get; set; }

        [Output("ATR T Sup", LineStyle = LineStyle.Dots, LineColor = "FF65FE66")]
        public IndicatorDataSeries Trailing2 { get; set; }

        [Output("ATR T Resist", LineStyle = LineStyle.Dots, LineColor = "FFFF6666")]
        public IndicatorDataSeries Trailing1 { get; set; }

        AverageTrueRange ATR { get; set; }

        bool Switch = false;

        double T1LastValue = 0.0;
        double T2LastValue = 0.0;

        protected override void Initialize()
        {
            MovingAverageType ATRMAType;

            if (MaType == MAType.Simple)
                ATRMAType = MovingAverageType.Simple;

            else if (MaType == MAType.Exponential)
                ATRMAType = MovingAverageType.Exponential;

            else if (MaType == MAType.Time_Series)
                ATRMAType = MovingAverageType.TimeSeries;

            else if (MaType == MAType.Triangular)
                ATRMAType = MovingAverageType.Triangular;

            else if (MaType == MAType.VIDYA)
                ATRMAType = MovingAverageType.VIDYA;

            else if (MaType == MAType.Weighted)
                ATRMAType = MovingAverageType.Weighted;
            else
                ATRMAType = MovingAverageType.WilderSmoothing;

            ATR = Indicators.AverageTrueRange(Peroid, ATRMAType);
        }

        public override void Calculate(int index)
        {
            var ClosePrice = Bars.ClosePrices.LastValue;

            var ATRTop = ClosePrice + (ATR.Result[index] * Multiply);
            var ATRBot = ClosePrice + (-ATR.Result[index] * Multiply);

            var PriceBetweenHighAndLow = (Bars.HighPrices[index] + Bars.LowPrices[index]) / 2;

            var _Trailing1 = T1LastValue > ATRTop ? ATRTop : T1LastValue < PriceBetweenHighAndLow ? PriceBetweenHighAndLow : T1LastValue;
            var _Trailing2 = T2LastValue < ATRBot ? ATRBot : T2LastValue > PriceBetweenHighAndLow ? PriceBetweenHighAndLow : T2LastValue;

            if (index == 0)
                _Trailing1 = _Trailing2 = PriceBetweenHighAndLow;

            if (ShowATRT)
            {
                if (_Trailing1 <= PriceBetweenHighAndLow)
                    Switch = true;

                else if (_Trailing2 >= PriceBetweenHighAndLow)
                    Switch = false;

                if (!Switch)
                    Trailing[index] = _Trailing1;
                else
                    Trailing[index] = _Trailing2;
            }

            if (BothSides)
            {
                Trailing1[index] = _Trailing1;
                Trailing2[index] = _Trailing2;
            }

            T1LastValue = _Trailing1;
            T2LastValue = _Trailing2;
        }
    }
}


Kbee's avatar
Kbee

Joined on 28.03.2020

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: ATR Trailing.algo
  • Rating: 5
  • Installs: 3812
  • Modified: 13/10/2021 09:55
Comments
Log in to add a comment.
DA
davidmwabuka · 7 months ago

Be blessed