Ergodic CCI

by cysecsbin.01 in category Oscilator at 06/07/2019
Description

Follow my cTrader Telegram group at https://t.me/cTraderCommunity; it's a new community but it will grow fast, plus everyone can talk about cTrader indicators and algorithm without restrictions, though it is not allowed to spam commercial indicators to sell them. There's also a Discord Server now @ https://discord.gg/5GAPMtp

This is a conversion for the Ergodic CCI indicator

UPDATE:Added RSI

 

For any bug report or suggestion, contact me by joining the group linked above or by commenting below

Download
71 downloads
How to install
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 System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;

namespace cAlgo
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class ErgodicCCI : Indicator
    {
        [Parameter("First Smoothing", Group = "Ergodic CCI", DefaultValue = 2)]
        public int pq { get; set; }

        [Parameter("Second Smoothing", Group = "Ergodic CCI", DefaultValue = 10)]
        public int pr { get; set; }

        [Parameter("Third Smoothing", Group = "Ergodic CCI", DefaultValue = 5)]
        public int ps { get; set; }

        [Parameter("Signal", Group = "Ergodic CCI", DefaultValue = 8)]
        public int trigger { get; set; }

        [Parameter("Period RSI", Group = "RSI", DefaultValue = 14)]
        public int rsiPer { get; set; }
        [Parameter("Show RSI", Group = "RSI", DefaultValue = true)]
        public bool showRSI { get; set; }

        [Output("CCI", LineColor = "RoyalBlue")]
        public IndicatorDataSeries CCI { get; set; }
        [Output("Trigger", LineColor = "Yellow")]
        public IndicatorDataSeries signal { get; set; }
        [Output("RSI", LineColor = "AcquaMarine", Thickness = 2)]
        public IndicatorDataSeries RSI { get; set; }

        private IndicatorDataSeries mtm, absmtm;
        private ExponentialMovingAverage emaMTM, emaABS, emaEMAMTM, emaEMAEMAMTM, emaEMAABS, emaEMAEMAABS, emaSignal;
        private RelativeStrengthIndex rsi;

        protected override void Initialize()
        {
            mtm = CreateDataSeries();
            absmtm = CreateDataSeries();
            emaMTM = Indicators.ExponentialMovingAverage(mtm, pq);
            emaEMAMTM = Indicators.ExponentialMovingAverage(emaMTM.Result, pr);
            emaEMAEMAMTM = Indicators.ExponentialMovingAverage(emaEMAMTM.Result, ps);
            emaABS = Indicators.ExponentialMovingAverage(absmtm, pq);
            emaEMAABS = Indicators.ExponentialMovingAverage(emaABS.Result, pr);
            emaEMAEMAABS = Indicators.ExponentialMovingAverage(emaEMAABS.Result, ps);
            emaSignal = Indicators.ExponentialMovingAverage(CCI, trigger);
            rsi = Indicators.RelativeStrengthIndex(CCI, rsiPer);
            Chart.ScrollChanged += OnChartScrollChanged;
        }

        void OnChartScrollChanged(ChartScrollEventArgs obj)
        {
            if (showRSI)
                if (IsLastBar)
                    calcRSI();
        }

        public override void Calculate(int index)
        {
            for (int i = 0; i <= index; i++)
            {
                mtm[i] = MarketSeries.Close[i] - MarketSeries.Close[i - 1];

                absmtm[i] = Math.Abs(mtm[i]);
            }

            CCI[index] = 500 * emaEMAEMAMTM.Result[index] / emaEMAEMAABS.Result[index];
            signal[index] = emaSignal.Result[index];

            if (showRSI)
                if (IsLastBar)
                    calcRSI();
        }

        public void calcRSI()
        {
            int startInd = Chart.FirstVisibleBarIndex;
            int endIndex = Chart.LastVisibleBarIndex;

            double max = 0, min = double.PositiveInfinity;
            for (int k = startInd; k <= endIndex; k++)
            {
                max = Math.Max(max, CCI[k]);
                min = Math.Min(min, CCI[k]);
            }

            for (int k = startInd; k <= endIndex; k++)
            {
                RSI[k] = (max - min) * (rsi.Result[k] - 50) / 100;
            }

            IndicatorArea.DrawHorizontalLine("85", (max - min) * (85 - 50) / 100, Color.DarkRed);
            IndicatorArea.DrawHorizontalLine("15", (max - min) * (15 - 50) / 100, Color.Green);
        }
    }
}
Comments
5