通过get_contract能够获取上期所标准套利对,但是没有办法下单,是我这边有哪里弄错了还是系统没有更新和适应?

通过get_contract能够获取上期所标准套利对,但是没有办法下单,是我这边有哪里弄错了还是系统没有更新和适应?

这个问题涉及价差交易模块和 CTP 接口的交互,让我先查一下相关文档和源码来定位原因
文档中有一条关键信息:价差交易模块的查询合约功能不支持交易所套利合约。让我进一步查看 CTP 接口和价差交易模块的源码来确认具体
让我进一步查看价差交易模块的核心代码,特别是下单逻辑和标准套利合约
让我进一步查看主引擎中 convert_order_request 的逻辑,以及 CTP 接口对标准套利合约的处理
现在我已经掌握了完整的调用链路。让我再确认一下文档中关于标准套利合约
现在我已经完整分析了整个调用链路,可以给出明确的结论了。
VeighNa 价差交易模块的官方文档中明确说明:
查询合约功能"不支持交易所套利合约"
— 来源:spread_trading.md 文档
你通过 get_contract 获取的 SP rb2610&rb2701.SHFE 是上期所交易所标准组合合约(Product.SPREAD),而价差交易模块的设计理念是:用户自己用两条独立腿构建价差合约,然后由 SpreadTaker 算法分别对两条腿下单,而不是直接对交易所标准套利合约下单。
从源码来看,整个下单链路是这样的:
SpreadAlgoEngine.send_order(engine.py)创建 OrderRequest 时,offset 固定为 Offset.OPEN:
original_req: OrderRequest = OrderRequest(
symbol=contract.symbol,
exchange=contract.exchange,
direction=direction,
offset=Offset.OPEN, # 固定开仓
...
)
经过 OffsetConverter 转换后,最终到达 CTP 接口的 send_order(ctp_gateway.py),构建 CTP 报单请求:
ctp_req: dict = {
"InstrumentID": req.symbol,
"ExchangeID": req.exchange.value,
"CombOffsetFlag": OFFSET_VT2CTP.get(req.offset, ""), # → "0"
"CombHedgeFlag": THOST_FTDC_HF_Speculation,
...
}
问题就在这里:CTP 对标准套利合约(组合合约)的 CombOffsetFlag 字段有特殊要求——它需要的是组合格式的开平标志(如 "00" 表示两条腿都开仓),而不是普通期货的单字符标志(如 "0")。当前 VeighNa 的 CTP 接口中 OFFSET_VT2CTP 映射的是普通期货的开平标志,没有针对组合合约做适配,因此 CTP 柜台返回错误代码 15(报单字段有误)。
如果你要交易上期所的螺纹钢跨期套利,应该用两条独立腿来自己构建价差合约:
| 配置项 | 值 |
|---|---|
| 主动腿 | rb2610.SHFE |
| 被动腿 | rb2701.SHFE |
| 价格公式 | A - B |
| 交易乘数 | 1 : 1 |
这样 SpreadTaker 算法会分别对 rb2610 和 rb2701 两条独立腿下单,每条腿都是标准期货合约,CTP 接口可以正常处理。
这不是你配置的问题,也不是系统 bug,而是价差交易模块在设计上就不支持交易所标准套利合约。标准套利合约需要通过 CTP 的组合指令功能来交易,而当前 VeighNa 的 CTP 接口和价差交易模块都没有针对组合合约做适配。建议使用两条独立腿构建价差合约来替代。