Esempio n. 1
0
    def setUp(self):
        self.mock_client = MagicMock()
        self.account_id = 10000
        self.utils = Utils(self.mock_client, self.account_id)

        self.order_id = 1

        self.maxDiff = None
Esempio n. 2
0
    def test_get_order_success_str_account_id(self):
        self.utils = Utils(self.mock_client, str(self.account_id))

        order_id = self.account_id + 100
        response = MockResponse({}, 200, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/{}'.format(
                self.account_id, order_id)})
        self.assertEqual(order_id, self.utils.extract_order_id(response))
Esempio n. 3
0
    def test_get_order_nonmatching_account_id_str(self):
        self.utils = Utils(self.mock_client, str(self.account_id))

        response = MockResponse({}, True, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/456'.format(
                self.account_id + 1)})
        with self.assertRaises(
                ValueError, msg='order request account ID != Utils.account_id'):
            self.utils.extract_order_id(response)
Esempio n. 4
0
 def executeOrder(self, order):
     orderId = 0
     try:
         orderResult = self._c.place_order(self.account.settings, order)
         orderId = Utils(
             self._c, self.account.settings).extract_order_id(orderResult)
     except Exception as ex:
         print("Failed to execute order")
     return self.getOrder(orderId)
Esempio n. 5
0
    def place_sell_stop(self, symbol: str, quantity: int, stop: Decimal):
        order = (equity_sell_market(symbol, quantity).set_order_type(
            OrderType.STOP).set_duration(
                Duration.GOOD_TILL_CANCEL).set_stop_price(stop)).build()

        r = self.c.place_order(self.account_id, order)
        if not r.ok:
            raise BrokerException(r)

        order_id = Utils(self.c, self.account_id).extract_order_id(r)
        return order_id
Esempio n. 6
0
    def place_buy_limit(self, symbol: str, quantity: int,
                        limit: Decimal) -> str:
        order = (equity_buy_limit(symbol, quantity, limit).set_duration(
            Duration.GOOD_TILL_CANCEL)).build()

        r = self.c.place_order(self.account_id, order)
        if not r.ok:
            raise BrokerException(r)

        order_id = Utils(self.c, self.account_id).extract_order_id(r)
        return order_id
Esempio n. 7
0
    def place_buy_market(self, symbol: str, quantity: int) -> str:
        order = (
            # market order can only be a day order
            equity_buy_market(symbol, quantity)).build()

        r = self.c.place_order(self.account_id, order)
        if not r.ok:
            raise BrokerException(r)

        order_id = Utils(self.c, self.account_id).extract_order_id(r)
        return order_id
Esempio n. 8
0
class UtilsTest(unittest.TestCase):

    def setUp(self):
        self.mock_client = MagicMock()
        self.account_id = 10000
        self.utils = Utils(self.mock_client, self.account_id)

        self.order_id = 1

        self.maxDiff = None

    ##########################################################################
    # extract_order_id tests

    @no_duplicates
    def test_extract_order_id_order_not_ok(self):
        response = MockResponse({}, 403)
        with self.assertRaises(
                UnsuccessfulOrderException, msg='order not successful'):
            self.utils.extract_order_id(response)

    @no_duplicates
    def test_extract_order_id_no_location(self):
        response = MockResponse({}, 200, headers={})
        self.assertIsNone(self.utils.extract_order_id(response))

    @no_duplicates
    def test_extract_order_id_no_pattern_match(self):
        response = MockResponse({}, 200, headers={
            'Location': 'https://api.tdameritrade.com/v1/accounts/12345'})
        self.assertIsNone(self.utils.extract_order_id(response))

    @no_duplicates
    def test_get_order_nonmatching_account_id(self):
        response = MockResponse({}, 200, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/456'.format(
                self.account_id + 1)})
        with self.assertRaises(
                AccountIdMismatchException,
                msg='order request account ID != Utils.account_id'):
            self.utils.extract_order_id(response)

    @no_duplicates
    def test_get_order_nonmatching_account_id_str(self):
        self.utils = Utils(self.mock_client, str(self.account_id))

        response = MockResponse({}, 200, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/456'.format(
                self.account_id + 1)})
        with self.assertRaises(
                AccountIdMismatchException,
                msg='order request account ID != Utils.account_id'):
            self.utils.extract_order_id(response)

    @no_duplicates
    def test_get_order_success_200(self):
        order_id = self.account_id + 100
        response = MockResponse({}, 200, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/{}'.format(
                self.account_id, order_id)})
        self.assertEqual(order_id, self.utils.extract_order_id(response))

    @no_duplicates
    def test_get_order_success_201(self):
        order_id = self.account_id + 100
        response = MockResponse({}, 201, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/{}'.format(
                self.account_id, order_id)})
        self.assertEqual(order_id, self.utils.extract_order_id(response))

    @no_duplicates
    def test_get_order_success_str_account_id(self):
        self.utils = Utils(self.mock_client, str(self.account_id))

        order_id = self.account_id + 100
        response = MockResponse({}, 200, headers={
            'Location':
            'https://api.tdameritrade.com/v1/accounts/{}/orders/{}'.format(
                self.account_id, order_id)})
        self.assertEqual(order_id, self.utils.extract_order_id(response))
Esempio n. 9
0
class UtilsTest(unittest.TestCase):

    def setUp(self):
        self.mock_client = MagicMock()
        self.account_id = 10000
        self.utils = Utils(self.mock_client, self.account_id)

        self.order_id = 1

        self.maxDiff = None

    def order(self, time, symbol, quantity, instruction, order_type):
        order = test_utils.real_order()
        order['orderId'] = self.order_id
        order['enteredTime'] = time
        order['closeTime'] = time
        order['accountId'] = self.account_id
        order['orderType'] = order_type
        order['orderLegCollection'][0]['quantity'] = quantity
        order['orderLegCollection'][0]['instruction'] = instruction
        order['orderLegCollection'][0]['instrument']['symbol'] = symbol
        order['orderActivityCollection'][0]['executionLegs'][0]['time'] = time
        order['orderActivityCollection'][0]['quantity'] = quantity
        order['orderActivityCollection'][0]['executionLegs'][0]['quantity'] \
            = quantity

        self.order_id += 1

        return order

    def test_most_recent_order(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        order = self.utils.get_most_recent_order()
        self.assertEqual(order2, order)

    def test_too_many_order_legs(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.get_most_recent_order()
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'].append(order2['orderLegCollection'][0])
        out_order = self.utils.get_most_recent_order()
        self.assertEqual(order1, out_order)

    def test_non_equity_asset_type(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.get_most_recent_order()
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['instrument']['assetType'] = 'OPTION'
        out_order = self.utils.get_most_recent_order()
        self.assertEqual(order1, out_order)

    def test_different_symbol(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.get_most_recent_order(symbol='AAPL')
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['instrument']['symbol'] = 'MSFT'
        out_order = self.utils.get_most_recent_order(symbol='AAPL')
        self.assertEqual(order1, out_order)

    def test_quantity_and_symbol(self):
        msg = 'when specifying quantity, must also specify symbol'
        with self.assertRaises(ValueError, msg=msg):
            out_order = self.utils.get_most_recent_order(quantity=1)

    def test_different_quantity(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.get_most_recent_order(
            symbol='AAPL', quantity=1)
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['quantity'] = 10
        out_order = self.utils.get_most_recent_order(
            symbol='AAPL', quantity=1)
        self.assertEqual(order1, out_order)

    def test_different_instruction(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.get_most_recent_order(
            instruction=EquityOrderBuilder.Instruction.BUY)
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['instruction'] = 'SELL'
        out_order = self.utils.get_most_recent_order(
            instruction=EquityOrderBuilder.Instruction.BUY)
        self.assertEqual(order1, out_order)

    def test_different_order_type(self):
        order1 = self.order(
            '2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')
        order2 = self.order(
            '2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY', 'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.get_most_recent_order(
            order_type=EquityOrderBuilder.OrderType.MARKET)
        self.assertEqual(order2, out_order)

        order2['orderType'] = 'LIMIT'
        out_order = self.utils.get_most_recent_order(
            order_type=EquityOrderBuilder.OrderType.MARKET)
        self.assertEqual(order1, out_order)
Esempio n. 10
0
class UtilsTest(unittest.TestCase):
    def setUp(self):
        self.mock_client = MagicMock()
        self.account_id = 10000
        self.utils = Utils(self.mock_client, self.account_id)

        self.order_id = 1

        self.maxDiff = None

    ##########################################################################
    # extract_order_id tests

    def test_extract_order_id_order_not_ok(self):
        response = MockResponse({}, False)
        with self.assertRaises(ValueError, msg='order not successful'):
            self.utils.extract_order_id(response)

    def test_extract_order_id_no_location(self):
        response = MockResponse({}, True, headers={})
        self.assertIsNone(self.utils.extract_order_id(response))

    def test_extract_order_id_no_pattern_match(self):
        response = MockResponse(
            {},
            True,
            headers={
                'Location': 'https://api.tdameritrade.com/v1/accounts/12345'
            })
        self.assertIsNone(self.utils.extract_order_id(response))

    def test_get_order_nonmatching_account_id(self):
        response = MockResponse(
            {},
            True,
            headers={
                'Location':
                'https://api.tdameritrade.com/v1/accounts/{}/orders/456'.
                format(self.account_id + 1)
            })
        with self.assertRaises(
                ValueError,
                msg='order request account ID != Utils.account_id'):
            self.utils.extract_order_id(response)

    def test_get_order_success(self):
        order_id = self.account_id + 100
        response = MockResponse(
            {},
            True,
            headers={
                'Location':
                'https://api.tdameritrade.com/v1/accounts/{}/orders/{}'.format(
                    self.account_id, order_id)
            })
        self.assertEqual(order_id, self.utils.extract_order_id(response))

    ##########################################################################
    # find_most_recent_order tests

    def order(self, time, symbol, quantity, instruction, order_type):
        order = test_utils.real_order()
        order['orderId'] = self.order_id
        order['enteredTime'] = time
        order['closeTime'] = time
        order['accountId'] = self.account_id
        order['orderType'] = order_type
        order['orderLegCollection'][0]['quantity'] = quantity
        order['orderLegCollection'][0]['instruction'] = instruction
        order['orderLegCollection'][0]['instrument']['symbol'] = symbol
        order['orderActivityCollection'][0]['executionLegs'][0]['time'] = time
        order['orderActivityCollection'][0]['quantity'] = quantity
        order['orderActivityCollection'][0]['executionLegs'][0]['quantity'] \
            = quantity

        self.order_id += 1

        return order

    def test_most_recent_order(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        order = self.utils.find_most_recent_order()
        self.assertEqual(order2, order)

    def test_too_many_order_legs(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.find_most_recent_order()
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'].append(order2['orderLegCollection'][0])
        out_order = self.utils.find_most_recent_order()
        self.assertEqual(order1, out_order)

    def test_non_equity_asset_type(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.find_most_recent_order()
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['instrument']['assetType'] = 'OPTION'
        out_order = self.utils.find_most_recent_order()
        self.assertEqual(order1, out_order)

    def test_different_symbol(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.find_most_recent_order(symbol='AAPL')
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['instrument']['symbol'] = 'MSFT'
        out_order = self.utils.find_most_recent_order(symbol='AAPL')
        self.assertEqual(order1, out_order)

    def test_quantity_and_symbol(self):
        msg = 'when specifying quantity, must also specify symbol'
        with self.assertRaises(ValueError, msg=msg):
            out_order = self.utils.find_most_recent_order(quantity=1)

    def test_different_quantity(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.find_most_recent_order(symbol='AAPL',
                                                      quantity=1)
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['quantity'] = 10
        out_order = self.utils.find_most_recent_order(symbol='AAPL',
                                                      quantity=1)
        self.assertEqual(order1, out_order)

    def test_different_instruction(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.find_most_recent_order(
            instruction=EquityOrderBuilder.Instruction.BUY)
        self.assertEqual(order2, out_order)

        order2['orderLegCollection'][0]['instruction'] = 'SELL'
        out_order = self.utils.find_most_recent_order(
            instruction=EquityOrderBuilder.Instruction.BUY)
        self.assertEqual(order1, out_order)

    def test_different_order_type(self):
        order1 = self.order('2020-01-01T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')
        order2 = self.order('2020-01-02T12:00:00+0000', 'AAPL', 1, 'BUY',
                            'MARKET')

        self.mock_client.get_orders_by_path = MagicMock(
            return_value=MockResponse([order1, order2], True))

        out_order = self.utils.find_most_recent_order(
            order_type=EquityOrderBuilder.OrderType.MARKET)
        self.assertEqual(order2, out_order)

        order2['orderType'] = 'LIMIT'
        out_order = self.utils.find_most_recent_order(
            order_type=EquityOrderBuilder.OrderType.MARKET)
        self.assertEqual(order1, out_order)