// aggregation (quantization) /// <include file='./info.xml' path='info/type[@name="Aggregate"]/*' /> /// public static IEnumerable <Quote> Aggregate <TQuote>( this IEnumerable <TQuote> quotes, PeriodSize newSize) where TQuote : IQuote { if (newSize != PeriodSize.Month) { // parameter conversion TimeSpan newTimeSpan = newSize.ToTimeSpan(); // convert return(quotes.Aggregate(newTimeSpan)); } else // month { return(quotes .OrderBy(x => x.Date) .GroupBy(x => new DateTime(x.Date.Year, x.Date.Month, 1)) .Select(x => new Quote { Date = x.Key, Open = x.First().Open, High = x.Max(t => t.High), Low = x.Min(t => t.Low), Close = x.Last().Close, Volume = x.Sum(t => t.Volume) })); } }
// quantization public static IEnumerable <Quote> Aggregate <TQuote>( this IEnumerable <TQuote> history, PeriodSize newSize) where TQuote : IQuote { TimeSpan newPeriod = newSize.ToTimeSpan(); return // handle no history scenario (history == null || !history.Any() ? new List <Quote>() // validate parameters : newPeriod == TimeSpan.Zero ? throw new ArgumentOutOfRangeException(nameof(newSize), newSize, "History Aggregation must use a New Size value of at least " + "one minute and not more than one week.") // return aggregation : history .OrderBy(x => x.Date) .GroupBy(x => x.Date.RoundDown(newPeriod)) .Select(x => new Quote { Date = x.Key, Open = x.First().Open, High = x.Max(t => t.High), Low = x.Min(t => t.Low), Close = x.Last().Close, Volume = x.Sum(t => t.Volume) })); }
// aggregation (quantization) /// <include file='./info.xml' path='info/type[@name="Aggregate"]/*' /> /// public static IEnumerable <Quote> Aggregate <TQuote>( this IEnumerable <TQuote> quotes, PeriodSize newSize) where TQuote : IQuote { // parameter conversion TimeSpan newTimeSpan = newSize.ToTimeSpan(); // convert return(quotes.Aggregate(newTimeSpan)); }
public static List <Quote> GetChartData(string pair, PeriodSize interval, DateTime from, DateTime to) { List <Quote> result = new List <Quote>(); using (var client = new BinanceClient()) { var res1 = client.Spot.Market.GetKlines(pair, (KlineInterval)((int)interval), from, to).Data.ToList(); result = res1.Select(s => new Quote() { Close = s.Close, Date = s.OpenTime, High = s.High, Low = s.Low, Open = s.Open, Volume = s.BaseVolume }).ToList(); } return(result); }
// PERIOD-SIZE to TIMESPAN CONVERSION internal static TimeSpan ToTimeSpan(this PeriodSize periodSize) { return(periodSize switch { PeriodSize.OneMinute => TimeSpan.FromMinutes(1), PeriodSize.TwoMinutes => TimeSpan.FromMinutes(2), PeriodSize.ThreeMinutes => TimeSpan.FromMinutes(3), PeriodSize.FiveMinutes => TimeSpan.FromMinutes(5), PeriodSize.FifteenMinutes => TimeSpan.FromMinutes(15), PeriodSize.ThirtyMinutes => TimeSpan.FromMinutes(30), PeriodSize.OneHour => TimeSpan.FromHours(1), PeriodSize.TwoHours => TimeSpan.FromHours(2), PeriodSize.FourHours => TimeSpan.FromHours(4), PeriodSize.Day => TimeSpan.FromDays(1), PeriodSize.Week => TimeSpan.FromDays(7), _ => TimeSpan.Zero });
public void Removed() { PeriodSize periodSize = PeriodSize.Month; PivotPointType pointType = PivotPointType.Standard; List <PivotPointsResult> results = quotes.GetPivotPoints(periodSize, pointType) .RemoveWarmupPeriods() .ToList(); // assertions Assert.AreEqual(482, results.Count); PivotPointsResult last = results.LastOrDefault(); Assert.AreEqual(266.6767m, Math.Round((decimal)last.PP, 4)); Assert.AreEqual(258.9633m, Math.Round((decimal)last.S1, 4)); Assert.AreEqual(248.9667m, Math.Round((decimal)last.S2, 4)); Assert.AreEqual(241.2533m, Math.Round((decimal)last.S3, 4)); Assert.AreEqual(null, last.S4); Assert.AreEqual(276.6733m, Math.Round((decimal)last.R1, 4)); Assert.AreEqual(284.3867m, Math.Round((decimal)last.R2, 4)); Assert.AreEqual(294.3833m, Math.Round((decimal)last.R3, 4)); Assert.AreEqual(null, last.R4); }
public void GetPivotPointsWoodie() { PeriodSize periodSize = PeriodSize.Day; PivotPointType pointType = PivotPointType.Woodie; IEnumerable <Quote> h = History.GetHistoryIntraday(); List <PivotPointsResult> results = Indicator.GetPivotPoints(h, periodSize, pointType) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(1564, results.Count); Assert.AreEqual(1173, results.Where(x => x.PP != null).Count()); // sample values PivotPointsResult r1 = results[1563]; Assert.AreEqual(371.3625m, Math.Round((decimal)r1.PP, 4)); Assert.AreEqual(370.2650m, Math.Round((decimal)r1.S1, 4)); Assert.AreEqual(369.9525m, Math.Round((decimal)r1.S2, 4)); Assert.AreEqual(368.8550m, Math.Round((decimal)r1.S3, 4)); Assert.AreEqual(371.6750m, Math.Round((decimal)r1.R1, 4)); Assert.AreEqual(372.7725m, Math.Round((decimal)r1.R2, 4)); Assert.AreEqual(373.0850m, Math.Round((decimal)r1.R3, 4)); PivotPointsResult r2 = results[1173]; Assert.AreEqual(371.3625m, Math.Round((decimal)r2.PP, 4)); Assert.AreEqual(370.2650m, Math.Round((decimal)r2.S1, 4)); Assert.AreEqual(369.9525m, Math.Round((decimal)r2.S2, 4)); Assert.AreEqual(368.8550m, Math.Round((decimal)r2.S3, 4)); Assert.AreEqual(371.6750m, Math.Round((decimal)r2.R1, 4)); Assert.AreEqual(372.7725m, Math.Round((decimal)r2.R2, 4)); Assert.AreEqual(373.0850m, Math.Round((decimal)r2.R3, 4)); PivotPointsResult r3 = results[1172]; Assert.AreEqual(370.9769m, Math.Round((decimal)r3.PP, 4)); Assert.AreEqual(370.7938m, Math.Round((decimal)r3.S1, 4)); Assert.AreEqual(368.6845m, Math.Round((decimal)r3.S2, 4)); Assert.AreEqual(368.5014m, Math.Round((decimal)r3.S3, 4)); Assert.AreEqual(373.0862m, Math.Round((decimal)r3.R1, 4)); Assert.AreEqual(373.2693m, Math.Round((decimal)r3.R2, 4)); Assert.AreEqual(375.3786m, Math.Round((decimal)r3.R3, 4)); PivotPointsResult r4 = results[391]; Assert.AreEqual(368.7875m, Math.Round((decimal)r4.PP, 4)); Assert.AreEqual(367.9850m, Math.Round((decimal)r4.S1, 4)); Assert.AreEqual(365.1175m, Math.Round((decimal)r4.S2, 4)); Assert.AreEqual(364.3150m, Math.Round((decimal)r4.S3, 4)); Assert.AreEqual(371.6550m, Math.Round((decimal)r4.R1, 4)); Assert.AreEqual(372.4575m, Math.Round((decimal)r4.R2, 4)); Assert.AreEqual(375.3250m, Math.Round((decimal)r4.R3, 4)); PivotPointsResult r5 = results[390]; Assert.AreEqual(null, r5.R4); Assert.AreEqual(null, r5.R3); Assert.AreEqual(null, r5.PP); Assert.AreEqual(null, r5.S1); Assert.AreEqual(null, r5.S2); Assert.AreEqual(null, r5.R1); Assert.AreEqual(null, r5.R2); Assert.AreEqual(null, r5.S3); Assert.AreEqual(null, r5.S4); }
public void GetPivotPointsFibonacci() { PeriodSize periodSize = PeriodSize.Hour; PivotPointType pointType = PivotPointType.Fibonacci; IEnumerable <Quote> h = History.GetHistoryIntraday(300); List <PivotPointsResult> results = Indicator.GetPivotPoints(h, periodSize, pointType) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(300, results.Count); Assert.AreEqual(241, results.Where(x => x.PP != null).Count()); // sample values PivotPointsResult r1 = results[299]; Assert.AreEqual(368.8200m, Math.Round((decimal)r1.PP, 4)); Assert.AreEqual(367.5632m, Math.Round((decimal)r1.S1, 4)); Assert.AreEqual(366.7868m, Math.Round((decimal)r1.S2, 4)); Assert.AreEqual(365.5300m, Math.Round((decimal)r1.S3, 4)); Assert.AreEqual(370.0768m, Math.Round((decimal)r1.R1, 4)); Assert.AreEqual(370.8532m, Math.Round((decimal)r1.R2, 4)); Assert.AreEqual(372.1100m, Math.Round((decimal)r1.R3, 4)); PivotPointsResult r2 = results[149]; Assert.AreEqual(369.0000m, Math.Round((decimal)r2.PP, 4)); Assert.AreEqual(368.5760m, Math.Round((decimal)r2.S1, 4)); Assert.AreEqual(368.3140m, Math.Round((decimal)r2.S2, 4)); Assert.AreEqual(367.8900m, Math.Round((decimal)r2.S3, 4)); Assert.AreEqual(369.4240m, Math.Round((decimal)r2.R1, 4)); Assert.AreEqual(369.6860m, Math.Round((decimal)r2.R2, 4)); Assert.AreEqual(370.1100m, Math.Round((decimal)r2.R3, 4)); PivotPointsResult r3 = results[119]; Assert.AreEqual(369.0000m, Math.Round((decimal)r3.PP, 4)); Assert.AreEqual(368.5760m, Math.Round((decimal)r3.S1, 4)); Assert.AreEqual(368.3140m, Math.Round((decimal)r3.S2, 4)); Assert.AreEqual(367.8900m, Math.Round((decimal)r3.S3, 4)); Assert.AreEqual(369.4240m, Math.Round((decimal)r3.R1, 4)); Assert.AreEqual(369.6860m, Math.Round((decimal)r3.R2, 4)); Assert.AreEqual(370.1100m, Math.Round((decimal)r3.R3, 4)); PivotPointsResult r4 = results[118]; Assert.AreEqual(368.4967m, Math.Round((decimal)r4.PP, 4)); Assert.AreEqual(367.9237m, Math.Round((decimal)r4.S1, 4)); Assert.AreEqual(367.5697m, Math.Round((decimal)r4.S2, 4)); Assert.AreEqual(366.9967m, Math.Round((decimal)r4.S3, 4)); Assert.AreEqual(369.0697m, Math.Round((decimal)r4.R1, 4)); Assert.AreEqual(369.4237m, Math.Round((decimal)r4.R2, 4)); Assert.AreEqual(369.9967m, Math.Round((decimal)r4.R3, 4)); PivotPointsResult r5 = results[59]; Assert.AreEqual(368.4967m, Math.Round((decimal)r5.PP, 4)); Assert.AreEqual(367.9237m, Math.Round((decimal)r5.S1, 4)); Assert.AreEqual(367.5697m, Math.Round((decimal)r5.S2, 4)); Assert.AreEqual(366.9967m, Math.Round((decimal)r5.S3, 4)); Assert.AreEqual(369.0697m, Math.Round((decimal)r5.R1, 4)); Assert.AreEqual(369.4237m, Math.Round((decimal)r5.R2, 4)); Assert.AreEqual(369.9967m, Math.Round((decimal)r5.R3, 4)); PivotPointsResult r6 = results[58]; Assert.AreEqual(null, r6.R4); Assert.AreEqual(null, r6.R3); Assert.AreEqual(null, r6.PP); Assert.AreEqual(null, r6.S1); Assert.AreEqual(null, r6.S2); Assert.AreEqual(null, r6.R1); Assert.AreEqual(null, r6.R2); Assert.AreEqual(null, r6.S3); Assert.AreEqual(null, r6.S4); }
public void GetPivotPointsDemark() { PeriodSize periodSize = PeriodSize.Month; PivotPointType pointType = PivotPointType.Demark; List <PivotPointsResult> results = Indicator.GetPivotPoints(history, periodSize, pointType) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count); Assert.AreEqual(482, results.Where(x => x.PP != null).Count()); // sample values PivotPointsResult r1 = results[501]; Assert.AreEqual(null, r1.R4); Assert.AreEqual(null, r1.R3); Assert.AreEqual(268.6050m, Math.Round((decimal)r1.PP, 4)); Assert.AreEqual(262.8200m, Math.Round((decimal)r1.S1, 4)); Assert.AreEqual(null, r1.S2); Assert.AreEqual(280.5300m, Math.Round((decimal)r1.R1, 4)); Assert.AreEqual(null, r1.R2); Assert.AreEqual(null, r1.S3); Assert.AreEqual(null, r1.S4); PivotPointsResult r2 = results[251]; Assert.AreEqual(null, r2.R4); Assert.AreEqual(null, r2.R3); Assert.AreEqual(256.0725m, Math.Round((decimal)r2.PP, 4)); Assert.AreEqual(253.4450m, Math.Round((decimal)r2.S1, 4)); Assert.AreEqual(null, r2.S2); Assert.AreEqual(262.2750m, Math.Round((decimal)r2.R1, 4)); Assert.AreEqual(null, r2.R2); Assert.AreEqual(null, r2.S3); Assert.AreEqual(null, r2.S4); PivotPointsResult r3 = results[250]; Assert.AreEqual(null, r3.R4); Assert.AreEqual(null, r3.R3); Assert.AreEqual(252.1925m, Math.Round((decimal)r3.PP, 4)); Assert.AreEqual(249.4450m, Math.Round((decimal)r3.S1, 4)); Assert.AreEqual(null, r3.S2); Assert.AreEqual(259.4350m, Math.Round((decimal)r3.R1, 4)); Assert.AreEqual(null, r3.R2); Assert.AreEqual(null, r3.S3); Assert.AreEqual(null, r3.S4); PivotPointsResult r4 = results[149]; Assert.AreEqual(null, r4.R4); Assert.AreEqual(null, r4.R3); Assert.AreEqual(234.3475m, Math.Round((decimal)r4.PP, 4)); Assert.AreEqual(232.2250m, Math.Round((decimal)r4.S1, 4)); Assert.AreEqual(null, r4.S2); Assert.AreEqual(239.5350m, Math.Round((decimal)r4.R1, 4)); Assert.AreEqual(null, r4.R2); Assert.AreEqual(null, r4.S3); Assert.AreEqual(null, r4.S4); PivotPointsResult r5 = results[20]; Assert.AreEqual(null, r5.R4); Assert.AreEqual(null, r5.R3); Assert.AreEqual(215.1300m, Math.Round((decimal)r5.PP, 4)); Assert.AreEqual(213.2400m, Math.Round((decimal)r5.S1, 4)); Assert.AreEqual(null, r5.S2); Assert.AreEqual(218.7400m, Math.Round((decimal)r5.R1, 4)); Assert.AreEqual(null, r5.R2); Assert.AreEqual(null, r5.S3); Assert.AreEqual(null, r5.S4); PivotPointsResult r6 = results[19]; Assert.AreEqual(null, r6.R4); Assert.AreEqual(null, r6.R3); Assert.AreEqual(null, r6.PP); Assert.AreEqual(null, r6.S1); Assert.AreEqual(null, r6.S2); Assert.AreEqual(null, r6.R1); Assert.AreEqual(null, r6.R2); Assert.AreEqual(null, r6.S3); Assert.AreEqual(null, r6.S4); }
public void GetPivotPointsStandard() { PeriodSize periodSize = PeriodSize.Month; PivotPointType pointType = PivotPointType.Standard; List <PivotPointsResult> results = Indicator.GetPivotPoints(history, periodSize, pointType) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count); Assert.AreEqual(482, results.Where(x => x.PP != null).Count()); // sample values PivotPointsResult r1 = results[501]; Assert.AreEqual(null, r1.R4); Assert.AreEqual(null, r1.R3); Assert.AreEqual(266.6767m, Math.Round((decimal)r1.PP, 4)); Assert.AreEqual(258.9633m, Math.Round((decimal)r1.S1, 4)); Assert.AreEqual(248.9667m, Math.Round((decimal)r1.S2, 4)); Assert.AreEqual(276.6733m, Math.Round((decimal)r1.R1, 4)); Assert.AreEqual(284.3867m, Math.Round((decimal)r1.R2, 4)); Assert.AreEqual(null, r1.S3); Assert.AreEqual(null, r1.S4); PivotPointsResult r2 = results[251]; Assert.AreEqual(null, r2.R4); Assert.AreEqual(null, r2.R3); Assert.AreEqual(255.1967m, Math.Round((decimal)r2.PP, 4)); Assert.AreEqual(251.6933m, Math.Round((decimal)r2.S1, 4)); Assert.AreEqual(246.3667m, Math.Round((decimal)r2.S2, 4)); Assert.AreEqual(260.5233m, Math.Round((decimal)r2.R1, 4)); Assert.AreEqual(264.0267m, Math.Round((decimal)r2.R2, 4)); Assert.AreEqual(null, r2.S3); Assert.AreEqual(null, r2.S4); PivotPointsResult r3 = results[250]; Assert.AreEqual(null, r3.R4); Assert.AreEqual(null, r3.R3); Assert.AreEqual(251.2767m, Math.Round((decimal)r3.PP, 4)); Assert.AreEqual(247.6133m, Math.Round((decimal)r3.S1, 4)); Assert.AreEqual(241.2867m, Math.Round((decimal)r3.S2, 4)); Assert.AreEqual(257.6033m, Math.Round((decimal)r3.R1, 4)); Assert.AreEqual(261.2667m, Math.Round((decimal)r3.R2, 4)); Assert.AreEqual(null, r3.S3); Assert.AreEqual(null, r3.S4); PivotPointsResult r4 = results[149]; Assert.AreEqual(null, r4.R4); Assert.AreEqual(null, r4.R3); Assert.AreEqual(233.6400m, Math.Round((decimal)r4.PP, 4)); Assert.AreEqual(230.8100m, Math.Round((decimal)r4.S1, 4)); Assert.AreEqual(226.3300m, Math.Round((decimal)r4.S2, 4)); Assert.AreEqual(238.1200m, Math.Round((decimal)r4.R1, 4)); Assert.AreEqual(240.9500m, Math.Round((decimal)r4.R2, 4)); Assert.AreEqual(null, r4.S3); Assert.AreEqual(null, r4.S4); PivotPointsResult r5 = results[20]; Assert.AreEqual(null, r5.R4); Assert.AreEqual(null, r5.R3); Assert.AreEqual(214.5000m, Math.Round((decimal)r5.PP, 4)); Assert.AreEqual(211.9800m, Math.Round((decimal)r5.S1, 4)); Assert.AreEqual(209.0000m, Math.Round((decimal)r5.S2, 4)); Assert.AreEqual(217.4800m, Math.Round((decimal)r5.R1, 4)); Assert.AreEqual(220.0000m, Math.Round((decimal)r5.R2, 4)); Assert.AreEqual(null, r5.S3); Assert.AreEqual(null, r5.S4); PivotPointsResult r6 = results[19]; Assert.AreEqual(null, r6.R4); Assert.AreEqual(null, r6.R3); Assert.AreEqual(null, r6.PP); Assert.AreEqual(null, r6.S1); Assert.AreEqual(null, r6.S2); Assert.AreEqual(null, r6.R1); Assert.AreEqual(null, r6.R2); Assert.AreEqual(null, r6.S3); Assert.AreEqual(null, r6.S4); }
public void GetPivotPointsCamarilla() { PeriodSize periodSize = PeriodSize.Week; PivotPointType pointType = PivotPointType.Camarilla; IEnumerable <Quote> h = History.GetHistory(38); List <PivotPointsResult> results = Indicator.GetPivotPoints(h, periodSize, pointType) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(38, results.Count); Assert.AreEqual(33, results.Where(x => x.PP != null).Count()); // sample values PivotPointsResult r1 = results[37]; Assert.AreEqual(239.7667m, Math.Round((decimal)r1.PP, 4)); Assert.AreEqual(224.3975m, Math.Round((decimal)r1.S1, 4)); Assert.AreEqual(222.9550m, Math.Round((decimal)r1.S2, 4)); Assert.AreEqual(221.5125m, Math.Round((decimal)r1.S3, 4)); Assert.AreEqual(217.1850m, Math.Round((decimal)r1.S4, 4)); Assert.AreEqual(261.9025m, Math.Round((decimal)r1.R1, 4)); Assert.AreEqual(263.3450m, Math.Round((decimal)r1.R2, 4)); Assert.AreEqual(264.7875m, Math.Round((decimal)r1.R3, 4)); Assert.AreEqual(269.1150m, Math.Round((decimal)r1.R4, 4)); PivotPointsResult r2 = results[23]; Assert.AreEqual(262.2767m, Math.Round((decimal)r2.PP, 4)); Assert.AreEqual(238.1900m, Math.Round((decimal)r2.S1, 4)); Assert.AreEqual(236.7300m, Math.Round((decimal)r2.S2, 4)); Assert.AreEqual(235.2700m, Math.Round((decimal)r2.S3, 4)); Assert.AreEqual(230.8900m, Math.Round((decimal)r2.S4, 4)); Assert.AreEqual(276.1500m, Math.Round((decimal)r2.R1, 4)); Assert.AreEqual(277.6100m, Math.Round((decimal)r2.R2, 4)); Assert.AreEqual(279.0700m, Math.Round((decimal)r2.R3, 4)); Assert.AreEqual(283.4500m, Math.Round((decimal)r2.R4, 4)); PivotPointsResult r3 = results[22]; Assert.AreEqual(265.8100m, Math.Round((decimal)r3.PP, 4)); Assert.AreEqual(257.4008m, Math.Round((decimal)r3.S1, 4)); Assert.AreEqual(256.5117m, Math.Round((decimal)r3.S2, 4)); Assert.AreEqual(255.6225m, Math.Round((decimal)r3.S3, 4)); Assert.AreEqual(252.9550m, Math.Round((decimal)r3.S4, 4)); Assert.AreEqual(280.5192m, Math.Round((decimal)r3.R1, 4)); Assert.AreEqual(281.4083m, Math.Round((decimal)r3.R2, 4)); Assert.AreEqual(282.2975m, Math.Round((decimal)r3.R3, 4)); Assert.AreEqual(284.9650m, Math.Round((decimal)r3.R4, 4)); PivotPointsResult r4 = results[5]; Assert.AreEqual(270.0567m, Math.Round((decimal)r4.PP, 4)); Assert.AreEqual(260.5875m, Math.Round((decimal)r4.S1, 4)); Assert.AreEqual(259.7850m, Math.Round((decimal)r4.S2, 4)); Assert.AreEqual(258.9825m, Math.Round((decimal)r4.S3, 4)); Assert.AreEqual(256.5750m, Math.Round((decimal)r4.S4, 4)); Assert.AreEqual(281.4525m, Math.Round((decimal)r4.R1, 4)); Assert.AreEqual(282.2550m, Math.Round((decimal)r4.R2, 4)); Assert.AreEqual(283.0575m, Math.Round((decimal)r4.R3, 4)); Assert.AreEqual(285.4650m, Math.Round((decimal)r4.R4, 4)); PivotPointsResult r5 = results[4]; Assert.AreEqual(null, r5.R4); Assert.AreEqual(null, r5.R3); Assert.AreEqual(null, r5.PP); Assert.AreEqual(null, r5.S1); Assert.AreEqual(null, r5.S2); Assert.AreEqual(null, r5.R1); Assert.AreEqual(null, r5.R2); Assert.AreEqual(null, r5.S3); Assert.AreEqual(null, r5.S4); }
// PIVOT POINTS /// <include file='./info.xml' path='indicator/*' /> /// public static IEnumerable <PivotPointsResult> GetPivotPoints <TQuote>( IEnumerable <TQuote> history, PeriodSize windowSize, PivotPointType pointType = PivotPointType.Standard) where TQuote : IQuote { // sort history List <TQuote> historyList = history.Sort(); // check parameter arguments ValidatePivotPoints(history, windowSize); // initialize List <PivotPointsResult> results = new(historyList.Count); PivotPointsResult windowPoint = new(); TQuote h0 = historyList[0]; int windowId = GetWindowNumber(h0.Date, windowSize); int windowEval; bool firstWindow = true; decimal windowHigh = h0.High; decimal windowLow = h0.Low; decimal windowOpen = h0.Open; decimal windowClose = h0.Close; // roll through history for (int i = 0; i < historyList.Count; i++) { TQuote h = historyList[i]; PivotPointsResult r = new() { Date = h.Date }; // new window evaluation windowEval = GetWindowNumber(h.Date, windowSize); if (windowEval != windowId) { windowId = windowEval; firstWindow = false; // set new levels if (pointType == PivotPointType.Woodie) { windowOpen = h.Open; } windowPoint = GetPivotPoint(pointType, windowOpen, windowHigh, windowLow, windowClose); // reset window min/max thresholds windowOpen = h.Open; windowHigh = h.High; windowLow = h.Low; } // add levels if (!firstWindow) { // pivot point r.PP = windowPoint.PP; // support r.S1 = windowPoint.S1; r.S2 = windowPoint.S2; r.S3 = windowPoint.S3; r.S4 = windowPoint.S4; // resistance r.R1 = windowPoint.R1; r.R2 = windowPoint.R2; r.R3 = windowPoint.R3; r.R4 = windowPoint.R4; } results.Add(r); // capture window threholds (for next iteration) windowHigh = (h.High > windowHigh) ? h.High : windowHigh; windowLow = (h.Low < windowLow) ? h.Low : windowLow; windowClose = h.Close; } return(results); }
public void Camarilla() { PeriodSize periodSize = PeriodSize.Week; PivotPointType pointType = PivotPointType.Camarilla; IEnumerable <Quote> h = HistoryTestData.Get(38); List <PivotPointsResult> results = Indicator.GetPivotPoints(h, periodSize, pointType) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(38, results.Count); Assert.AreEqual(33, results.Where(x => x.PP != null).Count()); // sample values PivotPointsResult r2 = results[4]; Assert.AreEqual(null, r2.R4); Assert.AreEqual(null, r2.R3); Assert.AreEqual(null, r2.PP); Assert.AreEqual(null, r2.S1); Assert.AreEqual(null, r2.S2); Assert.AreEqual(null, r2.R1); Assert.AreEqual(null, r2.R2); Assert.AreEqual(null, r2.S3); Assert.AreEqual(null, r2.S4); PivotPointsResult r3 = results[5]; Assert.AreEqual(271.0200m, Math.Round((decimal)r3.PP, 4)); Assert.AreEqual(270.13725m, Math.Round((decimal)r3.S1, 5)); Assert.AreEqual(269.2545m, Math.Round((decimal)r3.S2, 4)); Assert.AreEqual(268.3718m, Math.Round((decimal)r3.S3, 4)); Assert.AreEqual(265.7235m, Math.Round((decimal)r3.S4, 4)); Assert.AreEqual(271.9028m, Math.Round((decimal)r3.R1, 4)); Assert.AreEqual(272.7855m, Math.Round((decimal)r3.R2, 4)); Assert.AreEqual(273.66825m, Math.Round((decimal)r3.R3, 5)); Assert.AreEqual(276.3165m, Math.Round((decimal)r3.R4, 4)); PivotPointsResult r4 = results[22]; Assert.AreEqual(268.9600m, Math.Round((decimal)r4.PP, 4)); Assert.AreEqual(267.9819m, Math.Round((decimal)r4.S1, 4)); Assert.AreEqual(267.0038m, Math.Round((decimal)r4.S2, 4)); Assert.AreEqual(266.0258m, Math.Round((decimal)r4.S3, 4)); Assert.AreEqual(263.0915m, Math.Round((decimal)r4.S4, 4)); Assert.AreEqual(269.9381m, Math.Round((decimal)r4.R1, 4)); Assert.AreEqual(270.9162m, Math.Round((decimal)r4.R2, 4)); Assert.AreEqual(271.89425m, Math.Round((decimal)r4.R3, 5)); Assert.AreEqual(274.8285m, Math.Round((decimal)r4.R4, 4)); PivotPointsResult r5 = results[23]; Assert.AreEqual(257.1700m, Math.Round((decimal)r5.PP, 4)); Assert.AreEqual(255.5640m, Math.Round((decimal)r5.S1, 4)); Assert.AreEqual(253.9580m, Math.Round((decimal)r5.S2, 4)); Assert.AreEqual(252.3520m, Math.Round((decimal)r5.S3, 4)); Assert.AreEqual(247.5340m, Math.Round((decimal)r5.S4, 4)); Assert.AreEqual(258.7760m, Math.Round((decimal)r5.R1, 4)); Assert.AreEqual(260.3820m, Math.Round((decimal)r5.R2, 4)); Assert.AreEqual(261.9880m, Math.Round((decimal)r5.R3, 4)); Assert.AreEqual(266.8060m, Math.Round((decimal)r5.R4, 4)); PivotPointsResult r6 = results[37]; Assert.AreEqual(243.1500m, Math.Round((decimal)r6.PP, 4)); Assert.AreEqual(241.56325m, Math.Round((decimal)r6.S1, 5)); Assert.AreEqual(239.9765m, Math.Round((decimal)r6.S2, 4)); Assert.AreEqual(238.3898m, Math.Round((decimal)r6.S3, 4)); Assert.AreEqual(233.6295m, Math.Round((decimal)r6.S4, 4)); Assert.AreEqual(244.7368m, Math.Round((decimal)r6.R1, 4)); Assert.AreEqual(246.3235m, Math.Round((decimal)r6.R2, 4)); Assert.AreEqual(247.91025m, Math.Round((decimal)r6.R3, 5)); Assert.AreEqual(252.6705m, Math.Round((decimal)r6.R4, 4)); }
public PivotPointsResult[] CalculatePivotPoints(IEnumerable <IQuote> quotes, PeriodSize period) { return(Indicator.GetPivotPoints(quotes, period).ToArray()); }
public IEnumerable <object> GetAllStandardSignals(string pair = "BTCUSDT", PeriodSize periodSize = PeriodSize.ThirtyMinutes, long?fromTicks = null, long?toTicks = null) { DateTime from = DateTime.Now.AddDays(-2); DateTime to = DateTime.Now; if (fromTicks.HasValue) { from = new DateTime(fromTicks.Value); } if (toTicks.HasValue) { to = new DateTime(toTicks.Value); } if (to > DateTime.Now) { to = DateTime.Now; } IEnumerable <PatternQuote> history = HistoryService.GetHistory(pair, periodSize, from, to).Select(s => ToDerived <Quote, PatternQuote>(s)); var result = Indicator.GetBearishEngulfing(history); result = result.Union(Indicator.GetDarkCloudCover(history)); // "date": "2021-01-14T15:30:00Z" not confirmed ony 2 Candles result = result.Union(Indicator.GetEveningStar(history)); result = result.Union(Indicator.GetHangingMan(history)); // "date": "2021-01-15T22:00:00Z" ??? highest? result = result.Union(Indicator.GetShootingStar(history)); // "date": "2021-01-16T00:30:00Z" result = result.Union(Indicator.GetThreeBlackCrows(history)); result = result.Union(Indicator.GetBullishEngulfing(history)); result = result.Union(Indicator.GetHammer(history)); // "date": "2021-01-15T16:00:00Z" result = result.Union(Indicator.GetInverseHammer(history)); // "date": "2021-01-15T04:30:00Z" result = result.Union(Indicator.GetMorningStar(history)); result = result.Union(Indicator.GetPiercingLine(history)); // 14.01.2021 10UTC result = result.Union(Indicator.GetThreeWhiteSoldiers(history)); //"date": "2021-01-14T14:00:00Z" result = result.Union(Indicator.GetDragonflyDoji(history)); // "date": "2021-01-17T17:30:00Z" result = result.Union(Indicator.GetGraveStoneDoji(history)); result = result.Union(Indicator.GetLongLeggedDoji(history)); // "date": "2021-01-15T01:00:00Z" result = result.Union(Indicator.GetMarubozu(history)); //"source": "Marubozu open bullish", "date": "2021-01-14T17:00:00Z" // result = result.Union(Indicator.GetSpinningTop(history)); // "date": "2021-01-17T08:00:00Z" var groupedPatterns = result.GroupBy(r => r.Source).ToDictionary(x => x.Key, y => y.ToList()); //bool isFirstElemet = true; //List<object[]> returnValue = new List<object[]>(); //foreach (var v in history) //{ // if (isFirstElemet) // { // isFirstElemet = false; // List<object> curHeader = new List<object>(); // curHeader.Add("Date"); // curHeader.Add("Low"); // curHeader.Add("Open"); // curHeader.Add("Close"); // curHeader.Add("High"); // foreach (var key in groupedPatterns) // { // curHeader.Add(key.Key); // } // returnValue.Add(curHeader.ToArray()); // } // List<object> curEntry = new List<object>(); // curEntry.Add(v.Date); // curEntry.Add(v.Low); // curEntry.Add(v.Open); // curEntry.Add(v.Close); // curEntry.Add(v.High); // foreach (var key in groupedPatterns) // { // var pattern = key.FirstOrDefault(p => p.Date == v.Date); // if (pattern == null) // curEntry.Add(null); // else // curEntry.Add(pattern.Candle.High); // } // returnValue.Add(curEntry.ToArray()); //} return(new List <object>() { history.Select(s => s as IQuote), groupedPatterns }); }
// PIVOT POINTS /// <include file='./info.xml' path='indicator/*' /> /// public static IEnumerable <PivotPointsResult> GetPivotPoints <TQuote>( this IEnumerable <TQuote> quotes, PeriodSize windowSize, PivotPointType pointType = PivotPointType.Standard) where TQuote : IQuote { // sort quotes List <TQuote> quotesList = quotes.SortToList(); // initialize int length = quotesList.Count; List <PivotPointsResult> results = new(length); PivotPointsResult windowPoint = new(); TQuote h0; if (length == 0) { return(results); } else { h0 = quotesList[0]; } int windowId = GetWindowNumber(h0.Date, windowSize); int windowEval; bool firstWindow = true; decimal windowHigh = h0.High; decimal windowLow = h0.Low; decimal windowOpen = h0.Open; decimal windowClose = h0.Close; // roll through quotes for (int i = 0; i < length; i++) { TQuote q = quotesList[i]; PivotPointsResult r = new() { Date = q.Date }; // new window evaluation windowEval = GetWindowNumber(q.Date, windowSize); if (windowEval != windowId) { windowId = windowEval; firstWindow = false; // set new levels if (pointType == PivotPointType.Woodie) { windowOpen = q.Open; } windowPoint = GetPivotPoint <PivotPointsResult>( pointType, windowOpen, windowHigh, windowLow, windowClose); // reset window min/max thresholds windowOpen = q.Open; windowHigh = q.High; windowLow = q.Low; } // add levels if (!firstWindow) { // pivot point r.PP = windowPoint.PP; // support r.S1 = windowPoint.S1; r.S2 = windowPoint.S2; r.S3 = windowPoint.S3; r.S4 = windowPoint.S4; // resistance r.R1 = windowPoint.R1; r.R2 = windowPoint.R2; r.R3 = windowPoint.R3; r.R4 = windowPoint.R4; } results.Add(r); // capture window threholds (for next iteration) windowHigh = (q.High > windowHigh) ? q.High : windowHigh; windowLow = (q.Low < windowLow) ? q.Low : windowLow; windowClose = q.Close; } return(results); }