问题描述
解决方案
在 QMT 平台的回测模式中,设置滑点(Slippage)主要有两种方式:通过策略编辑器界面设置和通过Python 代码设置。
如果同时在界面和代码中进行了设置,代码中的设置优先级更高,会覆盖界面的设置。
以下是详细的设置方法说明:
方法一:通过 Python 代码设置(推荐)
在策略代码的 init(ContextInfo) 函数中,使用 ContextInfo.set_slippage(slippageType, slippage) 接口进行设置。这种方式可以确保策略逻辑与参数绑定,便于移植和版本管理。
函数说明
ContextInfo.set_slippage(slippageType, slippage)
- slippageType (int):滑点类型。
0:按 tick 跳数设置(例如设置 1,代表滑 1 个最小变动价位)。1:按 **固定值(价格)**设置(例如设置 0.01,代表每股滑 0.01 元)。2:按 价格比例设置(例如设置 0.001,代表按成交价的 0.1% 计算滑点)。
- slippage (float):具体的滑点数值。
代码示例
# -*- coding: gbk -*-
def init(ContextInfo):
# 方式1:按固定价格设置滑点
# 设置滑点为 0.02 元(即买入贵 0.02,卖出便宜 0.02)
ContextInfo.set_slippage(1, 0.02)
# 方式2:按比例设置滑点(注释掉上方代码使用此行)
# 设置滑点为千分之一 (0.1%)
# ContextInfo.set_slippage(2, 0.001)
# 方式3:按跳数设置滑点(注释掉上方代码使用此行)
# 设置滑点为 2 个 tick (如股票最小变动 0.01,则滑 0.02)
# ContextInfo.set_slippage(0, 2)
print("滑点设置完成")
def handlebar(ContextInfo):
# 策略逻辑
pass
方法二:通过策略编辑器界面设置
如果不希望修改代码,可以在 QMT 客户端的策略编辑器界面中直接配置:
- 打开【策略开发】界面。
- 在左侧选择或新建一个 Python 策略。
- 在右侧的【回测参数】面板中找到 “滑点” 选项。
- 选择滑点类型(跳/固定值/比例)并输入数值。
验证滑点设置
在回测过程中,您可以使用 ContextInfo.get_slippage() 来获取当前生效的滑点设置,以确保配置正确。
def handlebar(ContextInfo):
# 获取当前滑点设置
# 返回值为字典,包含 'slippage_type' 和 'slippage'
current_slippage = ContextInfo.get_slippage()
print(f"当前滑点设置: {current_slippage}")
Q&A
Q: set_slippage 函数在实盘模式下有效吗?
A: 无效。ContextInfo.set_slippage 仅在回测模式下生效。在实盘或模拟交易中,成交价格取决于市场的真实撮合情况,无法强制设定滑点,但可以通过限价单(Limit Order)或算法交易来控制滑点成本。
Q: 如果我在界面设置了滑点,代码里也写了 set_slippage,哪个生效?
A: 代码中的设置生效。代码中调用的 ContextInfo.set_slippage 优先级高于策略编辑器界面中的回测参数设置。
Q: 滑点是如何影响回测结果的?
A: 滑点模拟了真实交易中的冲击成本。
- 买入时:回测成交价 = 市场价 + 滑点
- 卖出时:回测成交价 = 市场价 - 滑点
设置合理的滑点可以使回测结果更接近真实交易环境,避免策略表现虚高。
Q: 股票回测一般设置多少滑点比较合理?
A: 这取决于策略的资金规模和交易频率。对于普通资金规模的日线策略,通常设置为 1跳 (Type 0, Value 1) 或 万分之五到千分之一 (Type 2, Value 0.0005 - 0.001) 较为常见。高频策略通常需要设置更严格的滑点。