我正在尝试使用 ibpy 库从交互式经纪商获取货币汇率,我在谷歌上找到了代码,我做了一些更改。
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
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 ('bid: %s' % ( msg.price))
bid=msg.price
elif msg.field == 2:
print ('ask: %s' % (msg.price))
ask=msg.price
elif msg.field==9:
print ('last close: %s' % msg.price)
last=msg.price
def makeStkContract(contractTuple):
newContract = Contract()
newContract.m_symbol = contractTuple[0]
newContract.m_secType = contractTuple[1]
newContract.m_exchange = contractTuple[2]
newContract.m_primaryExch=contractTuple[3]
newContract.m_currency = contractTuple[4]
print ('Contract Values:%s,%s,%s,%s,%s:' % contractTuple)
return newContract
if __name__ == '__main__':
global bid,ask,last
bid=None
ask=None
last=None
# con = ibConnection(port='4001',clientId=100)
con = Connection.create(port=7497, clientId=1006)
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
# Note: Option quotes will give an error if they aren't shown in TWS
#contractTuple = ('GOOGL', 'STK', 'SMART', 'ISLAND','USD')
#contractTuple = ('QQQQ', 'OPT', 'SMART', 'USD', '20170921', 47.0, 'CALL')
#contractTuple = ('ES', 'FUT', 'GLOBEX', 'USD', '200709', 0.0, '')
#contractTuple = ('ES', 'FOP', 'GLOBEX', 'USD', '20070920', 1460.0, 'CALL')
contractTuple = ('CAD', 'CASH', 'IDEALPRO','IDEALPRO','jpy')
stkContract = makeStkContract(contractTuple)
print ('* * * * REQUESTING MARKET DATA * * * *')
con.reqMktData(tickId, stkContract, '', False)
print ('global variables:',bid, ask,last)
sleep(1)
print ('* * * * CANCELING MARKET DATA * * * *')
con.cancelMktData(tickId)
sleep(1)
con.disconnect()
#sleep(1)
以下是结果
Server Version: 76
TWS Time at connection:20170319 05:45:12 EST
<managedAccounts accountsList=DU647841>
<nextValidId orderId=1>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfarm.us>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:cafarm>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:hfarm>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:cashfarm>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfuture>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:jfarm>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:eufarm>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfarm>
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usopt>
<error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:ushmds.us>
<error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:ilhmds>
<error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:euhmds>
<error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:cashhmds>
<error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:fundfarm>
<error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:ushmds>
Contract Values:CAD,CASH,IDEALPRO,IDEALPRO,jpy:
* * * * REQUESTING MARKET DATA * * * *
('global variables:', None, None, None)
last close: 85.07
* * * * CANCELING MARKET DATA * * * *
我现在遇到的困难是,首先我想消除所有这些不相关的味精,其次,我似乎无法让全局变量(bid,ask,last(工作。
有什么建议吗?提前致谢
如果您不想要所有消息,请不要print
它们。
你必须确保你做事的顺序是异步工作的。 在这里,您发出请求并在它有时间从服务器返回之前立即print
。 然后你sleep
1 秒钟,希望它完成。
con.reqMktData(tickId, stkContract, '', False)
print ('global variables:',bid, ask,last)
sleep(1)
print ('* * * * CANCELING MARKET DATA * * * *')
con.cancelMktData(tickId)
这是一种按顺序完成所有操作的方法。
from ib.ext.Contract import Contract
from ib.opt import ibConnection, message
def nextValidId_handler(msg):
global id;
id = msg.orderId
# start now when you know it's connected
makeRequest()
def error_handler(msg):
# only print interesting errors
if msg.id > 0:
print(msg)
# show Bid and Ask quotes
def my_BidAsk(msg):
global bid,ask
if msg.field == 1:
print ('bid: %s' % ( msg.price))
bid=msg.price
elif msg.field == 2:
print ('ask: %s' % (msg.price))
ask=msg.price
# there is no last price in forex, maybe just the last close.
if (bid is not None) and (ask is not None):
midPoint = (bid + ask)/2
print ('global variables:',bid, ask, midPoint)
# disconnect after getting all the data we want
disconnect()
def makeStkContract(contractTuple):
newContract = Contract()
newContract.m_symbol = contractTuple[0]
newContract.m_secType = contractTuple[1]
newContract.m_exchange = contractTuple[2]
newContract.m_primaryExch=contractTuple[3]
newContract.m_currency = contractTuple[4]
print ('Contract Values:%s,%s,%s,%s,%s:' % contractTuple)
return newContract
def makeRequest():
global tickId
tickId = 1
contractTuple = ('CAD', 'CASH', 'IDEALPRO','IDEALPRO','jpy')
stkContract = makeStkContract(contractTuple)
print ('* * * * REQUESTING MARKET DATA * * * *')
con.reqMktData(tickId, stkContract, '', False)
def disconnect():
print ('* * * * CANCELING MARKET DATA * * * *')
con.cancelMktData(tickId)
con.disconnect()
bid = None
ask = None
if __name__ == '__main__':
con = ibConnection(port=7497, clientId=1006)
con.register(error_handler, message.Error)
con.register(nextValidId_handler, message.nextValidId)
con.register(my_BidAsk, message.tickPrice)
con.connect()