Как исправить ошибки в сообщениях IbPy

Я использую IbPy для чтения текущих заказов. Ответные сообщения, которые возвращаются для обработки методами EWrapper, имеют некоторые атрибуты неправильного типа.

Для начала, вот мой обработчик для сообщений, связанных с заказом. Он предназначен для перехвата всех сообщений, вызванных reqAllOpenOrders(),

from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.ext.OrderState import OrderState

_order_resp = dict(openOrderEnd=False, openOrder=[], openStatus=[])

def order_handler(msg):
    """ Update our global Order data response dict
    """
    global _order_resp
    if msg.typeName in ['openStatus', 'openOrder']:
        d = dict()
        for i in msg.items():
            if isinstance(i[1], (Contract, Order, OrderState)):
                d[i[0]] = i[1].__dict__
            else:
                d[i[0]] = i[1]
        _order_resp[msg.typeName].append(d.copy())
    elif msg.typeName == 'openOrderEnd':
        _order_resp['openOrderEnd'] = True
    log.info('ORDER: {})'.format(msg))

В приведенном выше коде я загружаю все объекты и их атрибуты в dict, который затем добавляется в списки внутри _order_resp,

Строки вывода журнала показывают нормальное взаимодействие с IB:

25-Jan-16 14:57:04 INFO      ORDER: <openOrder orderId=1, contract=<ib.ext.Contract.Contract object at 0x102a98150>, order=<ib.ext.Order.Order object at 0x102a98210>, orderState=<ib.ext.OrderState.OrderState object at 0x102a98350>>)
25-Jan-16 14:57:04 INFO      ORDER: <orderStatus orderId=1, status=PreSubmitted, filled=0, remaining=100, avgFillPrice=0.0, permId=1114012437, parentId=0, lastFillPrice=0.0, clientId=0, whyHeld=None>)
25-Jan-16 14:57:04 INFO      ORDER: <openOrderEnd>)

Но, глядя на данные, помещенные в _order_resp dict, похоже, некоторые цифры отключены:

    {
        "contract": {
            "m_comboLegsDescrip": null,
            "m_conId": 265598,
            "m_currency": "USD",
            "m_exchange": "SMART",
...
        },
        "order": {
            "m_account": "DU12345",
            "m_action": "SELL",
            "m_activeStartTime": "",
            "m_activeStopTime": "",
            "m_algoStrategy": null,
            "m_allOrNone": false,
            "m_auctionStrategy": 0,
            "m_auxPrice": 0.0,
            "m_basisPoints": 9223372036854775807,
            "m_basisPointsType": 9223372036854775807,
...
        },
        "orderId": 1,
        "orderState": {
            "m_commission": 9223372036854775807,
            "m_commissionCurrency": null,
            "m_equityWithLoan": "1.7976931348623157E308",
            "m_initMargin": "1.7976931348623157E308",
            "m_maintMargin": "1.7976931348623157E308",
            "m_maxCommission": 9223372036854775807,
            "m_minCommission": 9223372036854775807,
...
        }
    }
],
"openOrderEnd": true,

В исходном коде мы видим, что m_maxCommission это float() Тем не менее, значение выглядит как int, и оно намного больше, чем большинство комиссий, которые люди платят.

Некоторые другие ключи, такие как m_equityWithLoan имеют значения строкового типа, но исходный код говорит, что это правильно.

Как мне исправить ситуацию, когда я получаю большие целые вместо плавающих? Можно ли считать значение из памяти и интерпретировать его как число с плавающей запятой? Это проблема API Interactive Brokers?

0 ответов

Другие вопросы по тегам