Indicators

Technical indicators are very important for algo trading, and NetTrade allows you to develop indicators and use them on your NetTrade robots. It comes with several built-in indicators that you can use to learn about how to develop an indicator based on the functions provided by NetTrade.

You can find the built-in indicators inside the NetTrade indicators directory. Below is an example of a simple moving average indicator:

    public class SimpleMovingAverage : Indicator
    {
        private readonly ExpandableSeries<double> _data = new ExpandableSeries<double>();

        public SimpleMovingAverage(ISymbol symbol)
        {
            Symbol = symbol;

            Symbol.IndicatorOnBarEvent += Symbol_OnBarEvent;
        }

        public ISymbol Symbol { get; }

        public int Periods { get; set; } = 14;

        public DataSourceType DataSourceType { get; set; } = DataSourceType.Close;

        public ISeries<double> Data => _data;

        private void Symbol_OnBarEvent(object sender, int index)
        {
            var symbolData = Symbol.Bars.GetData(DataSourceType);

            var dataPoint = double.NaN;

            if (symbolData.Count >= Periods)
            {
                var dataWindow = symbolData.Skip(symbolData.Count - Periods);

                dataPoint = dataWindow.Sum() / dataWindow.Count();
            }

            _data.Add(dataPoint);

            OnNewValue(index);
        }
    }

As you can see all the indicators must be implemented in the "IIndicator" interface or in the "Indicator" abstract class.

You can use one indicator inside another indicator; "Average True Range" is a good example:

    public class AverageTrueRange : Indicator
    {
        private readonly TrueRange _trueRange;

        private readonly ExpandableSeries<double> _data = new ExpandableSeries<double>();

        public AverageTrueRange(ISymbol symbol)
        {
            Symbol = symbol;

            _trueRange = new TrueRange(Symbol);

            _trueRange.OnNewValueEvent += _trueRange_OnNewValueEvent;
        }

        public int Periods { get; set; } = 14;

        public ISymbol Symbol { get; }

        public ISeries<double> Data => _data;

        private void _trueRange_OnNewValueEvent(object sender, int index)
        {
            var dataPoint = double.NaN;

            if (index + 1 >= Periods)
            {
                var dataWindow = _trueRange.Data.Skip(_trueRange.Data.Count - Periods);

                dataPoint = dataWindow.Sum() / dataWindow.Count();
            }

            _data.Add(dataPoint);

            OnNewValue(index);
        }
    }

Inside "Average True Range" we have used the "True Range" indicator.