问题描述
解决方案
在 QMT 的 Python 策略代码中,设置回测时的手续费率和滑点需要在 init(ContextInfo) 函数中调用相应的 API 方法。
以下是具体的设置方法和代码示例:
1. 设置滑点 (set_slippage)
使用 ContextInfo.set_slippage(slippageType, slippage) 函数。
- slippageType (滑点类型):
0: 按 tick 跳数设置(例如设置为 1,代表滑 1 个最小变动单位)。1: 按固定值(价格)设置(例如设置为 0.01,代表滑 0.01 元)。2: 按价格比例设置(例如设置为 0.001,代表滑 0.1%)。
- slippage (滑点值): 具体的数值。
2. 设置手续费 (set_commission)
使用 ContextInfo.set_commission(commissionType, commissionList) 函数。
- commissionType (手续费类型):
0: 按成交额比例计算(股票常用)。1: 按每手/每股固定值计算。
- commissionList (费率列表): 这是一个包含 6 个元素的列表,顺序固定如下:
[买入印花税, 卖出印花税, 开仓佣金, 平仓佣金, 平今佣金, 最低佣金]
完整代码示例
# -*- coding: gbk -*-
def init(ContextInfo):
# --- 设置滑点 ---
# 示例:设置为按固定价格滑点,滑点值为 0.02 元
# 参数1:类型 (1=固定值)
# 参数2:数值
ContextInfo.set_slippage(1, 0.02)
# --- 设置手续费 ---
# 示例:股票交易费率设置
# 买入印花税:0
# 卖出印花税:0.001 (千分之一)
# 开仓佣金(买入):0.0003 (万分之三)
# 平仓佣金(卖出):0.0003 (万分之三)
# 平今佣金:0 (股票通常不区分平今,期货才用)
# 最低佣金:5.0 (单笔最低5元)
# 列表顺序:[open_tax, close_tax, open_commission, close_commission, close_tdaycommission, min_commission]
commission_list = [0.0, 0.001, 0.0003, 0.0003, 0.0, 5.0]
# 参数1:类型 (0=按比例)
# 参数2:费率列表
ContextInfo.set_commission(0, commission_list)
print("回测费率与滑点设置完成")
def handlebar(ContextInfo):
# 策略逻辑代码
pass
注意事项
- 生效范围:这些设置仅在回测模式下生效。在实盘或模拟盘模式下,交易费用由柜台实际扣除,代码中的设置不会影响实际账户资金。
- 优先级:如果在策略编辑器的界面上也设置了回测参数(如“回测参数”面板),代码中
init函数里的设置优先级通常高于界面设置(以代码为准)。 - 简写方式:
ContextInfo.set_commission如果只传入一个数值参数(例如ContextInfo.set_commission(0.0003)),系统会将开仓、平仓、平今佣金都设为该值,其余设为 0。
Q&A
Q: QMT代码中设置的手续费会影响实盘交易吗?
A: 不会。set_commission 和 set_slippage 函数仅在回测模式(Backtest)下用于模拟计算净值和盈亏。实盘交易的手续费完全由券商柜台系统根据您的账户费率实际结算。
Q: 如何设置期货的按手数收取手续费?
A: 将 set_commission 的第一个参数 commissionType 设置为 1。例如:ContextInfo.set_commission(1, [0, 0, 5, 5, 0, 0]) 表示开仓和平仓每手收取 5 元(假设单位是元)。
Q: 滑点类型设置为 0 (tick跳数) 是什么意思?
A: 设置为 0 表示按照最小变动价位(Price Tick)来计算滑点。例如,某股票最小变动价位是 0.01 元,如果设置滑点值为 2 且类型为 0,则实际滑点金额为 2 * 0.01 = 0.02 元。这对于不同价格段或不同品种(如期货)的策略回测非常有用,因为它能自动适应品种的最小跳动单位。