【问题标题】:ibpy interactive broker's python api not working for placing orderibpy 交互式经纪人的 python api 不能用于下订单
【发布时间】:2017-01-17 16:19:55
【问题描述】:

我有以下示例代码,当我第一次尝试运行它时,它可以工作:

from ib.opt import Connection, message
from ib.ext.Contract import Contract
from ib.ext.Order import Order

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 = 100

while __name__ == "__main__":

    conn = Connection.create(port=7496, clientId=999)
    conn.connect()
    oid = cid
    cont = make_contract('AAPL', 'STK', 'SMART', 'SMART', 'USD')
    offer = make_order('BUY', 1, 200)
    conn.placeOrder(oid, cont, offer)
    conn.disconnect()
    x = raw_input('enter to resend')
    cid += 1

当我第一次运行脚本时,IB的界面会弹出一个窗口,显示API的模拟交易配置信息。但是第二次,第三次运行它时,弹出信息再也不会出现,这让我感到困惑。这里有什么问题吗?

【问题讨论】:

  • 不应该是if __name__ == "__main__":。我想知道如果使用while循环会发生什么?
  • 我不知道足够多的python来回答,但你应该总是注册一个错误处理程序。我会用一个只打印味精的处理程序来做一个 registerAll 。然后你就可以看到问题了。以其他 ibpy 问题为例。如果我不得不猜测您可能需要在循环中声明global cid。您必须跟踪一生中使用的最后一个 cid,并且始终以 1 递增,因此 100 也需要更改。
  • 我正在使用 iPython,这意味着我可以一次运行每一行代码,实际上我不是在终端中编译它,而是使用 iPython 并一次运行一个,所以问题不在于如果 name == "main" 我很确定

标签: python api interactive-brokers


【解决方案1】:

如前所述,如果 name == "ma​​in":

您正在做的是运行一个无限循环,该循环连接到 IB API、下订单、断开连接并重复相同的过程。

弹出窗口可能是 API 警告之一,一旦被接受就不会再次出现,这就解释了为什么您再也看不到它。

您的订单很可能已下达并应显示在 TWS 中,除非它导致您不会在 TWS 中看到的错误。

正如其他人所暗示的那样,您首先需要做的是不要使用 iPython 笔记本,因为它不会让您很好地了解正在发生的事情。将您的代码更改为如下所示,您将能够看到发生了什么:

from ib.opt import Connection, message
from ib.ext.Contract import Contract
from ib.ext.Order import Order
import time

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 = 100

def handleAll(msg):
    print msg

if __name__ == "__main__":

    conn = Connection.create(port=7496, clientId=999)
    conn.connect()
    conn.registerAll(handleAll)
    oid = cid
    cont = make_contract('AAPL', 'STK', 'SMART', 'SMART', 'USD')
    offer = make_order('BUY', 1, 200)
    conn.placeOrder(oid, cont, offer)
    while 1:
        time.sleep(1)

【讨论】:

  • 嗨 kbcool 我正在尝试您的代码,它可以工作,但仅适用于第一个下订单。在 TWS 上它显示了 AAPL 的 200 股购买记录,但是当我将 AAPL 更改为 MSFT 并再次执行时,它没有显示第二条记录。
  • 我确实已将 cid 从 100 更改为 500,它显示 Server Version: 76 TWS Time at connection:20170117 08:55:14 EST ,order=,orderState=>
  • 好的,我想我找到了问题所在,因为我没有在这些代码行之间给出 time.sleep()。记住它在本地/TWS 服务器之间的请求/响应,请在任何连接之前给一些缓解时间。
  • 您可以只获取 nextValidId 消息并使用它,而不是一直更改 cid。此外,一旦您收到该消息,您就知道您已连接并且不需要任何睡眠。
猜你喜欢
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多