Skip to content

KingwaQmtApi 使用文档

当前发布版本:v2.1.0.0 发布日期:2026-08-31 文档修订日期:2026-09-06

产品概述

KingwaQmtApi 是连接大智慧公式、量化脚本与 QMT 交易端的本地交易桥接系统。产品同时支持 MiniQMT 和标准 QMT,两种模式仅底层通信方式不同,使用相同的监控界面、交易功能及 DLL/TCP/HTTP 调用接口。

支持功能

  1. 双 QMT 模式:支持 XtMiniQmt.exe + userdata_miniXtItClient.exe + KINGWAQMTBRIDGE.py
  2. 多账户统一监控:支持最多 99 个独立 QMT 账户,显示每个账号的总资产、可用资金、持仓市值、持仓明细、当日委托和当日成交。
  3. 完整交易操作:支持买入、卖出、撤单、按金额买入、按可用资金比例买入及按总资产比例买入。
  4. 多种调用方式:提供大智慧 32/64 位 DLL、本地 TCP 服务和 HTTP API,适配公式、浏览器、脚本与自动化程序。
  5. 自动化策略管理:可在监控窗口中查看和管理自动化策略,并集中查看策略运行日志。
  6. 账户快照推送:向 DLL 客户端集中推送最新资产、持仓和委托快照,公式端可直接读取。
  7. 交易保护:支持单笔最大买入金额、交易次数、交易时段及周末锁定等配置。
  8. 成交记录导出:支持从标准 QMT 下载跨日成交并增量写入大智慧 .inv 文件。
  9. 运行维护:支持 QMT 路径发现、标准 QMT 内部策略自动安装、模式切换、日志查看和连接状态诊断。

主要优点

  1. 两种模式、一套操作:MiniQMT 与标准 QMT 的界面和业务功能一致,切换模式后无需修改公式、DLL、TCP 或 HTTP 客户端。
  2. 兼容现有程序:标准 QMT 通过内部策略完成通信,对外继续使用原地址、端口和调用格式;单账号既有策略可以直接沿用。
  3. 接入范围广:同时提供 32 位和 64 位 DLL,并开放 TCP 与 HTTP 接口,可连接不同版本的大智慧及常用开发语言。
  4. 状态清晰可见:资产、持仓、委托、成交、连接状态和运行日志集中在同一个窗口,便于日常监控和故障排查。
  5. 安装切换简单:程序可自动发现 QMT 目录、安装或更新标准 QMT 内部策略,并通过顶部菜单保存模式后自动重启。
  6. 内置基础风控:交易金额、次数和允许时段可统一控制,减少公式或脚本异常造成的重复下单。

交付内容

当前版本同时提供:

  • 主程序: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.py

MiniQMT 和标准 QMT 只在底层通信方式上不同。两种模式使用同一个 KingwaQmt.exe、同一套 DLL/TCP/HTTP 接口和同一个监控窗口,资产、持仓、当日委托、当日成交、自动化策略管理及日志的操作方式完全相同。

多账户约定

  • 账号编号为 199,缺省账号是 1;查询时显式传 0 表示全部账号。
  • 下单不允许账号 0,不会广播下单,也不会在目标账号异常时回退到账号 1
  • DLL 下单函数的第 4 参数编码为 账号编号 × 100 + 委托方式。旧公式值小于 100 时仍按账号 1 执行,因此 5105 都表示账号 1、委托方式 5,205 表示账号 2、委托方式 5。
  • DLL 查询函数在末尾增加可选账号参数:资产、持仓和委托计数类为第 1 参数;历史委托/成交及撤买/撤卖为第 3 参数。省略时使用账号 1
  • HTTP/TCP 的 account_index 缺省为 1;查询传 0 返回合并结果。GET /api/accounts 可查看每个账号的模式、授权、连接状态和错误。
  • 每个账户独立连接、重连、缓存、策略历史和 INV 文件。任一账户掉线不会停止其他账户或公共服务;紧急熔断仍作用于全部账户。

组件说明

  1. KingwaQmt.exe
    • 连接 QMT
    • 启动 TCP / HTTP 服务
    • 启动 GUI
    • 负责配置加载、QMT 路径发现、鉴权
  2. QmtApi32.dll / QmtApi64.dll
    • 给大智慧公式调用
    • 首次调用任意函数时自动初始化
  3. HTTP API
    • 适合脚本、浏览器、自动化服务
  4. GUI
    • 统一展示资产、持仓、当日委托、当日成交、自动化策略和系统日志

二、启动流程

每日启动顺序

每天交易前按下面顺序启动:

  1. 按配置模式启动并登录券商客户端:MiniQMT 使用 XtMiniQmt.exe,标准 QMT 使用 XtItClient.exe
  2. 运行 KingwaQmt.exe。如果当前模式不对,在顶部菜单选择“模式(M) → 标准 QMT”或“模式(M) → MiniQMT”;程序保存配置后会自动重启。
  3. MiniQMT:等待监控窗口显示 QMT 已连接。
  4. 标准 QMT:在 QMT 的 Python 策略界面加载并运行 KINGWAQMTBRIDGE.py;策略启动后,监控窗口会自动连接并显示完整账户数据。
  5. 确认 QMT、DLL/TCP/HTTP 状态就绪后,再启动大智慧股票池、公式策略或外部脚本。

所选券商 QMT 客户端是前置条件,必须先运行并登录成功,后续 KingwaQmtApi 才能连接交易环境。股票池启动前必须先保证券商客户端和 KingwaQmtApi 都已经运行,否则 DLL 调用可能返回未连接或下单失败。

首次启动流程

  1. 启动 KingwaQmt.exe
  2. 程序读取 config_v2.yaml;首次启动没有该文件时,自动把旧版 config.yaml 转成账户列表并保留旧文件
  3. 根据各账户的 模式 选择 MiniQMT 或标准 QMT
  4. QMT.安装目录 未配置,会提示自动发现并写回配置
  5. MiniQMT 模式完成鉴权后,由 EXE 外部连接 userdata_mini 并启动 TCP、HTTP 和 GUI
  6. 标准 QMT 模式完成鉴权后,把 KINGWAQMTBRIDGE.py 和协议模块安装或更新到券商 QMT 的 python 目录;启动该内部策略后显示与 MiniQMT 相同的完整 GUI
  7. 原 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;

多账户参数规则

  • 账号编号为 199;账号 1 为缺省账号,查询时可用 0 获取所有已连接账号的合并数据。
  • 交易函数的第 4 参数同时承载账号和委托方式,编码为 账号编号 × 100 + 委托方式5105 都是账号 1、方式 5,205 是账号 2、方式 5。
  • 查询函数可在末尾增加账号参数,例如 "QmtApi@GetCash"(2)"QmtApi@GetPosition"(2);省略时读取账号 1。
  • GetHistOrdersGetHistTrades 在第 3 参数传账号;CancelBuyCancelSell 也可在第 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;  // 金额不足一手时通常返回 0

5.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,下单和撤单必须传 199,不允许传 0
  • volumebuy_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 时,volumebuy_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

  1. 先启动并登录准备使用的券商客户端。
  2. KingwaQmt.exe 顶部选择“模式(M)”。
  3. 选择“标准 QMT”或“MiniQMT”并确认。
  4. 程序自动保存 config_v2.yaml 并重启,不需要修改 DLL、TCP、HTTP、公式或脚本。
  5. 切换到标准 QMT 后,还需在 QMT 中运行 KINGWAQMTBRIDGE.py

2. 标准 QMT 显示“未连接”或“等待 TCP”

按下面顺序检查:

  1. XtItClient.exe 已经启动并登录交易账号。
  2. 标准 QMT 的策略交易界面中已经加载 KINGWAQMTBRIDGE.py
  3. 策略处于运行状态;若策略行显示启动三角图标,说明尚未运行,点击启动后等待数秒。
  4. 如果 KingwaQmt.exe 刚完成策略安装或更新,先停止旧策略,再重新启动,使 QMT 载入最新版文件。
  5. 仍未连接时,打开“日志 → 打开日志文件”,查看 qmt_bridge.log 中的第一条错误信息。

3. 委托、成交有记录,但持仓为空

  1. 先确认标准 QMT 客户端本身的持仓页面确实有当前持仓;已全部卖出的证券不会出现在持仓列表中。
  2. 使用当前发布目录中的最新版 KingwaQmt.exe
  3. 停止并重新启动 KINGWAQMTBRIDGE.py,让内部策略重新载入;随后等待账户快照自动刷新。
  4. 如仍为空,打开 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.260 秒,默认 1.0;修改监控窗口中的设置后立即生效。
  • 服务.记录快照推送日志0 关闭、1 开启正常快照推送日志;异常日志不受此开关影响。
  • 服务.API密钥:HTTP 监听非本机地址时必填;填写后查询和交易接口都需要 X-API-Key

历史成交 INV 下载

  • 在对应账号的“当日成交”页点击“下载历史成交记录”,选择日期范围和保存目录。
  • 文件名固定为 {QMT资金账号}.inv;首次选择目录后会作为下次默认目录。
  • 跨日下载仅支持标准 QMT;MiniQMT 只能读取当日成交。
  • 重复下载会增量补写,不会重复写入同一笔成交。

风控配置说明

  • 风险控制.单笔最大下单金额
    • 0:不启用单笔买入金额限制
    • >0:买入委托金额超过该值时拒单;卖出不受此金额上限限制
    • 市价买入按实时涨停保护价计算金额;无法取得保护价时拒单。
  • 策略.收盘逆回购.启用:默认 0,只有明确需要自动回购时才手工开启。

QMT 配置说明

  • QMT.账户列表[].编号:范围 199,不可重复;必须存在启用的账号 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 miniqmtKingwaQmt.exe --mode qmt 在启动时指定。

标准 QMT 内部策略安装

  1. 启动并登录标准 QMT(XtItClient.exe)。
  2. 运行 KingwaQmt.exe,通过“模式(M) → 标准 QMT”切换;也可在启动时使用 KingwaQmt.exe --mode qmt
  3. 程序将内部桥接安装或更新为 券商QMT安装目录\python\KINGWAQMTBRIDGE.py
  4. 在标准 QMT 中进入策略交易的 Python 策略界面,加载该文件并运行。
  5. 内部策略连接成功后,KingwaQmt.exe 自动显示与 MiniQMT 一样的资产、持仓、当日委托、当日成交、自动化策略和日志界面。
  6. DLL、TCP 和 HTTP 始终连接 KingwaQmt.exe 的原地址和端口;程序再把请求透明转发给 QMT 内部策略,因此旧 DLL 无需识别模式或升级。
  7. 此模式不会创建外部 XtQuantTrader;关闭 KingwaQmt.exe 后 DLL/TCP/HTTP 接口随之停止。