Files
qihuo/docs/CTP_LIVE.md
T
dekun 95156ca595 Update docs for CTP worker split and roll breakout off-session.
Refresh DEPLOY, TRADING, STRATEGY, CTP_LIVE, FEATURES, INDEX, and README to document qihuo-ctp architecture, dual PM2 restarts, and休盘突破加仓.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 12:56:27 +08:00

239 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 期货公司实盘 CTP
本文说明如何接入 **期货公司实盘 CTP**,并对比 **SimNow 模拟盘****实盘** 的开平仓逻辑是否一致。
相关代码:`vnpy_bridge.py``ctp_worker.py``ctp_ipc_client.py``ctp_settings.py``trading_context.py``install_trading.py`
---
## 进程架构(Web / CTP Worker
自 2026-03 起,CTP 与 vn.py **不在 Flask 进程内**运行:
| 组件 | PM2 名 | 说明 |
|------|--------|------|
| Web | `qihuo` | 页面与 API`QIHUO_CTP_ROLE=client`,经 `127.0.0.1:6601` IPC 访问 Worker |
| CTP Worker | `qihuo-ctp` | 唯一加载 vnpy_ctp;连接、报单、持仓回调、止盈止损、滚仓 pending 监控 |
SimNow 与期货公司实盘的 **报单代码路径不变**,仍走 `execute_order()``vnpy_bridge.send_order()`Web 侧为 IPC 代理,Worker 侧为原生调用。
部署与重启见 [DEPLOY.md](./DEPLOY.md)。
---
## 一、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](./SIMNOW.md)。
---
## 二、实盘接入前准备
### 1. 向期货公司申请
通常需要:
1. 期货账户已开户并完成适当性评估
2. 申请 **CTP 程序化交易****API 接入**(各公司流程不同)
3. 获取 **看穿式监管** 所需的:
- 经纪商代码(BrokerID
- 投资者代码 / 资金账号
- 交易密码
- **交易前置(TD)**、**行情前置(MD)** 地址(`tcp://IP:端口`
- **AppID(产品名称)**、**AuthCode(授权编码)** — 实盘必须由期货公司分配,**不能** 使用 SimNow 的 `simnow_client_test`
4. 在期货公司 **仿真/实盘环境** 中确认 AppID 已报备、账号已绑定
具体以开户营业部或官方 API 文档为准。
### 2. 配置 `.env`
```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 已连接**、**期货公司实盘**,权益为柜台资金
修改模式或前置后建议 **重连 CTP**`pm2 restart ecosystem.config.cjs --update-env`(同时重启 Web 与 Worker)。
---
## 三、开平仓逻辑(代码层)
模拟盘与实盘共用 **`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_ctp``CTP_LIVE_ENV=实盘` |
| 不合法的登录 | 投资者代码或密码错误;是否在期货公司柜台改过密码 |
| 登录成功但拒单 | 资金、交易时段、合约代码、价格 tick、AppID 未报备 |
| 平今平昨报错 | 检查是否持有对应今/昨仓;上期所等必须正确平今/平昨 |
| 服务器连不上前置 | 期货公司是否要求 **白名单 IP**;云服务器出网是否放行 |
| 与 SimNow 行为不一致 | 优先查 **保证金、费率、合约**;报单方向/开平标志可在日志中看 `CTP 报单 … offset=` |
诊断 SimNow 可用 `python scripts/test_simnow.py`;实盘可将 `.env` 临时改为 live 配置后在同脚本逻辑下连 TD(需自行改脚本或看 PM2/应用日志)。
---
## 六、日志中如何确认报单
连接成功后,下单会在日志中输出类似:
```text
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.md) | SimNow 注册与仿真接入 |
| [TRADING.md](./TRADING.md) | 下单监控、两种通道概览 |
| [ORDER_MONITOR.md](./ORDER_MONITOR.md) | 手动开平仓、SL/TP、移动保本 |
| [DEPLOY.md](./DEPLOY.md) | 部署与环境变量总表 |
| [RISK.md](./RISK.md) | 账户风控(实盘同样生效) |
---
## 八、实盘接入检查清单
- [ ] 已向期货公司申请 CTP / 程序化权限
- [ ] 已获取 BrokerID、TD/MD 地址、AppID、AuthCode
- [ ] `.env` 或系统设置中 `CTP_LIVE_*` 已填写
- [ ] 系统设置交易模式为 **期货公司实盘**
- [ ] 下单监控 **连接 CTP** 成功,权益为真实资金
- [ ] 用小仓位测试:开仓 → 平仓(含上期所品种测平今)
- [ ] 确认本地 SL/TP 触发后能在 CTP 看到平仓委托
- [ ] 生产环境限制访问(HTTPS、防火墙、强密码)