public void RunRule_RaisesAlertInEschaton_WhenBidirectionalTrade() { _tradingHoursService = new MarketTradingHoursService(_tradingHoursRepository, new NullLogger <MarketTradingHoursService>()); var parameters = new LayeringRuleEquitiesParameters("id", TimeSpan.FromMinutes(30), null, null, null, null, false, true); var rule = new LayeringRule(parameters, _alertStream, _orderFilter, _logger, _equityFactory, _fixedIncomeFactory, _tradingHoursService, _ruleCtx, RuleRunMode.ValidationRun, _tradingLogger); var tradeBuy = ((Order)null).Random(); var tradeSell = ((Order)null).Random(); tradeBuy.OrderDirection = OrderDirections.BUY; tradeBuy.FilledDate = tradeBuy.PlacedDate.Value.AddMinutes(1); tradeSell.OrderDirection = OrderDirections.SELL; tradeSell.FilledDate = tradeSell.PlacedDate.Value.AddMinutes(1); var genesis = new UniverseEvent(UniverseStateEvent.Genesis, tradeBuy.PlacedDate.Value.AddMinutes(-1), new object()); var buyEvent = new UniverseEvent(UniverseStateEvent.OrderPlaced, tradeBuy.PlacedDate.Value, tradeBuy); var sellEvent = new UniverseEvent(UniverseStateEvent.OrderPlaced, tradeSell.PlacedDate.Value, tradeSell); var eschaton = new UniverseEvent(UniverseStateEvent.Eschaton, tradeSell.PlacedDate.Value.AddMinutes(-1), new object()); rule.OnNext(genesis); rule.OnNext(buyEvent); rule.OnNext(sellEvent); rule.OnNext(eschaton); A.CallTo(() => _alertStream.Add(A <IUniverseAlertEvent> .Ignored)).MustHaveHappenedTwiceExactly(); }
public void EndOfUniverse_RecordUpdateAlertAndEndEvent() { var rule = new LayeringRule(_equitiesParameters, _alertStream, _orderFilter, _logger, _equityFactory, _fixedIncomeFactory, _tradingHoursService, _ruleCtx, RuleRunMode.ValidationRun, _tradingLogger); var eschaton = new UniverseEvent(UniverseStateEvent.Eschaton, DateTime.UtcNow, new object()); rule.OnNext(eschaton); A.CallTo(() => _alertStream.Add(A <IUniverseAlertEvent> .Ignored)).MustHaveHappenedOnceExactly(); }
public void RunRule_DoesNotRaiseAlertInEschaton_WhenBidirectionalTradeAndDoesNotExceedsWindowThreshold_AndNoMarketData() { var parameters = new LayeringRuleEquitiesParameters("id", TimeSpan.FromMinutes(30), null, 0.1m, null, null, false, true); _tradingHoursService = new MarketTradingHoursService(_tradingHoursRepository, new NullLogger <MarketTradingHoursService>()); var rule = new LayeringRule(parameters, _alertStream, _orderFilter, _logger, _equityFactory, _fixedIncomeFactory, _tradingHoursService, _ruleCtx, RuleRunMode.ValidationRun, _tradingLogger); var tradeBuy = ((Order)null).Random(); var tradeSell = ((Order)null).Random(); tradeBuy.OrderDirection = OrderDirections.BUY; tradeBuy.FilledDate = tradeBuy.PlacedDate.Value.AddMinutes(1); tradeSell.OrderDirection = OrderDirections.SELL; tradeSell.FilledDate = tradeSell.PlacedDate.Value.AddMinutes(1); tradeBuy.OrderFilledVolume = 100; tradeSell.OrderFilledVolume = 100; var market = new Market("1", "XLON", "London Stock Exchange", MarketTypes.STOCKEXCHANGE); var marketData = new EquityIntraDayTimeBarCollection(market, tradeBuy.PlacedDate.Value.AddSeconds(-55), new List <EquityInstrumentIntraDayTimeBar> { new EquityInstrumentIntraDayTimeBar( tradeBuy.Instrument, new SpreadTimeBar( tradeBuy.OrderAverageFillPrice.Value, tradeSell.OrderAverageFillPrice.Value, tradeSell.OrderAverageFillPrice.Value, new Volume(2000)), new DailySummaryTimeBar( 1000, "USD", new IntradayPrices(tradeBuy.OrderAverageFillPrice.Value, tradeBuy.OrderAverageFillPrice.Value, tradeBuy.OrderAverageFillPrice.Value, tradeBuy.OrderAverageFillPrice.Value), 1000, new Volume(2000), tradeBuy.PlacedDate.Value.AddSeconds(-55)), tradeBuy.PlacedDate.Value.AddSeconds(-55), market) }); var genesis = new UniverseEvent(UniverseStateEvent.Genesis, tradeBuy.PlacedDate.Value.AddMinutes(-1), new object()); var marketDataEvent = new UniverseEvent(UniverseStateEvent.EquityIntraDayTick, tradeBuy.PlacedDate.Value.AddSeconds(-55), marketData); var buyEvent = new UniverseEvent(UniverseStateEvent.OrderPlaced, tradeBuy.PlacedDate.Value, tradeBuy); var sellEvent = new UniverseEvent(UniverseStateEvent.OrderPlaced, tradeSell.PlacedDate.Value, tradeSell); var eschaton = new UniverseEvent(UniverseStateEvent.Eschaton, tradeSell.PlacedDate.Value.AddMinutes(1), new object()); rule.OnNext(genesis); rule.OnNext(buyEvent); rule.OnNext(sellEvent); rule.OnNext(marketDataEvent); rule.OnNext(eschaton); A.CallTo(() => _alertStream.Add(A <IUniverseAlertEvent> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => _ruleCtx.EndEvent()).MustHaveHappenedOnceExactly(); }
public void RunRule_DoesNotRaiseAlertInEschaton_WhenBidirectionalTradeAndNoPriceMovementData() { var parameters = new LayeringRuleEquitiesParameters("id", TimeSpan.FromMinutes(30), null, null, true, null, false, true); _tradingHoursService = new MarketTradingHoursService(_tradingHoursRepository, new NullLogger <MarketTradingHoursService>()); var rule = new LayeringRule(parameters, _alertStream, _orderFilter, _logger, _equityFactory, _fixedIncomeFactory, _tradingHoursService, _ruleCtx, RuleRunMode.ValidationRun, _tradingLogger); var tradeBuy = ((Order)null).Random(); var tradeSell = ((Order)null).Random(); tradeBuy.OrderDirection = OrderDirections.BUY; tradeBuy.FilledDate = tradeBuy.PlacedDate.Value.AddMinutes(1); tradeSell.OrderDirection = OrderDirections.SELL; tradeSell.FilledDate = tradeSell.PlacedDate.Value.AddMinutes(1); tradeBuy.OrderFilledVolume = 300; tradeSell.OrderFilledVolume = 5; tradeBuy.PlacedDate = new DateTime(2018, 10, 14, 10, 30, 0); tradeSell.PlacedDate = tradeBuy.PlacedDate.Value.AddSeconds(30); var market = new Market("1", "XLON", "London Stock Exchange", MarketTypes.STOCKEXCHANGE); var initialPrice = tradeBuy.OrderAverageFillPrice.Value.Value; var marketData5 = SetExchangeFrameToPrice(market, tradeBuy, tradeSell, initialPrice * 1.2m, tradeSell.PlacedDate.Value.AddSeconds(5)); var marketData6 = SetExchangeFrameToPrice(market, tradeBuy, tradeSell, initialPrice * 1.25m, tradeSell.PlacedDate.Value.AddSeconds(10)); var genesis = new UniverseEvent(UniverseStateEvent.Genesis, tradeBuy.PlacedDate.Value.AddMinutes(-1), new object()); var buyEvent = new UniverseEvent(UniverseStateEvent.OrderPlaced, tradeBuy.PlacedDate.Value, tradeBuy); var sellEvent = new UniverseEvent(UniverseStateEvent.OrderPlaced, tradeSell.PlacedDate.Value, tradeSell); var marketDataEvent5 = new UniverseEvent(UniverseStateEvent.EquityIntraDayTick, marketData5.Epoch, marketData5); var marketDataEvent6 = new UniverseEvent(UniverseStateEvent.EquityIntraDayTick, marketData6.Epoch, marketData6); var eschaton = new UniverseEvent(UniverseStateEvent.Eschaton, tradeSell.PlacedDate.Value.AddMinutes(1), new object()); rule.OnNext(genesis); rule.OnNext(buyEvent); rule.OnNext(sellEvent); rule.OnNext(marketDataEvent5); rule.OnNext(marketDataEvent6); rule.OnNext(eschaton); A.CallTo(() => _alertStream.Add(A <IUniverseAlertEvent> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => _ruleCtx.EndEvent()).MustHaveHappenedOnceExactly(); }
private LayeringRule BuildRule(LayeringRuleEquitiesParameters parameters = null) { if (parameters == null) { parameters = new LayeringRuleEquitiesParameters("id", TimeSpan.FromMinutes(30), null, null, true, null, false, true); } var rule = new LayeringRule( parameters, _alertStream, _orderFilter, _logger, _equityFactory, _fixedIncomeFactory, _tradingHoursService, _ruleCtx, RuleRunMode.ValidationRun, _tradingLogger); return(rule); }