Ejemplo n.º 1
0
        public void Orderbook_PriceEngineTest_Live()
        {
            Console.WriteLine("Orderbook_PriceEngineTest_Live");
            Orderbook ob = new Orderbook();
            Matcher   m  = new Matcher();

            ob.setMatcher(m);

            double MAXTIME = 10000;

            ob.addBid(12.2, 100, null);
            ob.addAsk(12.3, 100, null);

            IOrderbookPriceEngine pe = new OrderbookPriceEngine();

            try
            {
                System.IO.TextWriter writeFile = new StreamWriter("Orderbook_PriceEngineTest_Live.txt");

                for (int i = 0; i < MAXTIME; i++)
                {
                    if (pe.isMarket(ob))
                    {
                        double pp    = pe.getMarketPrice(ob);
                        bool   isbid = SingletonRandomGenerator.Instance.NextBoolean();
                        if (isbid)
                        {
                            ob.addBid(pp, 100, null);
                        }
                        else
                        {
                            ob.addAsk(pp, 100, null);
                        }
                        writeFile.WriteLine("?, ?, " + pp);
                    }
                    else
                    {
                        double ppask = pe.getAskPrice(ob);
                        ob.addAsk(ppask, 100, null);

                        double ppbid = pe.getBidPrice(ob);
                        ob.addBid(ppbid, 100, null);

                        writeFile.WriteLine("" + ppask + ", " + ppbid + ", ?");
                    }
                }
                writeFile.Flush();
                writeFile.Close();
                writeFile = null;
            }
            catch (IOException)
            {
                Assert.AreEqual(0, 1);
            }

            // execution occurs: 4 5 and 6 partially hit 3 out of 5 units of o3 at the ask price (5)
            Scheduler.Instance().Run();
        }
Ejemplo n.º 2
0
        private void parseCSV()
        {
            try {
                using (StreamReader readFile = new StreamReader(_path)) {
                    string   line;
                    string[] row;
                    int      rownum = 1;
                    while ((line = readFile.ReadLine()) != null)
                    {
                        row = line.Split(',');

                        if (row.Length != 6)
                        {
                            throw new Exception("Bad row #" + rownum + " has " + row.Length + " fields: " + line);
                        }

                        /*
                         * string timeString = row[0];
                         * string priceString = row[1];
                         * double price = Double.Parse (priceString);
                         */

                        string directionString = row[2];
                        bool   isBid           = (directionString.Equals("Bid") ? true : false);

                        string orderpriceString = row[3];
                        double orderprice       = Double.Parse(orderpriceString);

                        string ordersizeString = row[4];
                        int    ordersize       = Int32.Parse(ordersizeString);

                        IOrder order;
                        if (isBid)
                        {
                            order = Orderbook.addBid(orderprice, ordersize, this);
                        }
                        else
                        {
                            order = Orderbook.addAsk(orderprice, ordersize, this);
                        }

                        SingletonLogger.Instance().InfoLog(typeof(AgentOrderbookLoader), "AgentOrderbookLoader placed: " + order);

                        AddToOpenOrderList(order);

                        rownum++;
                    }
                }
            }
            catch (Exception e) {
                // show
                SingletonLogger.Instance().ErrorLog(typeof(AgentOrderbookLoader), "Error in parseCSV -- " + e.Message);
                throw new Exception("Error in parseCSV -- " + e.Message);
            }
        }
Ejemplo n.º 3
0
        public void Orderbook_PriceEngineTest()
        {
            Console.WriteLine("Orderbook_PriceEngineTest");
            Orderbook ob = new Orderbook();
            Matcher   m  = new Matcher();

            ob.setMatcher(m);

            double MAXTIME = 10000;

            ob.addBid(12.2, 100, null);
            ob.addAsk(12.3, 100, null);

            IOrderbookPriceEngine pe = new OrderbookPriceEngine();

            try
            {
                System.IO.TextWriter writeFile = new StreamWriter("Orderbook_PriceEngineTest.txt");

                for (int i = 0; i < MAXTIME; i++)
                {
                    if (pe.isMarket(ob))
                    {
                        writeFile.WriteLine("?, ?, " + pe.getMarketPriceOffset(ob));
                    }
                    else
                    {
                        writeFile.WriteLine("" + pe.getAskPriceOffset(ob) + ", " + pe.getBidPriceOffset(ob) + ", ?");
                    }
                }
                writeFile.Flush();
                writeFile.Close();
                writeFile = null;
            }
            catch (IOException)
            {
                Assert.AreEqual(0, 1);
            }

            // execution occurs: 4 5 and 6 partially hit 3 out of 5 units of o3 at the ask price (5)
            Scheduler.Instance().Run();
        }
Ejemplo n.º 4
0
        public void Orderbook_AddOrdersTest()
        {
            Console.WriteLine("Orderbook_AddOrdersTest");
            Orderbook ob = new Orderbook();
            Matcher   m  = new Matcher();

            ob.setMatcher(m);

            // no bids or asks
            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 0);

            // place ask 1
            IOrder o1 = ob.addAsk(10.0, 3, null);

            Assert.AreEqual(ob.getNumAsks(), 1);
            Assert.AreEqual(ob.getNumBids(), 0);

            Assert.AreEqual(o1.isAsk(), true);
            Assert.AreEqual(o1.getPrice(), 10.0);
            Assert.AreEqual(o1.getVolume(), 3);
            Assert.AreEqual(o1.isCancelled(), false);
            Assert.AreEqual(o1.isFilled(), false);
            Assert.AreEqual(o1.getCapital(), 0.0);
            Assert.AreEqual(o1.getOwner(), null);

            // place bid 2
            IOrder o2 = ob.addBid(5.0, 3, null);

            Assert.AreEqual(ob.getNumAsks(), 1);
            Assert.AreEqual(ob.getNumBids(), 1);

            Assert.AreEqual(o2.isAsk(), false);
            Assert.AreEqual(o2.getPrice(), 5.0);
            Assert.AreEqual(o2.getVolume(), 3);
            Assert.AreEqual(o2.isCancelled(), false);
            Assert.AreEqual(o2.isFilled(), false);
            Assert.AreEqual(o2.getCapital(), 0.0);
            Assert.AreEqual(o2.getOwner(), null);

            Assert.AreEqual(ob.getHighestBid(), 5.0);
            Assert.AreEqual(ob.getLowestAsk(), 10.0);

            // place bid 3
            IOrder o3 = ob.addBid(10.0, 3, null);

            Assert.AreEqual(ob.getNumAsks(), 1);
            Assert.AreEqual(ob.getNumBids(), 2);

            Assert.AreEqual(o3.isAsk(), false);
            Assert.AreEqual(o3.getPrice(), 10.0);
            Assert.AreEqual(o3.getVolume(), 3);
            Assert.AreEqual(o3.isCancelled(), false);
            Assert.AreEqual(o3.isFilled(), false);
            Assert.AreEqual(o3.getCapital(), 0.0);
            Assert.AreEqual(o3.getOwner(), null);

            Assert.AreEqual(ob.getHighestBid(), 10.0);
            Assert.AreEqual(ob.getLowestAsk(), 10.0);

            // execution occurs -- o3 hits o1, leaving just the bid o2
            Scheduler.Instance().Run();
            Assert.AreEqual(m.NumAddOrdersReceived, 3, "orders = 3");
            Assert.AreEqual(m.NumFillsSent, 2, "fills = 2");
            Assert.AreEqual(m.NumPartialFillsSent, 0, "partial fills = 0");

            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 1);

            Assert.AreEqual(o3.isFilled(), true);
            Assert.AreEqual(o3.getCapital(), -30.0);
            Assert.AreEqual(o1.isFilled(), true);
            Assert.AreEqual(o1.getCapital(), 30.0);

            IOrder o4 = ob.addAsk(5.0, 1, null);
            IOrder o5 = ob.addAsk(5.0, 1, null);
            IOrder o6 = ob.addAsk(5.0, 1, null);

            Assert.AreEqual(o4.isAsk(), true);
            Assert.AreEqual(o4.getPrice(), 5.0);
            Assert.AreEqual(o4.getVolume(), 1);
            Assert.AreEqual(o4.isCancelled(), false);
            Assert.AreEqual(o4.isFilled(), false);
            Assert.AreEqual(o4.getCapital(), 0.0);
            Assert.AreEqual(o4.getOwner(), null);

            Assert.AreEqual(o5.isAsk(), true);
            Assert.AreEqual(o5.getPrice(), 5.0);
            Assert.AreEqual(o5.getVolume(), 1);
            Assert.AreEqual(o5.isCancelled(), false);
            Assert.AreEqual(o5.isFilled(), false);
            Assert.AreEqual(o5.getCapital(), 0.0);
            Assert.AreEqual(o5.getOwner(), null);

            Assert.AreEqual(o6.isAsk(), true);
            Assert.AreEqual(o6.getPrice(), 5.0);
            Assert.AreEqual(o6.getVolume(), 1);
            Assert.AreEqual(o6.isCancelled(), false);
            Assert.AreEqual(o6.isFilled(), false);
            Assert.AreEqual(o6.getCapital(), 0.0);
            Assert.AreEqual(o6.getOwner(), null);

            // execution occurs: 4 5 and 6 to hit o2
            Scheduler.Instance().Run();

            Assert.AreEqual(o4.isFilled(), true);
            Assert.AreEqual(o4.getCapital(), 5.0);
            Assert.AreEqual(o6.isFilled(), true);
            Assert.AreEqual(o6.getCapital(), 5.0);
            Assert.AreEqual(o5.isFilled(), true);
            Assert.AreEqual(o5.getCapital(), 5.0);

            Assert.AreEqual(o2.isFilled(), true);
            Assert.AreEqual(o2.getCapital(), -15.0);

            Assert.AreEqual(m.NumAddOrdersReceived, 6, "orders = 6");
            Assert.AreEqual(m.NumFillsSent, 6, "fills = 6");
            Assert.AreEqual(m.NumPartialFillsSent, 2, "partial fills = 2");

            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 0);
            //Assert.AreEqual(1, 0);
        }
Ejemplo n.º 5
0
        public void Orderbook_ComplexMatcherTest()
        {
            Console.WriteLine("Orderbook_ComplexMatcherTest");
            Orderbook ob = new Orderbook();
            Matcher   m  = new Matcher();

            ob.setMatcher(m);

            IOrder o2 = ob.addBid(5.0, 3, null);

            // let o2 fail to execute
            Scheduler.Instance().Run();

            IOrder o3 = ob.addBid(10.0, 5, null);

            // low asks will hit an existing high bid
            IOrder o4 = ob.addAsk(5.0, 1, null);

            Assert.AreEqual(ob.getNumAsks(), 1);
            Assert.AreEqual(ob.getNumBids(), 2);

            IOrder o5 = ob.addAsk(5.0, 1, null);

            Assert.AreEqual(ob.getNumAsks(), 2);
            Assert.AreEqual(ob.getNumBids(), 2);

            IOrder o6 = ob.addAsk(5.0, 1, null);

            Assert.AreEqual(ob.getNumAsks(), 3);
            Assert.AreEqual(ob.getNumBids(), 2);

            // execution occurs: 4 5 and 6 partially hit 3 out of 5 units of o3 at the ask price (5)
            Scheduler.Instance().Run();

            Assert.AreEqual(m.NumAddOrdersReceived, 5, "orders = 5");
            Assert.AreEqual(m.NumFillsSent, 3, "fills = 3");
            Assert.AreEqual(m.NumPartialFillsSent, 3, "partial fills = 3");

            Assert.AreEqual(o4.isFilled(), true);
            Assert.AreEqual(o4.getCapital(), 5.0);
            Assert.AreEqual(o6.isFilled(), true);
            Assert.AreEqual(o6.getCapital(), 5.0);
            Assert.AreEqual(o5.isFilled(), true);
            Assert.AreEqual(o5.getCapital(), 5.0);
            Assert.AreEqual(o3.isFilled(), false);
            Assert.AreEqual(o3.getCapital(), -15.0);
            Assert.AreEqual(o2.isFilled(), false);
            Assert.AreEqual(o2.getCapital(), 0.0);

            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 2);

            IOrder o7 = ob.addAsk(20.0, 1, null);
            IOrder o8 = ob.addAsk(20.0, 2, null);
            IOrder o9 = ob.addAsk(20.0, 3, null);

            // load up the new ask orders
            Scheduler.Instance().Run();

            Assert.AreEqual(m.NumAddOrdersReceived, 8, "orders = 8");
            Assert.AreEqual(m.NumFillsSent, 3, "fills = 3");
            Assert.AreEqual(m.NumPartialFillsSent, 3, "partial fills = 3");

            // high bid will hit existing low asks
            IOrder o10 = ob.addBid(100.0, 7, null);

            // execution occurs: 7 8 and 9 partially hit 10 out of 6 units of o10 at the ask price (20)
            Scheduler.Instance().Run();

            Assert.AreEqual(o7.isFilled(), true);
            Assert.AreEqual(o7.getCapital(), 20.0);
            Assert.AreEqual(o8.isFilled(), true);
            Assert.AreEqual(o8.getCapital(), 40.0);
            Assert.AreEqual(o9.isFilled(), true);
            Assert.AreEqual(o9.getCapital(), 60.0);
            Assert.AreEqual(o10.isFilled(), false);
            Assert.AreEqual(o10.getCapital(), -120.0);

            Assert.AreEqual(m.NumAddOrdersReceived, 9, "orders = 9");
            Assert.AreEqual(m.NumFillsSent, 6, "fills = 6");
            Assert.AreEqual(m.NumPartialFillsSent, 6, "partial fills = 6");

            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 3);
        }
Ejemplo n.º 6
0
        public void SimpleMatcherTest()
        {
            Console.WriteLine("MatcherTest");
            Orderbook ob = new Orderbook();
            Matcher   m  = new Matcher();

            ob.setMatcher(m);

            int ct = 0;
            // bids
            IOrder o1 = ob.addBid(10.0, 3, null);

            Scheduler.Instance().Run();
            ct++; Assert.AreEqual(m.NumAddOrdersReceived, ct, "order " + ct);
            Assert.AreEqual(m.NumFillsSent, 0, "fills " + 0);
            Assert.AreEqual(m.NumPartialFillsSent, 0, "partial fills " + 0);
            Console.WriteLine("o1 = " + o1);

            IOrder o2 = ob.addBid(12.0, 3, null);

            Scheduler.Instance().Run();
            ct++; Assert.AreEqual(m.NumAddOrdersReceived, ct, "order " + ct);
            Assert.AreEqual(m.NumFillsSent, 0, "fills " + 0);
            Assert.AreEqual(m.NumPartialFillsSent, 0, "partial fills " + 0);
            Console.WriteLine("o2 = " + o2);

            IOrder o3 = ob.addBid(14.0, 3, null);

            Scheduler.Instance().Run();
            ct++; Assert.AreEqual(m.NumAddOrdersReceived, ct, "order " + ct);
            Assert.AreEqual(m.NumFillsSent, 0, "fills " + 0);
            Assert.AreEqual(m.NumPartialFillsSent, 0, "partial fills " + 0);
            Console.WriteLine("o3 = " + o3);

            // asks
            IOrder o4 = ob.addAsk(10.0, 9, null);

            Scheduler.Instance().Run();
            // should get matched to bid @14,12,10
            // generating 4 fills (for ask and 3 bids) and 2 partial fills for the ask.
            ct++; Assert.AreEqual(m.NumAddOrdersReceived, ct, "order " + ct);
            Assert.AreEqual(m.NumFillsSent, 4, "fills " + 4);
            Assert.AreEqual(m.NumPartialFillsSent, 2, "partial fills " + 2);
            Console.WriteLine("o4 = " + o4);

            IOrder o5 = ob.addAsk(5.0, 1, null);

            Scheduler.Instance().Run();
            // should generate no new matching
            ct++; Assert.AreEqual(m.NumAddOrdersReceived, ct, "order " + ct);
            Assert.AreEqual(m.NumFillsSent, 4, "fills " + 4);
            Assert.AreEqual(m.NumPartialFillsSent, 2, "partial fills " + 2);
            Console.WriteLine("o5 = " + o5);

            IOrder o6 = ob.addAsk(5.0, 1, null);

            Scheduler.Instance().Run();
            // should generate no new matching
            ct++; Assert.AreEqual(m.NumAddOrdersReceived, ct, "order " + ct);
            Assert.AreEqual(m.NumFillsSent, 4, "fills " + 4);
            Assert.AreEqual(m.NumPartialFillsSent, 2, "partial fills " + 2);
            Console.WriteLine("o6 = " + o6);
        }
Ejemplo n.º 7
0
        public void Orderbook_CancelOrdersTest()
        {
            Console.WriteLine("Orderbook_CancelOrdersTest");
            Orderbook ob = new Orderbook();
            Matcher   m  = new Matcher();

            ob.setMatcher(m);

            // no bids or asks
            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 0);

            // place ask 1
            IOrder o1 = ob.addAsk(10.0, 3, null);
            // place bid 2
            IOrder o2 = ob.addBid(5.0, 3, null);

            // no bids or asks
            Assert.AreEqual(ob.getNumAsks(), 1);
            Assert.AreEqual(ob.getNumBids(), 1);

            bool cancelResult = ob.cancelOrder(o1);

            Assert.AreEqual(cancelResult, true);

            // no asks, 1 bid
            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 1);

            Scheduler.Instance().Run();

            // place bid 3
            IOrder o3 = ob.addBid(10.0, 5, null);

            // no asks, 2 bid
            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 2);

            Scheduler.Instance().Run();

            // execution is attempted -- but nothing can execute
            // since o2 cannot match o3
            Scheduler.Instance().Run();

            Assert.AreEqual(o1.isFilled(), false);
            Assert.AreEqual(o1.isCancelled(), true);
            Assert.AreEqual(o1.getCapital(), 0.0);

            Assert.AreEqual(o2.isFilled(), false);
            Assert.AreEqual(o2.isCancelled(), false);
            Assert.AreEqual(o2.getCapital(), 0.0);

            Assert.AreEqual(o3.isFilled(), false);
            Assert.AreEqual(o3.isCancelled(), false);
            Assert.AreEqual(o3.getCapital(), 0.0);

            Assert.AreEqual(m.NumAddOrdersReceived, 3, "orders = 3");
            Assert.AreEqual(m.NumFillsSent, 0, "fills = 0");
            Assert.AreEqual(m.NumPartialFillsSent, 0, "partial fills = 0");

            Assert.AreEqual(ob.getNumAsks(), 0);
            Assert.AreEqual(ob.getNumBids(), 2);
        }
Ejemplo n.º 8
0
        // receive a signal from the Simulation (via the Population)
        public override void Recv(ISimEntity src, ISimEvent simEvent)
        {
            if (Orderbook == null)
            {
                return;
            }

            if (LoggerDiags.Enabled)
            {
                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + "recv ISimEvent " + simEvent + " @ " + Scheduler.GetTime());
            }

            // events received from the DES
            if (simEvent is ActionPrompt)
            {
                if (DecideToAct())
                {
                    if (LoggerDiags.Enabled)
                    {
                        SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + "acts @ " + Scheduler.GetTime() + " I have " + _orders.Count + " orders open");
                    }

                    EvaluateAllOpenOrders();
                    if (DecideToMakeOrder())
                    {
                        if (LoggerDiags.Enabled)
                        {
                            SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + "makes order @ " + Scheduler.GetTime());
                        }

                        if (!Orderbook.isNonDegenerate())
                        {
                            SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " witnesses Orderbook blowup @ " + Scheduler.GetTime() + "\n" + Orderbook.ToStringLong());
                        }

                        IOrder newOrder = null;
                        if (DecideToSubmitBid())
                        {
                            if (LoggerDiags.Enabled)
                            {
                                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " submits bid @ " + Scheduler.GetTime());
                            }


                            // bid
                            double price  = GetBidPrice();
                            int    volume = GetBidVolume();

                            if (volume > 0)
                            {
                                newOrder = Orderbook.addBid(price, volume, this);
                            }
                            else
                            {
                                if (LoggerDiags.Enabled)
                                {
                                    SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " attempts unsuccessful zero sized bid @ " + Scheduler.GetTime());
                                }
                            }
                        }
                        else
                        {
                            if (LoggerDiags.Enabled)
                            {
                                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " submits ask @ " + Scheduler.GetTime());
                            }

                            // ask
                            double price  = GetAskPrice();
                            int    volume = GetAskVolume();

                            if (volume > 0)
                            {
                                newOrder = Orderbook.addAsk(price, volume, this);
                            }
                            else
                            {
                                if (LoggerDiags.Enabled)
                                {
                                    SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " attempts unsuccessful zero sized ask @ " + Scheduler.GetTime());
                                }
                            }
                        }

                        if (newOrder != null)
                        {
                            // may be null if dual volume is 0 preventing creation of new orders
                            AddToOpenOrderList(newOrder);

                            if (LoggerDiags.Enabled)
                            {
                                SingletonLogger.Instance().DebugLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " submitted " + newOrder + " @ " + Scheduler.GetTime());
                            }
                        }
                        else
                        {
                            throw new Exception("We got a problem");
                        }
                    }
                }

                double timeToNextPrompt = GetTimeToNextActionPrompt();
                if (timeToNextPrompt < 0.0)
                {
                    // agent checks out of ecosystem by indicating a negative time
                    if (LoggerDiags.Enabled)
                    {
                        SingletonLogger.Instance().WarningLog(typeof(AbstractAgent), "AbstractAgent " + GetName() + " leaves simulation by indicating negative prompt time @ " + Scheduler.GetTime());
                    }
                }
                else
                {
                    this.Send(this, simEvent, timeToNextPrompt);
                }
            }
        }