🚀 AI 一键生成 qmt 策略代码

QMT `passorder` 函数中按金额、按比例、按股数下单有什么区别?

qmt | 发布时间: 2025/12/19
以下内容由 EasyQuant 生成。

问题描述

我想用可用资金的50%买入一只股票,下单函数应该怎么写?

解决方案

在 QMT 中,想要实现“用可用资金的 50% 买入”这一特定需求,最直接且准确的方法是使用 passorder 函数,并配合特定的 orderType(下单方式)。

核心代码

# opType=23 (买入)
# orderType=1123 (单股、单账号、可用资金、比例下单)
# prType=5 (最新价)
# volume=0.5 (50%)
passorder(23, 1123, ContextInfo.accid, '600000.SH', 5, -1, 0.5, ContextInfo)

详细说明

要实现按可用资金比例下单,关键在于 passorder 函数的第二个参数 orderType

根据文档,orderType 设置为 1123 代表:单股、单账号、可用、比例[0 ~ 1]方式下单

参数详解:

  • 23 (opType): 操作类型,代表股票买入
  • 1123 (orderType): 下单方式。这是核心参数,表示按照当前账户可用资金的比例进行计算。
  • ContextInfo.accid (accountID): 你的资金账号(需要在 init 中设置或直接传入字符串)。
  • '600000.SH' (orderCode): 标的股票代码。
  • 5 (prType): 报价类型,5 代表最新价
  • -1 (price): 委托价格。因为前面选了最新价,这里填 -1 即可;如果选限价则需填具体价格。
  • 0.5 (volume): 下单数量。在 1123 模式下,0.5 代表 50%

完整策略示例

以下是一个完整的策略代码框架,展示了如何在 handlebar 中调用该函数:

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置资金账号
    ContextInfo.accid = '6000000000' 
    ContextInfo.set_account(ContextInfo.accid)

def handlebar(ContextInfo):
    # 获取当前主图的股票代码
    stock_code = ContextInfo.stockcode + '.' + ContextInfo.market
    
    # 示例:如果是最后一根K线,则下单
    if ContextInfo.is_last_bar():
        # 使用可用资金的 50% 以最新价买入
        passorder(23, 1123, ContextInfo.accid, stock_code, 5, -1, 0.5, ContextInfo)
        print(f"已对 {stock_code} 下单,使用可用资金的 50%")

常见误区提示

QMT 还有一个 order_percent 函数,但请注意区别:

  • order_percent(0.5) 通常是指**目标仓位占总资产(投资组合价值)**的 50%,而不是可用资金的 50%。
  • 如果你的目的是“花掉手里剩下现金的一半”,请务必使用 passorder 配合 1123 模式。

Q&A

Q: orderType 还有哪些常用的比例设置?
A:

  • 1113: 单股、单账号、总资产、比例下单(即目标仓位占总资产的百分比)。
  • 1123: 单股、单账号、可用资金、比例下单(即花费可用现金的百分比)。

Q: 如果可用资金不足以买入 1 手怎么办?
A: QMT 的交易接口通常会自动向下取整到 100 股(1手)。如果计算出的资金连 1 手都买不起,该委托通常不会被创建或会被柜台拒绝。

Q: passorder 中的 quickTrade 参数有什么用?
A: quickTrade(倒数第三个参数)用于控制是否立即下单。

  • 0(默认):在当前 K 线走完,下一根 K 线开始时触发(回测常用)。
  • 1:立即触发下单(实盘常用,配合 ContextInfo.is_last_bar() 使用)。
  • 2:强行立即触发,不判断 K 线状态(慎用)。