3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在日内高频执行策略中,成交量加权平均价格(VWAP, Volume Weighted Average Price)是一种广泛使用的算法交易策略,旨在减少对市场的冲击成本,使执行均价接近全天的 VWAP 均价。
在 QMT(迅投量化平台)中,我们可以利用 handlebar 驱动机制在获取最新的 Tick 数据时实时计算目标执行量,并结合 passorder 进行精确拆单下单。
handlebar(ContextInfo),利用 ContextInfo.get_full_tick() 获取实时盘口与成交量。passorder 按照指定选价类型(如对手价或最新价)提交委托。#coding:gbk
import numpy as np
import pandas as pd
def init(ContextInfo):
# 设置交易标的与账号
ContextInfo.stock = '600000.SH'
ContextInfo.account = '6000000248'
ContextInfo.set_universe([ContextInfo.stock])
ContextInfo.set_account(ContextInfo.account)
# 设置策略目标总交易股数(正数买入,负数卖出)
ContextInfo.total_target_shares = 10000
ContextInfo.traded_shares = 0
# 预设全天交易时间片段数(如5分钟为一个 slice,全天48个片段)
# 这里简化为按进度驱动,利用 Tick 数据更新比例
print("VWAP 算法策略初始化完成")
def handlebar(ContextInfo):
# 仅在最后一根 Bar(实时盘中)触发执行
if not ContextInfo.is_last_bar():
return
stock = ContextInfo.stock
acc = ContextInfo.account
# 1. 获取最新 Tick 数据
tick_data = ContextInfo.get_full_tick([stock])
if stock not in tick_data:
return
last_price = tick_data[stock]['lastPrice']
current_vol = tick_data[stock]['volume'] # 当天累计成交量(手)
# 2. 查询当前账户委托与成交明细,计算已成交量
deals = get_trade_detail_data(acc, 'STOCK', 'DEAL')
completed_vol = 0
for d in deals:
if d.m_strInstrumentID == stock:
completed_vol += d.m_nVolume
# 3. 计算剩余目标量与发单逻辑
remaining_target = ContextInfo.total_target_shares - completed_vol
if remaining_target <= 0:
return
# 简易VWAP逻辑:根据实时买卖盘口量和剩余量,小批量拆单(如每次买入1000股或对手盘一档量的10%)
ask_vol_1 = tick_data[stock]['askVol'][0] * 100 # 卖一档挂单量(股)
order_vol = int(min(remaining_target, max(100, ask_vol_1 * 0.1)))
# 调整为一手(100股)的整数倍
order_vol = (order_vol // 100) * 100
if order_vol >= 100:
# 4. 调用 passorder 下单,采用对手价(prType=14)或最新价(prType=5)
# opType 23 代表股票买入;orderType 1101 代表单股单账号股数下单
passorder(23, 1101, acc, stock, 14, -1, order_vol, 'VWAP_ALGO', 1, ContextInfo)
print(f"[VWAP执行] 最新价:{last_price}, 发送委托股数:{order_vol}, 剩余未执行:{remaining_target - order_vol}")
passorder 中将 quickTrade 参数设置为 1 或 2,可实现在 Tick 到来时立即触发下单,无需等待 Bar 走完。smart_algo_passorder,支持原生 VWAP / TWAP 算法拆单。如果柜台支持智能算法,可以直接调用:smart_algo_passorder(23, 1101, acc, stock, 5, -1, 10000, "VWAP_ALGO", 1, "remark", "VWAP", 20, 0, ContextInfo)
can_cancel_order 和 cancel 及时撤销未成交的挂单,防止追单导致仓位超限。