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
いくつかの数値がずれているように見えます:
{
"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
は文字列型の値がありますが、ソース コードはそれが正しいと言っています。
float ではなく大きな int を取得しているケースを修正するにはどうすればよいですか? メモリから値を読み取り、浮動小数点として再解釈することは可能ですか? これは Interactive Brokers API の問題ですか?