要提供有关我的问题的更多背景信息:
我正在使用 python 构建一个连接到交互式经纪人 TWS 的 API。我设法构建了一些功能性的东西,并且能够使用 IB 文档中给出的方法从合约中获取实时数据。现在我想使用所有数据来构建其他并行系统,我在组织来自 IB 服务器的数据时遇到了问题。
我的程序循环一个包含 30 个符号的列表以从中获取实时数据,然后我想将每个符号的数据(例如“HIGH”、“LOW”、“CLOSE”、“VWAP”等)放在一个数据帧中计算指标并从那里提出一个基于这些指标的警报系统。
这个目标我已经完成了,整个程序只使用一个符号。很容易将数据存储在实例或变量中,将其传递给 DataFrame,然后计算以设置警报。
现在,当循环 30 个值的列表并接收所有这些值的数据时,我一直在努力尝试将每个符号的数据存储在一起,然后计算并设置警报。特别是当我必须使用几种方法来接收数据时(例如,我对某些数据使用tickPrice,对其他一些数据使用tickString)这几种方法一个接一个地执行,但它们不一定同时拥有所有数据,有些价值比其他价值需要更多的时间来显示。
我将展示我的代码示例,以提供更多关于我的目标的上下文:
这是我的 EWrapper 类:
class IBApi(EWrapper, EClient):
def __init__(self):
self.syms = ['EN', 'DG', 'AI', 'ORA', 'RI', 'ENGI', 'AC', 'VIV', 'KER', 'CA', 'BN', 'WLN', 'OR', 'VIE',
'LR', 'ML', 'SGO', 'CAP', 'MC', 'ACA', 'ATO', 'UG', 'SU', 'HO', 'BNP', 'GLE', 'SAN', 'SW', 'AIR', 'TTE']
EClient.__init__(self, self)
# Reciving Real Time Data
def tickString(self, reqId, tickType, value):
super().tickString(reqId, tickType, value)
try:
if reqId == 0:
reqId = self.syms[0]
if reqId == 1:
reqId = self.syms[1]
if reqId == 2:
reqId = self.syms[2]
if reqId == 3:
reqId = self.syms[3]
if reqId == 4:
reqId = self.syms[4]
if reqId == 5:
reqId = self.syms[5]
if reqId == 6:
reqId = self.syms[6]
if reqId == 7:
reqId = self.syms[7]
if reqId == 8:
reqId = self.syms[8]
if reqId == 9:
reqId = self.syms[9]
if reqId == 10:
reqId = self.syms[10]
if reqId == 11:
reqId = self.syms[11]
if reqId == 12:
reqId = self.syms[12]
if reqId == 13:
reqId = self.syms[13]
if reqId == 14:
reqId = self.syms[14]
if reqId == 15:
reqId = self.syms[15]
if reqId == 16:
reqId = self.syms[16]
if reqId == 17:
reqId = self.syms[17]
if reqId == 18:
reqId = self.syms[18]
if reqId == 19:
reqId = self.syms[19]
if reqId == 20:
reqId = self.syms[20]
if reqId == 21:
reqId = self.syms[21]
if reqId == 22:
reqId = self.syms[22]
if reqId == 23:
reqId = self.syms[23]
if reqId == 24:
reqId = self.syms[24]
if reqId == 25:
reqId = self.syms[25]
if reqId == 26:
reqId = self.syms[26]
if reqId == 27:
reqId = self.syms[27]
if reqId == 28:
reqId = self.syms[28]
if reqId == 29:
reqId = self.syms[29]
if reqId == 30:
reqId = self.syms[30]
if tickType == 48 != 0.0:
rtVolume = value.split(";")
vwap = float(rtVolume[4])
self.myData(reqId, TickTypeEnum.to_str(tickType), vwap)
except Exception as e:
print(e)
def tickPrice(self, reqId, tickType, price, attrib):
super().tickPrice(reqId, tickType, price, attrib)
try:
if reqId == 0:
reqId = self.syms[0]
if reqId == 1:
reqId = self.syms[1]
if reqId == 2:
reqId = self.syms[2]
if reqId == 3:
reqId = self.syms[3]
if reqId == 4:
reqId = self.syms[4]
if reqId == 5:
reqId = self.syms[5]
if reqId == 6:
reqId = self.syms[6]
if reqId == 7:
reqId = self.syms[7]
if reqId == 8:
reqId = self.syms[8]
if reqId == 9:
reqId = self.syms[9]
if reqId == 10:
reqId = self.syms[10]
if reqId == 11:
reqId = self.syms[11]
if reqId == 12:
reqId = self.syms[12]
if reqId == 13:
reqId = self.syms[13]
if reqId == 14:
reqId = self.syms[14]
if reqId == 15:
reqId = self.syms[15]
if reqId == 16:
reqId = self.syms[16]
if reqId == 17:
reqId = self.syms[17]
if reqId == 18:
reqId = self.syms[18]
if reqId == 19:
reqId = self.syms[19]
if reqId == 20:
reqId = self.syms[20]
if reqId == 21:
reqId = self.syms[21]
if reqId == 22:
reqId = self.syms[22]
if reqId == 23:
reqId = self.syms[23]
if reqId == 24:
reqId = self.syms[24]
if reqId == 25:
reqId = self.syms[25]
if reqId == 26:
reqId = self.syms[26]
if reqId == 27:
reqId = self.syms[27]
if reqId == 28:
reqId = self.syms[28]
if reqId == 29:
reqId = self.syms[29]
if reqId == 30:
reqId = self.syms[30]
self.myData(reqId, TickTypeEnum.to_str(tickType), price)
time.sleep(0.5)
except Exception as e:
print(e)
@staticmethod
def myData(reqId, type, price):
if type == 'RT_VOLUME':
values = {
'SYMBOL': [reqId],
'TYPE': [type],
'VWAP': [price]
}
print(values)
else:
values = {
'SYMBOL': [reqId],
'TYPE': [type],
'PRICE': [price]
}
print(values)
def error(self, id, errorCode, errorMsg):
print(errorCode)
print(errorMsg)
然后我有我的应用程序类:
class App:
ib = None
def __init__(self):
self.ib = IBApi()
self.ib.connect("127.0.0.1", 7496, 88)
ib_thread = threading.Thread(target=self.run_loop, daemon=True)
ib_thread.start()
time.sleep(0.5)
for sym in self.ib.syms:
self.marketData(self.ib.syms.index(sym), self.symbolsForData(sym))
def symbolsForData(self, mySymbol, sec_type='STK', currency='EUR', exchange='SBF'):
contract1 = Contract()
contract1.symbol = mySymbol.upper()
contract1.secType = sec_type
contract1.currency = currency
contract1.exchange = exchange
return contract1
def marketData(self, req_num, contract1):
self.ib.reqMktData(reqId=req_num,
contract=contract1,
genericTickList='233',
snapshot=False,
regulatorySnapshot=False,
mktDataOptions=[])
def run_loop(self):
self.ib.run()
# Start App
App()
正如您在 EWrapper 类中看到的那样,我有两种方法来接收数据并将符号分配给每个 reqId,然后我传递一个静态方法,它将接收到的数据放在一起,还有要循环的值列表槽。然后在我的 App 类中有连接、构建合同的方法、从 IB 保存 reqMktData 的方法以及获取我需要的参数的方法,以及使用 EWrapper 类中的列表执行 reqMktData 的循环。
以这种方式一切正常,我有这样正确输入的数据:
问题
因此,我的数据到达方式对我建立警报系统并没有真正有用,因为我没有将每个合同的所有数据放在一起,我不能只使用不同的值来设定条件跟上警报。有一次我要么只有“HIGH”,要么只有“LOW”,或者只有“VWAP”,但我很难弄清楚如何将每个符号放在一起,因为我没有一次拥有所有东西,而且数据每次都不断出现我就是找不到路。
我想澄清一下,我是编程新手,也是使用 python 的新手。对不起我的菜鸟代码,可能是“显而易见的”问题。 但是,如果有人可以帮助我解决这个问题,我将不胜感激。任何其他评论将不胜感激。
亲切的问候
马里奥