VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 11
声望: 0

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

description

Super Moderator
avatar
加入于:
帖子: 138
声望: 15

这个问题涉及价差交易模块和 CTP 接口的交互,让我先查一下相关文档和源码来定位原因

文档中有一条关键信息:价差交易模块的查询合约功能不支持交易所套利合约。让我进一步查看 CTP 接口和价差交易模块的源码来确认具体

让我进一步查看价差交易模块的核心代码,特别是下单逻辑和标准套利合约

让我进一步查看主引擎中 convert_order_request 的逻辑,以及 CTP 接口对标准套利合约的处理

现在我已经掌握了完整的调用链路。让我再确认一下文档中关于标准套利合约

现在我已经完整分析了整个调用链路,可以给出明确的结论了。


结论:价差交易模块不支持交易所标准套利合约

根本原因

VeighNa 价差交易模块的官方文档中明确说明:

查询合约功能"不支持交易所套利合约"

— 来源:spread_trading.md 文档

你通过 get_contract 获取的 SP rb2610&rb2701.SHFE上期所交易所标准组合合约Product.SPREAD),而价差交易模块的设计理念是:用户自己用两条独立腿构建价差合约,然后由 SpreadTaker 算法分别对两条腿下单,而不是直接对交易所标准套利合约下单。

技术层面分析

从源码来看,整个下单链路是这样的:

  1. SpreadAlgoEngine.send_orderengine.py)创建 OrderRequest 时,offset 固定为 Offset.OPEN

    original_req: OrderRequest = OrderRequest(
        symbol=contract.symbol,
        exchange=contract.exchange,
        direction=direction,
        offset=Offset.OPEN,  # 固定开仓
        ...
    )
    
  2. 经过 OffsetConverter 转换后,最终到达 CTP 接口的 send_orderctp_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,
        ...
    }
    
  3. 问题就在这里:CTP 对标准套利合约(组合合约)的 CombOffsetFlag 字段有特殊要求——它需要的是组合格式的开平标志(如 "00" 表示两条腿都开仓),而不是普通期货的单字符标志(如 "0")。当前 VeighNa 的 CTP 接口中 OFFSET_VT2CTP 映射的是普通期货的开平标志,没有针对组合合约做适配,因此 CTP 柜台返回错误代码 15(报单字段有误)

正确的做法

如果你要交易上期所的螺纹钢跨期套利,应该用两条独立腿来自己构建价差合约

配置项
主动腿 rb2610.SHFE
被动腿 rb2701.SHFE
价格公式 A - B
交易乘数 1 : 1

这样 SpreadTaker 算法会分别对 rb2610rb2701 两条独立腿下单,每条腿都是标准期货合约,CTP 接口可以正常处理。

总结

这不是你配置的问题,也不是系统 bug,而是价差交易模块在设计上就不支持交易所标准套利合约。标准套利合约需要通过 CTP 的组合指令功能来交易,而当前 VeighNa 的 CTP 接口和价差交易模块都没有针对组合合约做适配。建议使用两条独立腿构建价差合约来替代。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】