我希望这里的某个人能够帮助阐明如何在带有 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 <- 9-8-59-0-MES-STK--0.0---SMART--USD---0--- 22:28:50:029 -> ---A4 -2-59-200-未找到请求的安全定义- 22:28:50:030 <- 3-60-0-MES-STK--0.0---SMART--USD----- BUY-1-MKT--------O-0--1-0-0-0-0-0-0-0--0.0--------0---1-0- --0---0-0--0------0-----0------------0---0-0---0--0 -0-0-0-------0---------0-0-0-0- 22:28:50:264 -> ---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()