public async Task ContractDetailsController_Should_ReturnValidForexContractAsync()
        {
            // Setup
            TwsObjectFactory twsObjectFactory = new TwsObjectFactory();

            TwsConnectionController      connectionController      = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            TwsContractDetailsController contractDetailsController = new TwsContractDetailsController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, new TwsRequestIdGenerator());

            await connectionController.EnsureConnectedAsync();

            Contract contract = new Contract();

            contract.Symbol   = "EUR";
            contract.SecType  = "CASH";
            contract.Currency = "GBP";
            contract.Exchange = "IDEALPRO";

            // Call
            List <ContractDetails> contractDetails = await contractDetailsController.GetContractAsync(contract);

            // Assert
            contractDetails.First().Should().NotBeNull();

            // Tear down
            await connectionController.DisconnectAsync();
        }
        public async Task ContractDetailsController_Should_ReturnValidContractAsync()
        {
            // Setup
            TwsObjectFactory twsObjectFactory = new TwsObjectFactory();

            TwsConnectionController      connectionController      = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            TwsContractDetailsController contractDetailsController = new TwsContractDetailsController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, new TwsRequestIdGenerator());

            await connectionController.EnsureConnectedAsync();

            Contract contract = new Contract
            {
                SecType     = TwsContractSecType.Stock,
                Symbol      = "MSFT",
                Exchange    = TwsExchange.Smart,
                PrimaryExch = TwsExchange.Island,
            };

            // Call
            List <ContractDetails> contractDetails = await contractDetailsController.GetContractAsync(contract);

            // Assert
            contractDetails.Should().NotBeNull();

            // Tear down
            await connectionController.DisconnectAsync();
        }
        public async Task OrderPlacementController_Should_PlaceTwoOrdersSuccessfully()
        {
            // Setup
            TwsObjectFactory twsObjectFactory = new TwsObjectFactory();

            // This should be fixed a bit to be injectable
            // It's a bit dirty because you need to run ConfigureTws before you have access to the client socket and callback handler
            TwsConnectionController     connectionController     = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            ITwsNextOrderIdController   nextOrderIdController    = new TwsNextOrderIdController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            TwsOrderPlacementController orderPlacementController = new TwsOrderPlacementController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);

            await connectionController.EnsureConnectedAsync();

            // Initialize the contract
            Contract contract = new Contract
            {
                SecType     = TwsContractSecType.Stock,
                Symbol      = "MSFT",
                Exchange    = TwsExchange.Smart,
                PrimaryExch = TwsExchange.Island,
            };

            // Initialize the order
            Order order = new Order
            {
                Action        = "BUY",
                OrderType     = "MKT",
                TotalQuantity = 1
            };

            // Call the API
            int orderId = await nextOrderIdController.GetNextValidIdAsync();

            var firstOrderAcknowledgedTask = orderPlacementController.PlaceOrderAsync(orderId, contract, order);

            orderId = await nextOrderIdController.GetNextValidIdAsync();

            var secondOrderAcknowledgedTask = orderPlacementController.PlaceOrderAsync(orderId, contract, order);

            Task.WaitAll(firstOrderAcknowledgedTask, secondOrderAcknowledgedTask);

            // Assert
            firstOrderAcknowledgedTask.Result.Should().BeTrue();
            secondOrderAcknowledgedTask.Result.Should().BeTrue();

            // Tear down
            await connectionController.DisconnectAsync();
        }
Пример #4
0
        public async Task PositionsController_Should_ReturnAListOfPositions()
        {
            // Setup
            TwsObjectFactory            twsObjectFactory         = new TwsObjectFactory();
            TwsConnectionController     connectionController     = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            TwsPositionsController      positionsController      = new TwsPositionsController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            ITwsNextOrderIdController   nextOrderIdController    = new TwsNextOrderIdController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            TwsOrderPlacementController orderPlacementController = new TwsOrderPlacementController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);

            await connectionController.EnsureConnectedAsync();

            // Create a position
            Contract contract = new Contract
            {
                SecType     = TwsContractSecType.Stock,
                Symbol      = "MSFT",
                Exchange    = TwsExchange.Smart,
                PrimaryExch = TwsExchange.Island,
            };

            Order order = new Order
            {
                Action        = "BUY",
                OrderType     = "MKT",
                TotalQuantity = 1
            };

            int orderId = await nextOrderIdController.GetNextValidIdAsync();

            bool successfullyPlaced = await orderPlacementController.PlaceOrderAsync(orderId, contract, order);

            Thread.Sleep(1000); // TWS takes some time to put the order in the portfolio. Wait for it.

            // Call
            List <PositionStatusEventArgs> positionStatusEvents = await positionsController.RequestPositions();

            // Assert
            positionStatusEvents.Count.Should().BeGreaterOrEqualTo(0);
            PositionStatusEventArgs daxPositions = positionStatusEvents.Where(eventArgs => eventArgs.Contract.Symbol == contract.Symbol).FirstOrDefault();

            daxPositions.Position.Should().BeGreaterOrEqualTo(order.TotalQuantity);

            // Tear down
            await connectionController.DisconnectAsync();
        }
Пример #5
0
        public async Task AccountUpdatesController_Should_ReturnInformation()
        {
            // Setup
            TwsObjectFactory            twsObjectFactory         = new TwsObjectFactory();
            TwsConnectionController     connectionController     = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            TwsAccountUpdatesController accountUpdatesController = new TwsAccountUpdatesController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            await connectionController.EnsureConnectedAsync();

            // Call
            string accountId = "DU1052488";
            ConcurrentDictionary <string, string> accountUpdates = await accountUpdatesController.GetAccountDetailsAsync(accountId);

            // Assert
            accountUpdates.Count.Should().BeGreaterThan(0);

            // Tear down
            await connectionController.DisconnectAsync();
        }
        public async Task TwsExecutionController_Should_ReturnExecutions()
        {
            TwsObjectFactory            twsObjectFactory         = new TwsObjectFactory();
            TwsConnectionController     connectionController     = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            ITwsNextOrderIdController   nextOrderIdController    = new TwsNextOrderIdController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            TwsOrderPlacementController orderPlacementController = new TwsOrderPlacementController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            TwsRequestIdGenerator       twsRequestIdGenerator    = new TwsRequestIdGenerator();
            TwsExecutionController      executionController      = new TwsExecutionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, twsRequestIdGenerator);

            await connectionController.EnsureConnectedAsync();

            // Create a position
            Contract contract = new Contract();

            contract.SecType    = TwsContractSecType.Future;
            contract.Symbol     = TwsSymbol.Dax;
            contract.Exchange   = TwsExchange.Dtb;
            contract.Currency   = TwsCurrency.Eur;
            contract.Multiplier = "25";
            contract.LastTradeDateOrContractMonth = "201809";

            Order order = new Order
            {
                Action        = "BUY",
                OrderType     = "MKT",
                TotalQuantity = 1
            };

            int orderId = await nextOrderIdController.GetNextValidIdAsync();

            bool successfullyPlaced = await orderPlacementController.PlaceOrderAsync(orderId, contract, order);

            Thread.Sleep(1000); // TWS takes some time to put the order in the portfolio. Wait for it.

            // Call
            List <ExecutionDetailsEventArgs> executionDetailEvents = await executionController.RequestExecutions();

            // Assert
            executionDetailEvents.Count.Should().BeGreaterOrEqualTo(0);

            // Tear down
            await connectionController.DisconnectAsync();
        }
        public async Task OrderPlacementController_Should_PlacePegToMidpointOrder()
        {
            // Setup
            TwsObjectFactory twsObjectFactory = new TwsObjectFactory();

            // This should be fixed a bit to be injectable
            // It's a bit dirty because you need to run ConfigureTws before you have access to the client socket and callback handler
            TwsConnectionController     connectionController     = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            ITwsNextOrderIdController   nextOrderIdController    = new TwsNextOrderIdController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            TwsOrderPlacementController orderPlacementController = new TwsOrderPlacementController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);

            await connectionController.EnsureConnectedAsync();

            // Initialize the contract
            Contract contract = new Contract();

            contract.SecType     = TwsContractSecType.Stock;
            contract.Symbol      = "MSFT";
            contract.Exchange    = TwsExchange.Smart;
            contract.PrimaryExch = TwsExchange.Island;

            // Initialize the order
            Order order = new Order()
            {
                Action        = TwsOrderActions.Buy,
                OrderType     = "REL",
                TotalQuantity = 1,
                LmtPrice      = 166,
                AuxPrice      = 0.1,
            };

            // Call the API
            int orderId = await nextOrderIdController.GetNextValidIdAsync();

            var orderAck = await orderPlacementController.PlaceOrderAsync(orderId, contract, order);

            // Assert
            orderAck.Should().BeTrue();

            // Tear down
            await connectionController.DisconnectAsync();
        }
        public async Task OrderPlacementController_Should_PlaceBracketOrder()
        {
            // Setup
            TwsObjectFactory            twsObjectFactory         = new TwsObjectFactory();
            TwsConnectionController     connectionController     = new TwsConnectionController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler, "localhost", 7462, 1);
            ITwsNextOrderIdController   nextOrderIdController    = new TwsNextOrderIdController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);
            TwsOrderPlacementController orderPlacementController = new TwsOrderPlacementController(twsObjectFactory.ClientSocket, twsObjectFactory.TwsCallbackHandler);

            await connectionController.EnsureConnectedAsync();

            // Initialize the contract
            Contract contract = new Contract();

            contract.SecType     = TwsContractSecType.Stock;
            contract.Symbol      = "MSFT";
            contract.Exchange    = TwsExchange.Smart;
            contract.PrimaryExch = TwsExchange.Island;

            int entryOrderId = await nextOrderIdController.GetNextValidIdAsync();

            var takeProfitOrderId = await nextOrderIdController.GetNextValidIdAsync();

            var stopOrderId = await nextOrderIdController.GetNextValidIdAsync();

            // Initialize the order
            Order entryOrder = new Order()
            {
                Action        = TwsOrderActions.Buy,
                OrderType     = TwsOrderType.Market,
                TotalQuantity = 1,
                Transmit      = false
            };

            Order takeProfit = new Order()
            {
                Action        = TwsOrderActions.Sell,
                OrderType     = TwsOrderType.Limit,
                TotalQuantity = 1,
                LmtPrice      = 190,
                ParentId      = entryOrderId,
                Transmit      = false,
            };

            Order stopLoss = new Order()
            {
                Action        = TwsOrderActions.Sell,
                OrderType     = TwsOrderType.StopLoss,
                TotalQuantity = 1,
                AuxPrice      = 100,
                ParentId      = entryOrderId,
                Transmit      = true,
            };

            // Call the API
            var entryOrderAckTask      = orderPlacementController.PlaceOrderAsync(entryOrderId, contract, entryOrder);
            var takeProfitOrderAckTask = orderPlacementController.PlaceOrderAsync(takeProfitOrderId, contract, takeProfit);
            var stopOrderAckTask       = orderPlacementController.PlaceOrderAsync(stopOrderId, contract, stopLoss);

            Task.WaitAll(entryOrderAckTask, takeProfitOrderAckTask, stopOrderAckTask);

            // Assert
            entryOrderAckTask.Result.Should().BeTrue();
            takeProfitOrderAckTask.Result.Should().BeTrue();
            stopOrderAckTask.Result.Should().BeTrue();

            // Tear down
            await connectionController.DisconnectAsync();
        }