/// <summary> /// Initializes the algorithm state. /// </summary> public override void Initialize() { SetStartDate(2012, 01, 01); SetEndDate(2013, 01, 01); AddSecurity(SecurityType.Equity, "SPY"); // 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 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 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 WickedTwoRisingThenThreeFallingGapRenkos() { 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, 7.9m)); Assert.AreEqual(renkos.Count, 5); Assert.AreEqual(renkos[0].Open, 10.0); Assert.AreEqual(renkos[0].High, 11.0); Assert.AreEqual(renkos[0].Low, 9.6); Assert.AreEqual(renkos[0].Close, 11.0); Assert.AreEqual(renkos[0].Direction, BarDirection.Rising); Assert.AreEqual(renkos[0].Spread, 1.0); Assert.AreEqual(renkos[1].Open, 11.0); Assert.AreEqual(renkos[1].High, 12.0); Assert.AreEqual(renkos[1].Low, 10.7); Assert.AreEqual(renkos[1].Close, 12.0); Assert.AreEqual(renkos[1].Direction, BarDirection.Rising); Assert.AreEqual(renkos[1].Spread, 1.0); Assert.AreEqual(renkos[2].Open, 11.0); Assert.AreEqual(renkos[2].High, 12.4); Assert.AreEqual(renkos[2].Low, 10.0); Assert.AreEqual(renkos[2].Close, 10.0); Assert.AreEqual(renkos[2].Direction, BarDirection.Falling); Assert.AreEqual(renkos[2].Spread, 1.0); Assert.AreEqual(renkos[3].Open, 10.0); Assert.AreEqual(renkos[3].High, 10.0); Assert.AreEqual(renkos[3].Low, 9.0); Assert.AreEqual(renkos[3].Close, 9.0); Assert.AreEqual(renkos[3].Direction, BarDirection.Falling); Assert.AreEqual(renkos[3].Spread, 1.0); Assert.AreEqual(renkos[4].Open, 9.0); Assert.AreEqual(renkos[4].High, 9.0); Assert.AreEqual(renkos[4].Low, 8.0); Assert.AreEqual(renkos[4].Close, 8.0); Assert.AreEqual(renkos[4].Direction, BarDirection.Falling); Assert.AreEqual(renkos[4].Spread, 1.0); var openRenko = consolidator.OpenRenkoBar; Assert.AreEqual(openRenko.Open, 8.0); Assert.AreEqual(openRenko.High, 8.0); Assert.AreEqual(openRenko.Low, 7.9); Assert.AreEqual(openRenko.Close, 7.9); }
public void WickedThreeFallingGapRenkos() { 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, 14.0m)); consolidator.Update(new IndicatorDataPoint(tickOn2, 10.0m)); Assert.AreEqual(renkos.Count, 3); Assert.AreEqual(renkos[0].Start, tickOn1); Assert.AreEqual(renkos[0].EndTime, tickOn2); Assert.AreEqual(renkos[0].Open, 14.0m); Assert.AreEqual(renkos[0].High, 14.0m); Assert.AreEqual(renkos[0].Low, 13.0m); Assert.AreEqual(renkos[0].Close, 13.0m); Assert.AreEqual(renkos[0].Direction, BarDirection.Falling); Assert.AreEqual(renkos[0].Spread, 1.0m); Assert.AreEqual(renkos[1].Start, tickOn2); Assert.AreEqual(renkos[1].EndTime, tickOn2); Assert.AreEqual(renkos[1].Open, 13.0m); Assert.AreEqual(renkos[1].High, 13.0m); Assert.AreEqual(renkos[1].Low, 12.0m); Assert.AreEqual(renkos[1].Close, 12.0m); Assert.AreEqual(renkos[1].Direction, BarDirection.Falling); Assert.AreEqual(renkos[1].Spread, 1.0); Assert.AreEqual(renkos[2].Start, tickOn2); Assert.AreEqual(renkos[2].EndTime, tickOn2); Assert.AreEqual(renkos[2].Open, 12.0m); Assert.AreEqual(renkos[2].High, 12.0m); Assert.AreEqual(renkos[2].Low, 11.0m); Assert.AreEqual(renkos[2].Close, 11.0m); Assert.AreEqual(renkos[2].Direction, BarDirection.Falling); Assert.AreEqual(renkos[2].Spread, 1.0m); var openRenko = consolidator.OpenRenkoBar; Assert.AreEqual(openRenko.Open, 11.0m); Assert.AreEqual(openRenko.High, 11.0m); Assert.AreEqual(openRenko.Low, 10.0m); Assert.AreEqual(openRenko.Close, 10.0m); }
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 WickedOutputTypeIsRenkoBar() { var consolidator = new RenkoConsolidator(10.0m); Assert.AreEqual(typeof(RenkoBar), consolidator.OutputType); }