🚀 AI 一键生成 qmt 策略代码

QMT 平台如何使用预设参数进行算法交易?

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

问题描述

如何调用一个交易函数,让它使用我在软件界面上已经设置好的TWAP算法参数来下单?

解决方案

在QMT中,如果您已经在软件界面的**“程序交易” -> “函数交易” -> “函数交易参数”**面板中设置好了拆单逻辑(例如设置了“算法交易”、下单间隔、最大下单次数等,这通常被视为一种简易的本地TWAP策略),您应该使用 algo_passorder 函数来触发下单。

该函数会调用您在界面上配置的参数进行交易。

核心代码实现

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置资金账号
    ContextInfo.accid = '6000000248' # 请替换为您真实的资金账号
    ContextInfo.set_account(ContextInfo.accid)

def handlebar(ContextInfo):
    # 获取当前K线索引
    index = ContextInfo.barpos
    # 获取当前时间
    realtime = ContextInfo.get_bar_timetag(index)
    
    # 示例:仅在最后一根K线(实时行情)运行
    if not ContextInfo.is_last_bar():
        return

    # --- 下单逻辑 ---
    # 假设条件触发
    if True: 
        # opType: 23 (买入)
        # orderType: 1101 (单股、单账号、普通、股/手方式)
        # accountid: 资金账号
        # orderCode: 标的代码
        # prType: -1 (关键参数:设置为-1表示使用界面“函数交易参数”中设置的报价方式)
        # modelprice: -1 (当prType为-1时,此价格无效,由界面参数决定)
        # volume: 1000 (下单总量,算法会根据界面设置将这1000股拆分)
        
        algo_passorder(23, 1101, ContextInfo.accid, '000001.SZ', -1, -1, 1000, ContextInfo)
        
        print("已调用算法交易函数,将使用界面预设参数执行")

关键点说明

  1. 函数选择:使用 algo_passorder 而不是普通的 passorder
  2. 报价类型 (prType)必须设置为 -1
    • prType 设为 -1 时,策略会读取您在【交易面板】->【程序交易】->【函数交易】->【函数交易参数】中设置的“报价方式”(如对手价、最新价等)。
  3. 用户参数 (userOrderParam)
    • 在上面的代码中,我省略userOrderParam 参数(即 algo_passorder 的第11个参数)。
    • 当您不传入此字典参数时,QMT会默认尝试使用界面上“函数交易参数”中的配置(如最大下单次数、下撤单间隔等)。
    • 注意:如果您在代码中传入了 userOrderParam 字典,代码中的设置将覆盖界面上的设置。

如何在界面上设置参数

为了确保代码能按您的预期工作,请检查软件界面的以下设置:

  1. 点击客户端顶部的 “交易” 菜单。
  2. 选择 “程序交易” 面板。
  3. 找到 “函数交易” 标签页。
  4. 点击 “函数交易参数” 按钮。
  5. 在弹出的设置框中:
    • 下单类型:选择 “算法交易”(这是实现TWAP拆单的基础)。
    • 最大下单次数:设置您希望拆分的次数(例如10次)。
    • 下撤单时间间隔:设置时间间隔(例如60秒)。
    • 报价方式:设置您希望的价格模式。

补充情况:如果您指的是券商提供的“智能算法”(Smart Algo)

如果您指的TWAP是券商柜台提供的标准智能算法(Smart Algo,如卡方、金纳算法),而不是QMT本地的拆单功能,那么您需要使用 smart_algo_passorder

注意smart_algo_passorder 通常要求在代码中显式传入参数,较少直接读取界面“默认值”。但如果您确实需要调用智能算法,代码如下:

# 示例:调用智能算法 TWAP
# 参数需要显式指定,无法直接读取界面“默认值”
smart_algo_passorder(
    23,                 # opType: 买入
    1101,               # orderType
    ContextInfo.accid,  # 账号
    '000001.SZ',        # 代码
    5,                  # prType: 最新价 (智能算法通常忽略此项,由算法内部控制)
    -1,                 # price
    10000,              # volume: 总量
    "TWAP",             # smartAlgoType: 算法名称
    0,                  # limitOverRate: 量比 (0-100)
    0,                  # minAmountPerOrder: 最小金额
    ContextInfo         # ContextInfo
)

总结:大多数用户所说的“调用界面设置好的参数”,通常是指第一种情况(使用 algo_passorder 配合 prType=-1 调用本地函数交易参数)。

Q&A

Q: algo_passorderpassorder 有什么区别?
A: passorder 是直接下单,单笔委托直接发往柜台。algo_passorder 是通过QMT的算法引擎下单,它会根据设置(如拆单逻辑)将一笔大单拆分成多笔小单发送,或者执行更复杂的交易逻辑。

Q: 如果我在代码里写了 prType=5(最新价),界面上设置的是“对手价”,以哪个为准?
A: 以代码为准。代码中明确指定的参数优先级高于界面设置。只有当代码中参数设为 -1(无效/默认)时,才会去读取界面的设置。

Q: 回测模式下支持 algo_passorder 吗?
A: 不支持。回测模式下,algo_passorder 通常会退化为普通成交或不执行拆单逻辑(因为回测无法模拟秒级的拆单挂单过程)。此功能主要用于实盘运行模式。