Exemplo n.º 1
0
        public void Filter_WhenUniverseEventExcludeMarketCapFilter_MustNotBeFiltered()
        {
            var marketCapRangeRuleFilter = new DecimalRangeRuleFilter
            {
                Type = RuleFilterType.Exclude
            };

            var highMarketCapFilter = new HighMarketCapFilter(
                _universeMarketCacheFactory,
                Engine.Rules.Rules.RuleRunMode.ValidationRun,
                marketCapRangeRuleFilter,
                _tradingHoursService,
                _operationRunRuleContext,
                _universeDataRequestsSubscriber,
                this.currencyConverterService,
                "test",
                _logger);


            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, new { });

            var result = highMarketCapFilter.Filter(eventOne);

            Assert.IsFalse(result);
        }
        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 OnNext_CallsOnCompleted_ForWhiteListTrueSubscribers_HighMarketCapFilter()
        {
            var fundOne  = ((Order)null).Random();
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, fundOne);

            A.CallTo(() => this._highMarketCapFilter.Filter(eventOne)).Returns(false);

            var filter = new UniverseFilterService(
                this._unsubscriber,
                this._highMarketCapFilter,
                this._filteredRule,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                this._logger);

            filter.Subscribe(this._observer);

            filter.OnNext(eventOne);

            A.CallTo(() => this._observer.OnNext(eventOne)).MustHaveHappenedOnceExactly();
        }
Exemplo n.º 4
0
        public void Filter_WhenUniverseEventAndTradingHoursIsNotValid_MustBeFiltered()
        {
            var fundOne  = ((Order)null).Random();
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, fundOne);

            A.CallTo(() => _tradingHoursService.GetTradingHoursForMic(fundOne.Market.MarketIdentifierCode))
            .Returns(new TradingHours()
            {
                IsValid = false
            });

            var marketCapRangeRuleFilter = new DecimalRangeRuleFilter
            {
                Type = RuleFilterType.Include
            };

            var highMarketCapFilter = new HighMarketCapFilter(
                _universeMarketCacheFactory,
                Engine.Rules.Rules.RuleRunMode.ValidationRun,
                marketCapRangeRuleFilter,
                _tradingHoursService,
                _operationRunRuleContext,
                _universeDataRequestsSubscriber,
                this.currencyConverterService,
                "test",
                _logger);

            var result = highMarketCapFilter.Filter(eventOne);

            Assert.IsTrue(result);
        }
        public void GivenIHaveTheOrders(string from, string to, Table orderTable)
        {
            var eventList = new List <IUniverseEvent>();

            var fromDate = DateTime.Parse(from);
            var genesis  = new UniverseEvent(UniverseStateEvent.Genesis, fromDate, new object());

            var toDate   = DateTime.Parse(to).AddDays(1).AddMilliseconds(-1);
            var eschaton = new UniverseEvent(UniverseStateEvent.Eschaton, toDate, new object());

            eventList.Add(genesis);

            for (var i = 0; i <= toDate.Subtract(fromDate).Days; i++)
            {
                var closeEventXlon = new UniverseEvent(
                    UniverseStateEvent.ExchangeClose,
                    fromDate.Date.AddDays(i).AddHours(16),
                    new MarketOpenClose(
                        "XLON",
                        fromDate.Date.AddDays(i).AddHours(8),
                        fromDate.Date.AddDays(i).AddHours(16)));

                eventList.Add(closeEventXlon);

                var closeEventNasdaq = new UniverseEvent(
                    UniverseStateEvent.ExchangeClose,
                    fromDate.Date.AddDays(i).AddHours(23),
                    new MarketOpenClose(
                        "NASDAQ",
                        fromDate.Date.AddDays(i).AddHours(15),
                        fromDate.Date.AddDays(i).AddHours(23)));

                eventList.Add(closeEventNasdaq);
            }

            var orderParams = orderTable.CreateSet <OrderParameters>();

            foreach (var row in orderParams)
            {
                var orderEvent = this.MapRowToOrderEvent(row);

                if (orderEvent == null)
                {
                    continue;
                }

                foreach (var universeEvent in orderEvent)
                {
                    eventList.Add(universeEvent);
                }
            }

            eventList.Add(eschaton);
            eventList = eventList.OrderBy(i => i.EventTime).ToList();

            var universe = this.Build(eventList);

            this._universeSelectionState.SelectedUniverse = universe;
        }
        public void Filter_NonOrderEvent_ReturnsEvent()
        {
            var orderFilter   = new UniverseEquityOrderFilterService(this._logger);
            var universeEvent = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, "not-an-order");

            var filteredEvent = orderFilter.Filter(universeEvent);

            Assert.AreEqual(universeEvent, filteredEvent);
        }
        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 Do_XNullEvent_ReturnLess()
        {
            IUniverseEvent x        = null;
            IUniverseEvent y        = new UniverseEvent(UniverseStateEvent.Genesis, DateTime.UtcNow, new object());
            var            comparer = new UniverseEventComparer();

            var result = comparer.Compare(x, y);

            Assert.AreEqual(result, -1);
        }
        public void OnNext_CallsOnCompleted_ForBlackListTrueSubscribers_Markets()
        {
            var markets = new RuleFilter {
                Ids = new[] { "abc", "ghi" }, Type = RuleFilterType.Exclude
            };

            var filter = new UniverseFilterService(
                this._unsubscriber,
                this._highMarketCapFilter,
                this._filteredRule,
                null,
                null,
                markets,
                null,
                null,
                null,
                null,
                null,
                null,
                this._logger);

            filter.Subscribe(this._observer);

            var accOne = ((Order)null).Random();

            accOne.Market = new Market("1", "abc", "abc", MarketTypes.STOCKEXCHANGE);
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, accOne);

            var accTwo = ((Order)null).Random();

            accTwo.Market = new Market("1", "def", "def", MarketTypes.STOCKEXCHANGE);
            var eventTwo = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, accTwo);

            var exchangeOne = new EquityIntraDayTimeBarCollection(
                new Market("1", "ghi", "ghi", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new EquityInstrumentIntraDayTimeBar[0]);
            var eventThree = new UniverseEvent(UniverseStateEvent.EquityIntraDayTick, DateTime.UtcNow, exchangeOne);

            var exchangeTwo = new EquityIntraDayTimeBarCollection(
                new Market("1", "jkl", "jkl", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new EquityInstrumentIntraDayTimeBar[0]);
            var eventFour = new UniverseEvent(UniverseStateEvent.EquityIntraDayTick, DateTime.UtcNow, exchangeTwo);

            filter.OnNext(eventOne);
            filter.OnNext(eventTwo);
            filter.OnNext(eventThree);
            filter.OnNext(eventFour);

            A.CallTo(() => this._observer.OnNext(eventOne)).MustNotHaveHappened();
            A.CallTo(() => this._observer.OnNext(eventTwo)).MustHaveHappenedOnceExactly();
            A.CallTo(() => this._observer.OnNext(eventThree)).MustNotHaveHappened();
            A.CallTo(() => this._observer.OnNext(eventFour)).MustHaveHappenedOnceExactly();
        }
Exemplo n.º 10
0
        public void Filter_WhenUniverseEventAndMarketCapFilter_MustFilterCorrectly(
            decimal?marketCap,
            decimal?min,
            decimal?max,
            bool mustBeFiltered)
        {
            A.CallTo(
                () => this.currencyConverterService.Convert(
                    A <IReadOnlyCollection <Money> > .Ignored,
                    A <Currency> .Ignored,
                    A <DateTime> .Ignored,
                    A <ISystemProcessOperationRunRuleContext> .Ignored)).Returns(new Money(marketCap.Value, "GBP"));

            var fundOne  = ((Order)null).Random();
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, fundOne);

            A.CallTo(() => _tradingHoursService.GetTradingHoursForMic(fundOne.Market.MarketIdentifierCode))
            .Returns(new TradingHours()
            {
                IsValid = true
            });

            //decimal? marketCap = 150;
            var marketDataResponse = new MarketDataResponse <EquityInstrumentInterDayTimeBar>(
                new EquityInstrumentInterDayTimeBar(null, new DailySummaryTimeBar(marketCap, "GBP", null, null, new Volume(), DateTime.UtcNow), DateTime.UtcNow, null), false, false);

            A.CallTo(() => _universeEquityInterDayCache.Get(
                         A <MarketDataRequest> .That.Matches(
                             m => m.MarketIdentifierCode == fundOne.Market.MarketIdentifierCode &&
                             m.Cfi == fundOne.Instrument.Cfi
                             )))
            .Returns(marketDataResponse);

            var marketCapRangeRuleFilter = new DecimalRangeRuleFilter
            {
                Type = RuleFilterType.Include,
                Min  = min,
                Max  = max
            };

            var highMarketCapFilter = new HighMarketCapFilter(
                _universeMarketCacheFactory,
                Engine.Rules.Rules.RuleRunMode.ValidationRun,
                marketCapRangeRuleFilter,
                _tradingHoursService,
                _operationRunRuleContext,
                _universeDataRequestsSubscriber,
                this.currencyConverterService,
                "test",
                _logger);

            var result = highMarketCapFilter.Filter(eventOne);

            Assert.AreEqual(result, mustBeFiltered);
        }
        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 Do_X_ReturnExpected_ToY_OnSameDate(UniverseStateEvent xe, UniverseStateEvent ye, int expected)
        {
            var eventDate = DateTime.UtcNow;
            var x         = new UniverseEvent(xe, eventDate, new object());
            var y         = new UniverseEvent(ye, eventDate, new object());

            var comparer = new UniverseEventComparer();

            var result = comparer.Compare(x, y);

            Assert.AreEqual(result, expected);
        }
        public void Filter_FiltersOutCredit_Cfi(string nonEquityCfi)
        {
            var orderFilter   = new UniverseEquityOrderFilterService(this._logger);
            var order         = ((Order)null).Random();
            var universeEvent = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, order);

            order.Instrument.Cfi = nonEquityCfi;

            var filteredEvent = orderFilter.Filter(universeEvent);

            Assert.IsNull(filteredEvent);
        }
        public void Filter_DoesNotFiltersOutEquity_Cfi(string equityCfi)
        {
            var orderFilter   = new UniverseEquityOrderFilterService(this._logger);
            var order         = ((Order)null).Random();
            var universeEvent = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, order);

            order.Instrument.Cfi = equityCfi;

            var filteredEvent = orderFilter.Filter(universeEvent);

            Assert.AreEqual(universeEvent, filteredEvent);
        }
Exemplo n.º 15
0
        public void DailyParameter_NoThresholdBreach_DoesNotRaiseAlert()
        {
            var windows = new TimeWindows("id", TimeSpan.FromHours(1));

            A.CallTo(() => _equitiesParameters.HighVolumePercentageDaily).Returns(0.1m);
            A.CallTo(() => _equitiesParameters.Windows).Returns(windows);
            var highVolumeRule = BuildRule();

            var trade           = Trade();
            var underlyingTrade = (Order)trade.UnderlyingEvent;

            underlyingTrade.FilledDate        = DateTime.UtcNow;
            underlyingTrade.OrderFilledVolume = 10;
            underlyingTrade.FilledDate        = DateTime.UtcNow;
            var market     = new Market("1", "XLON", "London Stock Exchange", MarketTypes.STOCKEXCHANGE);
            var marketData = new EquityIntraDayTimeBarCollection(market, underlyingTrade.PlacedDate.Value.AddSeconds(-55),
                                                                 new List <EquityInstrumentIntraDayTimeBar>
            {
                new EquityInstrumentIntraDayTimeBar(
                    underlyingTrade.Instrument,
                    new SpreadTimeBar(
                        underlyingTrade.OrderAverageFillPrice.Value,
                        underlyingTrade.OrderAverageFillPrice.Value,
                        underlyingTrade.OrderAverageFillPrice.Value,
                        new Volume(2000)),
                    new DailySummaryTimeBar(
                        1000m,
                        "USD",
                        new IntradayPrices(
                            underlyingTrade.OrderAverageFillPrice.Value,
                            underlyingTrade.OrderAverageFillPrice.Value,
                            underlyingTrade.OrderAverageFillPrice.Value,
                            underlyingTrade.OrderAverageFillPrice.Value),
                        10000,
                        new Volume(10000),
                        underlyingTrade.PlacedDate.Value.AddSeconds(-55)),
                    underlyingTrade.PlacedDate.Value.AddSeconds(-55),
                    market)
            });

            var marketEvent =
                new UniverseEvent(
                    UniverseStateEvent.EquityIntraDayTick,
                    DateTime.UtcNow.AddMinutes(-1),
                    marketData);

            highVolumeRule.OnNext(marketEvent);
            highVolumeRule.OnNext(trade);
            highVolumeRule.OnNext(Eschaton());

            A.CallTo(() => _alertStream.Add(A <IUniverseAlertEvent> .Ignored)).MustHaveHappenedOnceExactly();
        }
        public void Do_XDateSucceedY_ReturnMore()
        {
            IUniverseEvent x = new UniverseEvent(
                UniverseStateEvent.Genesis,
                DateTime.UtcNow.AddMinutes(5),
                new object());
            IUniverseEvent y = new UniverseEvent(UniverseStateEvent.Genesis, DateTime.UtcNow, new object());

            var comparer = new UniverseEventComparer();

            var result = comparer.Compare(x, y);

            Assert.AreEqual(result, 1);
        }
        public void Does_ASeriesOfUniverseEvents_GetSorted_AsExpected()
        {
            var dateBase = DateTime.UtcNow;

            var x1             = new UniverseEvent(UniverseStateEvent.Unknown, dateBase.AddMinutes(2), new object());
            var x2             = new UniverseEvent(UniverseStateEvent.Eschaton, dateBase.AddMinutes(10), new object());
            var x3             = new UniverseEvent(UniverseStateEvent.Genesis, dateBase, new object());
            var x4             = new UniverseEvent(UniverseStateEvent.ExchangeClose, dateBase.AddMinutes(3), new object());
            var x5             = new UniverseEvent(UniverseStateEvent.ExchangeOpen, dateBase.AddMinutes(3), new object());
            var x6             = new UniverseEvent(UniverseStateEvent.ExchangeOpen, dateBase.AddMinutes(4), new object());
            var x7             = new UniverseEvent(UniverseStateEvent.Order, dateBase.AddMinutes(6), new object());
            var x8             = new UniverseEvent(UniverseStateEvent.EquityIntraDayTick, dateBase.AddMinutes(6), new object());
            var x9             = new UniverseEvent(UniverseStateEvent.Order, dateBase.AddMinutes(6), new object());
            var x10            = new UniverseEvent(UniverseStateEvent.OrderPlaced, dateBase.AddMinutes(6), new object());
            var x11            = new UniverseEvent(UniverseStateEvent.Eschaton, dateBase.AddMinutes(6), new object());
            var universeEvents = new List <IUniverseEvent>
            {
                x1,
                x2,
                x3,
                x4,
                x5,
                x6,
                x7,
                x8,
                x9,
                x10,
                x11
            };

            var orderedEvents = universeEvents.OrderBy(i => i, new UniverseEventComparer()).ToList();

            foreach (var item in orderedEvents)
            {
                Console.WriteLine(item.StateChange);
            }

            Assert.AreEqual(orderedEvents.First(), x3);
            Assert.AreEqual(orderedEvents.Skip(1).First(), x1);
            Assert.AreEqual(orderedEvents.Skip(2).First(), x5);
            Assert.AreEqual(orderedEvents.Skip(3).First(), x4);
            Assert.AreEqual(orderedEvents.Skip(4).First(), x6);
            Assert.AreEqual(orderedEvents.Skip(5).First(), x8);
            Assert.AreEqual(orderedEvents.Skip(6).First(), x10);
            Assert.AreEqual(orderedEvents.Skip(7).First(), x7);
            Assert.AreEqual(orderedEvents.Skip(8).First(), x9);
            Assert.AreEqual(orderedEvents.Skip(9).First(), x11);
            Assert.AreEqual(orderedEvents.Skip(10).First(), x2);
        }
        private IUniverseEvent MapRowToFixedIncomeIntradayMarketDataEvent(IntradayMarketDataParameters marketDataParam)
        {
            if (marketDataParam == null)
            {
                return(null);
            }

            if (string.IsNullOrWhiteSpace(marketDataParam.SecurityName) ||
                !this._securitySelection.Securities.ContainsKey(marketDataParam.SecurityName))
            {
                this._scenarioContext.Pending();
                return(null);
            }

            if (marketDataParam.Bid == null || marketDataParam.Ask == null || marketDataParam.Price == null)
            {
                this._scenarioContext.Pending();
                return(null);
            }

            var security = this._securitySelection.Securities[marketDataParam.SecurityName];
            var bid      = this.MapToMoney(marketDataParam.Bid, marketDataParam.Currency);
            var ask      = this.MapToMoney(marketDataParam.Ask, marketDataParam.Currency);
            var price    = this.MapToMoney(marketDataParam.Price, marketDataParam.Currency);
            var volume   = new Volume(marketDataParam.Volume.GetValueOrDefault(0));

            var intradayPrices = new SpreadTimeBar(bid.Value, ask.Value, price.Value, volume);

            var marketData = new FixedIncomeInstrumentIntraDayTimeBar(
                security.Instrument,
                intradayPrices,
                null,
                marketDataParam.Epoch,
                security.Market);

            var timeBarCollection = new FixedIncomeIntraDayTimeBarCollection(
                security.Market,
                marketDataParam.Epoch,
                new[] { marketData });
            var universeEvent = new UniverseEvent(
                UniverseStateEvent.FixedIncomeIntraDayTick,
                marketDataParam.Epoch,
                timeBarCollection);

            return(universeEvent);
        }
        private IUniverseEvent MapRowToInterdayMarketDataEvent(InterdayMarketDataParameters marketDataParam)
        {
            if (marketDataParam == null)
            {
                return(null);
            }

            if (string.IsNullOrWhiteSpace(marketDataParam.SecurityName) ||
                !this._securitySelection.Securities.ContainsKey(marketDataParam.SecurityName))
            {
                this._scenarioContext.Pending();
                return(null);
            }

            var security       = this._securitySelection.Securities[marketDataParam.SecurityName];
            var open           = this.MapToMoney(marketDataParam.Open, marketDataParam.Currency);
            var close          = this.MapToMoney(marketDataParam.Close, marketDataParam.Currency);
            var high           = this.MapToMoney(marketDataParam.High, marketDataParam.Currency);
            var low            = this.MapToMoney(marketDataParam.Low, marketDataParam.Currency);
            var intradayPrices = new IntradayPrices(open, close, high, low);

            var dailySummary = new DailySummaryTimeBar(
                marketDataParam.MarketCap,
                marketDataParam.Currency,
                intradayPrices,
                marketDataParam.ListedSecurities,
                new Volume(marketDataParam.DailyVolume.GetValueOrDefault(0)),
                marketDataParam.Epoch);

            var marketData = new EquityInstrumentInterDayTimeBar(
                security.Instrument,
                dailySummary,
                marketDataParam.Epoch,
                security.Market);

            var timeBarCollection = new EquityInterDayTimeBarCollection(
                security.Market,
                marketDataParam.Epoch,
                new[] { marketData });
            var universeEvent = new UniverseEvent(
                UniverseStateEvent.EquityInterDayTick,
                marketDataParam.Epoch,
                timeBarCollection);

            return(universeEvent);
        }
        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();
        }
        public void InitiateTimeLogger_LogsWhenExpected_3HourRun()
        {
            var timeCompletionLogger = new UniversePercentageOfTimeCompletionLogger(this._logger);
            var scheduledExecution   = new ScheduledExecution
            {
                TimeSeriesInitiation  = DateTimeOffset.Now,
                TimeSeriesTermination = DateTimeOffset.Now.AddMinutes(100)
            };

            timeCompletionLogger.InitiateTimeLogger(scheduledExecution);

            for (var i = 0; i < 100; i++)
            {
                var events = new UniverseEvent(
                    UniverseStateEvent.Order,
                    scheduledExecution.TimeSeriesInitiation.AddMinutes(i).DateTime,
                    new object());

                timeCompletionLogger.OnNext(events);
            }
        }
        public void OnNext_CallsOnCompleted_ForNoneTrueSubscribers_Strategies()
        {
            var strategy = new RuleFilter {
                Ids = new[] { "abc" }, Type = RuleFilterType.None
            };

            var filter = new UniverseFilterService(
                this._unsubscriber,
                this._highMarketCapFilter,
                this._filteredRule,
                null,
                null,
                null,
                null,
                strategy,
                null,
                null,
                null,
                null,
                this._logger);

            filter.Subscribe(this._observer);

            var fundOne = ((Order)null).Random();

            fundOne.OrderStrategy = "abc";
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, fundOne);

            var fundTwo = ((Order)null).Random();

            fundTwo.OrderStrategy = "def";
            var eventTwo = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, fundTwo);

            filter.OnNext(eventOne);
            filter.OnNext(eventTwo);

            A.CallTo(() => this._observer.OnNext(eventOne)).MustHaveHappenedOnceExactly();
            A.CallTo(() => this._observer.OnNext(eventTwo)).MustHaveHappenedOnceExactly();
        }
        public void OnNext_CallsOnCompleted_ForWhiteListTrueSubscribers_Accounts()
        {
            var account = new RuleFilter {
                Ids = new[] { "abc" }, Type = RuleFilterType.Include
            };

            var filter = new UniverseFilterService(
                this._unsubscriber,
                this._highMarketCapFilter,
                this._filteredRule,
                account,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                this._logger);

            filter.Subscribe(this._observer);

            var accOne = ((Order)null).Random();

            accOne.OrderClientAccountAttributionId = "abc";
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, accOne);

            var accTwo = ((Order)null).Random();

            accTwo.OrderClientAccountAttributionId = "def";
            var eventTwo = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, accTwo);

            filter.OnNext(eventOne);
            filter.OnNext(eventTwo);

            A.CallTo(() => this._observer.OnNext(eventOne)).MustHaveHappenedOnceExactly();
            A.CallTo(() => this._observer.OnNext(eventTwo)).MustNotHaveHappened();
        }
        public void OnNext_CallsOnCompleted_ForWhiteListTrueSubscribers_Industries()
        {
            var industry = new RuleFilter {
                Ids = new[] { "abc" }, Type = RuleFilterType.Include
            };

            var filter = new UniverseFilterService(
                this._unsubscriber,
                this._highMarketCapFilter,
                this._filteredRule,
                null,
                null,
                null,
                null,
                null,
                null,
                industry,
                null,
                null,
                this._logger);

            filter.Subscribe(this._observer);

            var strategyOne = ((Order)null).Random();

            strategyOne.Instrument.IndustryCode = "abc";
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, strategyOne);

            var strategyTwo = ((Order)null).Random();

            strategyTwo.Instrument.IndustryCode = "def";
            var eventTwo = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, strategyTwo);

            filter.OnNext(eventOne);
            filter.OnNext(eventTwo);

            A.CallTo(() => this._observer.OnNext(eventOne)).MustHaveHappenedOnceExactly();
            A.CallTo(() => this._observer.OnNext(eventTwo)).MustNotHaveHappened();
        }
        public void InitiateLogging_WithEvents_LogsAsTheyOccur()
        {
            var event1  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, new object());
            var event2  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(1), new object());
            var event3  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(2), new object());
            var event4  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(3), new object());
            var event5  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(4), new object());
            var event6  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(5), new object());
            var event7  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(6), new object());
            var event8  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(7), new object());
            var event9  = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(8), new object());
            var event10 = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow.AddMinutes(9), new object());

            var universeEvents = new List <UniverseEvent>
            {
                event1,
                event2,
                event3,
                event4,
                event5,
                event6,
                event7,
                event8,
                event9,
                event10
            };

            var loggerUniverse = new Universe(universeEvents);

            var logger = new UniversePercentageOfEventCompletionLogger(this._logger);

            logger.InitiateEventLogger(loggerUniverse);

            foreach (var item in universeEvents)
            {
                logger.OnNext(item);
            }
        }
Exemplo n.º 26
0
        public void Filter_WhenUniverseEventAndHadMissingDataInUniverseEquityInterdayCache_MustBeFiltered()
        {
            var fundOne  = ((Order)null).Random();
            var eventOne = new UniverseEvent(UniverseStateEvent.Order, DateTime.UtcNow, fundOne);

            A.CallTo(() => _tradingHoursService.GetTradingHoursForMic(fundOne.Market.MarketIdentifierCode))
            .Returns(new TradingHours()
            {
                IsValid = true
            });

            A.CallTo(() => _universeEquityInterDayCache.Get(
                         A <MarketDataRequest> .That.Matches(
                             m => m.MarketIdentifierCode == fundOne.Market.MarketIdentifierCode &&
                             m.Cfi == fundOne.Instrument.Cfi
                             )))
            .Returns(MarketDataResponse <EquityInstrumentInterDayTimeBar> .MissingData());

            var marketCapRangeRuleFilter = new DecimalRangeRuleFilter
            {
                Type = RuleFilterType.Include
            };

            var highMarketCapFilter = new HighMarketCapFilter(
                _universeMarketCacheFactory,
                Engine.Rules.Rules.RuleRunMode.ValidationRun,
                marketCapRangeRuleFilter,
                _tradingHoursService,
                _operationRunRuleContext,
                _universeDataRequestsSubscriber,
                this.currencyConverterService,
                "test",
                _logger);

            var result = highMarketCapFilter.Filter(eventOne);

            Assert.IsTrue(result);
        }
        private IUniverseEvent[] MapRowToOrderEvent(OrderParameters orderParam)
        {
            if (orderParam == null)
            {
                return(null);
            }

            if (string.IsNullOrWhiteSpace(orderParam.SecurityName) ||
                !this._securitySelection.Securities.ContainsKey(orderParam.SecurityName))
            {
                this._scenarioContext.Pending();
                return(null);
            }

            var security = this._securitySelection.Securities[orderParam.SecurityName];

            var orderLimitPrice = orderParam.LimitPrice != null
                                      ? new Money(orderParam.LimitPrice, orderParam.Currency)
                                      : (Money?)null;

            var orderAveragePrice = orderParam.AverageFillPrice != null
                                        ? new Money(orderParam.AverageFillPrice, orderParam.Currency)
                                        : (Money?)null;

            var orderType = orderParam.LimitPrice != null ? OrderTypes.LIMIT : OrderTypes.MARKET;

            var order = new Order(
                security.Instrument,
                security.Market,
                0,
                orderParam.OrderId,
                orderParam.PlacedDate,
                null,
                null,
                null,
                orderParam.PlacedDate,
                orderParam.BookedDate,
                orderParam.AmendedDate,
                orderParam.RejectedDate,
                orderParam.CancelledDate,
                orderParam.FilledDate,
                orderType,
                orderParam.Direction,
                new Currency(orderParam.Currency),
                null,
                orderParam.CleanOrDirty,
                null,
                orderLimitPrice,
                orderAveragePrice,
                orderParam.OrderedVolume,
                orderParam.FilledVolume,
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                OptionEuropeanAmerican.NONE,
                null);

            var universeEventOrder       = new UniverseEvent(UniverseStateEvent.Order, order.MostRecentDateEvent(), order);
            var universeEventOrderPlaced = new UniverseEvent(
                UniverseStateEvent.OrderPlaced,
                order.PlacedDate.GetValueOrDefault(),
                order);
            var universeEventOrderFilled = new UniverseEvent(
                UniverseStateEvent.OrderFilled,
                order.FilledDate.GetValueOrDefault(),
                order);

            return(new[] { universeEventOrder, universeEventOrderPlaced, universeEventOrderFilled });
        }