Пример #1
0
        public void GetPrsTest()
        {
            int lookbackPeriod = 30;
            int smaPeriod      = 10;
            IEnumerable <PrsResult> results = Indicator.GetPrs(history, historyOther, lookbackPeriod, smaPeriod);

            // assertions

            // proper quantities
            // should always be the same number of results as there is history
            Assert.AreEqual(502, results.Count());
            Assert.AreEqual(502, results.Count(x => x.Prs != null));
            Assert.AreEqual(493, results.Where(x => x.Sma != null).Count());

            // sample values
            PrsResult r1 = results.Where(x => x.Index == 502).FirstOrDefault();

            Assert.AreEqual(1.356817m, Math.Round((decimal)r1.Prs, 6));
            Assert.AreEqual(1.343445m, Math.Round((decimal)r1.Sma, 6));
            Assert.AreEqual(0.037082m, Math.Round((decimal)r1.PrsPercent, 6));

            PrsResult r2 = results.Where(x => x.Index == 250).FirstOrDefault();

            Assert.AreEqual(1.222373m, Math.Round((decimal)r2.Prs, 6));
            Assert.AreEqual(1.275808m, Math.Round((decimal)r2.Sma, 6));
            Assert.AreEqual(-0.023089m, Math.Round((decimal)r2.PrsPercent, 6));

            PrsResult r3 = results.Where(x => x.Index == 9).FirstOrDefault();

            Assert.AreEqual(1.108340m, Math.Round((decimal)r3.Prs, 6));
            Assert.AreEqual(null, r3.Sma);
            Assert.AreEqual(null, r3.PrsPercent);
        }
Пример #2
0
        public void GetPrsTest()
        {
            int smaPeriod = 14;
            IEnumerable <PrsResult> results = Indicator.GetPrs(history, historyOther, smaPeriod);

            // assertions

            // proper quantities
            // should always be the same number of results as there is history
            Assert.AreEqual(502, results.Count());
            Assert.AreEqual(false, results.Any(x => x.Prs == null));
            Assert.AreEqual(489, results.Where(x => x.Sma != null).Count());

            // sample values
            PrsResult r1 = results.Where(x => x.Index == 502).FirstOrDefault();

            Assert.AreEqual(1.356817m, Math.Round((decimal)r1.Prs, 6));
            Assert.AreEqual(1.369077m, Math.Round((decimal)r1.Sma, 6));

            PrsResult r2 = results.Where(x => x.Index == 250).FirstOrDefault();

            Assert.AreEqual(1.222373m, Math.Round((decimal)r2.Prs, 6));
            Assert.AreEqual(1.281854m, Math.Round((decimal)r2.Sma, 6));

            PrsResult r3 = results.Where(x => x.Index == 10).FirstOrDefault();

            Assert.AreEqual(1.102129m, Math.Round((decimal)r3.Prs, 6));
            Assert.AreEqual(null, r3.Sma);
        }
Пример #3
0
    public void Standard()
    {
        int lookbackPeriods = 30;
        int smaPeriods      = 10;

        List <PrsResult> results =
            quotes.GetPrs(otherQuotes, lookbackPeriods, smaPeriods)
            .ToList();

        // assertions

        // proper quantities
        // should always be the same number of results as there is quotes
        Assert.AreEqual(502, results.Count);
        Assert.AreEqual(502, results.Count(x => x.Prs != null));
        Assert.AreEqual(493, results.Where(x => x.PrsSma != null).Count());

        // sample values
        PrsResult r1 = results[8];

        Assert.AreEqual(1.108340, Math.Round((double)r1.Prs, 6));
        Assert.AreEqual(null, r1.PrsSma);
        Assert.AreEqual(null, r1.PrsPercent);

        PrsResult r2 = results[249];

        Assert.AreEqual(1.222373, Math.Round((double)r2.Prs, 6));
        Assert.AreEqual(1.275808, Math.Round((double)r2.PrsSma, 6));
        Assert.AreEqual(-0.023089, Math.Round((double)r2.PrsPercent, 6));

        PrsResult r3 = results[501];

        Assert.AreEqual(1.356817, Math.Round((double)r3.Prs, 6));
        Assert.AreEqual(1.343445, Math.Round((double)r3.PrsSma, 6));
        Assert.AreEqual(0.037082, Math.Round((double)r3.PrsPercent, 6));
    }
Пример #4
0
        public void Standard()
        {
            int lookbackPeriod = 30;
            int smaPeriod      = 10;

            List <PrsResult> results =
                Indicator.GetPrs(history, historyOther, lookbackPeriod, smaPeriod)
                .ToList();

            // assertions

            // proper quantities
            // should always be the same number of results as there is history
            Assert.AreEqual(502, results.Count);
            Assert.AreEqual(502, results.Count(x => x.Prs != null));
            Assert.AreEqual(493, results.Where(x => x.PrsSma != null).Count());

            // sample values
            PrsResult r1 = results[8];

            Assert.AreEqual(1.108340m, Math.Round((decimal)r1.Prs, 6));
            Assert.AreEqual(null, r1.PrsSma);
            Assert.AreEqual(null, r1.PrsPercent);

            PrsResult r2 = results[249];

            Assert.AreEqual(1.222373m, Math.Round((decimal)r2.Prs, 6));
            Assert.AreEqual(1.275808m, Math.Round((decimal)r2.PrsSma, 6));
            Assert.AreEqual(-0.023089m, Math.Round((decimal)r2.PrsPercent, 6));

            PrsResult r3 = results[501];

            Assert.AreEqual(1.356817m, Math.Round((decimal)r3.Prs, 6));
            Assert.AreEqual(1.343445m, Math.Round((decimal)r3.PrsSma, 6));
            Assert.AreEqual(0.037082m, Math.Round((decimal)r3.PrsPercent, 6));
        }
Пример #5
0
    // PRICE RELATIVE STRENGTH
    /// <include file='./info.xml' path='indicator/*' />
    ///
    public static IEnumerable <PrsResult> GetPrs <TQuote>(
        this IEnumerable <TQuote> historyBase,
        IEnumerable <TQuote> historyEval,
        int?lookbackPeriods = null,
        int?smaPeriods      = null)
        where TQuote : IQuote
    {
        // convert quotes
        List <BasicD> bdBaseList = historyBase.ConvertToBasic(CandlePart.Close);
        List <BasicD> bdEvalList = historyEval.ConvertToBasic(CandlePart.Close);

        // check parameter arguments
        ValidatePriceRelative(historyBase, historyEval, lookbackPeriods, smaPeriods);

        // initialize
        List <PrsResult> results = new(bdEvalList.Count);

        // roll through quotes
        for (int i = 0; i < bdEvalList.Count; i++)
        {
            BasicD bi    = bdBaseList[i];
            BasicD ei    = bdEvalList[i];
            int    index = i + 1;

            if (ei.Date != bi.Date)
            {
                throw new InvalidQuotesException(nameof(historyEval), ei.Date,
                                                 "Date sequence does not match.  Price Relative requires matching dates in provided histories.");
            }

            PrsResult r = new()
            {
                Date = ei.Date,
                Prs  = (bi.Value == 0) ? null : (ei.Value / bi.Value) // relative strength ratio
            };
            results.Add(r);

            if (lookbackPeriods != null && index > lookbackPeriods)
            {
                BasicD bo = bdBaseList[i - (int)lookbackPeriods];
                BasicD eo = bdEvalList[i - (int)lookbackPeriods];

                if (bo.Value != 0 && eo.Value != 0)
                {
                    double pctB = (bi.Value - bo.Value) / bo.Value;
                    double pctE = (ei.Value - eo.Value) / eo.Value;

                    r.PrsPercent = pctE - pctB;
                }
            }

            // optional moving average of PRS
            if (smaPeriods != null && index >= smaPeriods)
            {
                double?sumRs = 0;
                for (int p = index - (int)smaPeriods; p < index; p++)
                {
                    PrsResult d = results[p];
                    sumRs += d.Prs;
                }

                r.PrsSma = sumRs / smaPeriods;
            }
        }

        return(results);
    }