🚀 AI 一键生成 qmt 策略代码

QMT 进阶教程:如何使用智能算法(VWAP/TWAP)执行大额订单?

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

问题描述

如何通过 VWAP 算法来拆分一个大额买单?

解决方案

在 QMT 平台中,拆分大额买单最推荐的方式是使用平台内置的 智能算法交易接口 smart_algo_passorder

该接口内置了 VWAP(成交量加权平均价)策略,能够自动根据历史成交量分布规律,将大单拆解为多个小单,在指定的时间段内分批执行,从而降低对市场的冲击并争取获得接近市场均价的成交成本。

以下是具体的实现代码和详细说明。

QMT VWAP 算法交易策略代码

# -*- coding: gbk -*-
import time

def init(ContextInfo):
    # 1. 设置资金账号 (请修改为您的实际账号)
    ContextInfo.accID = '6000000000' 
    ContextInfo.set_account(ContextInfo.accID)
    
    # 2. 定义全局变量,防止重复下单
    ContextInfo.has_ordered = False

def handlebar(ContextInfo):
    # 仅在最后一根K线(实时行情)运行,且只运行一次
    if not ContextInfo.is_last_bar() or ContextInfo.has_ordered:
        return

    # --- 交易参数设置 ---
    stock_code = '600000.SH'  # 标的代码
    total_volume = 100000     # 计划买入总股数 (大单)
    algo_type = "VWAP"        # 算法类型:VWAP
    
    # 策略名称和备注
    strategy_name = "VWAP_Strategy"
    remark = "Large_Order_Split"
    
    # 智能算法参数
    limit_over_rate = 20      # 量比控制 (0-100):例如20表示下单量不超过市场同期成交量的20%
    min_amount = 0            # 最小委托金额 (0表示不限制)
    
    # 算法执行时间段 (格式 HH:MM:SS)
    # 建议避开集合竞价,例如从 09:30:00 到 14:55:00
    start_time = '09:30:00'
    end_time = '14:55:00'

    print(f"开始执行 {algo_type} 算法下单:{stock_code}, 总量:{total_volume}")

    # --- 调用智能算法接口 ---
    # opType=23 (买入), orderType=1101 (单股单账号股数下单)
    # prType=5 (最新价,算法交易通常以此为基准或由算法内部决定)
    # price=-1 (由算法控制价格)
    # quickTrade=0 (非快速交易,走算法逻辑)
    
    ContextInfo.smart_algo_passorder(
        23,                         # opType: 23-买入
        1101,                       # orderType: 1101-按股数下单
        ContextInfo.accID,          # accountid: 资金账号
        stock_code,                 # orderCode: 标的代码
        5,                          # prType: 报价类型 (5-最新价,算法会自动调整)
        -1,                         # modelprice: 价格 (-1表示由算法控制)
        total_volume,               # volume: 总下单量
        strategy_name,              # strategyName: 策略名
        0,                          # quickTrade: 0-否 (必须为0才能启动算法)
        remark,                     # userOrderId: 备注
        algo_type,                  # smartAlgoType: "VWAP"
        limit_over_rate,            # limitOverRate: 量比
        min_amount,                 # minAmountPerOrder: 最小金额
        ContextInfo,                # ContextInfo对象
        # 注意:smart_algo_passorder 的最后几个参数在不同版本文档中可能略有差异
        # 通常需要通过位置参数传递 start_time 和 end_time,或者部分版本封装在内部
        # 如果您的QMT版本支持直接传参,请参考以下方式(部分旧版本可能不支持时间参数,默认全天):
        # targetPriceLevel (缺省), startTime, endTime
    )
    
    # 针对支持时间参数的完整调用形式(推荐尝试):
    # smart_algo_passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, 
    #                      strategyName, quickTrade, userOrderId, smartAlgoType, limitOverRate, 
    #                      minAmountPerOrder, targetPriceLevel, startTime, endTime, ContextInfo)
    
    # 下面是带时间参数的完整调用示例:
    # ContextInfo.smart_algo_passorder(
    #     23, 1101, ContextInfo.accID, stock_code, 5, -1, total_volume, 
    #     strategy_name, 0, remark, algo_type, limit_over_rate, min_amount, 
    #     6, start_time, end_time, ContextInfo
    # )

    ContextInfo.has_ordered = True
    print("VWAP 母单已发送,请在交易界面的【算法交易】或【任务管理】中查看进度。")

关键参数详解

在使用 smart_algo_passorder 实现 VWAP 时,以下参数至关重要:

  1. smartAlgoType (算法类型):

    • 必须设置为 "VWAP"。这告诉 QMT 按照成交量加权平均价的逻辑来拆单。
  2. limitOverRate (量比/参与率):

    • 含义: 控制子单占市场成交量的比例。
    • 设置建议: 通常设置为 10% - 30%
    • 作用: 如果设置为 20,意味着如果市场在某分钟成交了 100 手,你的算法最多只会成交 20 手。这能有效隐藏大单,避免把价格买高。
  3. startTimeendTime (执行时间):

    • 含义: 算法运行的起止时间。
    • 设置建议:
      • 开始时间通常设为 09:30:00 或稍晚(如 09:35:00)以避开开盘剧烈波动。
      • 结束时间通常设为 14:55:0014:57:00,避开尾盘集合竞价或确保在收盘前完成。
    • 注意: 如果不填,默认可能是当前时间到收盘。
  4. volume (总量):

    • 这是你要买入的总股数(母单数量)。算法会自动将其拆分成无数个小的子单。

运行后的效果

  1. 母单生成: 代码运行后,不会立即成交 10 万股。
  2. 任务创建: 在 QMT 交易终端的“算法交易”或“策略交易”面板中,会看到一条状态为“运行中”的 VWAP 任务。
  3. 自动拆单: 随着行情时间的推移,算法会根据该股票的历史成交量曲线和实时盘口,不断地发出小的限价单(子单)。
  4. 风控: 如果市场流动性不足(成交量小),算法会自动降低下单速度,严格遵守 limitOverRate 的限制。

常见问题 Q&A

Q: 为什么代码运行了但没有立即成交?
A: VWAP 的目的就是立即成交。它是一个时间加权策略,会在设定的 startTimeendTime 之间慢慢买入。请去交易界面的“任务”栏查看进度。

Q: smart_algo_passorderpassorder 有什么区别?
A: passorder 是普通下单,发出去就是一笔委托,直接报送交易所。smart_algo_passorder 是发送给 QMT 的算法服务器,由算法服务器拆分成无数个 passorder 再报送交易所。

Q: 回测模式下支持 VWAP 算法吗?
A: QMT 的回测模式主要针对逻辑回测,不支持 smart_algo_passorder 的真实拆单逻辑模拟。回测时请使用 passorder 配合逻辑模拟,或者仅在“实盘/模拟交易”模式下测试此代码。

Q: 如何中途停止 VWAP 任务?
A: 可以使用 cancel_task 函数,传入任务 ID 来停止;或者直接在 QMT 交易界面的算法任务列表中手动点击“暂停”或“撤销”。