Appearance
KingwaQmtApi 使用文档
当前发布版本:v2.1.0.0 发布日期:2026-08-31 文档修订日期:2026-09-06
产品概述
KingwaQmtApi 是连接大智慧公式、量化脚本与 QMT 交易端的本地交易桥接系统。产品同时支持 MiniQMT 和标准 QMT,两种模式仅底层通信方式不同,使用相同的监控界面、交易功能及 DLL/TCP/HTTP 调用接口。
支持功能
- 双 QMT 模式:支持
XtMiniQmt.exe + userdata_mini和XtItClient.exe + KINGWAQMTBRIDGE.py。 - 多账户统一监控:支持最多 99 个独立 QMT 账户,显示每个账号的总资产、可用资金、持仓市值、持仓明细、当日委托和当日成交。
- 完整交易操作:支持买入、卖出、撤单、按金额买入、按可用资金比例买入及按总资产比例买入。
- 多种调用方式:提供大智慧 32/64 位 DLL、本地 TCP 服务和 HTTP API,适配公式、浏览器、脚本与自动化程序。
- 自动化策略管理:可在监控窗口中查看和管理自动化策略,并集中查看策略运行日志。
- 账户快照推送:向 DLL 客户端集中推送最新资产、持仓和委托快照,公式端可直接读取。
- 交易保护:支持单笔最大买入金额、交易次数、交易时段及周末锁定等配置。
- 成交记录导出:支持从标准 QMT 下载跨日成交并增量写入大智慧
.inv文件。 - 运行维护:支持 QMT 路径发现、标准 QMT 内部策略自动安装、模式切换、日志查看和连接状态诊断。
主要优点
- 两种模式、一套操作:MiniQMT 与标准 QMT 的界面和业务功能一致,切换模式后无需修改公式、DLL、TCP 或 HTTP 客户端。
- 兼容现有程序:标准 QMT 通过内部策略完成通信,对外继续使用原地址、端口和调用格式;单账号既有策略可以直接沿用。
- 接入范围广:同时提供 32 位和 64 位 DLL,并开放 TCP 与 HTTP 接口,可连接不同版本的大智慧及常用开发语言。
- 状态清晰可见:资产、持仓、委托、成交、连接状态和运行日志集中在同一个窗口,便于日常监控和故障排查。
- 安装切换简单:程序可自动发现 QMT 目录、安装或更新标准 QMT 内部策略,并通过顶部菜单保存模式后自动重启。
- 内置基础风控:交易金额、次数和允许时段可统一控制,减少公式或脚本异常造成的重复下单。
交付内容
当前版本同时提供:
- 主程序:
KingwaQmt.exe - 大智慧 DLL:
QmtApi32.dll/QmtApi64.dll - HTTP API:默认
http://127.0.0.1:8080 - TCP 服务:默认
127.0.0.1:8766 - GUI 监控窗口:资产、持仓、委托、成交、日志
本文档只描述当前版本支持并可直接使用的功能。
一、系统概览
text
大智慧公式 / QmtApi32.dll / QmtApi64.dll
│
├── TCP 8766 ──> KingwaQmt.exe
│
浏览器 / 脚本 ── HTTP 8080 ─┘
├── MiniQMT:XtQuantTrader ──> userdata_mini
└── 标准 QMT:本地 TCP ──> KINGWAQMTBRIDGE.pyMiniQMT 和标准 QMT 只在底层通信方式上不同。两种模式使用同一个 KingwaQmt.exe、同一套 DLL/TCP/HTTP 接口和同一个监控窗口,资产、持仓、当日委托、当日成交、自动化策略管理及日志的操作方式完全相同。
多账户约定
- 账号编号为
1–99,缺省账号是1;查询时显式传0表示全部账号。 - 下单不允许账号
0,不会广播下单,也不会在目标账号异常时回退到账号1。 - DLL 下单函数的第 4 参数编码为
账号编号 × 100 + 委托方式。旧公式值小于100时仍按账号1执行,因此5与105都表示账号 1、委托方式 5,205表示账号 2、委托方式 5。 - DLL 查询函数在末尾增加可选账号参数:资产、持仓和委托计数类为第 1 参数;历史委托/成交及撤买/撤卖为第 3 参数。省略时使用账号
1。 - HTTP/TCP 的
account_index缺省为1;查询传0返回合并结果。GET /api/accounts可查看每个账号的模式、授权、连接状态和错误。 - 每个账户独立连接、重连、缓存、策略历史和 INV 文件。任一账户掉线不会停止其他账户或公共服务;紧急熔断仍作用于全部账户。
组件说明
KingwaQmt.exe- 连接 QMT
- 启动 TCP / HTTP 服务
- 启动 GUI
- 负责配置加载、QMT 路径发现、鉴权
QmtApi32.dll/QmtApi64.dll- 给大智慧公式调用
- 首次调用任意函数时自动初始化
- HTTP API
- 适合脚本、浏览器、自动化服务
- GUI
- 统一展示资产、持仓、当日委托、当日成交、自动化策略和系统日志
二、启动流程
每日启动顺序
每天交易前按下面顺序启动:
- 按配置模式启动并登录券商客户端:MiniQMT 使用
XtMiniQmt.exe,标准 QMT 使用XtItClient.exe。 - 运行
KingwaQmt.exe。如果当前模式不对,在顶部菜单选择“模式(M) → 标准 QMT”或“模式(M) → MiniQMT”;程序保存配置后会自动重启。 - MiniQMT:等待监控窗口显示 QMT 已连接。
- 标准 QMT:在 QMT 的 Python 策略界面加载并运行
KINGWAQMTBRIDGE.py;策略启动后,监控窗口会自动连接并显示完整账户数据。 - 确认 QMT、DLL/TCP/HTTP 状态就绪后,再启动大智慧股票池、公式策略或外部脚本。
所选券商 QMT 客户端是前置条件,必须先运行并登录成功,后续 KingwaQmtApi 才能连接交易环境。股票池启动前必须先保证券商客户端和 KingwaQmtApi 都已经运行,否则 DLL 调用可能返回未连接或下单失败。
首次启动流程
- 启动
KingwaQmt.exe - 程序读取
config_v2.yaml;首次启动没有该文件时,自动把旧版config.yaml转成账户列表并保留旧文件 - 根据各账户的
模式选择 MiniQMT 或标准 QMT - 若
QMT.安装目录未配置,会提示自动发现并写回配置 - MiniQMT 模式完成鉴权后,由 EXE 外部连接
userdata_mini并启动 TCP、HTTP 和 GUI - 标准 QMT 模式完成鉴权后,把
KINGWAQMTBRIDGE.py和协议模块安装或更新到券商 QMT 的python目录;启动该内部策略后显示与 MiniQMT 相同的完整 GUI - 原 DLL/TCP/HTTP 接口始终连接
KingwaQmt.exe,切换模式后调用地址、端口和公式写法均不需要修改
三、GUI 监控窗口
GUI 启动后默认展示:
- 资产资金:账号、总资产、可用资金、持仓市值、连接状态;持仓市值按整数显示
- 持仓查询:持仓量、可用量、成本价、市值、浮盈、盈亏比;成本价精确到分,市值和浮盈按整数显示
- 当日委托:委托号、时间、方向、价格、数量、状态;价格精确到分
- 当日成交:成交号、时间、方向、价格、数量;价格精确到分
- 策略面板:策略运行日志与快捷操作
- 系统实时日志
以上界面在 MiniQMT 和标准 QMT 模式中完全一致;模式差异只体现在程序连接券商客户端的方式。
GUI 操作
- 双击“当日委托”中的可撤委托,可发起撤单
- 菜单“模式(M)”可在“标准 QMT”和“MiniQMT”之间切换;当前模式带有选中标记,确认后程序自动保存并重启
- 菜单“日志”可打开当前模式日志:标准 QMT 为
logs/qmt_bridge.log,MiniQMT 为logs/miniqmt_bridge.log - 菜单“安装”可把
QmtApi32.dll/QmtApi64.dll安装到目标目录 - 菜单“配置 → 账户快照设置”可调整资产、持仓和委托的集中刷新频率,并开关正常推送日志
- 菜单“配置 → 设置大智慧目录”可保存默认目录;每个账号的“当日成交”页点击“下载历史成交记录”时会默认打开该目录,文件固定命名为
{QMT资金账号}.inv - 跨日历史成交通过标准 QMT 的历史交易明细接口下载;MiniQMT 只提供当日成交,跨日下载时程序会提示切换到标准 QMT
- 重复下载会自动跳过已写入的成交记录;不需要手工去重或覆盖原文件
- 菜单“帮助”可查看
KingwaQmt使用文档.md
四、DLL 调用规则
基本语法
pascal
"QmtApi@函数名"(参数1, 参数2, ...);- 引号里只写
QmtApi@函数名 - 参数写在引号外的圆括号里
- 无参数函数写法示例:
pascal
连接状态 := "QmtApi@IsConnected", PRECIS0;参数常数规则
交易函数 Buy/BuyE/BuyByCashRatio/BuyByAssetRatio/Sell/SellE 的第 2、3、4 个参数,如果不是直接写数字,必须使用 const() / CONST(...) 转成常数。
示例:
pascal
下单结果 := "QmtApi@Buy"(C, CONST(CROSS(MA(C,5), MA(C,10)) * 5), 100, 2), PRECIS0;
卖出结果 := "QmtApi@Sell"(C, CONST((盈亏比例 >= 0.05) * 2), CONST(可卖数量), 2), PRECIS0;多账户参数规则
- 账号编号为
1–99;账号1为缺省账号,查询时可用0获取所有已连接账号的合并数据。 - 交易函数的第 4 参数同时承载账号和委托方式,编码为
账号编号 × 100 + 委托方式:5和105都是账号 1、方式 5,205是账号 2、方式 5。 - 查询函数可在末尾增加账号参数,例如
"QmtApi@GetCash"(2)、"QmtApi@GetPosition"(2);省略时读取账号 1。 GetHistOrders、GetHistTrades在第 3 参数传账号;CancelBuy、CancelSell也可在第 3 参数传账号。例如:"QmtApi@GetHistTrades"(20260906, 30, 2)、"QmtApi@CancelBuy"(1, 0, 2)。- 下单不允许账号
0,不会广播到多个账户,也不会在目标账号异常时自动回退到账号 1。DLL 撤单传0时,会在全部账号中按序号查找并撤销对应委托;HTTP 撤单仍必须指定单个账号。
当前股票的含义
DLL 调用时,函数默认针对当前图表中的股票执行。 因此:
Buy/BuyE/BuyByCashRatio/BuyByAssetRatio/Sell/SellE都是对“当前股票”下单GetPosition/GetBuyCount/CancelBuy也都是针对“当前股票”
主程序的“快速交易悬浮条”会自动跟踪所有带当前股票上下文的 DLL 调用。若现有公式没有调用任何股票相关 QmtApi 函数,可在大智慧副图公式中增加:
pascal
同步当前股票 := "QmtApi@SyncStock"(), PRECIS0;切换大智慧股票后,公式重新计算并把当前代码同步到置顶悬浮条。也可以直接点击主程序的持仓、委托或成交行,或者在悬浮条中手工输入代码。
返回值约定
- 成功下单:返回委托股数
- 条件不满足、次数限制触发、金额不足一手、QMT 拒单、超时:通常返回
0 - 程序未连接、当前图表没有股票或关键参数异常:可能返回
-1
条件*次数 机制
Buy/BuyE/BuyByCashRatio/BuyByAssetRatio/Sell/SellE 的第 2 个参数不是单纯布尔值,而是“条件乘以次数限制”。
<= 0:本次不下单> 0:允许下单,并把该值作为当日该方向的最大次数限制
示例:
pascal
下单结果 := "QmtApi@Buy"(C, CONST(CROSS(MA(C,5), MA(C,10)) * 5), 100, 0), PRECIS0;含义:
- 金叉成立时才下单
- 当日最多买入 5 次
委托方式
Buy/Sell 的第 4 参数 {方式},以及 HTTP 的 price_type/pt,都表示委托方式。
说明:系统会按市场自动处理对应委托方式,调用时只需要记住下面这套统一编号。
| 编号 | 含义 |
|---|---|
0 | 限价 |
1 | 最新价 |
2 | 五档即时 |
3 | 对手方最优 |
4 | 本方最优 |
5 | 卖一 |
6 | 卖二 |
7 | 卖三 |
8 | 卖四 |
9 | 卖五 |
10 | 买一 |
11 | 买二 |
12 | 买三 |
13 | 买四 |
14 | 买五 |
15 | 沪转限价 / 深即成剩撤 |
补充说明:
五档即时- 按当前盘口对手方前五档价格立即尝试成交
- 能马上成交的部分会先成交
- 不能马上成交的剩余部分,由交易所按该市场对应的“五档即时”规则继续处理
- 对使用者来说,可以把它理解为“尽量按当前盘口快速成交”,比普通限价单更偏向立即成交
提示:即使是市价类方式,当前接口仍要求传一个价格参数,建议传当前价或预期参考价。
五、DLL 函数完整说明
函数名中文意义速查
| 函数名 | 中文意义 |
|---|---|
Buy | 按股数买入当前股票 |
BuyE | 买入指定金额的当前股票,金额单位为元(10000 = 1 万元) |
BuyByCashRatio | 按可用资金比例买入当前股票 |
BuyByAssetRatio | 按总资产比例买入当前股票 |
Sell | 按股数卖出当前股票 |
SellE | 卖出指定金额的当前股票,金额单位为元(10000 = 1 万元) |
SyncStock | 将大智慧当前股票同步到快速交易悬浮条 |
GetAsset | 读取主程序推送的总资产快照 |
GetPositions | 读取主程序推送的当前股票持仓量 |
GetHistOrders | 查询历史委托 |
GetHistTrades | 查询历史成交 |
GetCash | 读取可用资金 |
GetTotalAsset | 读取总资产 |
GetPosition | 读取当前股票持仓量 |
GetPosCanUseVolume | 读取当前股票可卖数量 |
GetPosOpenPrice | 读取当前股票持仓成本价 |
GetPosMarketValue | 读取当前股票持仓市值 |
GetPosProfit | 读取当前股票浮盈金额 |
GetPosProfitRatio | 读取当前股票盈亏比例 |
GetBuyCount | 读取当前股票已成交买单数 |
GetSellCount | 读取当前股票已成交卖单数 |
GetCanCancleBuyCount | 读取当前股票可撤买单数 |
GetCanCancleSellCount | 读取当前股票可撤卖单数 |
CancelBuy | 撤当前股票买单 |
CancelSell | 撤当前股票卖单 |
IsConnected | 读取连接状态 |
savelog | 刷新 DLL 日志到磁盘 |
Ver | 读取 DLL 版本号 |
5.1 交易函数
5.1.1 Buy(按股数买入)
- 调用语法:
pascal
"QmtApi@Buy"(价格, 条件*次数, 数量, 方式)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 委托价格 |
| 2 | 条件乘以次数限制 |
| 3 | 委托股数 |
| 4 | 委托方式 |
- 返回值:
- 成功返回委托股数
- 条件不满足、次数限制触发、QMT 拒单或超时通常返回
0 - 程序未连接或不可用时可能返回
-1
- 刷新行为:直接发起下单,不读取网络查询结果
- 示例:
pascal
下单结果 := "QmtApi@Buy"(C, 1 * 3, 100, 0), PRECIS0;
下单结果 := "QmtApi@Buy"(C, CONST(CROSS(MA(C,5), MA(C,10)) * 5), 100, 2), PRECIS0;5.1.2 BuyE(买入指定金额的股票,金额单位元)
- 调用语法:
pascal
"QmtApi@BuyE"(价格, 条件*次数, 金额, 方式)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 委托价格 |
| 2 | 条件乘以次数限制 |
| 3 | 委托总金额,单位元;例如 10000 表示 1 万元 |
| 4 | 委托方式 |
- 返回值:
- 成功返回最终下单股数
- 条件不满足、金额不足一手、QMT 拒单或超时通常返回
0 - 价格
<= 0.0001或程序不可用时可能返回-1
- 刷新行为:直接发起下单,不读取网络查询结果
- 当前金额换股规则:
- 先计算:
股数 = floor(金额 / 价格) - 普通 A 股:向下取整到
100股整数倍 688开头股票:至少200股才允许下单,之后仍按100股向下取整- 最终股数
<= 0:不下单,返回0
- 先计算:
- 示例:
pascal
下单结果 := "QmtApi@BuyE"(C, 1, 10000, 0), PRECIS0; // 买入约 1 万元股票
下单结果 := "QmtApi@BuyE"(C, CONST(CROSS(MA(C,5), MA(C,10)) * 3), 20000, 2), PRECIS0; // 满足条件时买入约 2 万元股票
下单结果 := "QmtApi@BuyE"(C, 1, 500, 0), PRECIS0; // 金额不足一手时通常返回 0说明:
- 当前股票若是普通 A 股,价格
10.20、金额10000,先算得980股,再向下取整到900股 - 当前股票若是
688xxx,价格8.00、金额1800,先算得225股,最终会按200股下单 - 当前股票若是
688xxx,价格8.00、金额1000,先算得125股,小于200股,返回0
5.1.3 BuyByCashRatio(按可用资金比例买入)
- 调用语法:
pascal
"QmtApi@BuyByCashRatio"(价格, 条件*次数, 比例, 方式)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 委托价格 |
| 2 | 条件乘以次数限制 |
| 3 | 按当前可用资金换算的买入比例 |
| 4 | 委托方式 |
- 返回值:
- 成功返回最终下单股数
- 条件不满足、比例换算后金额不足一手、QMT 拒单或超时通常返回
0 - 价格
<= 0.0001、比例大于100或程序不可用时可能返回-1
- 刷新行为:直接按当前可用资金换算后下单,不主动等待资产刷新
- 比例规则:
0 < 比例 <= 1:按小数比例处理,例如0.2 = 20%1 < 比例 <= 100:按百分数处理,例如20 = 20%<= 0:不下单,返回0> 100:视为参数异常,可能返回-1
- 当前换算公式:
目标金额 = 当前可用资金 × 比例股数 = floor(目标金额 / 价格)- 普通 A 股按
100股向下取整 688开头代码:至少200股才允许下单,之后按100股向下取整
- 示例:
pascal
下单结果 := "QmtApi@BuyByCashRatio"(C, 1, 0.2, 2), PRECIS0;
下单结果 := "QmtApi@BuyByCashRatio"(C, 1, 20, 2), PRECIS0; // 20 也表示 20%
下单结果 := "QmtApi@BuyByCashRatio"(C, CONST(CROSS(MA(C,5), MA(C,10)) * 3), 0.35, 0), PRECIS0;说明:
- 若当前可用资金为
50000,比例0.2,价格10.00,则目标金额为10000,普通 A 股最终下单1000股 - 若当前可用资金不足,或换算后不足一手,返回
0
5.1.4 BuyByAssetRatio(按总资产比例买入)
- 调用语法:
pascal
"QmtApi@BuyByAssetRatio"(价格, 条件*次数, 比例, 方式)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 委托价格 |
| 2 | 条件乘以次数限制 |
| 3 | 按当前总资产换算的买入比例 |
| 4 | 委托方式 |
- 返回值:
- 成功返回最终下单股数
- 条件不满足、比例换算后金额不足一手、QMT 拒单或超时通常返回
0 - 价格
<= 0.0001、比例大于100或程序不可用时可能返回-1
- 刷新行为:直接按当前总资产换算后下单,不主动等待资产刷新
- 比例规则:
0 < 比例 <= 1:按小数比例处理,例如0.1 = 10%1 < 比例 <= 100:按百分数处理,例如10 = 10%<= 0:不下单,返回0> 100:视为参数异常,可能返回-1
- 当前换算公式:
目标金额 = 当前总资产 × 比例股数 = floor(目标金额 / 价格)- 普通 A 股按
100股向下取整 688开头代码:至少200股才允许下单,之后按100股向下取整
- 示例:
pascal
下单结果 := "QmtApi@BuyByAssetRatio"(C, 1, 0.1, 2), PRECIS0;
下单结果 := "QmtApi@BuyByAssetRatio"(C, 1, 10, 2), PRECIS0; // 10 也表示 10%
下单结果 := "QmtApi@BuyByAssetRatio"(C, CONST(CROSS(MA(C,5), MA(C,10)) * 2), 0.08, 0), PRECIS0;说明:
- 若当前总资产为
200000,比例0.1,价格10.00,则目标金额为20000,普通 A 股最终下单2000股 - 该函数按总资产换算金额,不会自动截断到可用资金;若换算金额超过实际可用资金,QMT 仍可能拒单
- 若换算后不足一手,返回
0
5.1.5 Sell(按股数卖出)
- 调用语法:
pascal
"QmtApi@Sell"(价格, 条件*次数, 数量, 方式)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 委托价格 |
| 2 | 条件乘以次数限制 |
| 3 | 委托股数 |
| 4 | 委托方式 |
- 返回值:
- 成功返回委托股数
- 条件不满足、次数限制触发、QMT 拒单或超时通常返回
0 - 程序不可用时可能返回
-1
- 刷新行为:直接发起下单,不读取网络查询结果
- 示例:
pascal
下单结果 := "QmtApi@Sell"(C, 1 * 3, 100, 0), PRECIS0;
下单结果 := "QmtApi@Sell"(C, CONST((盈亏比例 >= 0.05 AND 持仓 > 0) * 2), CONST(可卖数量), 2), PRECIS0;5.1.6 SellE(卖出指定金额的股票,金额单位元)
- 调用语法:
pascal
"QmtApi@SellE"(价格, 条件*次数, 金额, 方式)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 委托价格 |
| 2 | 条件乘以次数限制 |
| 3 | 委托总金额,单位元;例如 10000 表示 1 万元 |
| 4 | 委托方式 |
- 返回值:
- 成功返回最终下单股数
- 条件不满足、金额不足一手、QMT 拒单或超时通常返回
0 - 价格
<= 0.0001或程序不可用时可能返回-1
- 刷新行为:直接发起下单,不读取网络查询结果
- 当前金额换股规则:
- 先计算:
股数 = floor(金额 / 价格) - 统一按
100股向下取整 - 最终股数
<= 0:不下单,返回0
- 先计算:
- 示例:
pascal
下单结果 := "QmtApi@SellE"(C, 1, 10000, 0), PRECIS0; // 卖出约 1 万元股票
下单结果 := "QmtApi@SellE"(C, CONST((盈亏比例 >= 0.05 AND 持仓 > 0) * 2), 20000, 2), PRECIS0; // 满足条件时卖出约 2 万元股票
下单结果 := "QmtApi@SellE"(C, 1, 500, 0), PRECIS0; // 金额不足一手时通常返回 05.2 快照 / 查询函数
5.2.1 GetAsset(读取总资产快照)
- 调用语法:
pascal
"QmtApi@GetAsset"(账号)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1(可选) | 账号编号;省略时为 1,传 0 返回全部已连接账号的总资产合计 |
- 返回值:
- 返回 DLL 本地缓存中的最新总资产
- 刷新行为:不发起网络请求;主程序按“账户快照刷新秒”集中查询并推送
- 示例:
pascal
总资产 := "QmtApi@GetAsset", PRECIS2;
全部总资产 := "QmtApi@GetAsset"(0), PRECIS2;5.2.2 GetPositions(读取当前股票持仓快照)
- 调用语法:
pascal
"QmtApi@GetPositions"(账号)- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1(可选) | 账号编号;省略时为 1,传 0 返回当前股票在全部已连接账号中的持仓合计 |
- 返回值:
- 返回 DLL 本地缓存中当前股票的持仓量
- 刷新行为:不发起网络请求;主程序一次查询全部持仓后推送给所有 DLL
- 示例:
pascal
持仓 := "QmtApi@GetPositions", PRECIS0;
全部持仓 := "QmtApi@GetPositions"(0), PRECIS0;5.2.3 GetHistOrders(查询历史委托)
- 调用语法:
pascal
"QmtApi@GetHistOrders"(结束日期[, 天数[, 账号]])- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 结束日期,格式如 20260419 |
| 2(可选) | 回看天数;省略时为 7 |
| 3(可选) | 账号编号;省略时为 1,传 0 查询全部已连接账号 |
- 返回值:
- 固定返回
1,表示历史委托查询请求已发出
- 固定返回
- 刷新行为:会发起历史查询
- 限制说明:
- 该函数只负责发起查询,不会把历史委托逐条返回到公式中
- 示例:
pascal
"QmtApi@GetHistOrders"(20260419, 30);
"QmtApi@GetHistOrders"(20260419, 30, 2);5.2.4 GetHistTrades(查询历史成交)
- 调用语法:
pascal
"QmtApi@GetHistTrades"(结束日期[, 天数[, 账号]])- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 结束日期,格式如 20260419 |
| 2(可选) | 回看天数;省略时为 7 |
| 3(可选) | 账号编号;省略时为 1,传 0 查询全部已连接账号 |
- 返回值:
- 固定返回
1,表示历史成交查询请求已发出
- 固定返回
- 刷新行为:会发起历史查询
- 限制说明:
- 该函数只负责发起查询,不会把历史成交逐条返回到公式中
- 示例:
pascal
"QmtApi@GetHistTrades"(20260419, 30);
"QmtApi@GetHistTrades"(20260419, 30, 2);5.3 数据读取函数
5.3.1 GetCash(读取可用资金)
- 调用语法:
pascal
"QmtApi@GetCash"(账号)- 参数说明:账号可选;省略时为
1,传0返回全部已连接账号的可用资金合计。 - 返回值:当前已获取的可用资金
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
可用资金 := "QmtApi@GetCash", PRECIS2;
全部可用资金 := "QmtApi@GetCash"(0), PRECIS2;5.3.2 GetTotalAsset(读取总资产)
- 调用语法:
pascal
"QmtApi@GetTotalAsset"(账号)- 参数说明:账号可选;省略时为
1,传0返回全部已连接账号的总资产合计。 - 返回值:当前已获取的总资产
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
总资产 := "QmtApi@GetTotalAsset", PRECIS2;
账号2总资产 := "QmtApi@GetTotalAsset"(2), PRECIS2;5.3.3 GetPosition(读取当前股票持仓量)
- 调用语法:
pascal
"QmtApi@GetPosition"(账号)- 参数说明:账号可选;省略时为
1,传0返回当前股票在全部已连接账号中的持仓合计。 - 返回值:当前股票的持仓量
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
持仓 := "QmtApi@GetPosition", PRECIS0;
全部持仓 := "QmtApi@GetPosition"(0), PRECIS0;5.3.4 GetPosCanUseVolume(读取当前股票可卖数量)
- 调用语法:
pascal
"QmtApi@GetPosCanUseVolume"(账号)- 参数说明:账号可选;省略时为
1,传0返回当前股票在全部已连接账号中的可卖数量合计。 - 返回值:当前股票的可卖数量
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
可卖数量 := "QmtApi@GetPosCanUseVolume", PRECIS0;
全部可卖数量 := "QmtApi@GetPosCanUseVolume"(0), PRECIS0;5.3.5 GetPosOpenPrice(读取当前股票持仓成本价)
- 调用语法:
pascal
"QmtApi@GetPosOpenPrice"(账号)- 参数说明:账号可选;省略时为
1,传0返回当前股票的持仓量加权成本价。 - 返回值:当前股票的持仓成本价
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
持仓成本 := "QmtApi@GetPosOpenPrice", PRECIS2;
全部持仓成本 := "QmtApi@GetPosOpenPrice"(0), PRECIS2;5.3.6 GetPosMarketValue(读取当前股票持仓市值)
- 调用语法:
pascal
"QmtApi@GetPosMarketValue"(账号)- 参数说明:账号可选;省略时为
1,传0返回当前股票在全部已连接账号中的市值合计。 - 返回值:当前股票的持仓市值
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
持仓市值 := "QmtApi@GetPosMarketValue", PRECIS2;
全部持仓市值 := "QmtApi@GetPosMarketValue"(0), PRECIS2;5.3.7 GetPosProfit(读取当前股票浮盈金额)
- 调用语法:
pascal
"QmtApi@GetPosProfit"(账号)- 参数说明:账号可选;省略时为
1,传0返回当前股票在全部已连接账号中的浮盈合计。 - 返回值:当前股票的浮盈金额
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
盈亏金额 := "QmtApi@GetPosProfit", PRECIS2;
全部盈亏金额 := "QmtApi@GetPosProfit"(0), PRECIS2;5.3.8 GetPosProfitRatio(读取当前股票盈亏比例)
- 调用语法:
pascal
"QmtApi@GetPosProfitRatio"(账号)- 参数说明:账号可选;省略时为
1,传0返回当前股票按市值加权的盈亏比例。 - 返回值:当前股票的盈亏比例
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
盈亏比例 := "QmtApi@GetPosProfitRatio", PRECIS2;
全部盈亏比例 := "QmtApi@GetPosProfitRatio"(0), PRECIS2;5.4 委托计数函数
说明:函数名里的 Cancle 是历史拼写,当前版本继续保留这个名称以兼容旧公式。
5.4.1 GetBuyCount(读取当前股票已成交买单数)
- 调用语法:
pascal
"QmtApi@GetBuyCount"(账号)- 参数说明:账号可选;省略时为
1,传0汇总全部已连接账号。 - 返回值:当前股票的已成交买单数
- 统计口径:只统计当前股票买入方向、状态为已成的委托单
- 已成状态:已成
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
已成交买单数 := "QmtApi@GetBuyCount", PRECIS0;
全部已成交买单数 := "QmtApi@GetBuyCount"(0), PRECIS0;5.4.2 GetSellCount(读取当前股票已成交卖单数)
- 调用语法:
pascal
"QmtApi@GetSellCount"(账号)- 参数说明:账号可选;省略时为
1,传0汇总全部已连接账号。 - 返回值:当前股票的已成交卖单数
- 统计口径:只统计当前股票卖出方向、状态为已成的委托单
- 已成状态:已成
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
已成交卖单数 := "QmtApi@GetSellCount", PRECIS0;
全部已成交卖单数 := "QmtApi@GetSellCount"(0), PRECIS0;5.4.3 GetCanCancleBuyCount(读取当前股票可撤买单数)
- 调用语法:
pascal
"QmtApi@GetCanCancleBuyCount"(账号)- 参数说明:账号可选;省略时为
1,传0汇总全部已连接账号。 - 返回值:当前股票的可撤买单数
- 可撤状态:已报 / 部成
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
可撤买单数 := "QmtApi@GetCanCancleBuyCount", PRECIS0;
全部可撤买单数 := "QmtApi@GetCanCancleBuyCount"(0), PRECIS0;5.4.4 GetCanCancleSellCount(读取当前股票可撤卖单数)
- 调用语法:
pascal
"QmtApi@GetCanCancleSellCount"(账号)- 参数说明:账号可选;省略时为
1,传0汇总全部已连接账号。 - 返回值:当前股票的可撤卖单数
- 可撤状态:已报 / 部成
- 刷新行为:只读取当前数据,不主动刷新
- 示例:
pascal
可撤卖单数 := "QmtApi@GetCanCancleSellCount", PRECIS0;
全部可撤卖单数 := "QmtApi@GetCanCancleSellCount"(0), PRECIS0;5.5 撤单函数
5.5.1 CancelBuy(撤当前股票买单)
- 调用语法:
pascal
"QmtApi@CancelBuy"(条件, 序号[, 账号])- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 撤单条件,<=0 不执行 |
| 2 | 撤单序号,0=全部,1=第一个,2=第二个 |
| 3(可选) | 账号编号;省略时为 1,传 0 可按序号跨账号查找并撤单 |
- 返回值:
- 返回成功发起的撤单数量
- 刷新行为:直接发起撤单,不主动刷新委托列表
- 示例:
pascal
"QmtApi@CancelBuy"(1, 0);
"QmtApi@CancelBuy"(1, 1);
"QmtApi@CancelBuy"(1, 0, 2);5.5.2 CancelSell(撤当前股票卖单)
- 调用语法:
pascal
"QmtApi@CancelSell"(条件, 序号[, 账号])- 参数说明:
| 参数序号 | 含义 |
|---|---|
| 1 | 撤单条件,<=0 不执行 |
| 2 | 撤单序号,0=全部,1=第一个,2=第二个 |
| 3(可选) | 账号编号;省略时为 1,传 0 可按序号跨账号查找并撤单 |
- 返回值:
- 返回成功发起的撤单数量
- 刷新行为:直接发起撤单,不主动刷新委托列表
- 示例:
pascal
"QmtApi@CancelSell"(盈亏比例 >= 0.05, 0);
"QmtApi@CancelSell"(盈亏比例 >= 0.05, 0, 2);5.6 状态与工具函数
5.6.1 IsConnected(读取连接状态)
- 调用语法:
pascal
"QmtApi@IsConnected"(账号)- 参数说明:账号可选;省略时为
1。传0时,全部已配置账号都已连接才返回1。 - 返回值:
1=已连接,0=未连接 - 刷新行为:只读当前连接状态
- 示例:
pascal
连接状态 := "QmtApi@IsConnected", PRECIS0;
账号2连接状态 := "QmtApi@IsConnected"(2), PRECIS0;5.6.2 savelog(刷新DLL日志到磁盘)
- 调用语法:
pascal
"QmtApi@savelog"- 参数说明:无
- 返回值:固定返回
1 - 刷新行为:立即把 DLL 日志刷新到磁盘
- 示例:
pascal
"QmtApi@savelog";5.6.3 SyncStock(同步当前股票到快速交易悬浮条)
- 调用语法:
pascal
"QmtApi@SyncStock"()- 参数说明:无
- 返回值:成功同步返回
1;服务未连接、当前图表没有股票或公式上下文无效时返回-1 - 刷新行为:把当前图表股票代码通知主程序,用于更新快速交易悬浮条;不读取账户或持仓数据
- 示例:
pascal
同步当前股票 := "QmtApi@SyncStock"(), PRECIS0;5.6.4 Ver(读取DLL版本号)
- 调用语法:
pascal
"QmtApi@Ver"- 参数说明:无
- 返回值:DLL 内嵌的数值版本号;可用于在公式中识别已加载的 DLL 是否完成升级
- 示例:
pascal
DLL版本 := "QmtApi@Ver", PRECIS3;六、完整公式示例
pascal
连接状态 := "QmtApi@IsConnected", PRECIS0;
"QmtApi@GetAsset";
"QmtApi@GetPositions";
可用资金 := "QmtApi@GetCash", PRECIS2;
总资产 := "QmtApi@GetTotalAsset", PRECIS2;
持仓 := "QmtApi@GetPosition", PRECIS0;
可卖数量 := "QmtApi@GetPosCanUseVolume", PRECIS0;
盈亏比例 := "QmtApi@GetPosProfitRatio", PRECIS2;
// 金叉买入,最多 5 次
买入结果 := "QmtApi@Buy"(C, CONST((CROSS(MA(C,5), MA(C,10)) AND 持仓 = 0) * 5), 100, 2), PRECIS0;
// 按金额买入,最多 3 次
金额买入结果 := "QmtApi@BuyE"(C, CONST((CROSS(MA(C,5), MA(C,10)) AND 持仓 = 0) * 3), 20000, 2), PRECIS0;
// 按可用资金 20% 买入,最多 2 次
资金比例买入结果 := "QmtApi@BuyByCashRatio"(C, CONST((CROSS(MA(C,5), MA(C,10)) AND 持仓 = 0) * 2), 0.2, 2), PRECIS0;
// 按总资产 10% 买入,最多 2 次
资产比例买入结果 := "QmtApi@BuyByAssetRatio"(C, CONST((CROSS(MA(C,5), MA(C,10)) AND 持仓 = 0) * 2), 0.1, 2), PRECIS0;
// 止盈时先撤买单,再卖出
"QmtApi@CancelBuy"(盈亏比例 >= 0.05 AND 持仓 > 0, 0);
卖出结果 := "QmtApi@Sell"(C, CONST((盈亏比例 >= 0.05 AND 持仓 > 0) * 2), CONST(可卖数量), 2), PRECIS0;七、HTTP API
需在
config_v2.yaml中设置服务.启用HTTP: 1。HTTP 绑定到非本机地址时必须设置服务.API密钥;配置密钥后,所有/api/请求都要携带X-API-Key请求头。TCP 因兼容 DLL 协议没有认证字段,只允许监听本机回环地址。
7.1 查询接口
所有带账户数据的查询接口均可附加 ?account_index=编号,省略时读取账号 1;传 0 则返回全部已连接账号的合并数据。示例:GET /api/positions?account_index=2。
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/health | 系统状态 |
GET | /api/accounts | 多账户编号、模式、授权、连接状态和错误 |
GET | /api/assets | 资金信息 |
GET | /api/positions | 持仓列表 |
GET | /api/orders | 当日委托 |
GET | /api/trades | 当日成交 |
GET | /api/traded_volume/{code} | 当日个股成交量统计 |
/api/health 返回示例
json
{
"status": "running",
"mode": "mixed",
"xt_connected": true,
"account_id": "{你的QMT账号}",
"account_count": 2,
"account_limit": 2,
"emergency_stop": false,
"last_reject_reason": ""
}/api/traded_volume/{code} 返回示例
json
{
"account_index": 2,
"stock_code": "600000.SH",
"buy_volume": 1000,
"sell_volume": 500,
"total_volume": 1500
}7.2 变更状态接口
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /api/buy | 买入 |
POST | /api/sell | 卖出 |
POST | /api/order | 通用下单 |
POST | /api/cancel | 撤单 |
POST | /api/emergency_stop | 触发熔断 |
7.3 下单请求示例
POST /api/buy
json
{
"stock_code": "600000.SH",
"buy_ratio": 0.2,
"buy_ratio_base": "cash",
"price": 9.85,
"price_type": 2,
"limit_count": 3
}说明:
account_index缺省为1,下单和撤单必须传1–99,不允许传0volume和buy_ratio二选一buy_ratio_base支持:cash:按可用资金比例换算asset:按总资产比例换算
buy_ratio支持两种写法:0.2表示20%20也表示20%
- 当比例换算后不足一手时,请求会直接失败并返回明确原因
按股数买入时也可以继续使用旧写法:
json
{
"account_index": 2,
"stock_code": "600000.SH",
"volume": 100,
"price": 9.85,
"price_type": 2,
"limit_count": 3
}成功返回示例:
json
{
"order_id": 123456,
"status": "buy_submitted",
"reason": "",
"buy_ratio_base": "cash",
"buy_ratio_fraction": 0.2,
"buy_ratio_percent": 20,
"ratio_base_amount": 50000,
"resolved_amount": 10000,
"resolved_volume": 1000
}POST /api/sell
json
{
"account_index": 2,
"stock_code": "600000.SH",
"volume": 100,
"price": 9.95,
"price_type": 2,
"limit_count": 2
}POST /api/order
json
{
"stock_code": "600000.SH",
"order_type": 23,
"buy_ratio": 0.1,
"buy_ratio_base": "asset",
"price": 9.85,
"price_type": 2,
"limit_count": 3
}order_type=23:买入order_type=24:卖出order_type=23时,volume和buy_ratio也支持二选一order_type=24时,仍然只支持volume
POST /api/cancel
json
{
"account_index": 2,
"order_id": "123456"
}成功返回示例:
json
{
"result": true,
"status": "cancel_request_sent",
"reason": ""
}POST /api/emergency_stop
json
{
"reason": "人工触发"
}返回示例:
json
{
"emergency_stop": true,
"reason": "人工触发",
"cancelled_orders": ["123456"],
"failed_orders": [],
"cancel_requested": 1
}八、常见误区
1. BuyE/SellE 的第 3 参数是金额,不是股数
错误理解:
pascal
"QmtApi@BuyE"(C, 1, 100, 0); // 这不是 100 股,而是 100 元正确理解:如果要买入约 1 万元股票,第 3 参数应填写 10000。
2. BuyByCashRatio/BuyByAssetRatio 的第 3 参数是比例,不是金额也不是股数
例如:
0.2表示20%20也表示20%1表示100%
3. price_type 传的是委托方式,不是 QMT 原始编号
例如:
2表示“五档即时”- 系统会自动转换成对应市场使用的实际方式
4. 账户类 Get* 只读取 DLL 本地快照
GetAsset/GetPositions/GetCash/GetPosition/GetPos*:不发请求,只读取主程序推送的最新资产和持仓快照GetBuyCount/GetSellCount/GetCanCancle*:不发请求,只读取最新委托快照
5. GetHistOrders/GetHistTrades 不会把历史数组直接返回给公式
这两个函数只负责发起历史查询,不会把历史明细逐条直接返回到公式里。
九、连接与数据显示排查
1. 如何切换标准 QMT / MiniQMT
- 先启动并登录准备使用的券商客户端。
- 在
KingwaQmt.exe顶部选择“模式(M)”。 - 选择“标准 QMT”或“MiniQMT”并确认。
- 程序自动保存
config_v2.yaml并重启,不需要修改 DLL、TCP、HTTP、公式或脚本。 - 切换到标准 QMT 后,还需在 QMT 中运行
KINGWAQMTBRIDGE.py。
2. 标准 QMT 显示“未连接”或“等待 TCP”
按下面顺序检查:
XtItClient.exe已经启动并登录交易账号。- 标准 QMT 的策略交易界面中已经加载
KINGWAQMTBRIDGE.py。 - 策略处于运行状态;若策略行显示启动三角图标,说明尚未运行,点击启动后等待数秒。
- 如果
KingwaQmt.exe刚完成策略安装或更新,先停止旧策略,再重新启动,使 QMT 载入最新版文件。 - 仍未连接时,打开“日志 → 打开日志文件”,查看
qmt_bridge.log中的第一条错误信息。
3. 委托、成交有记录,但持仓为空
- 先确认标准 QMT 客户端本身的持仓页面确实有当前持仓;已全部卖出的证券不会出现在持仓列表中。
- 使用当前发布目录中的最新版
KingwaQmt.exe。 - 停止并重新启动
KINGWAQMTBRIDGE.py,让内部策略重新载入;随后等待账户快照自动刷新。 - 如仍为空,打开
qmt_bridge.log,搜索“持仓”或“账户快照查询失败”,按日志中的首个错误处理。
4. 已连接但资产、持仓、委托或成交暂未刷新
- 首次连接后等待一个快照刷新周期,默认约
1秒。 - 可在“配置 → 账户快照设置”中查看或调整刷新间隔。
- 标准 QMT 与 MiniQMT 的字段和显示规则相同,不需要分别配置界面。
十、配置文件附录
日常使用优先按界面提示操作。新版本只读写 config_v2.yaml;仅在首次启动且新文件不存在时读取并迁移旧版 config.yaml,旧文件不会被删除。
配置文件示例
yaml
服务:
启用HTTP: 0
启用TCP: 1
HTTP地址: 127.0.0.1
HTTP端口: 8080
TCP地址: 127.0.0.1
TCP端口: 8766
账户快照刷新秒: 1.0
记录快照推送日志: 0
API密钥: ""
风险控制:
单笔最大下单金额: 10000.0
策略:
收盘逆回购:
启用: 0
交易时间:
启用: 1
周末锁定: 1
允许时段:
- 06:00-15:00
QMT:
账户列表:
- 编号: 1
资金账号: "{你的QMT账号1}"
模式: qmt
安装目录: "D:\\券商A\\QMT"
账号类型: 1
启用: 1
策略:
收盘逆回购:
启用: 0
- 编号: 2
资金账号: "{你的QMT账号2}"
模式: miniqmt
安装目录: "D:\\券商B\\QMT"
账号类型: 1
启用: 1服务.账户快照刷新秒:可设置0.2–60秒,默认1.0;修改监控窗口中的设置后立即生效。服务.记录快照推送日志:0关闭、1开启正常快照推送日志;异常日志不受此开关影响。服务.API密钥:HTTP 监听非本机地址时必填;填写后查询和交易接口都需要X-API-Key。
历史成交 INV 下载
- 在对应账号的“当日成交”页点击“下载历史成交记录”,选择日期范围和保存目录。
- 文件名固定为
{QMT资金账号}.inv;首次选择目录后会作为下次默认目录。 - 跨日下载仅支持标准 QMT;MiniQMT 只能读取当日成交。
- 重复下载会增量补写,不会重复写入同一笔成交。
风控配置说明
风险控制.单笔最大下单金额0:不启用单笔买入金额限制>0:买入委托金额超过该值时拒单;卖出不受此金额上限限制- 市价买入按实时涨停保护价计算金额;无法取得保护价时拒单。
策略.收盘逆回购.启用:默认0,只有明确需要自动回购时才手工开启。
QMT 配置说明
QMT.账户列表[].编号:范围1–99,不可重复;必须存在启用的账号1。编号0只用于查询全部账号。QMT.账户列表[].资金账号和安装目录均不可重复。QMT.账户列表[].模式:miniqmt使用XtMiniQmt.exe + userdata_mini外部连接;qmt使用XtItClient.exe内部 Python 策略。QMT.账户列表[].安装目录:对应券商 QMT 软件根目录。MiniQMT 自动使用userdata_mini;标准 QMT 自动安装策略到各自的安装目录\python并分配独立内部端口。- 旧版单账号
QMT.账号/模式/安装目录配置会自动作为账号1加载,无需手工迁移。 - 日常切换优先使用顶部“模式(M)”菜单,选择后配置自动保存并重启。首次启动且模式为空时,程序会弹窗选择;也可用
KingwaQmt.exe --mode miniqmt或KingwaQmt.exe --mode qmt在启动时指定。
标准 QMT 内部策略安装
- 启动并登录标准 QMT(
XtItClient.exe)。 - 运行
KingwaQmt.exe,通过“模式(M) → 标准 QMT”切换;也可在启动时使用KingwaQmt.exe --mode qmt。 - 程序将内部桥接安装或更新为
券商QMT安装目录\python\KINGWAQMTBRIDGE.py。 - 在标准 QMT 中进入策略交易的 Python 策略界面,加载该文件并运行。
- 内部策略连接成功后,
KingwaQmt.exe自动显示与 MiniQMT 一样的资产、持仓、当日委托、当日成交、自动化策略和日志界面。 - DLL、TCP 和 HTTP 始终连接
KingwaQmt.exe的原地址和端口;程序再把请求透明转发给 QMT 内部策略,因此旧 DLL 无需识别模式或升级。 - 此模式不会创建外部
XtQuantTrader;关闭KingwaQmt.exe后 DLL/TCP/HTTP 接口随之停止。