I made a test example below to show you. You can take a look at the Print output.
Firstly,
The OnBarUpdate doesn't understand whether it is real time or not.
Secondly,
As you can see from the print outs. It prints out fine at first then it just stops processing on OnBarUpdate().
You call it as so.
private UEJ uej = UEJ.Instance;
#region Using declarations using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Xml.Serialization; using NinjaTrader.Cbi; using NinjaTrader.Gui; using NinjaTrader.Gui.Chart; using NinjaTrader.Gui.SuperDom; using NinjaTrader.Gui.Tools; using NinjaTrader.Data; using NinjaTrader.NinjaScript; using NinjaTrader.Core.FloatingPoint; using NinjaTrader.NinjaScript.DrawingTools; using System.Windows.Threading; using NinjaTrader.Cbi; using NinjaTrader.Core; #endregion //This namespace holds Add ons in this folder and is required. Do not change it. namespace NinjaTrader.NinjaScript.AddOns { public sealed class UEJ : NinjaTrader.NinjaScript.AddOnBase { public double UEJ_Value { get; private set; } public double UEJ_Inverted { get; private set; } public double Trend { get; private set; } private BarsRequest barsRequest1; private BarsRequest barsRequest2; private BarsRequest barsRequest3; private double bars1Close; private double bars2Close; private double bars3Close; private int daysBack = 1; //Singleton code ----------------------------------------------------------------------------------------------------- static int instanceCounter = 0; private static UEJ singleInstance = null; private static readonly object lockObject = new object(); public static UEJ Instance { get { if(singleInstance == null) { lock(lockObject) { if(singleInstance == null) { singleInstance = new UEJ(); } } } else { NinjaTrader.Code.Output.Process("Instance of UEJ already created",PrintTo.OutputTab1); } return singleInstance; } } private UEJ() { Print("UEJ Started. Instances created " + instanceCounter + 1); NinjaTrader.Data.BarsRequest barsRequest1 = _BarsRequest("EURUSD", daysBack); NinjaTrader.Data.BarsRequest barsRequest2 = _BarsRequest("USDJPY", daysBack); NinjaTrader.Data.BarsRequest barsRequest3 = _BarsRequest("EURJPY", daysBack); } //------------------------------------------------------------------------------------------------------------------------------------ protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Tet Example Singleton Addon."; Name = "UEJ"; } else if (State == State.Configure) { } else if (State == State.Terminated) { NinjaTrader.Code.Output.Process("UEJ stopped" , PrintTo.OutputTab1); Cleanup(); } else if (State == State.Historical) { } } private NinjaTrader.Data.BarsRequest _BarsRequest(string symbol, int lookBackPeriod) { Cbi.Instrument instrument = Cbi.Instrument.GetInstrument(symbol); // Declare a BarsRequest object NinjaTrader.Data.BarsRequest barsRequest; // Request x number of days back of data. barsRequest = new NinjaTrader.Data.BarsRequest(instrument, DateTime.Now.AddDays(-lookBackPeriod), DateTime.Now); // Parameterize the request barsRequest.BarsPeriod = new NinjaTrader.Data.BarsPeriod { BarsPeriodType = BarsPeriodType.Tick, Value = 1 }; barsRequest.TradingHours = NinjaTrader.Data.TradingHours.Get("Default 24 x 7"); // Attach event handler for real-time events if you want to process real-time data barsRequest.Update += OnBarUpdate; // Call the Request method on the BarsRequest object to request the bars barsRequest.Request(new Action<NinjaTrader.Data.BarsRequest, ErrorCode, string>((bars, errorCode, errorMessage) => { if (errorCode != ErrorCode.NoError) { // Handle any errors in requesting bars here Print(string.Format("Error on requesting bars: {0}, {1}", errorCode, errorMessage)); return; } })); // Return the Bars Request to any callers of this method return barsRequest; } private void OnBarUpdate(object sender, NinjaTrader.Data.BarsUpdateEventArgs e) { Print("I am alive " + DateTime.Now.ToShortTimeString()); if(State == State.Historical) { Print("HISTORICAL - Symbol " + e.BarsSeries.Instrument.ToString() + " Close: " + e.BarsSeries.GetClose(e.MaxIndex) + " Index: " + e.BarsSeries.TotalTicks + " Count " + e.BarsSeries.Count + " LastBarTime " + e.BarsSeries.LastBarTime); } else if (State == State.Realtime) { Print("REALTIME - Symbol " + e.BarsSeries.Instrument.ToString() + " Close: " + e.BarsSeries.GetClose(e.MaxIndex) + " Index: " + e.BarsSeries.TotalTicks + " Count " + e.BarsSeries.Count + " LastBarTime " + e.BarsSeries.LastBarTime); } else { Print("Symbol " + e.BarsSeries.Instrument.ToString() + " Close: " + e.BarsSeries.GetClose(e.MaxIndex) + " Index: " + e.BarsSeries.TotalTicks + " Count " + e.BarsSeries.Count + " LastBarTime " + e.BarsSeries.LastBarTime); } // Process updated bars on each tick for (int i = e.MinIndex; i <= e.MaxIndex; i++) { //Processing every single realtime tick Print(string.Format("i = " + i + " " + "REALTIME BARS Time: {1} Close: {5} Symbol: {6}", Environment.NewLine, e.BarsSeries.GetTime(i), e.BarsSeries.GetOpen(i), e.BarsSeries.GetHigh(i), e.BarsSeries.GetLow(i), e.BarsSeries.GetClose(i), e.BarsSeries.Instrument.ToString()) ); } //if(something) Calculate() } public void Calculate() { //Just placeholder code UEJ_Value = bars1Close/bars2Close; UEJ_Inverted = bars2Close*bars3Close; Trend = 1; } public void Cleanup() { // Make sure to unsubscribe to the bars request subscription Print("Cleaning up Subscriptions"); barsRequest1.Update -= OnBarUpdate; barsRequest1.Dispose(); barsRequest1 = null; barsRequest2.Update -= OnBarUpdate; barsRequest2.Dispose(); barsRequest2 = null; barsRequest3.Update -= OnBarUpdate; barsRequest3.Dispose(); barsRequest3 = null; } } }
Comment