コード例 #1
0
        public void ArchiveEmptyCollection_OneItemToArchive_OneToKeep_ReturnsOne()
        {
            var stack             = new EquityInterDayHistoryStack();
            var date              = DateTime.UtcNow;
            var firstBar          = date - TimeSpan.FromDays(2);
            var tb                = this.GetTimeBar();
            var tb2               = this.GetTimeBar();
            var timeBarCollection = new EquityInterDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                firstBar,
                new[] { tb, tb2 });

            var timeBarCollection2 = new EquityInterDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new[] { tb, tb2 });

            stack.Add(timeBarCollection, firstBar);
            stack.Add(timeBarCollection2, date);

            var stackContents = stack.ActiveMarketHistory();

            Assert.AreEqual(2, stackContents.Count);

            stack.ArchiveExpiredActiveItems(date);
            var stackContentsAfterExpire = stack.ActiveMarketHistory();

            Assert.AreEqual(1, stackContentsAfterExpire.Count);
            Assert.AreEqual(timeBarCollection2, stackContentsAfterExpire.Pop());
        }
コード例 #2
0
        public void DoesPush_IfDateDoesMatch_MultipleTimeBars()
        {
            var stack             = new EquityInterDayHistoryStack();
            var date              = DateTime.UtcNow;
            var tb                = this.GetTimeBar();
            var tb2               = this.GetTimeBar();
            var timeBarCollection = new EquityInterDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow - TimeSpan.FromMinutes(1),
                new[] { tb, tb2 });

            var timeBarCollection2 = new EquityInterDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new[] { tb, tb2 });

            stack.Add(timeBarCollection, date);
            stack.Add(timeBarCollection2, date);

            var stackContents = stack.ActiveMarketHistory();

            Assert.AreEqual(2, stackContents.Count);
            Assert.AreEqual(timeBarCollection2, stackContents.Pop());
            Assert.AreEqual(timeBarCollection, stackContents.Pop());
        }
        public void Add(EquityInterDayTimeBarCollection value)
        {
            if (value == null)
            {
                this._logger.LogInformation("UniverseEquityInterDayCache was asked to add null. returning");
                return;
            }

            this._logger.LogInformation(
                $"UniverseEquityInterDayCache adding {value.Epoch} - {value.Exchange?.MarketIdentifierCode}");

            if (this._latestExchangeFrameBook.ContainsKey(value.Exchange.MarketIdentifierCode))
            {
                this._latestExchangeFrameBook.Remove(value.Exchange.MarketIdentifierCode);
                this._latestExchangeFrameBook.Add(value.Exchange.MarketIdentifierCode, value);
            }
            else
            {
                this._latestExchangeFrameBook.Add(value.Exchange.MarketIdentifierCode, value);
            }

            if (!this._marketHistory.ContainsKey(value.Exchange.MarketIdentifierCode))
            {
                var history = new EquityInterDayHistoryStack();
                history.Add(value, value.Epoch);
                this._marketHistory.TryAdd(value.Exchange.MarketIdentifierCode, history);
            }
            else
            {
                this._marketHistory.TryGetValue(value.Exchange.MarketIdentifierCode, out var history);

                history?.Add(value, value.Epoch);
                history?.ArchiveExpiredActiveItems(value.Epoch);
            }
        }
        public void ToString_PrintsOutExpected_ExchangeAndSecurities()
        {
            var market   = new Market("1", "xlon", "london stock exchange", MarketTypes.DarkPool);
            var date     = DateTime.UtcNow;
            var timeBars = new EquityInstrumentInterDayTimeBar[0];
            var coll     = new EquityInterDayTimeBarCollection(market, date, timeBars);

            var result = coll.ToString();

            Assert.AreEqual("Exchange (xlon.london stock exchange) Securities(0)", result);
        }
        public void Ctor_AssignsVariables_Correctly()
        {
            var market   = new Market("1", "xlon", "london stock exchange", MarketTypes.DarkPool);
            var date     = DateTime.UtcNow;
            var timeBars = new EquityInstrumentInterDayTimeBar[0];

            var coll = new EquityInterDayTimeBarCollection(market, date, timeBars);

            Assert.AreEqual(market, coll.Exchange);
            Assert.AreEqual(date, coll.Epoch);
            Assert.AreEqual(timeBars, coll.Securities);
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        public void DoesPush_SetAMarket_OnExchangeCall()
        {
            var stack = new EquityInterDayHistoryStack();
            var date  = DateTime.UtcNow;
            var tb    = this.GetTimeBar();
            var venue = new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE);

            var timeBarCollection = new EquityInterDayTimeBarCollection(venue, DateTime.UtcNow, new[] { tb });

            stack.Add(timeBarCollection, date);

            var exch = stack.Exchange();

            Assert.AreEqual(exch, venue);
        }
コード例 #8
0
        public void DoesNotPush_IfDateDoesNotMatch()
        {
            var stack             = new EquityInterDayHistoryStack();
            var date              = DateTime.UtcNow - TimeSpan.FromDays(3);
            var tb                = this.GetTimeBar();
            var timeBarCollection = new EquityInterDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new[] { tb });

            stack.Add(timeBarCollection, date);

            var stackContents = stack.ActiveMarketHistory();

            Assert.IsEmpty(stackContents);
        }
        public void Add(EquityInterDayTimeBarCollection frame, DateTime currentTime)
        {
            if (frame == null)
            {
                return;
            }

            lock (this._lock)
            {
                // Ensure all contents have the same date (may not work well in pacific zone with the international date line ++ trading hours - should be OK for Japan/Tokyo and USA/SanFran) - RT
                if (currentTime.Date == frame.Epoch.Date)
                {
                    this._activeStack.Push(frame);
                }
            }
        }
コード例 #10
0
        public void DoesPush_IfDateDoesMatch()
        {
            var stack             = new EquityInterDayHistoryStack();
            var date              = DateTime.UtcNow;
            var tb                = this.GetTimeBar();
            var timeBarCollection = new EquityInterDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new[] { tb });

            stack.Add(timeBarCollection, date);

            var stackContents = stack.ActiveMarketHistory();

            Assert.AreEqual(1, stackContents.Count);
            Assert.AreEqual(timeBarCollection, stackContents.Peek());
        }
コード例 #11
0
        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 Setup()
        {
            this._dataRequestRepository = A.Fake <IRuleRunDataRequestRepository>();
            this._logger = A.Fake <ILogger>();

            var xlon = new Market("1", "XLON", "XLON", MarketTypes.STOCKEXCHANGE);

            this._instrument1 = new InstrumentIdentifiers(
                "1",
                "1",
                "1",
                "client-id-1",
                "abcd123",
                "abcd12345678",
                "abcd12345678",
                "abc123",
                "TEST",
                "TEST INC",
                "TSTY",
                "testRic");

            this._instrument2 = new InstrumentIdentifiers(
                "2",
                "2",
                "2",
                "client-id-2",
                "abcd122",
                "abcd12345672",
                "abcd12345672",
                "abc122",
                "TES2",
                "TEST2 INC",
                "TST2Y",
                "test2Ric");

            this._mdr1 = new MarketDataRequest(
                "1",
                "XLON",
                "entspb",
                this._instrument1,
                DateTime.UtcNow,
                DateTime.UtcNow.AddDays(1),
                "1",
                false,
                DataSource.AnyInterday);

            this._mdr2 = new MarketDataRequest(
                "2",
                "XLON",
                "entspb",
                this._instrument1,
                DateTime.UtcNow.AddDays(-5),
                DateTime.UtcNow.AddDays(-4),
                "1",
                false,
                DataSource.AnyInterday);

            this._interdayTimeBarCollectionNasdaq = new EquityInterDayTimeBarCollection(
                new Market("1", "NASDAQ", "NASDAQ", MarketTypes.STOCKEXCHANGE),
                DateTime.UtcNow,
                new EquityInstrumentInterDayTimeBar[0]);

            this._interdayTimeBarCollectionXlon = new EquityInterDayTimeBarCollection(
                xlon,
                DateTime.UtcNow,
                new[]
            {
                new EquityInstrumentInterDayTimeBar(
                    new FinancialInstrument(
                        InstrumentTypes.Equity,
                        this._instrument1,
                        "test",
                        "entspb",
                        "GBX",
                        "TEST"),
                    new DailySummaryTimeBar(null, null, null, null, new Volume(1), DateTime.Now),
                    DateTime.UtcNow,
                    xlon)
            });

            this._interdayTimeBarCollectionXlon2 = new EquityInterDayTimeBarCollection(
                xlon,
                DateTime.UtcNow,
                new[]
            {
                new EquityInstrumentInterDayTimeBar(
                    new FinancialInstrument(
                        InstrumentTypes.Equity,
                        this._instrument2,
                        "test",
                        "entspb",
                        "GBX",
                        "TEST"),
                    new DailySummaryTimeBar(null, null, null, null, new Volume(1), DateTime.Now),
                    DateTime.UtcNow,
                    xlon)
            });
        }