public void DoesPush_IfDateDoesMatch_MultipleTimeBars()
        {
            var stack             = new EquityIntraDayHistoryStack(TimeSpan.Zero);
            var date              = DateTime.UtcNow;
            var tb                = this.GetTimeBar();
            var tb2               = this.GetTimeBar();
            var timeBarCollection = new EquityIntraDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                date,
                new[] { tb, tb2 });

            var timeBarCollection2 = new EquityIntraDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                date,
                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 ExecuteTradeStrategy(EquityIntraDayTimeBarCollection frame, IOrderStream <Order> tradeOrders)
        {
            if (tradeOrders == null)
            {
                this._logger.Log(LogLevel.Error, "Received a null trade orders in the markov trade strategy");
                throw new ArgumentNullException(nameof(tradeOrders));
            }

            if (frame == null)
            {
                this._logger.LogInformation("A null frame was passed to the markov trade strategy");
                return;
            }

            if (frame.Securities == null || frame.Securities.All(sec => sec == null))
            {
                this._logger.LogInformation(
                    "No securities were present on the exchange frame in the markov trade strategy");
                return;
            }

            var tradableSecurities  = frame.Securities.Where(sec => sec != null).ToList();
            var numberOfTradeOrders = this._tradeVolumeStrategy.CalculateSecuritiesToTrade(tradableSecurities);

            if (numberOfTradeOrders <= 0)
            {
                this._logger.LogInformation("Markov trading strategy decided not to trade on this frame");
                return;
            }

            this.GenerateAndSubmitTrades(frame, tradeOrders, numberOfTradeOrders);
        }
        private void Tick(object sender, EventArgs e)
        {
            if (this._tickLocked)
            {
                // don't tick if we're getting overwhelmed
                this._logger.LogInformation("Ticks tocking too fast for equity generator");
                return;
            }

            lock (this._walkingLock)
            {
                this._tickLocked = true;

                if (!this._walkInitiated)
                {
                    this._heartBeat?.Stop();
                    this._tickLocked = false;
                    return;
                }

                var tockedSecurities = this._activeFrame.Securities.Select(this.TickSecurity).ToArray();

                var tickTock = new EquityIntraDayTimeBarCollection(
                    this._activeFrame.Exchange,
                    DateTime.UtcNow,
                    tockedSecurities);
                this._activeFrame = tickTock;

                this._stream.Add(tickTock);

                this._tickLocked = false;
            }
        }
        public void ArchiveEmptyCollection_OneItemToArchive_OneToKeep_ReturnsOne()
        {
            var stack             = new EquityIntraDayHistoryStack(TimeSpan.Zero);
            var date              = DateTime.UtcNow;
            var firstBar          = date - TimeSpan.FromDays(2);
            var tb                = this.GetTimeBar();
            var tb2               = this.GetTimeBar();
            var timeBarCollection = new EquityIntraDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                firstBar,
                new[] { tb, tb2 });

            var timeBarCollection2 = new EquityIntraDayTimeBarCollection(
                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());
        }
Ejemplo n.º 5
0
        public void Add(EquityIntraDayTimeBarCollection value)
        {
            if (value == null)
            {
                this._logger.LogInformation("UniverseMarketCache was asked to add null. returning");
                return;
            }

            this._logger.LogInformation(
                $"UniverseMarketCache 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 EquityIntraDayHistoryStack(this._windowSize);
                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 OnNext_PassesFrame_ToConsole()
        {
            var subscriber = new ExchangeFrameDisplaySubscriber(this._console);
            var frame      = new EquityIntraDayTimeBarCollection(null, DateTime.UtcNow, null);

            subscriber.OnNext(frame);

            A.CallTo(() => this._console.OutputMarketFrame(frame)).MustHaveHappenedOnceExactly();
        }
        public override void OnNext(EquityIntraDayTimeBarCollection value)
        {
            if (value == null)
            {
                return;
            }

            this.OrderStrategy.ExecuteTradeStrategy(value, this.TradeStream);
        }
        private Order GenerateTrade(EquityInstrumentIntraDayTimeBar tick, EquityIntraDayTimeBarCollection exchFrame)
        {
            if (tick == null)
            {
                return(null);
            }

            var direction              = this.CalculateTradeDirection();
            var orderType              = this.CalculateTradeOrderType();
            var limit                  = this.CalculateLimit(tick, direction, orderType);
            var executedPrice          = this.CalculateExecutedPrice(tick);
            var volume                 = this.CalculateVolume(tick);
            var orderStatus            = this.CalculateOrderStatus();
            var orderStatusLastChanged = tick.TimeStamp.AddMilliseconds(300);
            var orderSubmittedOn       = tick.TimeStamp;
            var traderId               = this.GenerateClientFactorString();
            var dealerInstructions     = "Process Asap";
            var orderCurrency          = tick?.SpreadTimeBar.Price.Currency.Code ?? string.Empty;

            var cancelledDate = orderStatus == OrderStatus.Cancelled ? (DateTime?)orderSubmittedOn : null;
            var filledDate    = orderStatus == OrderStatus.Filled ? (DateTime?)orderSubmittedOn : null;

            return(new Order(
                       tick.Security,
                       tick.Market,
                       null,
                       $"order-{Guid.NewGuid()}",
                       DateTime.UtcNow,
                       string.Empty,
                       string.Empty,
                       Guid.NewGuid().ToString(),
                       orderSubmittedOn,
                       orderSubmittedOn,
                       null,
                       cancelledDate,
                       filledDate,
                       orderStatusLastChanged,
                       OrderTypes.MARKET,
                       direction,
                       new Currency(orderCurrency),
                       new Currency(orderCurrency),
                       OrderCleanDirty.CLEAN,
                       null,
                       limit,
                       executedPrice,
                       volume,
                       volume,
                       traderId,
                       traderId,
                       "Clearing-Bank",
                       dealerInstructions,
                       new OrderBroker(string.Empty, string.Empty, "Mr Broker", DateTime.Now, true),
                       null,
                       null,
                       OptionEuropeanAmerican.NONE,
                       new DealerOrder[0]));
        }
        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 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();
        }
Ejemplo n.º 11
0
        public void ToString_PrintsOutExpected_ExchangeAndSecurities()
        {
            var market   = new Market("1", "xlon", "london stock exchange", MarketTypes.DarkPool);
            var date     = DateTime.UtcNow;
            var timeBars = new EquityInstrumentIntraDayTimeBar[0];
            var coll     = new EquityIntraDayTimeBarCollection(market, date, timeBars);

            var result = coll.ToString();

            Assert.AreEqual("Exchange (xlon.london stock exchange) Securities(0)", result);
        }
        private IReadOnlyCollection <int> SecuritiesToTrade(EquityIntraDayTimeBarCollection frame, int securitiesToTrade)
        {
            var upperLimit           = frame.Securities.Count - 1;
            var securitiesToTradeIds = new List <int>();

            for (var count = 0; count < securitiesToTrade; count++)
            {
                securitiesToTradeIds.Add(DiscreteUniform.Sample(0, upperLimit));
            }

            return(securitiesToTradeIds);
        }
Ejemplo n.º 13
0
        public void Ctor_AssignsVariables_Correctly()
        {
            var market   = new Market("1", "xlon", "london stock exchange", MarketTypes.DarkPool);
            var date     = DateTime.UtcNow;
            var timeBars = new EquityInstrumentIntraDayTimeBar[0];

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

            Assert.AreEqual(market, coll.Exchange);
            Assert.AreEqual(date, coll.Epoch);
            Assert.AreEqual(timeBars, coll.Securities);
        }
Ejemplo n.º 14
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();
        }
Ejemplo n.º 15
0
        public void Add(EquityIntraDayTimeBarCollection frame, DateTime currentTime)
        {
            if (frame == null)
            {
                return;
            }

            lock (this._lock)
            {
                if (currentTime.Subtract(frame.Epoch) <= this._activeTradeDuration)
                {
                    this._activeStack.Push(frame);
                }
            }
        }
Ejemplo n.º 16
0
        public override void OnNext(EquityIntraDayTimeBarCollection value)
        {
            lock (this._lock)
            {
                if (!this._initiated)
                {
                    this._heartbeat.OnBeat(this.TradeOnHeartbeat);
                    this._initiated = true;
                }

                if (value == null) return;

                this._lastFrame = value;
            }
        }
        public void DoesPush_SetAMarket_OnExchangeCall()
        {
            var stack = new EquityIntraDayHistoryStack(TimeSpan.Zero);
            var date  = DateTime.UtcNow;
            var tb    = this.GetTimeBar();
            var venue = new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE);

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

            stack.Add(timeBarCollection, date);

            var exch = stack.Exchange();

            Assert.AreEqual(exch, venue);
        }
        public void DoesNotPush_IfDateDoesNotMatch()
        {
            var stack             = new EquityIntraDayHistoryStack(TimeSpan.Zero);
            var date              = DateTime.UtcNow;
            var tb                = this.GetTimeBar();
            var timeBarCollection = new EquityIntraDayTimeBarCollection(
                new Market("1", "xlon", "London Stock Exchange", MarketTypes.STOCKEXCHANGE),
                date,
                new[] { tb });

            stack.Add(timeBarCollection, date + TimeSpan.FromDays(1));

            var stackContents = stack.ActiveMarketHistory();

            Assert.IsEmpty(stackContents);
        }
Ejemplo n.º 19
0
        private void Tick(DateTime advanceTick, IEquityDataGeneratorStrategy strategy)
        {
            lock (this._walkingLock)
            {
                var tockedSecurities = this._activeFrame.Securities
                                       .Select(sec => strategy.AdvanceFrame(sec, advanceTick, false)).ToArray();

                var tickTock = new EquityIntraDayTimeBarCollection(
                    this._activeFrame.Exchange,
                    advanceTick,
                    tockedSecurities);
                this._activeFrame = tickTock;

                this._stream.Add(tickTock);
            }
        }
Ejemplo n.º 20
0
        private void AdvanceFrames(ExchangeDto market, EquityIntraDayTimeBarCollection frame)
        {
            if (frame.Epoch.TimeOfDay > market.MarketCloseTime)
            {
                this._logger.Log(LogLevel.Error, "ended up advancing a frame whose start exceeded market close time");
                return;
            }

            var timeSpanList = new List <TickStrategy>();
            var advanceTick  = frame.Epoch.TimeOfDay;

            while (advanceTick <= market.MarketCloseTime)
            {
                timeSpanList.Add(new TickStrategy {
                    TickOffset = advanceTick, Strategy = this._dataStrategy
                });

                advanceTick = advanceTick.Add(this._tickSeparation);
            }

            timeSpanList = this.RemoveConflictingTicks(timeSpanList);

            foreach (var subPlan in this._plan)
            {
                var strategy    = new PlanEquityStrategy(subPlan, this._dataStrategy);
                var initialTick = subPlan.EquityInstructions.IntervalCommencement;
                while (initialTick <= subPlan.EquityInstructions.IntervalTermination)
                {
                    timeSpanList.Add(new TickStrategy {
                        TickOffset = initialTick, Strategy = strategy
                    });

                    initialTick = initialTick.Add(subPlan.EquityInstructions.UpdateFrequency);
                }
            }

            timeSpanList = timeSpanList.OrderBy(i => i.TickOffset).ToList();
            foreach (var item in timeSpanList)
            {
                if (item?.Strategy == null)
                {
                    continue;
                }

                this.Tick(frame.Epoch.Date.Add(item.TickOffset), item.Strategy);
            }
        }
Ejemplo n.º 21
0
        public void Add(EquityIntraDayTimeBarCollection frame)
        {
            if (frame == null)
            {
                return;
            }

            if (this._observers == null)
            {
                return;
            }

            foreach (var obs in this._observers)
            {
                obs.Value?.OnNext(frame);
            }
        }
Ejemplo n.º 22
0
        public void OutputMarketFrame(EquityIntraDayTimeBarCollection frame)
        {
            lock (this._lock)
            {
                if (frame == null)
                {
                    WriteToLine(this._marketFrameOffset, "*****************************");
                    WriteToLine(this._marketFrameOffset + 1, "Market. Empty frame");
                    WriteToLine(this._marketFrameOffset + 2, "*****************************");
                    return;
                }

                WriteToLine(this._marketFrameOffset, "*****************************");
                WriteToLine(this._marketFrameOffset + 1, $"Market Frame ({frame.Epoch}). {frame}");
                WriteToLine(this._marketFrameOffset + 2, "*****************************");
            }
        }
        private IUniverseEvent MapRowToIntradayMarketDataEvent(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 EquityInstrumentIntraDayTimeBar(
                security.Instrument,
                intradayPrices,
                null,
                marketDataParam.Epoch,
                security.Market);

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

            return(universeEvent);
        }
        private void GenerateAndSubmitTrades(
            EquityIntraDayTimeBarCollection frame,
            IOrderStream <Order> tradeOrders,
            int numberOfTradeOrders)
        {
            var securitiesToTradeIds = this.SecuritiesToTrade(frame, numberOfTradeOrders);
            var securitiesToTrade    = securitiesToTradeIds.Select(sec => frame.Securities.ElementAt(sec)).ToList();
            var trades = securitiesToTrade.Select(sec => this.GenerateTrade(sec, frame)).Where(trade => trade != null)
                         .ToList();

            foreach (var trade in trades)
            {
                tradeOrders.Add(trade);
            }

            this._logger.LogInformation($"Submitted {trades.Count} trade orders in frame");
        }
        public void OnNext(EquityIntraDayTimeBarCollection value)
        {
            if (value == null)
            {
                this._baseGenerator.OnNext(null);
                return;
            }

            var filteredSecurities =
                value.Securities?.Where(
                    sec => this._sedols.Contains(
                        sec?.Security.Identifiers.Sedol,
                        StringComparer.CurrentCultureIgnoreCase) == this._inclusive).ToList()
                ?? new List <EquityInstrumentIntraDayTimeBar>();

            var filteredFrame = new EquityIntraDayTimeBarCollection(value.Exchange, value.Epoch, filteredSecurities);

            this._baseGenerator.OnNext(filteredFrame);
        }
Ejemplo n.º 26
0
        public void OnNext(EquityIntraDayTimeBarCollection value)
        {
            var csvRecords = value?.Securities?.Select(this._securityMapper.Map).Where(w => w != null).ToList()
                             ?? new List <FinancialInstrumentTimeBarCsv>();

            if (!csvRecords.Any())
            {
                return;
            }

            var fileName = $"{value.Exchange.Id}-{value.Epoch.ToString("yyyyMMddHHmmssffff")}.csv";
            var filePath = Path.Combine(this._path, fileName);

            using (var writer = File.CreateText(filePath))
            {
                var csv = new CsvWriter(writer);
                csv.Configuration.HasHeaderRecord = true;
                csv.WriteRecords(csvRecords);
            }
        }
        public void InitiateWalk(IStockExchangeStream stream)
        {
            this._logger.LogInformation("Walk initiated in equity generator");

            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            lock (this._stateTransitionLock)
            {
                this._walkInitiated = true;

                this._stream      = stream;
                this._activeFrame = this._exchangeTickInitialiser.InitialFrame();
                this._stream.Add(this._activeFrame);

                this._heartBeat.OnBeat(this.Tick);
                this._heartBeat.Start();
            }
        }
        public override void OnNext(EquityIntraDayTimeBarCollection value)
        {
            if (value == null)
            {
                return;
            }

            if (this._plan == null)
            {
                return;
            }

            lock (this._lock)
            {
                if (!this._initialCluster && this._plan.EquityInstructions.CommencementInUtc <= value.Epoch)
                {
                    this.WashTradeInSecurityWithClustering(this._plan.Sedol, value, 20);

                    this._initialCluster = true;
                    return;
                }

                if (!this._secondaryCluster && this._plan.EquityInstructions.TerminationInUtc <= value.Epoch)
                {
                    this.WashTradeInSecurityWithClustering(this._plan.Sedol, value, 30);

                    this._secondaryCluster = true;
                    return;
                }

                if (!this._thirdCluster && this._thirdGroupActivation <= value.Epoch)
                {
                    this.WashTradeInSecurityWithClustering(this._plan.Sedol, value, 20);

                    this._thirdCluster = true;
                }
            }
        }
Ejemplo n.º 29
0
        private DataGenerationPlan PlanInDateRange(EquityIntraDayTimeBarCollection value)
        {
            if (!this._plan?.Any() ?? true)
            {
                return(null);
            }

            if (value == null)
            {
                return(null);
            }

            foreach (var plan in this._plan)
            {
                if (plan.EquityInstructions.CommencementInUtc <= value.Epoch &&
                    plan.EquityInstructions.TerminationInUtc >= value.Epoch)
                {
                    return(plan);
                }
            }

            return(null);
        }
Ejemplo n.º 30
0
        public override void OnNext(EquityIntraDayTimeBarCollection value)
        {
            if (value == null)
            {
                return;
            }

            if (!this._plan?.Any() ?? true)
            {
                return;
            }

            this._intraDayHistoryStack.Add(value, value.Epoch);

            var plan = this.PlanInDateRange(value);

            if (plan == null)
            {
                return;
            }

            lock (this._lock)
            {
                this._intraDayHistoryStack.ArchiveExpiredActiveItems(value.Epoch);
                var activeItems = this._intraDayHistoryStack.ActiveMarketHistory();

                if (plan.EquityInstructions.TerminationInUtc == value.Epoch)
                {
                    this.CreateLayeringTradesForWindowBreachInSedol(plan.Sedol, activeItems, value, false);
                    this.CreateLayeringTradesForWindowBreachInSedol(plan.Sedol, activeItems, value, true);
                }
                else
                {
                    this.CreateLayeringTradesForWindowBreachInSedol(plan.Sedol, activeItems, value, false);
                }
            }
        }