passorder 是 QMT 内置 Python 中最底层的下单函数,通过指定操作类型、订单类型、账户、证券代码、价格类型等参数向交易服务器发送委托。该函数为异步执行——调用后立即返回,不等待交易所撮合结果,实际成交状态通过 order_callback 和 deal_callback 回调函数通知。
QMT passorder 函数原型与适用环境
【事实】 函数原型:
passorder(opType, orderType, accountid, orderCode, prType, price, volume, strategyName, quickTrade, userOrderId, optional)
【事实】 适用环境与权限要求:
| 环境 | 是否支持 | 说明 |
|---|---|---|
| 回测环境 | 支持 | 模拟撮合,不发送真实委托 |
| 模拟信号环境 | 支持 | 生成信号但不实际下单(取决于配置) |
| 仿真交易环境 | 支持 | 向仿真服务器发送委托 |
| 真实交易环境 | 支持 | 向交易所发送真实委托 |
| 所需权限 | 交易权限 | 需在客户端中开通对应账户的交易权限 |
【建议】 在真实交易环境使用前,务必先在回测环境和仿真交易环境中充分验证策略逻辑。
QMT passorder 参数详解
opType — 操作类型
【事实】 opType 为 int 类型,指定买卖方向及操作类别。
| 值 | 含义 | 说明 |
|---|---|---|
| 0 | 买入 | 普通买入 |
| 1 | 卖出 | 普通卖出 |
| 2 | 融资买入 | 信用账户融资买入 |
| 3 | 融券卖出 | 信用账户融券卖出 |
| 4 | 买券还券 | 信用账户买券还券 |
| 5 | 卖券还款 | 信用账户卖券还款 |
| 6 | 现券还券 | 信用账户现券还券 |
| 23 | 申购 | ETF/基金申购 |
| 24 | 赎回 | ETF/基金赎回 |
| 25 | 合并 | 期权合并 |
| 26 | 拆分 | 期权拆分 |
| 27 | 现金认购 | 现金认购 |
| 28 | 证券认购 | 证券认购 |
| 29 | 现金赎回 | 现金赎回 |
| 30 | 证券赎回 | 证券赎回 |
orderType — 订单类型
【事实】 orderType 为 int 类型,指定交易品种所属的市场类别。
| 值 | 含义 |
|---|---|
| 0 | 股票 |
| 1 | 期货 |
| 2 | 期权 |
| 3 | 融资融券 |
| 4 | 沪港通 |
| 5 | 询价 |
| 6 | 上交所 fdr |
| 7 | 深交所 fdr |
| 8 | ETF 申赎 |
| 9 | 回购 |
| 10 | 结构性互换询价 |
accountid — 账户 ID
【事实】 accountid 为 str 类型,指定交易使用的资金账号。该账号需在客户端中已登录并处于连接状态。
【解释】 账号 ID 可通过 ContextInfo.accountid 获取,也可在客户端的交易界面中查看。
orderCode — 证券代码
【事实】 orderCode 为 str 类型,指定委托的证券代码,格式为 代码.市场,如 '600000.SH'(上海)、'000001.SZ'(深圳)。
prType — 价格类型
【事实】 prType 为 int 类型,指定委托的报价方式。
| 值 | 含义 | 说明 |
|---|---|---|
| 0 | 限价 | 按 price 参数指定的价格委托 |
| 1 | 最新价 | 按当前最新成交价委托 |
| 2 | 市价 | 按市场价委托 |
| 3 | 五档即成剩撤 | 最优五档即时成交,剩余撤销 |
| 4 | 五档即成转限价 | 最优五档即时成交,剩余转限价 |
| 5 | 全额成交或撤销 | 全额成交或全部撤销 |
【解释】 不同交易所支持的市价类型有所不同,具体可用类型以当前客户端版本为准。当 prType 为 0(限价)时,委托价格取 price 参数的值;当为其他市价类型时,price 参数通常可设为 0。
price — 委托价格
【事实】 price 为 float 类型,指定委托价格。当 prType 为 0(限价)时该值生效;当为市价类型时该值通常被忽略,可设为 0。
volume — 委托数量
【事实】 volume 为 int 类型,指定委托数量(股数或手数)。
【建议】 股票买入委托数量需为 100 的整数倍(1 手 = 100 股),卖出时不足 100 股的部分应一次性卖出。
strategyName — 策略名称
【事实】 strategyName 为 str 类型,指定策略名称,用于在客户端中标识委托来源。
quickTrade — 快速交易模式
【事实】 quickTrade 为 int 类型,控制下单的触发方式,取值为 0、1 或 2。
| 值 | 含义 | 触发方式 | 适用场景 |
|---|---|---|---|
| 0 | 弹窗确认 | 调用后弹出确认窗口,用户手动确认后下单 | 回测环境、仿真调试 |
| 1 | 立即触发(单标的) | 不弹窗,在当前 Bar 立即触发下单 | 盘中实盘快速下单(仅单标的) |
| 2 | 回调触发 | 不弹窗,在回调函数或定时任务中触发下单 | 回调函数、定时任务中下单 |
【解释】 三种模式的详细区别:
-
quickTrade=0:调用
passorder后,客户端弹出委托确认窗口。在回测环境中,弹窗由系统自动确认;在仿真和真实交易环境中,需要用户手动点击确认。该模式适合回测和仿真调试阶段,可人工干预防止误操作。 -
quickTrade=1:调用
passorder后不弹窗,在当前 Bar 立即执行下单逻辑。仅支持单标的(每次调用只传一个证券代码)。适合盘中需要快速反应的场景。使用该模式需确保策略中已正确设置账户和交易权限。 -
quickTrade=2:调用
passorder后不弹窗,在回调函数(如order_callback、deal_callback)或通过ContextInfo.run_time设置的定时任务中触发下单。适合需要异步处理或周期性下单的场景。
【建议】 真实交易环境中推荐使用 quickTrade=2,在 handlebar 中通过 ContextInfo.run_time 设定的定时任务调用 passorder,可兼顾灵活性和安全性。
userOrderId — 自定义委托号
【事实】 userOrderId 为 int 类型,用户自定义的委托编号,用于在回调中识别委托来源。可设为 0 表示不使用。
optional — 可选参数
【事实】 optional 为可选参数,类型和用途以当前客户端版本为准。通常可传入 None 或不传。
QMT passorder 返回值说明
【事实】 passorder 函数无返回值(返回 None)。函数调用后立即返回,委托的执行状态通过回调函数异步通知。
【解释】 如需获取委托结果,应在 order_callback 中处理委托状态变化,在 deal_callback 中处理成交回报。
QMT passorder 执行机制
【事实】 passorder 采用异步执行机制:
- 函数被调用后,将委托请求发送至交易服务器(或回测引擎)
- 函数立即返回,不阻塞当前策略执行
- 交易服务器处理委托后,通过回调函数通知结果
order_callback收到委托状态变化通知deal_callback收到成交回报通知
【解释】 异步机制意味着在 handlebar 中调用 passorder 后,同一根 Bar 内无法立即获取成交结果。如需在同一根 Bar 内判断成交状态,应使用 get_trade_detail_data 查询。
QMT passorder 最小示例代码
以下为完整的可运行示例,展示在 handlebar 中以限价买入 100 股 600000.SH:
# -*- coding: utf-8 -*-
def init(ContextInfo):
"""策略初始化"""
ContextInfo.accountid = 'YOUR_ACCOUNT_ID' # 替换为实际资金账号
# 设置定时任务,每日 09:35 执行
ContextInfo.run_time('my_trade_task', '35min9?09:00-15:00', '20200101', '20991231')
def my_trade_task(ContextInfo):
"""定时任务:执行下单"""
accountid = ContextInfo.accountid
stock_code = '600000.SH'
# 买入 100 股,限价 10.50 元
passorder(
0, # opType: 买入
0, # orderType: 股票
accountid, # accountid: 资金账号
stock_code, # orderCode: 证券代码
0, # prType: 限价
10.50, # price: 委托价格
100, # volume: 委托数量
'my_strategy', # strategyName: 策略名称
2, # quickTrade: 回调触发
1001, # userOrderId: 自定义委托号
None # optional: 可选参数
)
print(f'已发送买入委托: {stock_code} 100股 @ 10.50')
def handlebar(ContextInfo):
"""K 线回调"""
pass
def order_callback(ContextInfo, order_info):
"""委托状态变化回调"""
print(f'委托回调: 代码={order_info.m_strStockCode}, '
f'状态={order_info.m_nOrderStatus}, '
f'委托号={order_info.m_strOrderSysID}')
def deal_callback(ContextInfo, deal_info):
"""成交回报回调"""
print(f'成交回调: 代码={deal_info.m_strStockCode}, '
f'价格={deal_info.m_dPrice}, '
f'数量={deal_info.m_nVolume}')
QMT passorder 预期日志输出
运行上述示例后,预期日志输出如下(具体内容以实际运行为准):
已发送买入委托: 600000.SH 100股 @ 10.50
委托回调: 代码=600000.SH, 状态=50, 委托号=202608040000001
委托回调: 代码=600000.SH, 状态=55, 委托号=202608040000001
成交回调: 代码=600000.SH, 价格=10.50, 数量=100
【解释】 日志含义:
| 日志行 | 含义 |
|---|---|
已发送买入委托... |
passorder 调用成功,委托请求已发送 |
状态=50 |
委托已提交至交易服务器 |
状态=55 |
委托已确认 |
成交回调... |
委托已成交,成交价为 10.50,数量 100 股 |
QMT passorder 常见错误
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 委托被拒,提示价格异常 | 委托价格超出涨跌停板限制 | 检查委托价格是否在当日涨跌停范围内 |
| 委托被拒,提示数量不合法 | 买入数量不是 100 的整数倍 | 确保买入数量为 100 的整数倍 |
| 委托被拒,提示资金不足 | 账户可用资金不足以支付委托金额 | 下单前检查可用资金,或减少委托数量 |
| 委托被拒,提示持仓不足 | 卖出数量超过可用持仓 | 下单前检查可用持仓数量 |
| 委托无响应,无回调 | 交易账户未连接或未登录 | 确认客户端中交易账户已登录并处于连接状态 |
| 弹窗不出现 | quickTrade 设置为 1 或 2 |
该行为符合预期,quickTrade=1/2 不弹窗 |
| 委托状态一直为待报 | 非交易时间段下单 | 确认在交易时间段内下单 |
| 提示账号类型不匹配 | orderType 与账号类型不一致 |
确认 orderType 与账号类型对应(如信用账户用 3) |
【建议】 在策略中加入资金和持仓检查逻辑,避免因资金不足或持仓不足导致委托被拒:
def safe_buy(ContextInfo, accountid, stock_code, price, volume):
"""安全买入:检查资金后下单"""
# 获取账户资产
acct_data = get_trade_detail_data(accountid, 'ACCOUNT', 'STOCK')
if not acct_data:
print('无法获取账户信息,可能账户未连接')
return False
available = acct_data[0].m_dAvailable
cost = price * volume
if available < cost:
print(f'可用资金不足: 需要 {cost:.2f}, 可用 {available:.2f}')
return False
# 发送委托
passorder(0, 0, accountid, stock_code, 0, price, volume,
'safe_buy', 2, 0, None)
return True
QMT passorder 回测与盘中差异
【事实】 回测环境与盘中(仿真/真实交易)环境的主要差异:
| 对比项 | 回测环境 | 盘中环境 |
|---|---|---|
| 委托发送 | 不发送真实委托,由回测引擎模拟撮合 | 向交易服务器发送真实委托 |
| 成交价格 | 根据回测设置(如按收盘价、开盘价等)撮合 | 由交易所实际撮合决定 |
| 成交时间 | 在当前 Bar 或下一 Bar 撮合 | 取决于市场流动性 |
| quickTrade=0 | 弹窗自动确认 | 需要手动确认 |
| quickTrade=1 | 在当前 Bar 模拟触发 | 在当前 Bar 立即触发 |
| 回调函数 | 回测引擎模拟触发 | 交易服务器实际触发 |
| 滑点 | 可通过回测参数设置 | 实际市场滑点 |
| 手续费 | 按回测参数计算 | 按实际费率收取 |
【建议】 从回测迁移到实盘时,重点关注以下差异: 1. 回测中的成交假设(如按收盘价成交)在实盘中可能无法实现 2. 实盘中的滑点和手续费可能与回测设置不同 3. 实盘中需要处理网络延迟、委托排队等情况 4. 建议先在仿真交易环境中验证,再切换至真实交易环境
QMT passorder 版本差异说明
【事实】 passorder 函数在不同客户端版本中可能存在以下差异:
- 部分旧版本不支持
optional参数 quickTrade=1的单标的限制在不同版本中实现细节可能不同- 部分价格类型(
prType)的支持范围随交易所规则调整而变化 - 操作类型(
opType)的可用值随业务扩展可能增加
【建议】 具体参数支持范围以当前客户端版本为准。升级客户端版本后,建议重新验证策略中的 passorder 调用逻辑。
QMT passorder 相关函数
| 函数 | 说明 | 链接 |
|---|---|---|
get_trade_detail_data |
获取交易明细数据(资产、持仓、委托、成交) | get_trade_detail_data |
order_callback |
委托状态变化回调函数 | 委托回调 |
deal_callback |
成交回报回调函数 | 委托回调 |
ContextInfo.cancel |
撤销委托 | 交易与账户 |
ContextInfo.order_volume |
按数量下单(封装函数) | 交易与账户 |
QMT passorder 来源与更新时间
【事实】 本页面内容基于 QMT 官方文档整理。
| 项目 | 值 |
|---|---|
| 数据来源 | QMT 官方文档 |
| 更新时间 | 2026-08-04 |
| 验证时间 | 2026-08-04 |
| 适用版本 | 以当前客户端版本为准 |