예제 #1
0
        public override void Populate()
        {
            BarHistory bars    = base.Parameters[0].AsBarHistory;
            int        period1 = base.Parameters[1].AsInt;
            int        period2 = base.Parameters[2].AsInt;

            this.DateTimes = bars.DateTimes;
            int FirstValidValue = Math.Max(period1, period2) + 1;

            if (bars.Count < FirstValidValue)
            {
                return;
            }
            var MLTP       = 2.0 / ((double)period1 + 1.0);
            var MLTP2      = (bars.Close - Lowest.Series(bars.Low, period2) - (Highest.Series(bars.High, period2) - bars.Close)).Abs() / (Highest.Series(bars.High, period2) - Lowest.Series(bars.Low, period2));
            var timeSeries = MLTP * (1.0 + MLTP2);

            for (int i = 0; i < FirstValidValue; i++)
            {
                base[i] = FastSMA.Series(bars.Close, period1)[i];
            }

            for (int j = FirstValidValue; j < bars.Count; j++)
            {
                base.Values[j] = base.Values[j - 1] + timeSeries[j] * (bars.Close[j] - base.Values[j - 1]);
            }
        }
예제 #2
0
        //populate
        public override void Populate()
        {
            TimeSeries ds     = Parameters[0].AsTimeSeries;
            Int32      period = Parameters[1].AsInt;
            Double     devs   = Parameters[2].AsDouble;
            bool       Upper  = Parameters[3].AsBoolean;

            DateTimes = ds.DateTimes;

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }

            //Avoid exception errors
            if (period < 1 || period > ds.Count)
            {
                period = ds.Count;
            }

            int upper       = 1;
            var ds2         = ds * ds;
            var period_sr   = Math.Sqrt(period);
            var periodM1_sr = Math.Sqrt(period - 1);
            var devs2       = devs * devs;

            if (!Upper)
            {
                upper = -1;
            }
            var _smaSer = new FastSMA(ds, period);
            var _sdSer  = new StdDev(ds, period);
            var _sumK   = ds2.Sum(period);
            var k1      = devs * Math.Sqrt(period / (period - 1 - devs2));
            var k2      = devs * Math.Sqrt((period - 1) / (period - 1 - devs2));

            //Assign first bar that contains indicator data
            var FirstValidValue = ds.FirstValidIndex + period - 1;

            if (FirstValidValue > ds.Count)
            {
                FirstValidValue = ds.Count;
            }

            for (int bar = FirstValidValue; bar < ds.Count; bar++)
            {
                double k = _sumK[bar];
                k = Math.Sqrt(Math.Max(0d, k - period * _smaSer[bar]));
                if (Math.Abs(k / period_sr - _sdSer[bar]) < Math.Abs(k / periodM1_sr - _sdSer[bar]))
                {
                    k = k1;
                }
                else
                {
                    k = k2;
                }

                Values[bar] = _smaSer[bar] - upper * k * _sdSer[bar];
            }
        }
예제 #3
0
        //populate
        public override void Populate()
        {
            TimeSeries ds      = Parameters[0].AsTimeSeries;
            Int32      period1 = Parameters[1].AsInt;
            Int32      period2 = Parameters[2].AsInt;

            DateTimes = ds.DateTimes;
            int period = Math.Max(period1, period2);

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }


            var FirstValidValue = Math.Max(period1, period2);

            if (FirstValidValue > ds.Count || FirstValidValue < 0)
            {
                FirstValidValue = ds.Count;
            }
            if (ds.Count < Math.Max(period1, period2))
            {
                return;
            }

            TASCIndicators.FastSMA ema1 = new FastSMA(ds, period1);
            TASCIndicators.FastSMA ema2 = new FastSMA(ds, period2);

            for (int bar = 0; bar < ds.Count; bar++)
            {
                Values[bar] = ema1[bar] - ema2[bar];
            }
        }
예제 #4
0
        //populate
        public override void Populate()
        {
            TimeSeries ds      = Parameters[0].AsTimeSeries;
            Int32      period1 = Parameters[1].AsInt;
            Int32      period2 = Parameters[2].AsInt;

            DateTimes = ds.DateTimes;
            int period = Math.Max(period1, period2);

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }


            var FirstValidValue = Math.Max(period1, period2);

            if (FirstValidValue > ds.Count || FirstValidValue < 0)
            {
                FirstValidValue = ds.Count;
            }
            if (ds.Count < Math.Max(period1, period2))
            {
                return;
            }

            sMACD   smacd = new sMACD(ds, period1, period2);
            FastSMA sma   = new FastSMA(smacd, 9);

            for (int bar = FirstValidValue; bar < ds.Count; bar++)
            {
                Values[bar] = sma[bar];
            }
        }
예제 #5
0
        public override void Populate()
        {
            BarHistory bars   = Parameters[0].AsBarHistory;
            Int32      period = Parameters[1].AsInt;

            DateTimes = bars.DateTimes;

            if (period <= 0 || DateTimes.Count == 0)
            {
                return;
            }

            var FirstValidValue = period;

            if (FirstValidValue > bars.Count || FirstValidValue < 0)
            {
                FirstValidValue = bars.Count;
            }

            for (int bar = 0; bar < bars.Count; bar++)
            {
                if (bar >= period)
                {
                    double av     = new FastSMA(bars.Volume, period)[bar];
                    double sd     = new StdDev(bars.Volume, period)[bar];
                    double relVol = (bars.Volume[bar] - av) / sd;
                    Values[bar] = relVol;
                }
                else
                {
                    Values[bar] = 0d;
                }
            }
        }
예제 #6
0
        // returns price where sMACD cross 0
        private double PsMACDzero(int bar, TimeSeries price, int periodX, int periodY)
        {
            double result = (periodX * periodY * (FastSMA.Calculate(bar, price, periodX) - FastSMA.Calculate(bar, price, periodY)) +
                             periodX * price[periodY + 1] -
                             periodY * price[periodX + 1]) /
                            (periodX - periodY);

            return(result);
        }
예제 #7
0
        public override void Populate()
        {
            BarHistory bars    = Parameters[0].AsBarHistory;
            Int32      periodK = Parameters[1].AsInt;
            Int32      smoothK = Parameters[2].AsInt;

            DateTimes = bars.DateTimes;
            var period = Math.Max(periodK, smoothK);

            if (period <= 0 || DateTimes.Count == 0)
            {
                return;
            }

            FastSMA    sma     = new FastSMA(bars.Close, 2);
            TimeSeries sma1    = sma * 5;
            TimeSeries sma2    = new FastSMA(sma, 2) * 4;
            TimeSeries sma3    = new FastSMA(new FastSMA(sma, 2), 2) * 3;
            TimeSeries sma4    = new FastSMA(new FastSMA(new FastSMA(sma, 2), 2), 2) * 2;
            TimeSeries sma5    = new FastSMA(new FastSMA(new FastSMA(new FastSMA(sma, 2), 2), 2), 2);
            TimeSeries sma6    = new FastSMA(sma5, 2);
            TimeSeries sma7    = new FastSMA(sma6, 2);
            TimeSeries sma8    = new FastSMA(sma7, 2);
            TimeSeries sma9    = new FastSMA(sma8, 2);
            TimeSeries sma10   = new FastSMA(sma9, 2);
            TimeSeries Rainbow = (sma1 + sma2 + sma3 + sma4 + sma5 + sma6 + sma7 + sma8 + sma9 + sma10) / 20;

            TimeSeries RBC = (Rainbow + bars.AveragePriceHLC) / 2;
            TimeSeries nom = RBC - new Lowest(bars.Low, periodK);
            TimeSeries den = new Highest(bars.High, periodK) - new Lowest(RBC, periodK);

            var fastK = new TimeSeries(DateTimes);

            for (int bar = 0; bar < bars.Count; bar++)
            {
                if (bar >= periodK)
                {
                    fastK[bar] = (Math.Min(100, Math.Max(0, 100 * nom[bar] / den[bar])));
                }
                else
                {
                    fastK[bar] = 0d;
                }
            }

            var K = new FastSMA(fastK, smoothK);

            for (int bar = 0; bar < bars.Count; bar++)
            {
                Values[bar] = K[bar];
            }
        }
예제 #8
0
        //This static method allows ad-hoc calculation of InstantaneousTrendLine (single calc mode)
        public static double Calculate(int bar, TimeSeries ds, int period)
        {
            if (bar < period + 2 || period > ds.Count)
            {
                return(0);
            }

            double smoothedslope = ds[bar] - ds[bar - period + 1]
                                   + ds[bar - 3] - ds[bar - period + 1 - 3] +
                                   2 * (ds[bar - 1] - ds[bar - period + 1 - 1]
                                        + ds[bar - 2] - ds[bar - period + 1 - 2]);

            return(FastSMA.Calculate(bar, ds, period) + smoothedslope / 12);
        }
예제 #9
0
        //populate
        public override void Populate()
        {
            TimeSeries ds     = Parameters[0].AsTimeSeries;
            Int32      period = Parameters[1].AsInt;
            Boolean    useEMA = Parameters[2].AsBoolean;

            DateTimes = ds.DateTimes;

            if (period <= 0 || ds.Count == 0 || ds.Count < period)
            {
                return;
            }

            var        weight = 2d / (period + 1);
            TimeSeries sma    = FastSMA.Series(ds, period);
            TimeSeries ema    = EMA.Series(ds, period);
            TimeSeries ma     = !useEMA ? sma : ema;

            double mdev   = 0;
            var    exd    = new TimeSeries(DateTimes);
            var    absDif = (ma - ds).Abs();
            var    Rate   = 2 / (double)(period + 1);

            for (int i = 0; i > period; i--)
            {
                mdev += Math.Abs(ma[i] - ds[i]);
            }

            mdev /= period;

            for (int bar = 1; bar < ds.Count; bar++)
            {
                if (bar <= period)
                {
                    exd[bar] = mdev;
                }
                else
                {
                    exd[bar] = absDif[bar] * Rate + exd[bar - 1] * (1.0 - Rate);
                }
            }

            for (int bar = 0; bar < ds.Count; bar++)
            {
                Values[bar] = exd[bar];
            }
        }
예제 #10
0
        //populate
        public override void Populate()
        {
            TimeSeries ds     = Parameters[0].AsTimeSeries;
            Int32      period = Parameters[1].AsInt;

            DateTimes = ds.DateTimes;

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }

            var _sd  = new StdDev(ds, period);
            var _sma = new FastSMA(ds, period);

            for (int bar = period; bar < ds.Count; bar++)
            {
                Values[bar] = 100 * (ds[bar] + 2 * _sd[bar] - _sma[bar]) / (4 * _sd[bar]);
            }
        }
예제 #11
0
        public override void Populate()
        {
            BarHistory bars     = Parameters[0].AsBarHistory;
            Int32      smooth   = Parameters[1].AsInt;
            Int32      sdPeriod = Parameters[2].AsInt;

            DateTimes = bars.DateTimes;
            var period = Math.Max(smooth, sdPeriod);

            if (period <= 0 || DateTimes.Count == 0 || bars.Count < period)
            {
                return;
            }

            FastSMA    sma     = new FastSMA(bars.Close, 2);
            TimeSeries sma1    = sma * 5;
            TimeSeries sma2    = new FastSMA(sma, 2) * 4;
            TimeSeries sma3    = new FastSMA(new FastSMA(sma, 2), 2) * 3;
            TimeSeries sma4    = new FastSMA(new FastSMA(new FastSMA(sma, 2), 2), 2) * 2;
            TimeSeries sma5    = new FastSMA(new FastSMA(new FastSMA(new FastSMA(sma, 2), 2), 2), 2);
            TimeSeries sma6    = new FastSMA(sma5, 2);
            TimeSeries sma7    = new FastSMA(sma6, 2);
            TimeSeries sma8    = new FastSMA(sma7, 2);
            TimeSeries sma9    = new FastSMA(sma8, 2);
            TimeSeries sma10   = new FastSMA(sma9, 2);
            TimeSeries Rainbow = (sma1 + sma2 + sma3 + sma4 + sma5 + sma6 + sma7 + sma8 + sma9 + sma10) / 20;

            TimeSeries ema1 = new EMA(Rainbow, smooth);
            TimeSeries ema2 = new EMA(ema1, smooth);
            TimeSeries diff = ema1 - ema2;
            TimeSeries ZLRB = ema1 + diff;
            TEMA_TASC  tema = new TEMA_TASC(ZLRB, smooth);
            StdDev     sd   = new StdDev(tema, sdPeriod);
            WMA        wma  = new WMA(tema, sdPeriod);
            var        PB   = (tema + sd * 2 - wma) / (sd * 4) * 100;

            for (int bar = 0; bar < bars.Count; bar++)
            {
                base[bar] = PB[bar];
            }
        }
예제 #12
0
        //populate
        public override void Populate()
        {
            TimeSeries ds     = Parameters[0].AsTimeSeries;
            Int32      period = Parameters[1].AsInt;

            DateTimes = ds.DateTimes;

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }

            //Avoid exception errors
            if (period < 1 || period > ds.Count)
            {
                period = ds.Count;
            }
            var sma = new FastSMA(ds, period);

            //Assign first bar that contains indicator data
            var FirstValidValue = ds.FirstValidIndex + period + 2;

            if (FirstValidValue > ds.Count)
            {
                FirstValidValue = ds.Count;
            }

            //Initialize start of series with zeroes
            //for (int bar = 0; bar < FirstValidValue; bar++)
            //     Values[bar] = 0;

            //Rest of series
            for (int bar = FirstValidValue; bar < ds.Count; bar++)
            {
                double smoothedslope = ds[bar] - ds[bar - period + 1]
                                       + ds[bar - 3] - ds[bar - period + 1 - 3] +
                                       2 * (ds[bar - 1] - ds[bar - period + 1 - 1]
                                            + ds[bar - 2] - ds[bar - period + 1 - 2]);
                Values[bar] = sma[bar] + smoothedslope / 12;
            }
        }
예제 #13
0
        //populate
        public override void Populate()
        {
            TimeSeries ds         = Parameters[0].AsTimeSeries;
            Int32      period     = Parameters[1].AsInt;
            Double     deviations = Parameters[2].AsDouble;
            Boolean    useEMA     = Parameters[3].AsBoolean;

            DateTimes = ds.DateTimes;

            if (period <= 0 || ds.Count == 0 || ds.Count < period)
            {
                return;
            }

            TimeSeries sma = FastSMA.Series(ds, period);
            TimeSeries ema = EMA.Series(ds, period);
            TimeSeries ma  = !useEMA ? sma : ema;
            ExpDev     exd = new ExpDev(ds, period, useEMA);

            for (int bar = period; bar < ds.Count; bar++)
            {
                Values[bar] = ma[bar] - exd[bar] * deviations;
            }
        }
예제 #14
0
        //populate
        public override void Populate()
        {
            TimeSeries ds          = Parameters[0].AsTimeSeries;
            Int32      period1     = Parameters[1].AsInt;
            Int32      period2     = Parameters[2].AsInt;
            Int32      m           = Parameters[3].AsInt;
            Int32      n           = Parameters[4].AsInt;
            Int32      c           = Parameters[5].AsInt;
            Boolean    useRMSNoise = Parameters[6].AsBoolean;

            DateTimes = ds.DateTimes;
            var period = new List <int> {
                period1, period2, m, n, c
            }.Max();

            if (period <= 0 || ds.Count == 0)
            {
                return;
            }

            //Assign first bar that contains indicator data
            if (n == 0)
            {
                n = 1;
            }
            n = Math.Abs(n);
            var FirstValidValue = n;

            if (FirstValidValue > ds.Count)
            {
                FirstValidValue = ds.Count;
            }

            if (ds.Count < n || ds == null)
            {
                return;
            }

            /* CPC and CPCTrend*/
            var lpf1 = new EMA(ds, period1);
            var lpf2 = new EMA(ds, period2);

            var hCPC   = new TimeSeries(DateTimes);
            var hTrend = new TimeSeries(DateTimes);

            double expnt  = 2d / (1 + m);
            double cumSum = 0d;
            int    xBar   = 0;
            var    mom    = new Momentum(ds, 1);

            hCPC[0] = hTrend[0] = 0d;
            for (int bar = 0; bar < ds.Count; bar++)
            {
                hTrend[bar] = 0d;
            }

            for (int bar = 1; bar < ds.Count; bar++)
            {
                if (CrossOver(bar, lpf1, lpf2) || CrossUnder(bar, lpf1, lpf2))
                {
                    cumSum = 0d;
                    xBar   = bar;
                }
                else
                {
                    cumSum += mom[bar];
                }

                hCPC[bar] = cumSum;

                /* Calculate the Trend with a piecewise EMA */
                if (bar - xBar > 0)
                {
                    double diff = expnt * (hCPC[bar] - hTrend[bar - 1]);
                    hTrend[bar] = hTrend[bar - 1] + diff;
                }
            }

            /* Trend Quality */
            TimeSeries hDT = hCPC - hTrend;
            TimeSeries hNoise;

            if (useRMSNoise)
            {
                var hDTms = new SMA(hDT * hDT, n);
                hNoise = new TimeSeries(DateTimes);
                for (int bar = 0; bar < ds.Count; bar++)
                {
                    hNoise[bar] = Math.Sqrt(hDTms[bar]);
                }
            }
            else
            {
                hNoise = new FastSMA(hDT.Abs(), n);
            }
            hNoise *= c;

            var hQ = hTrend / hNoise;

            for (int bar = 0; bar < ds.Count; bar++)
            {
                Values[bar] = hQ[bar];
            }
        }
예제 #15
0
        //(BarHistory bars, BarHistory barsFirst, BarHistory barsSecond, int periodRegression, int periodRegressionMomentum,
        public override void Populate()
        {
            BarHistory bars         = Parameters[0].AsBarHistory;
            Int32      period       = Parameters[1].AsInt;
            Int32      emaPeriod    = Parameters[2].AsInt;
            Double     cutoffConst  = Parameters[3].AsDouble;
            Double     curtailCoeff = Parameters[4].AsDouble;

            DateTimes = bars.DateTimes;

            var FirstValidValue = Math.Max(period, emaPeriod) * 3;

            if (FirstValidValue > bars.Count || FirstValidValue < 0)
            {
                FirstValidValue = bars.Count;
            }

            if (FirstValidValue <= 0 || DateTimes.Count == 0)
            {
                return;
            }

            // Based on WL4 coding: http://wl4.wealth-lab.com/cgi-bin/WealthLab.DLL/libraryview?item=245
            var dsInter = new TimeSeries(DateTimes);

            dsInter[0] = 0d;

            // 'Typical' is the AveragePriceC.Series in WLP
            for (int bar = 1; bar < bars.Count; bar++)
            {
                dsInter[bar] = Math.Log(bars.AveragePriceHLC[bar]) - Math.Log(bars.AveragePriceHLC[bar - 1]);
            }

            // StdDev over 30-day time period (30 bars)
            dsInter = new StdDev(dsInter, 30);
            var dsCutoff = dsInter * cutoffConst * bars.Close;

            // dsAve = Average volume with 1 bar delay
            var dsAve = new FastSMA(bars.Volume, period) >> 1;
            var dsMax = dsAve * curtailCoeff;

            var dsMF  = bars.AveragePriceHLC - (bars.AveragePriceHLC >> 1);
            var dsSer = new TimeSeries(DateTimes);
            var dsVFI = new TimeSeries(DateTimes);

            // Optimized summation over period.
            double PrevVfi = 0.0;

            for (int bar = 0; bar < bars.Count; bar++)
            {
                double Old = 0.0;
                if (bar > period)
                {
                    Old = dsSer[bar - period - 1];
                }

                double Value = Math.Min(bars.Volume[bar], dsMax[bar]);
                double New   = 0.0;
                if (dsMF[bar] > dsCutoff[bar])
                {
                    New = Value;
                }
                else if (dsMF[bar] < (-1 * dsCutoff[bar]))
                {
                    New = -1 * Value;
                }

                dsSer[bar] = New;
                dsVFI[bar] = PrevVfi - Old + New;
                PrevVfi    = dsVFI[bar];
            }

            dsVFI /= dsAve;

            // Smooth VFI and store in result series
            var dsEma = new EMA(dsVFI, emaPeriod);

            for (int bar = 0; bar < bars.Count; bar++)
            {
                Values[bar] = dsEma[bar];
            }
        }
예제 #16
0
        //populate
        public override void Populate()
        {
            BarHistory bars   = Parameters[0].AsBarHistory;
            Int32      period = Parameters[1].AsInt;

            DateTimes = bars.DateTimes;

            if (period <= 0 || bars.Count == 0)
            {
                return;
            }

            var FirstValidValue = period;

            if (FirstValidValue > bars.Count || FirstValidValue < 0)
            {
                FirstValidValue = bars.Count;
            }

            var RelVol = new TimeSeries(DateTimes);

            if (FirstValidValue > 1)
            {
                RelVol[FirstValidValue - 1] = 0d;
            }

            for (int bar = FirstValidValue; bar < bars.Count; bar++)
            {
                double av     = FastSMA.Calculate(bar, bars.Volume, period);
                double sd     = new StdDev(bars.Volume, period)[bar];
                double relVol = (bars.Volume[bar] - av) / sd;
                RelVol[bar] = relVol;
            }

            var aMove   = ((bars.Close - (bars.Close >> 1)) / bars.Close >> 1).Abs();
            var theMin  = new Lowest(aMove, period);
            var theMax  = new Highest(aMove, period);
            var theMove = new TimeSeries(DateTimes);
            var theVol  = new TimeSeries(DateTimes);

            for (int bar = FirstValidValue; bar < bars.Count; bar++)
            {
                if ((theMax[bar] - theMin[bar]) > 0)
                {
                    theMove[bar] = 1.0 + ((aMove[bar] - theMin[bar]) * (10d - 1d)) / (theMax[bar] - theMin[bar]);
                }
            }

            var theMinV = new Lowest(RelVol, period);
            var theMaxV = new Highest(RelVol, period);

            for (int bar = FirstValidValue; bar < bars.Count; bar++)
            {
                if ((theMaxV[bar] - theMinV[bar]) > 0)
                {
                    theVol[bar] = 1.0 + ((RelVol[bar] - theMinV[bar]) * (10d - 1d)) / (theMaxV[bar] - theMinV[bar]);
                }
            }

            var vByM   = theVol / theMove;
            var avF    = new SMA(vByM, period);
            var sdF    = new StdDev(vByM, period);
            var theFoM = (vByM - avF) / sdF;

            for (int bar = 0; bar < bars.Count; bar++)
            {
                Values[bar] = theFoM[bar];
            }
        }