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

CTP | 合约信息查询成功
2026-08-03 11:19:20 2026-08-03 11:19:20.181 | INFO | CTP | 委托 1_-384763495_1 状态更新,79:已撤单报单被拒绝CZCE:不被支持的报单类型

这个问题如何解决?昨天注册的simnow模拟账号,回测的策略都正常,但是自动交易加载策略后下单就失败

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

这个报错核心是:CZCE/CTP 前置拒绝了你发出的报单类型,不是回测逻辑问题。VeighNa 的 CTP 网关里只支持显式映射 LIMIT / MARKET / FAK / FOK,不支持把 STOP 直接发到 CTP;其中对郑商所 CZCE 来说,市价 AnyPrice、FAK/FOK/IOC 这类报单经常会被拒为“不被支持的报单类型”,实盘/模拟都应改用 限价 GFD

依据源码 vnpy_ctp/gateway/ctp_gateway.py

ORDERTYPE_VT2CTP = {
    OrderType.LIMIT:  (THOST_FTDC_OPT_LimitPrice, THOST_FTDC_TC_GFD, THOST_FTDC_VC_$),
    OrderType.MARKET: (THOST_FTDC_OPT_AnyPrice,  THOST_FTDC_TC_GFD, THOST_FTDC_VC_$),
    OrderType.FAK:    (THOST_FTDC_OPT_LimitPrice, THOST_FTDC_TC_IOC, THOST_FTDC_VC_$),
    OrderType.FOK:    (THOST_FTDC_OPT_LimitPrice, THOST_FTDC_TC_IOC, THOST_FTDC_VC_CV),
}

建议你按下面顺序排查/修改:

  1. 确认策略/模块没有发 MARKET、FAK、FOK

    • CTA 策略默认 buy/sell/short/coverOrderType.LIMIT,通常没问题。
    • 如果你用的是脚本交易、算法交易、组合策略,或自己调用 main_engine.send_order(),请把 order_type 固定为 OrderType.LIMIT
    • 想要“立即成交”不要用 MARKET,改成限价超价:买入用 ask_price_1 + n*pricetick,卖出用 bid_price_1 - n*pricetick,并限制在涨跌停内。
  2. CZCE 合约强制限价示例

from vnpy.trader.constant import Direction, Exchange, Offset, OrderType
from vnpy.trader.object import OrderRequest, TickData, ContractData

def make_czce_limit_req(
    contract: ContractData,
    tick: TickData,
    direction: Direction,
    offset: Offset,
    volume: float,
    slippage_ticks: int = 2,
) -> OrderRequest:
    """CZCE 不使用市价/FAK/FOK,用限价超价模拟市价成交。"""
    price: float = tick.last_price

    if direction == Direction.LONG:
        price = tick.ask_price_1 or tick.last_price
        price += slippage_ticks * contract.pricetick
        if tick.limit_up:
            price = min(price, tick.limit_up)
    else:
        price = tick.bid_price_1 or tick.last_price
        price -= slippage_ticks * contract.pricetick
        if tick.limit_down:
            price = max(price, tick.limit_down)

    return OrderRequest(
        symbol=contract.symbol,
        exchange=Exchange.CZCE,
        direction=direction,
        offset=offset,
        type=OrderType.LIMIT,
        price=price,
        volume=volume,
        reference="czce_limit_only",
    )
  1. 检查 stop=True 的用法

    • CTA 文档说明:stop=True 时,如果接口支持交易所停止单则发交易所停止单,否则转本地停止单。CTP 网关本身没有 OrderType.STOP 映射,正常会走本地停止单,触发后再发 LIMIT
    • 但如果你自己改过 contract.stop_supported=True、或自定义引擎把 OrderType.STOP 直接送到 CTP,要改回来:CTP 不要发交易所 STOP。
    • 海龟/Keltner/ATR-RSI 这类示例里大量用 stop=True,在 CTP 上应依赖本地停止单,触发后必须落到 send_limit_order
  2. 加一行日志确认真实发出的 CTP 字段
    vnpy_ctp/gateway/ctp_gateway.pyCtpTdApi.send_order() 里,reqOrderInsert 前临时打印:

self.gateway.write_log(
    "CTP报单请求: "
    f"symbol={req.symbol} exchange={req.exchange.value} type={req.type.value} "
    f"price_type={price_type} time_condition={time_condition} "
    f"volume_condition={volume_condition} price={req.price} volume={req.volume}"
)

如果看到 MARKET/FAK/FOKTimeCondition=IOC,基本就是问题来源;CZCE 改成 LIMIT + GFD + $

  1. SimNow 账号侧再确认
    官方文档要求:SimNow 用户名是 6 位 InvestorID,不是手机号;经纪商代码 9999;新注册账号需要修改一次密码后才能用;注意两套环境适用时间段不同,且不要把 SimNow 账号接到 CTPTEST。你能“合约信息查询成功”说明登录/授权大概率已通过,但仍建议确认当天是否已完成改密、是否连的是 CTP 而非 CTPTEST、是否在交易时段内。

结论:把发往 CZCE 的委托统一改成 OrderType.LIMIT,不要用 MARKET/FAK/FOK/STOP;用限价超价替代市价单。改完后这类 CZCE:不被支持的报单类型 一般就会消失。
参考来源:vnpy_ctp/gateway/ctp_gateway.pyvnpy_ctastrategy/engine.pydocument/community/app/cta_strategy.mddocument/community/info/veighna_trader.md


基于RAG技术开发的VeighNa AI助手,你的个人专属 Desk Quant