问题描述
解决方案
在 QMT 的 Python 策略代码中,可以通过 ContextInfo 对象的 do_back_test 属性来判断当前策略是处于回测模式还是实盘/模拟运行模式。
核心方法
使用 ContextInfo.do_back_test 布尔值属性:
- True:表示当前处于回测模式(利用历史数据进行回测)。
- False:表示当前处于实盘或模拟交易模式(利用实时行情驱动)。
代码示例
以下是一个完整的策略示例,展示了如何在 init 初始化函数和 handlebar 行情驱动函数中进行判断:
# -*- coding: gbk -*-
def init(ContextInfo):
"""
初始化函数
"""
# 判断当前运行模式
if ContextInfo.do_back_test:
print("【系统提示】当前处于:回测模式")
# 在回测模式下,可以设置特定的参数,例如资金、费率等
ContextInfo.capital = 1000000 # 设置回测初始资金
ContextInfo.set_slippage(1, 0.01) # 设置回测滑点
else:
print("【系统提示】当前处于:实盘/模拟运行模式")
# 在实盘模式下,通常需要绑定资金账号
# ContextInfo.set_account('您的资金账号')
def handlebar(ContextInfo):
"""
K线/行情驱动函数
"""
# 也可以在盘中逻辑里判断,例如只在实盘打印某些日志
if not ContextInfo.do_back_test:
# 仅在实盘模式下打印当前Bar的时间,避免回测日志过多
index = ContextInfo.barpos
timetag = ContextInfo.get_bar_timetag(index)
print(f"实盘运行中,当前时间戳: {timetag}")
# 策略核心逻辑...
return
详细说明
- 属性性质:
ContextInfo.do_back_test是一个只读属性,由系统在策略启动时自动赋值,用户无法在代码中修改它。 - 应用场景:
- 参数隔离:回测时使用一套激进的参数,实盘时使用保守参数。
- 账号设置:回测时使用虚拟资金(
ContextInfo.capital),实盘时绑定真实资金账号(ContextInfo.set_account)。 - 日志控制:回测速度很快,产生大量日志可能导致界面卡顿,可以通过此标志限制回测时的
print输出频率。 - 数据获取:某些特定的数据接口可能仅在实盘有效(如实时推送),或者回测时需要预取历史数据,可以通过此标志区分处理逻辑。
Q&A
Q: ContextInfo.do_back_test 为 False 时,一定是在用真金白银交易吗?
A: 不一定。False 仅代表策略是在“运行模式”(Run Mode)下,即基于实时行情驱动。这包括了“模拟交易”和“实盘交易”。要区分模拟和实盘,通常取决于您在 QMT 界面上选择的账号类型以及是否勾选了“实盘”选项,代码层面通常统一处理为实时运行。
Q: 能否在 handlebar 之外的函数中使用这个属性?
A: 可以。只要能访问到 ContextInfo 对象的地方都可以使用。例如在自定义的函数中,只要将 ContextInfo 作为参数传递进去即可读取该属性。
Q: 回测模式下 ContextInfo.do_back_test 会在运行过程中改变吗?
A: 不会。在一次策略生命周期内,该属性的值是固定的。