Help on this codes

Created at 28 Sep 2015, 09:33
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
LU

lunarus

Joined 28.09.2015

Help on this codes
28 Sep 2015, 09:33


Hi I'm very new to calgo & programming. My code doesn't seem to work & I'm not sure what went wrong. Can anyone please guide me what went wrong. This is based on J. Ehlers' Universal Oscillator http://traders.com/Documentation/FEEDbk_docs/2015/01/TradersTips.html

Thanks

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

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, ScalePrecision = 5)]
    public class UniversalOscillator : Indicator
    {
        #region Variables

        private IndicatorDataSeries _filt;
        private IndicatorDataSeries _wn;
        private double peak;
        private double uni;
        private double a1;
        private double b1;
        private double c1;
        private double c2;
        private double c3;



        #endregion

        #region Parameters

        [Output("Universal Oscillator", Color = Colors.Purple)]
        public IndicatorDataSeries Universal { get; set; }

        [Parameter("BandEdge", DefaultValue = 20)]
        public int Period2 { get; set; }

        [Parameter()]
        public DataSeries Source { get; set; }

        #endregion

        protected override void Initialize()
        {
            _filt = CreateDataSeries();
            _wn = CreateDataSeries();

            a1 = Math.Exp(-Math.Sqrt(2) * Math.PI / Period2);
            b1 = 2 * a1 * Math.Cos(Math.Sqrt(2) * Math.PI / Period2);
            c2 = b1;
            c3 = -a1 * a1;
            c1 = 1 - c2 - c3;

            _wn[0] = 0;
            _wn[1] = 0;

            _filt[0] = 0;
            _filt[1] = 0;

        }

        public override void Calculate(int index)
        {

            if (index < 2)
                return;

            _wn[index] = Source[index - 1] + Source[index - 2] / 2;

            _filt[index] = c1 * (_wn[index] + _wn[index - 1]) / 2 + c2 * _filt[index - 1] + c3 * _filt[index - 2];

            peak = 0.991 * peak;
            if (Math.Abs(_filt[index]) > peak)
                peak = Math.Abs(_filt[index]);
            if (peak != 0)
                uni = _filt[index] / peak;


            Universal[index] = uni;

        }
    }
}

 


@lunarus
Replies

lunarus
28 Sep 2015, 13:34

I made a correction & it looks identical to the results in the other platform but I wasn't sure if the codes was exactly correct

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

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, ScalePrecision = 5)]
    public class UniversalOscillator : Indicator
    {
        #region Variables

        private IndicatorDataSeries _filt;
        private IndicatorDataSeries _wn;
        private IndicatorDataSeries _pk;
        private double a1;
        private double b1;
        private double c1;
        private double c2;
        private double c3;



        #endregion

        #region Parameters

        [Output("Universal", Color = Colors.Red, IsHistogram = true)]
        public IndicatorDataSeries Universal { get; set; }


        [Parameter("BandEdge", DefaultValue = 20)]
        public int Period { get; set; }

        [Parameter()]
        public DataSeries Source { get; set; }

        #endregion

        protected override void Initialize()
        {
            _filt = CreateDataSeries();
            _wn = CreateDataSeries();
            _pk = CreateDataSeries();

            a1 = Math.Exp(-Math.Sqrt(2) * Math.PI / Period);
            b1 = 2 * a1 * Math.Cos(Math.Sqrt(2) * Math.PI / Period);
            c2 = b1;
            c3 = -a1 * a1;
            c1 = 1 - c2 - c3;

            _wn[0] = 0;
            _wn[1] = 0;

            _filt[0] = 0;
            _filt[1] = 0;

            _pk[0] = 1E-07;
            _pk[1] = 1E-07;

        }

        public override void Calculate(int index)
        {

            if (index < 2)
                return;

            _wn[index] = (Source[index] - Source[index - 2]) / 2;

            _filt[index] = c1 * (_wn[index] + _wn[index - 1]) / 2 + c2 * _filt[index - 1] + c3 * _filt[index - 2];

            _pk[index] = 0.991 * _pk[index - 1];
            if (Math.Abs(_filt[index]) > _pk[index])
                _pk[index] = Math.Abs(_filt[index]);
            if (_pk[index] != 0)
                Universal[index] = _filt[index] / _pk[index];

        }
    }
}

 


@lunarus

ClickAlgo
28 Sep 2015, 14:34

Just with a quick look you have removed: an IndicatorDataSeries

        private IndicatorDataSeries _filt;
        private IndicatorDataSeries _wn;
        private IndicatorDataSeries _pk;
        private double a1;
        private double b1;
        private double c1;
        private double c2;
        private double c3;

I would put the original code back and start again or let us know what the exact problem is.


@ClickAlgo