TF SSL Channel free

by cW22Trader in category Trend at 06/10/2021
Description

This is a version of the SSL Channel indicator which workes on higher time frames. It does not work on Tick charts!

Based on this indicator.

Notification Publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section you may use the Copyright Infringement Notification form to submit a claim.
Formula / Source Code
Language: C#
Trading Platform: cAlgocTrader
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;

namespace cAlgo
{
    [Cloud("SSLDown", "SSLUp")]
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class TimeFrameSSLChannel : Indicator
    {
        //////////////////////////////////////////////////////////////////////// PARAMETERS
        [Parameter("Time Frame", DefaultValue = "Daily")]
        public TimeFrame SelectedTimeFrame { get; set; }
        [Parameter("Length", DefaultValue = 10)]
        public int _length { get; set; }
        [Parameter("MA Type", DefaultValue = MovingAverageType.Simple)]
        public MovingAverageType _MAType { get; set; }

        //////////////////////////////////////////////////////////////////////// OUTPUTS
        [Output("SSLDown", LineColor = "Red")]
        public IndicatorDataSeries _sslDown { get; set; }
        [Output("SSLUp", LineColor = "Green")]
        public IndicatorDataSeries _sslUp { get; set; }

        private MovingAverage _maHigh, _maLow;
        private IndicatorDataSeries _hlv;
        private bool isCurrentTimeFrame;
        private Bars bars;
        //////////////////////////////////////////////////////////////////////// INITIALIZE
        protected override void Initialize()
        {
            isCurrentTimeFrame = SelectedTimeFrame == TimeFrame;
            bars = MarketData.GetBars(SelectedTimeFrame);

            while (bars.OpenTimes[0] > Bars.OpenTimes[0])
                bars.LoadMoreHistory();

            _maHigh = Indicators.MovingAverage(bars.HighPrices, _length, _MAType);
            _maLow = Indicators.MovingAverage(bars.LowPrices, _length, _MAType);

            _hlv = CreateDataSeries();
        }
        //////////////////////////////////////////////////////////////////////// CALCULATE
        public override void Calculate(int index)
        {
            int dataIndex = isCurrentTimeFrame ? index : bars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);
            int dataIndex2 = isCurrentTimeFrame ? index - 1 : bars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index - 1]);
            if (dataIndex < 0)
            {
                return;
            }

            _hlv[index] = bars.ClosePrices[dataIndex] > _maHigh.Result[dataIndex] ? 1 : bars.ClosePrices[dataIndex] < _maLow.Result[dataIndex] ? -1 : _hlv[Bars.OpenTimes.GetIndexByTime(bars.OpenTimes[dataIndex]) - 1];
            _sslDown[index] = _hlv[index] < 0 ? _maHigh.Result[dataIndex] : _maLow.Result[dataIndex];
            _sslUp[index] = _hlv[index] < 0 ? _maLow.Result[dataIndex] : _maHigh.Result[dataIndex];

            // Check if a new bar started (open time of tf bar != open time of last TF bar) on the selected TF, if so keep the values of the last index (index - 1)
            // since this was the actual close of the TF bar otherwise "delete" the values of the last index

            // index when the TF bar opened
            int lastDataIndex = Bars.OpenTimes.GetIndexByTime(bars.OpenTimes[dataIndex]);
            int lastDataIndex2 = Bars.OpenTimes.GetIndexByTime(bars.OpenTimes[dataIndex2]);
            if (lastDataIndex == lastDataIndex2 && !isCurrentTimeFrame)
            {
                _sslDown[index - 1] = double.NaN;
                _sslUp[index - 1] = double.NaN;
            }
        }
    }
}
Comments
0