Невозможно подключиться к IB TWS с помощью API Python IbPy
Я пытаюсь получить исторические рыночные данные для различных тикеров, используя код, который я нашел с https://github.com/blampe/IbPy
В этом репозитории есть пример того, как запрашивать рыночные данные в файле "fancy_marketdata.py". Однако у меня возникают проблемы с установлением соединения с использованием следующего кода:
from ib.opt import ibConnection, message
from ib.ext.Contract import Contract
from time import sleep
# print all messages from TWS
def watcher(msg):
print(msg)
# show Bid and Ask quotes
def my_BidAsk(msg):
if msg.field == 1:
print ('%s:%s: bid: %s' % (contractTuple[0],
contractTuple[6], msg.price))
elif msg.field == 2:
print ('%s:%s: ask: %s' % (contractTuple[0], contractTuple[6], msg.price))
def makeStkContract(contractTuple):
newContract = Contract()
newContract.m_symbol = contractTuple[0]
newContract.m_secType = contractTuple[1]
newContract.m_exchange = contractTuple[2]
newContract.m_currency = contractTuple[3]
newContract.m_expiry = contractTuple[4]
newContract.m_strike = contractTuple[5]
newContract.m_right = contractTuple[6]
print ('Contract Values:%s,%s,%s,%s,%s,%s,%s:' % contractTuple)
return newContract
con = ibConnection(port=7496,clientId=100)
con.registerAll(watcher)
showBidAskOnly = True # set False to see the raw messages
if showBidAskOnly:
con.unregister(watcher, message.tickSize, message.tickPrice,
message.tickString, message.tickOptionComputation)
con.register(my_BidAsk, message.tickPrice)
con.connect()
sleep(1)
tickId = 1
contractTuple = ('QQQQ', 'STK', 'SMART', 'USD', '', 0.0, '')
stkContract = makeStkContract(contractTuple)
con.reqMktData(tickId, stkContract, '', False)
sleep(10)
con.cancelMktData(tickId)
sleep(1)
con.disconnect()
sleep(1)
Когда я получаю "con.connect()", он выдает следующее сообщение об ошибке:
Server Version: 76
<error id=None, errorCode=None, errorMsg='Receiver' object has no attribute 'managedAccounts'>TWS Time at connection:20171225 13:38:01 EST
Exception in thread EReader:
Traceback (most recent call last):
File "/Users/XYZ/anaconda3/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/Users/XYZ/anaconda3/ib/IbPy-master/ib/ext/EReader.py", line 113, in run
self.m_parent.close()
File "/Users/XYZ/anaconda3/ib/IbPy-master/ib/ext/EClientSocket.py", line 1714, in close
self.wrapper().connectionClosed()
AttributeError: 'Receiver' object has no attribute 'connectionClosed'
Это потому, что я использую Python 3.6? Моя версия TWS 968.2h. Пожалуйста, любая помощь будет принята с благодарностью! Контракт, для которого я пытаюсь получить рыночные данные, - это два новых фьючерсных контракта CBOE и CME (GXBT и BRR соответственно) для торговли биткойнами.
1 ответ
Ничего плохого в вашем коде, просто подтвердите, что вы указываете кортеж контракта. Обе эти биржи недавно установили биткойн-контракты, для которых вы запрашиваете данные - у них, возможно, еще не все работает гладко - объект, вероятно, ссылается на что-то конкретное в отношении типа вашей учетной записи.
Основываясь на своем опыте, я обнаружил, что использую дистрибутив Anaconda Python из
https://www.anaconda.com/download/
обеспечивает наиболее последовательные установки. Обеспечивает все так, как вам нужно, одним махом...