예제 #1
0
        public Order[] GetNextActions(LimitOrderBookSnapshot limitOrderBook)
        {
            var order = base.GetNextAction(limitOrderBook);

            var orders = new List<Order>();

            if (order != null)
            {
                if (_lastOrder != null)
                {
                    //cancel previous
                    var cancelOrder = new Order();
                    cancelOrder.Type = OrderType.Cancel;
                    cancelOrder.ID = _lastOrder.ID;

                    orders.Add(cancelOrder);
                }

                orders.Add(order);

                _lastOrder = order;
            }

            return orders.ToArray();
        }
        public virtual Order GetNextAction(LimitOrderBookSnapshot limitOrderBook)
        {
            var size = Math.Ceiling(_maxOrderSize * _rng.GetRandomDouble());
            var priceDiff = _maxPriceDifferential * Math.Abs(_normal.Sample());

            Order order;

            var randomNumber = _rng.GetRandomDouble();
            if (randomNumber > (0.5 + (_doNothingProbability/2)))
            {
                //buylimitorder
                var price = Math.Round(limitOrderBook.BestAskPrice.Value - priceDiff, _decimals);
                order = new Order { Price = price, Quantity = size, Side = OrderSide.Buy,Type = OrderType.LimitOrder, Valid = true};

            }
            else if (randomNumber < (0.5 - (_doNothingProbability/2)))
            {
                //selllimitorder
                var price = Math.Round(limitOrderBook.BestBidPrice.Value + priceDiff, _decimals);
                order = new Order { Price = price, Quantity = size, Side = OrderSide.Sell, Type = OrderType.LimitOrder, Valid = true };
            }
            else
            {
                //donothing
                order = null;
            }

            return order;
        }
        //   [TestMethod]
        public void GetPriceDistribution()
        {
            var lob = new LimitOrderBookSnapshot();
            lob.BestAskPrice = 101;
            lob.BestBidPrice = 99;

            var buyPrices = new SortedDictionary<double, int>();
            var sellPrices = new SortedDictionary<double, int>();

            var agent = new RandomLiquidityMaker(new CSharpRandomNumberGenerator(), 100, 10, 0, new Normal(0,0.2),2);

            for (int i = 0; i < 100000000; i++)
            {
                var order = agent.GetNextAction(lob);

                if (order.Side == OrderSide.Buy)
                {
                    if (!buyPrices.ContainsKey(order.Price))
                    {
                        buyPrices.Add(order.Price, 0);
                    }

                    buyPrices[order.Price]++;
                }
                else
                {
                    if (!sellPrices.ContainsKey(order.Price))
                    {
                        sellPrices.Add(order.Price, 0);
                    }

                    sellPrices[order.Price]++;
                }
            }

            var lines = new List<string>();

            foreach (var price in buyPrices)
            {
                lines.Add(string.Format("{0},{1}", price.Key, price.Value));
            }

            foreach (var price in sellPrices)
            {
                lines.Add(string.Format("{0},{1}", price.Key, price.Value));
            }

            File.WriteAllLines(@"c:\temp\test.csv", lines);
        }
        public Order GetNextAction(LimitOrderBookSnapshot limitOrderBook)
        {
            Order order;
            var size = Math.Ceiling(_maxOrderSize * _rng.GetRandomDouble());

            var randomNumber = _rng.GetRandomDouble();

            if (randomNumber < (0.5 - (_doNothingProbability / 2)))
            {
                //buymarketdorder
                order = new Order() {Quantity = size,Type = OrderType.MarketOrder, Side = OrderSide.Buy };
            }
            else if (randomNumber > (0.5 + (_doNothingProbability / 2)))
            {
                order = new Order() { Quantity = size, Type = OrderType.MarketOrder, Side = OrderSide.Sell };
            }
            else
            {
                //do nothing
                order = null;
            }

            return order;
        }
예제 #5
0
 private static void UpdateLimitOrderBook(LimitOrderBookSnapshot data)
 {
     if (data.BestAskPrice != null)
     {
         data.BestAskPrice = data.BestAskPrice ?? _lob.BestAskPrice;
         data.BestBidPrice = data.BestBidPrice ?? _lob.BestBidPrice;
         _lob = data;
         System.Console.WriteLine(data.BestBidPrice + "\t\t\t" + data.BestAskPrice);
         System.IO.File.AppendAllLines(@"c:\temp\test.csv", new string[] { DateTime.Now.Ticks + "," + data.BestBidPrice + "," + data.BestAskPrice });
     }
 }
예제 #6
0
 private static void UpdateLimitOrderBook(LimitOrderBookSnapshot data)
 {
     if (data != null)
     {
         _currentLimitOrderBook = data;
     }
 }
        public bool PushUpdate(ILimitOrderBook limitOrderBook)
        {
            var orderBookSnapshot = new LimitOrderBookSnapshot();
            orderBookSnapshot.BestAskPrice = limitOrderBook.BestAsk != null ? (double?)limitOrderBook.BestAsk.Price : null;
            orderBookSnapshot.BestAskQuantity = limitOrderBook.BestAsk != null ? (double?)limitOrderBook.BestAsk.Quantity : null;
            orderBookSnapshot.BestBidPrice = limitOrderBook.BestBid != null ? (double?)limitOrderBook.BestBid.Price : null;
            orderBookSnapshot.BestBidQuantity = limitOrderBook.BestBid != null ? (double?)limitOrderBook.BestBid.Quantity : null;

            var dataConnections = ConnectionIDs.Where(c => DataListeners.Contains(c.Key)).Select(c => c.Value);

            foreach (var connID in dataConnections)
            {
                _clientsInstance.Value.Client(connID).Update(orderBookSnapshot);
            }

            return true;
        }