内置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]

实盘下单的三条注意

  1. 价格笼子:股票报价不能超最新价 ±2%,否则废单;数量超可用持仓也会废单。
  2. 防超单:立即下单模式(quicktrade=2)下,信号不丢弃,务必自己做「有未成交委托则暂停后续报单」的控制——用一个 waiting_list 记下投资备注,查到成交回报后再移除。
  3. 状态存放:逐 K 线模式可存 ContextInfo;立即下单必须用普通全局变量。

下一步

学会下单后,去看怎么取行情和品种数据:内置Python行情与数据函数。