public void RunRule_DoesRaiseAlertInEschaton_WhenBidirectionalTradeAndDoesExceedsDailyThreshold_AndHasMarketData() { _tradingHoursService = new MarketTradingHoursService(_tradingHoursRepository, new NullLogger <MarketTradingHoursService>()); var rule = new LayeringRule(_equitiesParameters, _alertStream, _orderFilter, _logger, _equityFactory, _fixedIncomeFactory, _tradingHoursService, _ruleCtx, RuleRunMode.ValidationRun, _tradingLogger); var tradeBuy = ((Order)null).Random(); var tradeSell = ((Order)null).Random(); tradeBuy.PlacedDate = new DateTime(2018, 01, 01, 12, 0, 0); tradeBuy.OrderDirection = OrderDirections.BUY; tradeBuy.FilledDate = tradeBuy.PlacedDate.Value.AddMinutes(1); tradeSell.PlacedDate = new DateTime(2018, 01, 01, 12, 0, 0); tradeSell.OrderDirection = OrderDirections.SELL; tradeSell.FilledDate = tradeSell.PlacedDate.Value.AddMinutes(1); tradeBuy.OrderFilledVolume = 987; tradeSell.OrderFilledVolume = 1019; var market = new Market("1", "XLON", "London Stock Exchange", MarketTypes.STOCKEXCHANGE); var marketData = new EquityInterDayTimeBarCollection(market, tradeBuy.PlacedDate.Value.AddSeconds(-55), new List <EquityInstrumentInterDayTimeBar> { new EquityInstrumentInterDayTimeBar( tradeBuy.Instrument, 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.EquityInterDayTick, 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(marketDataEvent); rule.OnNext(buyEvent); rule.OnNext(sellEvent); rule.OnNext(eschaton); A.CallTo(() => _alertStream.Add(A <IUniverseAlertEvent> .Ignored)).MustHaveHappened(); A.CallTo(() => _ruleCtx.EndEvent()).MustHaveHappenedOnceExactly(); A.CallTo(() => _operationCtx.EndEventWithMissingDataError()).MustNotHaveHappened(); }
/// <summary> /// The set operation context end state. /// </summary> /// <param name="dataRequestSubscriber"> /// The data request subscriber. /// </param> /// <param name="operationContext"> /// The operation context. /// </param> private void SetOperationContextEndState( IUniverseDataRequestsSubscriber dataRequestSubscriber, ISystemProcessOperationContext operationContext) { if (!dataRequestSubscriber?.SubmitRequests ?? true) { this.logger.LogInformation("ending operation context event"); operationContext.EndEvent(); return; } this.logger.LogInformation("ending operating context event with missing data error"); operationContext.EndEventWithMissingDataError(); }