/// <summary> /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized. /// </summary> public override void Initialize() { SetStartDate(2013, 11, 1); SetEndDate(2013, 12, 10); //Set End Date SetWarmup(TimeSpan.FromDays(30)); _spy = AddEquity("SPY", Resolution.Daily).Symbol; var renkoConsolidator = new RenkoConsolidator(2m); renkoConsolidator.DataConsolidated += (sender, consolidated) => { if (IsWarmingUp) { return; } if (!Portfolio.Invested) { SetHoldings(_spy, 1.0); } Log($"CLOSE - {consolidated.Time:o} - {consolidated.Open} {consolidated.Close}"); }; var sma = new SimpleMovingAverage("SMA", 3); RegisterIndicator(_spy, sma, renkoConsolidator); }
public void WickedOneRisingRenko() { var consolidator = new RenkoConsolidator(1.0m, RenkoType.Wicked); var renkos = new List <RenkoBar>(); consolidator.DataConsolidated += (sender, renko) => renkos.Add(renko); var tickOn1 = new DateTime(2016, 1, 1, 17, 0, 0, 0); var tickOn2 = new DateTime(2016, 1, 1, 17, 0, 0, 1); consolidator.Update(new IndicatorDataPoint(tickOn1, 9.0m)); consolidator.Update(new IndicatorDataPoint(tickOn2, 10.1m)); Assert.AreEqual(renkos.Count, 1); Assert.AreEqual(renkos[0].Open, 9.0m); Assert.AreEqual(renkos[0].High, 10.0m); Assert.AreEqual(renkos[0].Low, 9.0m); Assert.AreEqual(renkos[0].Close, 10.0m); Assert.AreEqual(renkos[0].Direction, BarDirection.Rising); Assert.AreEqual(renkos[0].Spread, 1.0m); Assert.AreEqual(renkos[0].Start, tickOn1); Assert.AreEqual(renkos[0].EndTime, tickOn2); var openRenko = consolidator.OpenRenkoBar; Assert.AreEqual(openRenko.Start, tickOn2); Assert.AreEqual(openRenko.EndTime, tickOn2); Assert.AreEqual(openRenko.Open, 10.0m); Assert.AreEqual(openRenko.High, 10.1m); Assert.AreEqual(openRenko.Low, 10.0m); Assert.AreEqual(openRenko.Close, 10.1m); }
public void ConsolidatesOnBrickLow() { RenkoBar bar = null; var consolidator = new RenkoConsolidator(10, x => x.Value, x => 0); consolidator.DataConsolidated += (sender, consolidated) => { bar = consolidated; }; var reference = DateTime.Today; consolidator.Update(new IndicatorDataPoint(reference, 10m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddHours(1), 2m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddHours(2), 0m)); Assert.IsNotNull(bar); Assert.AreEqual(10m, bar.Open); Assert.AreEqual(0m, bar.Close); Assert.IsTrue(bar.IsClosed); }
public void WickedTwoRisingThenOneFallingRenkos() { var consolidator = new RenkoConsolidator(1.0m, RenkoType.Wicked); var renkos = new List <RenkoBar>(); consolidator.DataConsolidated += (sender, renko) => renkos.Add(renko); var tickOn1 = new DateTime(2016, 1, 1, 17, 0, 0, 0); var tickOn2 = new DateTime(2016, 1, 1, 17, 0, 0, 1); consolidator.Update(new IndicatorDataPoint(tickOn1, 10.0m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 9.6m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 10.5m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 11.1m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 11.0m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 10.7m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 11.6m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 12.3m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 12.3m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 12.4m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 11.5m)); consolidator.Update(new IndicatorDataPoint(tickOn1, 9.9m)); Assert.AreEqual(renkos.Count, 3); Assert.AreEqual(renkos[0].Open, 10.0m); Assert.AreEqual(renkos[0].High, 11.0m); Assert.AreEqual(renkos[0].Low, 9.6m); Assert.AreEqual(renkos[0].Close, 11.0m); Assert.AreEqual(renkos[0].Direction, BarDirection.Rising); Assert.AreEqual(renkos[0].Spread, 1.0m); Assert.AreEqual(renkos[1].Open, 11.0m); Assert.AreEqual(renkos[1].High, 12.0m); Assert.AreEqual(renkos[1].Low, 10.7m); Assert.AreEqual(renkos[1].Close, 12.0m); Assert.AreEqual(renkos[1].Direction, BarDirection.Rising); Assert.AreEqual(renkos[1].Spread, 1.0m); Assert.AreEqual(renkos[2].Open, 11.0m); Assert.AreEqual(renkos[2].High, 12.4m); Assert.AreEqual(renkos[2].Low, 10.0m); Assert.AreEqual(renkos[2].Close, 10.0m); Assert.AreEqual(renkos[2].Direction, BarDirection.Falling); Assert.AreEqual(renkos[2].Spread, 1.0m); var openRenko = consolidator.OpenRenkoBar; Assert.AreEqual(openRenko.Open, 10.0m); Assert.AreEqual(openRenko.High, 10.0m); Assert.AreEqual(openRenko.Low, 9.9m); Assert.AreEqual(openRenko.Close, 9.9m); }
/// <summary> /// Initializes the algorithm state. /// </summary> public override void Initialize() { SetStartDate(2012, 01, 01); SetEndDate(2013, 01, 01); AddEquity("SPY", Resolution.Daily); // this is the simple constructor that will perform the renko logic to the Value // property of the data it receives. // break SPY into $2.5 renko bricks and send that data to our 'OnRenkoBar' method var renkoClose = new RenkoConsolidator(2.5m); renkoClose.DataConsolidated += (sender, consolidated) => { // call our event handler for renko data HandleRenkoClose(consolidated); }; // register the consolidator for updates SubscriptionManager.AddConsolidator("SPY", renkoClose); // this is the full constructor that can accept a value selector and a volume selector // this allows us to perform the renko logic on values other than Close, even computed values! // break SPY into (2*o + h + l + 3*c)/7 var renko7bar = new RenkoConsolidator <TradeBar>(2.5m, x => (2 * x.Open + x.High + x.Low + 3 * x.Close) / 7m, x => x.Volume); renko7bar.DataConsolidated += (sender, consolidated) => { HandleRenko7Bar(consolidated); }; // register the consolidator for updates SubscriptionManager.AddConsolidator("SPY", renko7bar); }
public void WickedNoRisingRenkoKissLimit() { var consolidator = new RenkoConsolidator(1.0m, RenkoType.Wicked); var renkos = new List <RenkoBar>(); consolidator.DataConsolidated += (sender, renko) => renkos.Add(renko); var tickOn1 = new DateTime(2016, 1, 1, 17, 0, 0, 0); var tickOn2 = new DateTime(2016, 1, 1, 17, 0, 0, 1); consolidator.Update(new IndicatorDataPoint(tickOn1, 10.0m)); consolidator.Update(new IndicatorDataPoint(tickOn2, 11.0m)); Assert.AreEqual(renkos.Count, 0); var openRenko = consolidator.OpenRenkoBar; Assert.AreEqual(openRenko.Open, 10.0m); Assert.AreEqual(openRenko.High, 11.0m); Assert.AreEqual(openRenko.Low, 10.0m); Assert.AreEqual(openRenko.Close, 11.0m); }
public void CyclesUpAndDown() { RenkoBar bar = null; int count = 0; int rcount = 0; var consolidator = new RenkoConsolidator(1m, x => x.Value, x => 0); consolidator.DataConsolidated += (sender, consolidated) => { rcount++; bar = consolidated; }; var reference = DateTime.Today; // opens at 0 consolidator.Update(new IndicatorDataPoint(reference, 0)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(1), .5m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(2), 1m)); Assert.IsNotNull(bar); Assert.AreEqual(0m, bar.Open); Assert.AreEqual(1m, bar.Close); Assert.AreEqual(0, bar.Volume); Assert.AreEqual(1m, bar.High); Assert.AreEqual(0m, bar.Low); Assert.IsTrue(bar.IsClosed); Assert.AreEqual(reference, bar.Start); Assert.AreEqual(reference.AddSeconds(2), bar.EndTime); bar = null; consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(3), 1.5m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(4), 1m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(5), .5m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(6), 0m)); Assert.IsNotNull(bar); // ReSharper disable HeuristicUnreachableCode - ReSharper doesn't realiz this can be set via the event handler Assert.AreEqual(1m, bar.Open); Assert.AreEqual(0m, bar.Close); Assert.AreEqual(0, bar.Volume); Assert.AreEqual(1.5m, bar.High); Assert.AreEqual(0m, bar.Low); Assert.IsTrue(bar.IsClosed); Assert.AreEqual(reference.AddSeconds(2), bar.Start); Assert.AreEqual(reference.AddSeconds(6), bar.EndTime); bar = null; consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(7), -0.5m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(8), -0.9999999m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(9), -0.01m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(10), 0.25m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(9), 0.75m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(10), 0.9999999m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(10), 0.25m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(9), -0.25m)); Assert.IsNull(bar); consolidator.Update(new IndicatorDataPoint(reference.AddSeconds(10), -1m)); Assert.IsNotNull(bar); Assert.AreEqual(0m, bar.Open); Assert.AreEqual(-1m, bar.Close); Assert.AreEqual(0, bar.Volume); Assert.AreEqual(0.9999999m, bar.High); Assert.AreEqual(-1m, bar.Low); Assert.IsTrue(bar.IsClosed); Assert.AreEqual(reference.AddSeconds(6), bar.Start); Assert.AreEqual(reference.AddSeconds(10), bar.EndTime); // ReSharper restore HeuristicUnreachableCode }
public void OututTypeIsRenkoBar() { var consolidator = new RenkoConsolidator(10, x => x.Value, x => 0); Assert.AreEqual(typeof(RenkoBar), consolidator.OutputType); }
public void WickedOutputTypeIsRenkoBar() { var consolidator = new RenkoConsolidator(10.0m); Assert.AreEqual(typeof(RenkoBar), consolidator.OutputType); }
public void ConsistentRenkos() { // Test Renko bar consistency amongst three consolidators starting at different times var time = new DateTime(2016, 1, 1); var testValues = new List <decimal> { 1.38687m, 1.38688m, 1.38687m, 1.38686m, 1.38685m, 1.38683m, 1.38682m, 1.38682m, 1.38684m, 1.38682m, 1.38682m, 1.38680m, 1.38681m, 1.38686m, 1.38688m, 1.38688m, 1.38690m, 1.38690m, 1.38691m, 1.38692m, 1.38694m, 1.38695m, 1.38697m, 1.38697m, 1.38700m, 1.38699m, 1.38699m, 1.38699m, 1.38698m, 1.38699m, 1.38697m, 1.38698m, 1.38698m, 1.38697m, 1.38698m, 1.38698m, 1.38697m, 1.38697m, 1.38700m, 1.38702m, 1.38701m, 1.38699m, 1.38697m, 1.38698m, 1.38696m, 1.38698m, 1.38697m, 1.38695m, 1.38695m, 1.38696m, 1.38693m, 1.38692m, 1.38693m, 1.38693m, 1.38692m, 1.38693m, 1.38692m, 1.38690m, 1.38686m, 1.38685m, 1.38687m, 1.38686m, 1.38686m, 1.38686m, 1.38686m, 1.38685m, 1.38684m, 1.38678m, 1.38679m, 1.38680m, 1.38680m, 1.38681m, 1.38685m, 1.38685m, 1.38683m, 1.38682m, 1.38682m, 1.38683m, 1.38682m, 1.38683m, 1.38682m, 1.38681m, 1.38680m, 1.38681m, 1.38681m, 1.38681m, 1.38682m, 1.38680m, 1.38679m, 1.38678m, 1.38675m, 1.38678m, 1.38678m, 1.38678m, 1.38682m, 1.38681m, 1.38682m, 1.38680m, 1.38682m, 1.38683m, 1.38685m, 1.38683m, 1.38683m, 1.38684m, 1.38683m, 1.38683m, 1.38684m, 1.38685m, 1.38684m, 1.38683m, 1.38686m, 1.38685m, 1.38685m, 1.38684m, 1.38685m, 1.38682m, 1.38684m, 1.38683m, 1.38682m, 1.38683m, 1.38685m, 1.38685m, 1.38685m, 1.38683m, 1.38685m, 1.38684m, 1.38686m, 1.38693m, 1.38695m, 1.38693m, 1.38694m, 1.38693m, 1.38692m, 1.38693m, 1.38695m, 1.38697m, 1.38698m, 1.38695m, 1.38696m }; var consolidator1 = new RenkoConsolidator(0.0001m); var consolidator2 = new RenkoConsolidator(0.0001m); var consolidator3 = new RenkoConsolidator(0.0001m); // Update each of our consolidators starting at different indexes of test values for (int i = 0; i < testValues.Count; i++) { var data = new IndicatorDataPoint(time.AddSeconds(i), testValues[i]); consolidator1.Update(data); if (i > 10) { consolidator2.Update(data); } if (i > 20) { consolidator3.Update(data); } } // Assert that consolidator 2 and 3 price is the same as 1. Even though they started at different // indexes they should be the same var bar1 = consolidator1.Consolidated as RenkoBar; var bar2 = consolidator2.Consolidated as RenkoBar; var bar3 = consolidator3.Consolidated as RenkoBar; Assert.AreEqual(bar1.Close, bar2.Close); Assert.AreEqual(bar1.Close, bar3.Close); consolidator1.Dispose(); consolidator2.Dispose(); consolidator3.Dispose(); }