Category Trend  at 17/02/2023

ATR Stop and Reverse indicator

Description

The ATR Stop and Reverse, is a very simple trading system used for scalping. The indicators used in this trading system basically focus on the stop and reverse concept, as in the parabolic SAR indicator .

In this version you can definate to use ATR or Fix for defination reverse Pips Zone.


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

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class mATRLevelStopReverse : Indicator
    {
        [Parameter("UseATRMode (yes)", DefaultValue = true)]
        public bool inpUseATRMode { get; set; }
        [Parameter("NonATRStopPips (40)",DefaultValue = 40)]
        public int inpNonATRStopPips { get; set; }
        [Parameter("ATRPeriod (9)", DefaultValue = 9)]
        public int inpATRPeriod { get; set; }
        [Parameter("ATRMultiplier (3.0)", DefaultValue = 3.0)]
        public int inpATRMultiplier { get; set; }
        [Parameter("ATRType (sma)", DefaultValue = MovingAverageType.Simple)]
        public MovingAverageType inpATRType { get; set; }
        [Parameter("ATRSmoothPeriod (1)", DefaultValue = 1)]
        public int inpATRSmoothPeriod { get; set; }
        [Parameter("ATRSmoothType (sma)", DefaultValue = MovingAverageType.WilderSmoothing)]
        public MovingAverageType inpATRSmoothType { get; set; }

        [Output("ATR Level Stop-Reverse", LineColor = "Magenta", PlotType = PlotType.DiscontinuousLine, LineStyle = LineStyle.Lines, Thickness = 1)]
        public IndicatorDataSeries outLSR { get; set; }
        [Output("OpenLong trigger", LineColor = "Green", PlotType = PlotType.Points, LineStyle = LineStyle.Dots, Thickness = 5)]
        public IndicatorDataSeries outLongOpen { get; set; }
        [Output("OpenShort trigger", LineColor = "Red", PlotType = PlotType.Points, LineStyle = LineStyle.Solid, Thickness = 5)]
        public IndicatorDataSeries outShortOpen { get; set; }
        
        private AverageTrueRange _atr;
        private MovingAverage _atrma;
        private IndicatorDataSeries _deltastop, _stoplevel, _arrowup, _arrowdown;
        

        protected override void Initialize()
        {
            _atr = Indicators.AverageTrueRange(inpATRPeriod, inpATRType);
            _atrma = Indicators.MovingAverage(_atr.Result, inpATRSmoothPeriod, inpATRSmoothType);
            _deltastop = CreateDataSeries();
            _stoplevel = CreateDataSeries();
            _arrowup = CreateDataSeries();
            _arrowdown = CreateDataSeries();
        }

        public override void Calculate(int i)
        {
            _deltastop[i] = inpUseATRMode == true 
                    ? Math.Round(_atrma.Result[i] * inpATRMultiplier, Symbol.Digits) 
                    : Math.Round(inpNonATRStopPips * Symbol.PipSize, Symbol.Digits);

            _stoplevel[i] = Bars.ClosePrices[i];
            _arrowup[i] = double.NaN;
            _arrowdown[i] = double.NaN;
            
            if(i>1 && Bars.ClosePrices[i] == _stoplevel[i-1]) 
                _stoplevel[i] = _stoplevel[i-1];
            else 
            {
                if(i>1 && Bars.ClosePrices[i-1] <= _stoplevel[i-1] && Bars.ClosePrices[i] < _stoplevel[i-1])
                    _stoplevel[i] = Math.Min(_stoplevel[i-1], (Bars.ClosePrices[i] + _deltastop[i]));
                else 
                {
                    if(i>1 && Bars.ClosePrices[i-1] >= _stoplevel[i-1] && Bars.ClosePrices[i] > _stoplevel[i-1])
                        _stoplevel[i] = Math.Max(_stoplevel[i-1], (Bars.ClosePrices[i] - _deltastop[i]));
                    else 
                    {                        
                        if(i>1 && Bars.ClosePrices[i] > _stoplevel[i-1])
                        {
                            _stoplevel[i] = Bars.ClosePrices[i] - _deltastop[i];
                            _arrowup[i] = Bars.LowPrices[i] - (5 * Symbol.PipSize);
                        }
                        else 
                        {
                            _stoplevel[i] = Bars.ClosePrices[i] + _deltastop[i];
                            _arrowdown[i] = Bars.HighPrices[i] + (5 * Symbol.PipSize);
                        }
                    }
                }
            }
            
            outLSR[i] = _stoplevel[i];
            outLongOpen[i] = _arrowup[i];
            outShortOpen[i] = _arrowdown[i];
        }
    }
}

MF
mfejza

Joined 25.01.2022

  • Type: Free
  • Language: C#
  • Trading Platform: cTrader Automate
  • Filename: mATRLevelStopReverse.algo
  • Rating: 5
  • Downloads: 1129
Comments
Only logged in users can post a comment
VI
VietNam · 5 months ago

That would be great if there is a Cbot version available for testing. 
That's fantastic! I'm glad you found the information helpful. To add a pop-up notification for buy or sell signals on both the cAlgo platform and the cTrader app, you will need to modify the code to incorporate the notification feature

EL
elainaorne · 9 months ago

If you enjoy the version of you can play the full version here.

 

codefinger Five Nights at Freddy's,@ - February 20, 2023 @ 20:43

Thanks for this indi but how you was able to compile it?

This line:

_atrma = Indicators.CommodityChannelIndex(_atr.Result, inpATRSmoothPeriod, inpATRSmoothType);

Returns an error:

mATRLevelStopReverse.cs(42, 33): [CS1501] No overload for method 'CommodityChannelIndex' takes 3 arguments

NG
nguyenphongotjtiqatabto43 · 9 months ago

What happen?

MF
mfejza · 9 months ago

please anybody block this account (nguyenphongotjtiqatabto43): https://ctrader.com/users/profile/82116

NG
nguyenphongotjtiqatabto43 · 9 months ago

Looks like your line 40-42 is wrong.

CO
codefinger · 9 months ago

yeap, sorry for this mess. Probably by mistake, I've overridden it in my IDE and haven't noticed.

MF
mfejza · 9 months ago

@codefinger

mate, you are trying to replace smoothing ATR result, from MovingAverrage to CCI, and you can not, because CCI is calculated from 4 array components (bars data: open, high, low, close); ATR indicator return only a array of data

CO
codefinger · 9 months ago

Thanks for this indi but how you was able to compile it?

This line:

_atrma = Indicators.CommodityChannelIndex(_atr.Result, inpATRSmoothPeriod, inpATRSmoothType);

Returns an error:

mATRLevelStopReverse.cs(42, 33): [CS1501] No overload for method 'CommodityChannelIndex' takes 3 arguments

 

VE
VEI5S6C4OUNT0 · 9 months ago

Nice indicator. I should get you to fix my codes ha ha ha . keep up the great work.

Very Much appreciated.