【问题标题】:Problem with IB Insync Futures Order on Interactive Brokers TWS API盈透证券 TWS API 上的 IB Insync 期货订单问题
【发布时间】:2021-12-07 07:31:48
【问题描述】:

我希望这里有人能够帮助阐明如何在带有 Interactive Brokers API 的 python API 链接中为期货订单构建 IB-Insync 合约格式。 我正在尝试使用 IB-Insync 将汽车机器人 API 链接开发到盈透证券 API。 我的系统现在可以完美运行,自动以“库存”合同格式下订单;如下:

stock = Stock(message_data['ticker'], 'SMART', 'USD')
ib.qualifyContracts(stock)
order = MarketOrder(message_data['strategy']['order_action'], message_data['strategy']['order_contracts'])
trade = ib.placeOrder(stock, order)

但是当我根据文档应用相同的 python 脚本来理解期货订单所需的 IB-Insync 合同格式时,什么也没有发生,并且 API 日志中显示错误。

使用的 IB-Insync 期货合约格式如下:

contract = Future(symbol='MES', lastTradeDateOrContractMonth='20211217', exchange='GLOBEX',
localSymbol='MESZ1', multiplier='5', currency='USD')
ib.qualifyContracts(contract)
order = MarketOrder(message_data['strategy']['order_action'], message_data['strategy']['order_contracts'])
trade = ib.placeOrder(contract, order)

API 日志错误信息如下:

22:28:49:791 ---A4-2-59-200-未找到请求的安全定义- 22:28:50:030 ---A4-2-60-200-未找到请求的安全定义-

我尝试了许多不同的方法来构建期货合约格式;包括:

contract=Future('MES', '20121217', 'GLOBEX')

但同样的问题发生了——盈透证券 TWS API 将订单记录为 STK 订单,通过 SMART 交换协议路由它;显然不是。 我可以手动在 TWS 上为 MES 下一个期货订单;所以这不可能是由于权限设置造成的。

我希望这里有人可能知道解决方案或以前遇到过这个问题?

我被它难住了

感谢您的帮助

整个代码如下:

import redis, json
from ib_insync import *
import asyncio, time, random
from dataclasses import dataclass, field
from typing import List, NamedTuple, Optional
import ib_insync.util as util

# connect to Interactive Brokers 
util.startLoop()
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)

# connect to Redis and subscribe to tradingview messages
r = redis.Redis(host='localhost', port=6379, db=0)
p = r.pubsub()
p.subscribe('tradingview')

async def check_messages():
    print(f"{time.time()} - checking for tradingview webhook messages")
    message = p.get_message()
    if message is not None and message['type'] == 'message':
        print(message)

        message_data = json.loads(message['data'])

        contract = Future(symbol='MES', lastTradeDateOrContractMonth='20211217', exchange='GLOBEX', localSymbol='MESZ1', multiplier='5', currency='USD')
        ib.qualifyContracts(contract)
        order = MarketOrder(message_data['strategy']['order_action'], message_data['strategy']['order_contracts'])
        trade = ib.placeOrder(contract, order)

async def run_periodically(interval, periodic_function):
    while True:
        await asyncio.gather(asyncio.sleep(interval), periodic_function())

asyncio.run(run_periodically(1, check_messages))

ib.run()

【问题讨论】:

  • 我不使用 insync 但我可以通过使用“202112”到期来获取数据。我认为更长的形式是选项。
  • 我认为您需要 IB 的市场数据之一subscriptions 才能访问 TWS 中的期货合约。
  • 感谢 Brian 和 Matthew 的贡献 - @matthew:是的,我有订阅权限。我找到了解决方案并发布了答案,希望有一天能帮助其他人

标签: python redis interactive-brokers ib-api


【解决方案1】:

感谢那些回答的人 - 经过广泛的研究、实验和另一个论坛的想法......我找到了解决方案。

IB-Insync 中期货定单的合约参数格式与股票定单中使用的非常不同。

最终起作用的代码是:

        fut_contract = Contract()
        fut_contract.secType = 'FUT'
        fut_contract.exchange = 'GLOBEX'
        fut_contract.currency = 'USD'
        fut_contract.symbol = 'MNQ'
        fut_contract.localSymbol = 'MNQZ1'
        ib.qualifyContracts(fut_contract)
        
        order = MarketOrder('order_action', 'order_contracts')
        trade = ib.placeOrder(fut_contract, order)

股票订单的合约参数格式很简单:

stock = Stock(MSFT, 'SMART', 'USD')
ib.qualifyContracts(stock)
order = MarketOrder('BUY/SELL', Qty)
trade = ib.placeOrder(stock, order)

就我而言 - IB-Insync 文档中没有清楚地传达这种要求的格式,或者可能是因为我是自学成才的程序员,这对我来说并不明显 - 但可能是经验丰富的开发人员。无论如何 - 希望这些信息能在他们遇到同样的问题时对他们有所帮助。

【讨论】:

  • 文档位于 IB interactivebrokers.github.io/tws-api/basic_contracts.html#fut 您可以使用本地符号或符号到期。
  • @Brian....谢谢您的意见....是的-您是对的....我在研究/学习 IB-Insync 时了解到它有自己的语言结构,特别是对于合约参数格式,并且 IB-API 的参数格式不能在没有 IB-API 包装器的情况下与 IB-Insync 结合使用。看来我错了-谢谢
猜你喜欢
  • 2015-12-23
  • 2017-05-28
  • 2021-06-10
  • 2021-04-30
  • 2015-07-14
  • 1970-01-01
  • 2014-09-27
  • 2023-01-15
相关资源
最近更新 更多