Files
big-qmt/docs/zt.md
2026-09-07 00:27:33 +08:00

58 lines
3.7 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.
# ZT 日内做 T 策略
启用时在账户 YAML 中设置:
```yaml
strategy: zt
signal_allow: ["dcm"]
zt_sell_ratio: 0.5
zt_buy_fall_pct: 1.0
zt_max_price: 200
```
-`dcm` 信号可建立底仓;建仓使用反弹确认,跳过价格高于 `zt_max_price` 的股票。
- 对 dcm 底仓,盈利网格出现回撤时卖出 `zt_sell_ratio` 对应的可用整手;不卖出超过记录底仓的数量。
- 每笔卖出成交直接累计做 T 数量;活动委托结束后,价格较卖出均价回落 `zt_buy_fall_pct`,并经反弹确认,买回实际卖出数量。
- 每只股票每日只做一轮14:50 后不再开新卖单,已卖未买的仓位强制按市价买回,避免隔夜净减仓。
- 仅支持标准 A 股的先卖后买,不把当日新买入股票作为可卖库存。
## SQLite 状态存储
`libs/orderbook.py` 使用标准库 `sqlite3`,数据库路径为
`{qmt_data_dir}/zt_{account_id}_state.db`,每个账户/策略独立存储,由一个策略实例串行更新。
启动时仅创建当前表结构和索引,不执行数据迁移或旧 JSON 导入。
`OrderBook` 初始化后调用 `load()`,填充 `positions`(按代码)、`deals`(按系统订单号)
`deals_sys_ids`(系统订单号集合)。`sync_deals(list[DealItem])` 根据该集合过滤已保存及
同批重复成交,再以单个事务批量插入,提交成功后刷新缓存;不修改持仓。
`sys_order_id` 对应 API 的 `m_strOrderSysID``local_order_id``m_strRemark` 的首段提取。
| 表 | 字段与用途 | 索引 |
| --- | --- | --- |
| `positions` | 自增 `id`、股票代码 `code`、底仓订单/数量/成本 `base_order_id/base_qty/base_cost`、补仓订单/次数/数量/成本 `added_order_id/added_num/added_qty/added_cost`、状态 `status` | `code` 唯一索引;`base_order_id``added_order_id` |
| `deals` | `id`、系统/本地订单号、证券信息、方向、API 状态、剩余/成交数量、委托日期时间、备注、委托价格及成交均价/金额,字段映射见下表 | `id` 主键;`sys_order_id` 唯一;`local_order_id``(code, insert_date)``(insert_date, insert_time)` |
SDK 的 `DealItem` 与成交表业务字段一致:
| API 字段 | SDK / SQLite 字段 |
| --- | --- |
| `m_strOrderSysID` | `sys_order_id` |
| `m_strInstrumentID``m_strExchangeID` | `instrument_id``exchange_id`,组合生成 `code` |
| `m_strInstrumentName` | `name` |
| `m_nOffsetFlag` | `offset_flag`,解析生成买卖方向 `side` |
| `m_nOrderStatus` | `status` |
| `m_nVolumeTotal``m_nVolumeTraded` | `remaining_volume``traded_volume` |
| `m_nOrderTime` | `order_time` |
| `m_strInsertDate``m_strInsertTime` | `insert_date``insert_time` |
| `m_strRemark` | `remark`,提取 `local_order_id` |
| `m_dPrice``m_dTradePrice``m_dTradeAmount` | `price``trade_price``trade_amount` |
API 返回已成交数据,每个系统订单号仅入库一次;`status` 保存 API 原值,不增加确认流程。
成交金额缺失时仅使用成交均价乘成交数量补足,不使用委托价格。
买卖方向使用 `side`ZT 通过本地委托号前缀区分底仓买入与做 T 买回。
ZT 根据实际成交数量及金额更新持仓,日期取 API 提供的 `insert_date`,入库时规范为 `YYYY-MM-DD`
首次接管持仓仅写持仓表。活动委托和重复下单检查由 `libs/order.py` 的委托簿负责。
持仓快照与新增成交在同一事务内保存,历史成交只追加;写入失败回滚数据库并恢复内存状态。
持仓更新按 `code` 保留原有自增 ID。ZT 将轮次状态写入 `status`,卖出、买回数量及均价、
轮次日期在重启时从 `deals` 重建补仓字段预留ZT 买回不计为补仓。