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 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();
        }
예제 #4
0
        public void Tuner_AdjustsLayeringRuleField_AsExpected()
        {
            var tuner = new RuleParameterTuner(this._logger);

            var ruleParameters = new LayeringRuleEquitiesParameters(
                "id",
                TimeSpan.FromHours(1),
                0.3m,
                0.4m,
                true,
                null,
                true,
                true);

            var result = tuner.ParametersFramework(ruleParameters);

            Assert.That(result, Is.Not.Null);
            Assert.That(result.Count, Is.EqualTo(18));
        }
예제 #5
0
        public void GivenIHaveTheLayeringRuleParameterValues(Table layeringParameters)
        {
            if (layeringParameters.RowCount != 1)
            {
                this._scenarioContext.Pending();
                return;
            }

            var parameters = layeringParameters.CreateInstance <LayeringApiParameters>();

            this._parameters = new LayeringRuleEquitiesParameters(
                "0",
                new TimeSpan(parameters.WindowHours, 0, 0),
                parameters.PercentageOfMarketDailyVolume,
                parameters.PercentageOfMarketWindowVolume,
                parameters.CheckForCorrespondingPriceMovement,
                new ClientOrganisationalFactors[0],
                true,
                true);
        }
        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);
        }