CTP | 合约信息查询成功
2026-08-03 11:19:20 2026-08-03 11:19:20.181 | INFO | CTP | 委托 1_-384763495_1 状态更新,79:已撤单报单被拒绝CZCE:不被支持的报单类型
这个问题如何解决?昨天注册的simnow模拟账号,回测的策略都正常,但是自动交易加载策略后下单就失败
CTP | 合约信息查询成功
2026-08-03 11:19:20 2026-08-03 11:19:20.181 | INFO | CTP | 委托 1_-384763495_1 状态更新,79:已撤单报单被拒绝CZCE:不被支持的报单类型
这个问题如何解决?昨天注册的simnow模拟账号,回测的策略都正常,但是自动交易加载策略后下单就失败
这个报错核心是: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),
}
建议你按下面顺序排查/修改:
确认策略/模块没有发 MARKET、FAK、FOK
buy/sell/short/cover 是 OrderType.LIMIT,通常没问题。main_engine.send_order(),请把 order_type 固定为 OrderType.LIMIT。MARKET,改成限价超价:买入用 ask_price_1 + n*pricetick,卖出用 bid_price_1 - n*pricetick,并限制在涨跌停内。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",
)
检查 stop=True 的用法
stop=True 时,如果接口支持交易所停止单则发交易所停止单,否则转本地停止单。CTP 网关本身没有 OrderType.STOP 映射,正常会走本地停止单,触发后再发 LIMIT。contract.stop_supported=True、或自定义引擎把 OrderType.STOP 直接送到 CTP,要改回来:CTP 不要发交易所 STOP。stop=True,在 CTP 上应依赖本地停止单,触发后必须落到 send_limit_order。加一行日志确认真实发出的 CTP 字段
在 vnpy_ctp/gateway/ctp_gateway.py 的 CtpTdApi.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/FOK 或 TimeCondition=IOC,基本就是问题来源;CZCE 改成 LIMIT + GFD + $。
9999;新注册账号需要修改一次密码后才能用;注意两套环境适用时间段不同,且不要把 SimNow 账号接到 CTPTEST。你能“合约信息查询成功”说明登录/授权大概率已通过,但仍建议确认当天是否已完成改密、是否连的是 CTP 而非 CTPTEST、是否在交易时段内。结论:把发往 CZCE 的委托统一改成 OrderType.LIMIT,不要用 MARKET/FAK/FOK/STOP;用限价超价替代市价单。改完后这类 CZCE:不被支持的报单类型 一般就会消失。
参考来源:vnpy_ctp/gateway/ctp_gateway.py、vnpy_ctastrategy/engine.py、document/community/app/cta_strategy.md、document/community/info/veighna_trader.md。
基于RAG技术开发的VeighNa AI助手,你的个人专属 Desk Quant