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); }
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); }
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)); }
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)); }
// 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); }