public void ClientPlacesStopLimitOrder()
        {
            bool orderFilled      = false;
            var  manualResetEvent = new ManualResetEvent(false);
            var  ib = new InteractiveBrokersBrokerage();

            ib.Connect();

            decimal aapl  = 100m;
            decimal delta = 85.0m; // if we can't get a price then make the delta huge

            ib.OrderEvent += (sender, args) =>
            {
                orderFilled = true;
                aapl        = args.FillPrice;
                delta       = 0.02m;
                manualResetEvent.Set();
            };

            // get the current market price, couldn't get RequestMarketData to fire tick events
            int id = 0;

            ib.PlaceOrder(new Order("AAPL", SecurityType.Equity, 1, OrderType.Market, DateTime.UtcNow)
            {
                Id = ++id
            });

            manualResetEvent.WaitOne(2000);
            manualResetEvent.Reset();
            Assert.IsTrue(orderFilled);

            orderFilled = false;

            // make a box around the current price +- a little

            const int quantity = 1;
            var       order    = new Order("AAPL", SecurityType.Equity, +quantity, OrderType.StopMarket, DateTime.Now, aapl - delta)
            {
                Id = ++id
            };

            ib.PlaceOrder(order);

            ib.PlaceOrder(new Order("AAPL", SecurityType.Equity, -quantity, OrderType.StopMarket, DateTime.Now, aapl + delta)
            {
                Id = ++id
            });

            manualResetEvent.WaitOne(1000);

            var orderFromIB = AssertOrderOpened(orderFilled, ib, order);

            Assert.AreEqual(OrderType.StopMarket, orderFromIB.Type);
        }
        public void ClientSellsMarketOrder()
        {
            bool orderFilled      = false;
            var  manualResetEvent = new ManualResetEvent(false);

            var ib = new InteractiveBrokersBrokerage();

            ib.Connect();

            ib.OrderEvent += (sender, args) =>
            {
                orderFilled = true;
                manualResetEvent.Set();
            };

            // sell a single share
            var order = new Order("AAPL", SecurityType.Equity, -1, OrderType.Market, DateTime.UtcNow);

            ib.PlaceOrder(order);

            manualResetEvent.WaitOne(2500);

            var orderFromIB = AssertOrderOpened(orderFilled, ib, order);

            Assert.AreEqual(OrderType.Market, orderFromIB.Type);
        }
        public void ClientPlacesMarketOrder()
        {
            bool orderFilled      = false;
            var  manualResetEvent = new ManualResetEvent(false);
            var  ib = new InteractiveBrokersBrokerage();

            ib.Connect();

            ib.Client.RequestOpenOrders();

            ib.OrderEvent += (sender, args) =>
            {
                orderFilled = true;
                manualResetEvent.Set();
            };

            const int buyQuantity = 1;
            //ib.PlaceOrder(new Order("AAPL", SecurityType.Equity, buyQuantity, OrderType.Market, DateTime.Now));
            var order = new Order("AAPL", SecurityType.Equity, buyQuantity, OrderType.Market, DateTime.Now);

            ib.PlaceOrder(order);

            manualResetEvent.WaitOne(2500);
            var orderFromIB = AssertOrderOpened(orderFilled, ib, order);

            Assert.AreEqual(OrderType.Market, orderFromIB.Type);
        }
        public void ClientCancelsLimitOrder()
        {
            OrderStatus status           = OrderStatus.New;
            var         manualResetEvent = new ManualResetEvent(false);

            var ib = new InteractiveBrokersBrokerage();

            ib.Connect();

            ib.OrderEvent += (sender, args) =>
            {
                status = args.Status;
                manualResetEvent.Set();
            };

            // try to sell a single share at a ridiculous price, we'll cancel this later
            var order = new Order("AAPL", SecurityType.Equity, -1, OrderType.Limit, DateTime.UtcNow, 100000);

            ib.PlaceOrder(order);
            manualResetEvent.WaitOne(2500);

            ib.CancelOrder(order);

            manualResetEvent.Reset();
            manualResetEvent.WaitOne(2500);

            Assert.AreEqual(OrderStatus.Canceled, status);
        }