Python中连接保护IBPy和RequestID自动递增IBPy

2024-10-04 11:36:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这段代码可以执行一些算法,但是有几个明显的错误很难解决,因为我对Python和IBPy还不熟悉,连接问题在任何语言中都是专家问题。在

  • 第一个问题是,虽然类声明在本质上是正确的,但是一旦您有两个类的实例“Downloader”,它就会停止工作,如下面的代码所示。我可以很容易地看到,处理这个问题的方法是要么进行错误检查,不声明连接的新实例,要么只检查连接是否打开而不声明新实例。另一种选择是不创建新的对象,但是在这种情况下,我看不到如何在算法中执行操作,这样您就可以理解我的困境了。另外请注意,在主程序中,我初始化了另一个连接,但我想知道这是否必要;因此,如果您是IBPy的专家,你能告诉我通过在类'Downloader'中打开一个连接连接到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

Tags: 实例importselfidmakedeforderaction