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();
        }
Пример #2
0
        /// <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();
        }