内置Python交易函数
QMT 内置 Python 的所有交易动作都收敛到一个综合下单函数 passorder——股票、期货、期权、融资融券、新股新债申购都靠它,区别只在参数取值。再加上撤单函数和一组 get_trade_detail_data 查询函数,就构成了完整的交易能力。
passorder:综合下单函数
passorder 是 QMT 推荐使用的下单入口,可覆盖多品种下单。原型:
passorder(
opType, # 操作号:买/卖/开/平/融资/融券/申购……
orderType, # 下单方式:一般填 1101(组合,双向开平)
accountid, # 资金账号
orderCode, # 品种代码,如 '600000.SH'、'cu2403.SF'
prType, # 报价类型:最新价/限价/对手价……
price, # 报价价格(市价类填 -1 或 0)
volume, # 委托数量
strategyName, # 策略名称(可选,立即下单时建议填)
quickTrade, # 快速下单标记:0=逐K线生效,2=立即下单
userOrderId, # 投资备注/自定义订单号(可选)
ContextInfo # 策略上下文 C
)
最常用参数值速查
opType(操作号)——决定这是买还是卖、是哪个品种:
| opType | 含义 | 说明 |
|---|---|---|
23 | 买入股票 | 普通股票买入 |
24 | 卖出股票 | 普通股票卖出 |
33 | 融资买入 | 两融:借钱买入 |
34 | 融券卖出 | 两融:借券卖出 |
37 / 38 | 卖券还款 / 买券还券 | 两融还款方向 |
23/24 也用于 ETF、可转债 | — | 股票类共用 |
| 期货开平 | 见期货专用代码 | 双向持仓有开仓/平仓区分 |
区分股票与两融账号:示例里常见
buy_code = 23 if acct_type == 'STOCK' else 33,即账号类型是STOCK用普通买卖(23/24),是信用账号用融资融券代码(33/34)。
prType(报价类型)——决定用什么价格报:
| prType | 含义 |
|---|---|
5 | 最新价 |
11 | 盘口买一价 |
12 | 盘口卖一价 |
14 | 限价(按 price 参数指定价格) |
| 其他 | 对手价、市价、指定价等(不同柜台支持不同) |
quickTrade(快速下单标记)——决定什么时候发单(见 运行机制):
| quickTrade | 行为 |
|---|---|
0 | 默认,逐 K 线生效:信号暂存,K 线结束、下一根首笔时发出 |
2 | 立即下单:运行后立刻发出,不等待不丢弃 |
股票买入示例
回测里买入 100 股,用最新价(prType=5,price=-1):
# 买入:opType=23, 最新价, 逐K线生效
passorder(23, 1101, C.accountid, C.stock, 5, -1, 100, C)
# 卖出:opType=24
passorder(24, 1101, C.accountid, C.stock, 5, -1, hold_vol, C)
期货下单示例
期货用限价(prType=14),指定价格 0 表示市价/对手价:
passorder(
2, # opType 期货
1101, # orderType
'1000044', # accountid
'cu2403.SF', # orderCode 期货合约
14, # prType 限价
0.0, # price
2, # volume 手数
'示例下单', # strategyName
1, # quickTrade
'投资备注', # userOrderId
C # ContextInfo
)
实盘立即下单(quicktrade=2)
立即下单时建议带上 strategyName、quickTrade、userOrderId,并用普通全局变量存状态:
msg = f"双均线实盘 买入 {vol}股"
passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol,
'双均线实盘', 2, msg, C)
A.waiting_list.append(msg) # 记下投资备注,用于成交回报核对
撤单
委托发出后,可用撤单函数按委托号撤单。常见用法:
# 撤单:opType 用对应的撤单操作号,orderCode 传原委托号
passorder(opType_cancel, 1101, accountid, order_sysid, prType, -1, 0, C)
具体撤单的 opType 值随品种和柜台不同,实盘前务必在 QMT 函数文档里核对该品种的撤单操作号,避免误报。
查询:get_trade_detail_data
下单后要查账号、持仓、委托、成交,统一用 get_trade_detail_data:
get_trade_detail_data(accountid, account_type, data_type)
account_type:'stock'(普通股票)、信用账号、期货账号等。data_type:'account'(账号资产)、'position'(持仓)、'order'(委托)、'deal'(成交)、'consign'(合同)等。
返回的是对象列表,常用字段:
# 账号资产
acct = get_trade_detail_data(A.acct, A.acct_type, 'account')[0]
acct.m_dAvailable # 可用资金
acct.m_dBalance # 总资产
# 持仓
positions = get_trade_detail_data(A.acct, A.acct_type, 'position')
for p in positions:
p.m_strInstrumentID # 代码
p.m_strExchangeID # 市场
p.m_nVolume # 总持仓
p.m_nCanUseVolume # 可用持仓
p.m_dOpenPrice # 开仓价
p.m_dProfit # 盈亏
# 委托
orders = get_trade_detail_data(A.acct, A.acct_type, 'order')
# 成交
deals = get_trade_detail_data(A.acct, A.acct_type, 'deal')
for d in deals:
d.m_strRemark # 投资备注,和下单时传的 userOrderId 对应
把持仓整理成「代码 → 数量」字典是常见写法:
holdings = {p.m_strInstrumentID + '.' + p.m_strExchangeID: p.m_nCanUseVolume
for p in get_trade_detail_data(A.acct, A.acct_type, 'position')}
两融专用:担保明细与可融资标的
融资融券还能查担保品和可融资标的:
# 查某账号的担保明细
r = get_assure_contract('123456789')
# m_eFinStatus==48 表示可融资
finable = [o.m_strInstrumentID + '.' + o.m_strExchangeID
for o in r if o.m_eFinStatus == 48]
实盘下单的三条注意
- 价格笼子:股票报价不能超最新价 ±2%,否则废单;数量超可用持仓也会废单。
- 防超单:立即下单模式(quicktrade=2)下,信号不丢弃,务必自己做「有未成交委托则暂停后续报单」的控制——用一个
waiting_list记下投资备注,查到成交回报后再移除。 - 状态存放:逐 K 线模式可存
ContextInfo;立即下单必须用普通全局变量。
下一步
学会下单后,去看怎么取行情和品种数据:内置Python行情与数据函数。