刷新页面后,脚本或策略会给出不同的结果

历史数据不包括价格在intra-bar变动的记录;仅开、高、低、收 (OHLC)。这导致脚本有时在历史数据和实时数据上有不同的工作方式,其中只知道开盘价,并且在实时K线关闭之前,K线里的高、低价格会移动很多次;在K线关闭后,相关价格才会确定。

 

如果我们在图表上增加一个脚本,等到它在多个实时K线上进行计算,然后重新加载页面,有时我们会看到脚本的绘图略有变化。此行为是通常称为指标重绘 (indicator repainting) 的几种不同类型的行为之一。这是我们在此涉及的重绘类型,在使用重绘时将参考该类型。这是由于以下事实:在脚本中使用某些功能时,它们在历史和实时K在线的计算会有所不同。   

 

在其他类型的行为,正确或错误地引用重绘,包括在过去的K在线以负偏移绘制,以及使用透过对security功能的误解调用而接收到的其他不可用的未来信息,这些信息可能会将实时不可用的数据引入脚本计算中。

 

并非所有指标都与我们在此处讨论的重绘类型有关。在大多数情况下,这取决于程序代码中是否使用某些功能或语言构造。请注意,这种重绘效果不是bug。这是TradingView上的历史K线和实时K线信息之间固有差异的结果。

 

我们看看以下重绘的案例:

 

1. 使用calc_on_every_tick=true的策略。参数calc_on_every_tick=false的策略也可能倾向于重绘,但程度较小。

 

2. 使用security以高于图表上主要品种的时间周期来请求数据:

// Add this study on 1 minute chart
//@version=4
study("My Script")
c = security(syminfo.tickerid, "5", close)
plot(close)
plot(c, color=color.red)

不论lookahead参数的值如何,此研究将对实时数据和历史数据进行不同的计算 (请参阅Understanding lookahead)。

 

3. 使用security以低于图表上主要品种的时间周期来请求数据 (更多信息在此处): 

// Add this study on 5 minute chart
//@version=3
study("My Script")
c = security(tickerid, "1", close, lookahead=false)
plot(close)
plot(c, color=red)

lookahead=false,则将重绘。当lookahead=true时,重绘的可能性较小。1分钟和5分钟的更新时间互相超过时,仍可能会发生。

 

4. 所有脚本的计算均取决于起点。根据时间周期,日内数据将与星期、月或年的起点对齐。因此,此类脚本产生的结果可能会不时发生变化。在以下情况下,脚本将依赖起点:

  • 当他们使用valuewhen, barssinceema函数时 (由于其算法的特殊性)
  • 任何回测策略 (无论如何定义calc_on_every_tick参数)

 

时间周期和起点对齐之间存在依赖关系:

  • 1至14分钟 — 与一周的开始对齐
  • 15–29分钟 — 与一个月的开始对齐
  • 30分钟或更长的时间 — 与一年的开始对齐 

 

处理数据时,应考虑到历史记录长度的以下限制:

  • Ultimate方案,40000根历史K线
  • Elite方案,30000根历史K线
  • Expert方案,25000根历史K线
  • Premium方案,20000根历史K线
  • Pro和Pro+方案,10000根历史K线
  • 其它方案,5000根历史K线

 

5. 历史数据的改变,例如由于股票分割。

6. 脚本中以下变量的存在通常会导致重新绘制:

  1. barstate.isconfirmed, barstate.isfirst, barstate.ishistory, barstate.islast, barstate.isnew, barstate.isrealtime
  2. timenow
  3. bar_index