问题描述
解决方案
在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("已调用算法交易函数,将使用界面预设参数执行")
关键点说明
- 函数选择:使用
algo_passorder而不是普通的passorder。 - 报价类型 (
prType):必须设置为-1。- 当
prType设为-1时,策略会读取您在【交易面板】->【程序交易】->【函数交易】->【函数交易参数】中设置的“报价方式”(如对手价、最新价等)。
- 当
- 用户参数 (
userOrderParam):- 在上面的代码中,我省略了
userOrderParam参数(即algo_passorder的第11个参数)。 - 当您不传入此字典参数时,QMT会默认尝试使用界面上“函数交易参数”中的配置(如最大下单次数、下撤单间隔等)。
- 注意:如果您在代码中传入了
userOrderParam字典,代码中的设置将覆盖界面上的设置。
- 在上面的代码中,我省略了
如何在界面上设置参数
为了确保代码能按您的预期工作,请检查软件界面的以下设置:
- 点击客户端顶部的 “交易” 菜单。
- 选择 “程序交易” 面板。
- 找到 “函数交易” 标签页。
- 点击 “函数交易参数” 按钮。
- 在弹出的设置框中:
- 下单类型:选择 “算法交易”(这是实现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_passorder 和 passorder 有什么区别?
A: passorder 是直接下单,单笔委托直接发往柜台。algo_passorder 是通过QMT的算法引擎下单,它会根据设置(如拆单逻辑)将一笔大单拆分成多笔小单发送,或者执行更复杂的交易逻辑。
Q: 如果我在代码里写了 prType=5(最新价),界面上设置的是“对手价”,以哪个为准?
A: 以代码为准。代码中明确指定的参数优先级高于界面设置。只有当代码中参数设为 -1(无效/默认)时,才会去读取界面的设置。
Q: 回测模式下支持 algo_passorder 吗?
A: 不支持。回测模式下,algo_passorder 通常会退化为普通成交或不执行拆单逻辑(因为回测无法模拟秒级的拆单挂单过程)。此功能主要用于实盘运行模式。