Files
qihuo/docs/CTP_LIVE.md
T
dekun b02c9d6ca0 Fix empty recommend list and CTP premarket auto-connect.
Correct main_code order in product refresh, refresh on CTP connect, and limit reconnect to trading or premarket windows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 08:24:10 +08:00

9.7 KiB
Raw Blame History

期货公司实盘 CTP

本文说明如何接入 期货公司实盘 CTP,并对比 SimNow 模拟盘实盘 的开平仓逻辑是否一致。

相关代码:vnpy_bridge.pyctp_settings.pytrading_context.pyinstall_trading.py


一、SimNow 与实盘的关系

项目 模拟盘(SimNow 实盘(期货公司 CTP
系统设置 模拟盘 · SimNow 期货公司实盘
配置项 SIMNOW_* / simnow_* CTP_LIVE_* / ctp_live_*
连接对象 SimNow 仿真前置 开户期货公司提供的 TD/MD 前置
资金与持仓 SimNow 柜台 真实资金与持仓
报单代码路径 execute_order()vnpy_bridge.send_order() 完全相同

本系统 没有 本地假撮合。模拟盘与实盘均通过 vnpy_ctp 向 CTP 柜台发真实委托;区别仅在于 连哪组前置、用哪套账号,以及柜台返回的保证金/费率/拒单规则。

SimNow 接入步骤见 SIMNOW.md


二、实盘接入前准备

1. 向期货公司申请

通常需要:

  1. 期货账户已开户并完成适当性评估

  2. 申请 CTP 程序化交易API 接入(各公司流程不同)

  3. 获取 看穿式监管 所需的:

    • 经纪商代码(BrokerID
    • 投资者代码 / 资金账号
    • 交易密码
    • 交易前置(TD行情前置(MD 地址(tcp://IP:端口
    • AppID(产品名称)AuthCode(授权编码) — 实盘必须由期货公司分配,不能 使用 SimNow 的 simnow_client_test
  4. 在期货公司 仿真/实盘环境 中确认 AppID 已报备、账号已绑定

具体以开户营业部或官方 API 文档为准。

2. 配置 .env

TRADING_MODE=live

CTP_LIVE_USER=你的投资者代码
CTP_LIVE_PASSWORD=你的交易密码
CTP_LIVE_BROKER_ID=期货公司BrokerID
CTP_LIVE_TD_ADDRESS=tcp://xxx.xxx.xxx.xxx:端口
CTP_LIVE_MD_ADDRESS=tcp://xxx.xxx.xxx.xxx:端口
CTP_LIVE_APP_ID=期货公司分配的AppID
CTP_LIVE_AUTH_CODE=期货公司分配的AuthCode
CTP_LIVE_ENV=实盘

也可在 系统设置 → CTP 连接 → 期货公司实盘 中填写;页面保存优先于 .env

变量 说明
CTP_LIVE_USER 投资者代码(InvestorID),非手机号
CTP_LIVE_PASSWORD 交易密码
CTP_LIVE_BROKER_ID 期货公司 BrokerID(每家不同,不是 SimNow 的 9999
CTP_LIVE_TD_ADDRESS 交易服务器
CTP_LIVE_MD_ADDRESS 行情服务器
CTP_LIVE_APP_ID 看穿式 AppID
CTP_LIVE_AUTH_CODE 看穿式授权码
CTP_LIVE_ENV 一般为 实盘;测评环境按期货公司要求

3. 切换与连接

  1. 系统设置 → 交易模式期货公司实盘
  2. 保存 CTP 实盘账号与前置
  3. 下单监控连接 CTP
  4. 顶栏显示 CTP 已连接期货公司实盘,权益为柜台资金

修改模式或前置后建议 重连 CTPpm2 restart qihuo


三、开平仓逻辑(代码层)

模拟盘与实盘共用 vnpy_bridge.send_order(),映射如下。

开仓

本系统参数 CTP / vnpy
offset=open + direction=long Direction.LONG + Offset.OPEN(买开)
offset=open + direction=short Direction.SHORT + Offset.OPEN(卖开)

平仓

本系统参数 CTP 方向 开平标志
offset=close_long + 持多 Direction.SHORT(卖平) 见下表
offset=close_short + 持空 Direction.LONG(买平) 见下表

开平标志_resolve_close_offset()交易所规则 自动选择(与 SimNow/实盘 CTP 规范一致):

交易所 规则
大商所(DCE 使用通用 CLOSE
上期所(SHFE)、能源(INE)、郑商所(CZCE)、中金所(CFFEX) 区分 平今 CLOSETODAY / 平昨 CLOSEYESTERDAY
选择依据 查询持仓的今仓 td_volume、昨仓 yd_volume,优先平今再平昨

这与国内期货公司 CTP 客户端、快期等 标准投机平仓逻辑 一致。

委托类型

页面选项 vnpy 类型 说明
限价 OrderType.LIMIT 价格按最小变动价位取整
市价 OrderType.FAK + 对手价偏移 非「无价格市价单」,而是 带滑点的限价 FAK,以提高 SimNow/各前置成交率

止盈止损触发、手动平仓、策略平仓均走 order_type=market 的上述 FAK 逻辑。


四、SimNow 开平仓是否符合期货公司实盘逻辑?

结论(简要)

层级 是否一致 说明
CTP 报单语义(开/平、买卖方向、平今平昨) 同一套 send_order,符合国内 CTP 规范
交易所平今平昨规则 按 SHFE/INE/CZCE/CFFEX 与 DCE 分别处理
连接与鉴权 否(环境不同) BrokerID、前置、AppID/AuthCode 必须换期货公司参数
柜台业务规则 部分一致 SimNow 仿真在保证金、合约、拒单细节上可能与实盘有差异
本程序附加层 两模式相同 本地 SL/TP、移动保本、风控、微信推送等与柜台无关,SimNow/实盘行为一致

一致的部分(可放心联调)

  1. 开仓:买开 / 卖开 → Offset.OPEN
  2. 平仓:平多 = 卖 + 平今/平昨/平;平空 = 买 + 平今/平昨/平
  3. 持仓同步:来自 CTP 柜台回报,写入监控与 trade_logs 同步逻辑相同
  4. 撤单、挂单超时:对 CTP 委托号操作,两模式相同
  5. 策略 / 关键位自动单:最终都调用 execute_order(),无「模拟专用分支」

在 SimNow 上验证通过的开平仓流程,报单层面 可直接用于实盘;实盘主要风险在 账号权限、资金、AppID 报备、网络到期货公司前置,而非本系统换一套开平逻辑。

可能差异(接入实盘时需自行核对)

项目 SimNow 实盘
BrokerID 固定 9999 各期货公司不同
AppID / AuthCode 默认测试值 必须向期货公司申请
保证金 / 手续费 仿真柜台 真实费率,以 CTP 查询为准
合约限制 部分合约或规则简化 以期货公司 + 交易所为准
拒单原因 仿真环境 资金不足、非交易时间、未报备 AppID、风控拒单等
看穿式 SIMNOW_ENV=实盘 CTP_LIVE_ENV=实盘,且 AppID 必须在期货公司报备

本系统「非 CTP 标准」但两模式相同的部分

以下 不是 期货公司客户端自带功能,而是 本程序本地逻辑SimNow 与实盘 行为一致,但都与「只用手动在快期下单」不同:

功能 说明
本地止盈 / 止损 程序监控价格,触发后 再向 CTP 发平仓单
移动保本 动态抬止损,触发后市价 FAK 平仓
挂单超时撤单 本系统定时检查 pending 监控并撤单
账户冷静期 / 仓位上限 本系统风控,在发单前拦截
开单计划 / 关键支阻区 仅提醒,不自动报单(关键位自动单除外)

实盘使用时需知:CTP 柜台 不会 自动执行上述本地 SL/TP;只有程序运行且 CTP 已连接时才会生效。


五、实盘常见问题

现象 处理
连接失败 / 4097 核对 AppID、AuthCode、BrokerID;升级 vnpy_ctpCTP_LIVE_ENV=实盘
不合法的登录 投资者代码或密码错误;是否在期货公司柜台改过密码
登录成功但拒单 资金、交易时段、合约代码、价格 tick、AppID 未报备
平今平昨报错 检查是否持有对应今/昨仓;上期所等必须正确平今/平昨
服务器连不上前置 期货公司是否要求 白名单 IP;云服务器出网是否放行
与 SimNow 行为不一致 优先查 保证金、费率、合约;报单方向/开平标志可在日志中看 CTP 报单 … offset=

诊断 SimNow 可用 python scripts/test_simnow.py;实盘可将 .env 临时改为 live 配置后在同脚本逻辑下连 TD(需自行改脚本或看 PM2/应用日志)。


六、日志中如何确认报单

连接成功后,下单会在日志中输出类似:

CTP 报单 rb2510 SHFE Direction.SHORT 2手 @3205 offset=Offset.CLOSETODAY type=OrderType.FAK
  • offset=Offset.OPEN → 开仓
  • offset=Offset.CLOSETODAY / CLOSEYESTERDAY / CLOSE → 平仓类型
  • Direction 与持仓方向相反 → 平仓方向正确

SimNow 与实盘日志格式相同,仅 mode 与前置地址不同。


七、相关文档

文档 内容
SIMNOW.md SimNow 注册与仿真接入
TRADING.md 下单监控、两种通道概览
ORDER_MONITOR.md 手动开平仓、SL/TP、移动保本
DEPLOY.md 部署与环境变量总表
RISK.md 账户风控(实盘同样生效)

八、实盘接入检查清单

  • 已向期货公司申请 CTP / 程序化权限
  • 已获取 BrokerID、TD/MD 地址、AppID、AuthCode
  • .env 或系统设置中 CTP_LIVE_* 已填写
  • 系统设置交易模式为 期货公司实盘
  • 下单监控 连接 CTP 成功,权益为真实资金
  • 用小仓位测试:开仓 → 平仓(含上期所品种测平今)
  • 确认本地 SL/TP 触发后能在 CTP 看到平仓委托
  • 生产环境限制访问(HTTPS、防火墙、强密码)