在回测过程中自定义时间范围
引言
TradingView回测时默认会使用全部可用数据,正常情况下可用的数据肯定是越多越好。但是有些时候我们也想观察某个特定时间范围内的表现。这就引发了一个需求,如何在策略脚本中自定义时间范围呢?
账号的有效日期范围
不同级别的账号有着不同的可用数据量,这些数据限制决定了你在不同的时间周期下的测试范围。例如大部分人都用的是免费账号,它的数据量是5,000根K线。如果是以一小时为周期,折算下来就是200天左右。时间周期是1分钟的话,那就只有不到4天。具体区别如下:
这并非表明我们就真的只能使用5,000根K线。按照官方的说法,根据不同的交易品种和时间周期,会有一些调整,实际情况要远比这个多。具体能测试多久,我们可以在“策略测试器”的“属性”页查看。
例如我现在的账号级别是Essential,可以使用10,000根K线。切换到一小时级别,我的回测范围是从2022年1月至2024年1月。这显然超过了10,000根K线。需要注意的是,Premium级别以上的回测范围不受这个数据的限制,它可以使用一个“深度回测”的功能突破10,000根K线。
图中红色的“交易范围”就是订单的实际成交范围,也是我们要修改的范围。在开始定义时间范围之前,我们要有一个基本的概念,时间过滤功能只能在可用的数据范围中生效,也就是说它不能超过回测范围。
日期过滤的效果
当前展示的是在策略脚本中添加时间过滤的功能。可以看到“交易范围”是从2023年1月开始的,对应策略设置中的开始时间。而我的有效回测范围则是从2022年1月开始。这样就可以很方便的控制有效会测范围。
日期筛选的实现过程
要实现日期筛选的功能,需要执行以下几个步骤:
- 创建输入参数,指定开始日期和结束日期
我们可以通过代码在策略的输入页面创建一个日期选框,效果如上图所示。
startPeriodTime = input.time(timestamp('1 Jan 2012'), '开始', group='交易日期范围', inline='开始时间')
endPeriodTime = input.time(timestamp('31 Dec 2099'), '结束', group='交易日期范围', inline='结束时间')
这段代码是用于创建两个输入变量 startPeriodTime
和 endPeriodTime
,它们表示交易日期范围的开始和结束时间,它们的格式是标准时间戳的形式。’开始’ 和 ‘结束’ 是输入框中显示的标签,group=’交易日期范围’ 表示将这两个输入变量放置在一个名为“交易日期范围”的组中,方便我们识别。inline=’开始时间’ 和 inline=’结束时间’ 是为了利用将输入参数放置在同一行的操作,让日期选框实现左对齐,这样能美观一些。
- 定义策略的日期状态
isStartPeriodEnabledAndInRange = startPeriodTime <= time
isEndPeriodEnabledAndInRange = endPeriodTime >= time
这两行代码用于检查当前时间是否在指定的交易日期范围内,time是系统内置的参数。如果当前时间time大于指定的开始时间startPeriodTime,那么isStartPeriodEnabledAndInRange这个条件为真;如果当前时间time小于指定的结束时间endPeriodTime,那么isEndPeriodEnabledAndInRange这个条件为真。
- 在策略中启用时间过滤功能
显然,只要isStartPeriodEnabledAndInRange和isEndPeriodEnabledAndInRange同时成立,自然就满足我们定义的日期范围。接下来,只要在策略的交易逻辑中加上这个条件,就可以生效了。
isInRange = isStartPeriodEnabledAndInRange and isEndPeriodEnabledAndInRange
if isInRange
//交易逻辑
if is_trading == 1
if strategy.position_size == 0 // 触发止损,做多行情结束
long_signal := false
接下来,只要在策略的交易逻辑中加上这个条件,就能实现我们刚才的效果。
总结
TradingView会使用全部可用数据进行回测,我们只能在这个有效日期内进行时间过滤。通过在输入参数页面中创建日期选框,可以灵活的定义交易范围。