Esempio n. 1
0
        public void TestCase1()
        {
            //trade instrument
            Instrument digicoin = new Instrument() { Name = "DIGICOIN", LotSize = 10, MinLot = 1 };

            //clients
            Account a = new Account("Client A");
            Account b = new Account("Client B");
            Account c = new Account("Client C");

            //brokers
            BrokerRoute broker1 = new BrokerRoute(new FixedCommissionCalculator(5), 10);
            broker1.LastQuote = new Quote(1.49);
            BrokerRoute broker2 = new BrokerRoute(new AmountBasedCommissionCalculator(new decimal[] { 3, 3, 3, 3, 2.5M, 2.5M, 2.5M, 2.5M, 2, 2 }), 10);
            broker2.LastQuote = new Quote(1.52);

            //samrt route AKA 'aggregator'
            SmartRoute smart = new SmartRoute(broker1, broker2);
            smart.MaxLot = 10;

            //trade server
            Server server = new Server();
            server.Route = smart;

            DealTicket ticket;

            //1
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = a, Amount = 1, Side = Operation.Buy });
            Assert.AreEqual(15.645M, ticket.Gross);

            //2
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 4, Side = Operation.Buy });
            Assert.AreEqual(62.58M, ticket.Gross);

            //3
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = a, Amount = 5, Side = Operation.Buy });
            Assert.AreEqual(77.9M, ticket.Gross);

            //4
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 10, Side = Operation.Buy });
            Assert.AreEqual(155.04M, ticket.Gross);

            //5
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 8, Side = Operation.Sell });
            Assert.AreEqual(124.64M, ticket.Gross);

            //6
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = c, Amount = 7, Side = Operation.Sell });
            Assert.AreEqual(109.06M, ticket.Gross);

            //7
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = a, Amount = 13, Side = Operation.Buy });
            Assert.AreEqual(201.975M, ticket.Gross);

            //8
            ticket = server.PlaceOrder(new Order() { Instrument = digicoin, Account = b, Amount = 6, Side = Operation.Sell });
            Assert.AreEqual(93.48M, ticket.Gross);

            //9
            Assert.AreEqual(296.156M, Math.Round(server.GetTotalAmount(a, digicoin), 3));
            Assert.AreEqual(0M, Math.Round(server.GetTotalAmount(b, digicoin), 3));
            Assert.AreEqual(-109.06M, Math.Round(server.GetTotalAmount(c, digicoin), 3));

            //10
            Assert.AreEqual(80M, server.GetTransactedAmount(broker1, digicoin));
            Assert.AreEqual(460M, server.GetTransactedAmount(broker2, digicoin));
        }