我有这段代码可以执行一些算法,但是有一些难以解决的明显错误,因为我是 Python 和 IBPy 的新手,而且无论如何连接问题总是任何语言的专业问题。
- 第一个问题是,虽然类声明本质上是正确的,但只要您有两个“Downloader”类实例,它就会停止工作,如下面的代码所示。我可以很容易地看到处理这个问题的方法是进行错误检查而不声明新的连接实例,或者只是检查连接是否打开而不声明新实例。另一种方法是不创建新对象,但在这种情况下,我看不到如何在算法中执行操作,因此您可以在这里理解我的困境。另请注意,在主程序中,我初始化了另一个连接,但我想知道这是否有必要;因此,如果您是 IBPy 专家,您能否通过在“下载器”类中打开连接来告诉我是否连接到 TWS 创建直接到 API 的连接(这是我试图通过主程序中的连接实现的)并且不再需要在主程序中初始化新连接?我必须强调我不是 Python 或 IBYPy 的专家,我非常需要知识渊博的人的帮助。
- 另一个令人震惊的问题是“requestID”。这在类的第一次实例化中递增,但在第二次实例化中重新初始化。再一次,唯一的解决方案是错误检查然后递增并且不再初始化,或者检查是否非零并递增,或者找到不需要新对象实例的方法。(在一个不相关的说明中,我认为有一种复杂的方法来增加 c_id 和 order_id 但现在看不到如何,所以如果你有想法,欢迎他们)
这是代码
import ib
from ib.opt import Connection, message
from ib.ext.Contract import Contract
from ib.ext.Order import Order
class Downloader(object):
field4price = ''
def __init__(self):
self.tws = ibConnection('localhost', 4001, 0)
self.tws.register(self.tickPriceHandler, 'TickPrice')
self.tws.connect()
self._reqId = 1 # current request id
def tickPriceHandler(self,msg):
if msg.field == 4:
self.field4price = msg.price
#print '[debug]', msg
def requestData(self,contract):
self.tws.reqMktData(self._reqId, contract, '', 1)
self._reqId+=1
def make_contract(symbol, sec_type, exch, prim_exch, curr):
Contract.m_symbol = symbol
Contract.m_secType = sec_type
Contract.m_exchange = exch
Contract.m_primaryExch = prim_exch
Contract.m_currency = curr
return Contract
def make_order(action,quantity, price = None):
if price is not None:
order = Order()
order.m_orderType = 'LMT'
order.m_totalQuantity = quantity
order.m_action = action
order.m_lmtPrice = price
else:
order = Order()
order.m_orderType = 'MKT'
order.m_totalQuantity = quantity
order.m_action = action
return order
cid = 303
c_id = 304
while __name__ == "__main__":
d1 = downloader
d2 = downloader
conn = Connection.create(port=7496, clientId=999)
conn.connect()
orderId = cid
oid = c_id
3sigma = 3
sec1 = make_contract('TSLA', 'STK', 'SMART', 'SMART', 'USD')
sec2 = make_contract('AAPL', 'STK', 'SMART', 'SMART', 'USD')
d1.requestData(sec1)
d2.requestData(sec2)
if abs(float(d1.field4price) - float(d2.field4price)) < 3sigma
if float(d1.field4price) < float(d2.field4price)
offer = make_order('BUY', 1, 200)
conn.placeOrder(orderId, sec1, offer)
offer = make_order('SELL', 1, 200)
conn.placeOrder(orderId, sec2, offer)
else
offer = make_order('BUY', 1, 200)
conn.placeOrder(orderId, sec2, offer)
offer = make_order('SELL', 1, 200)
conn.placeOrder(orderId, sec1, offer)
conn.disconnect()
x = raw_input('enter to resend')
c_id += 1
cid +=1