腳本或策略在刷新頁面(重新繪製)後有不同的結果

歷史數據通常不包括價格的K線內的記錄,只包括開盤價、最高價、最低價和收盤價(OHLC)。這會導致腳本有時在歷史數據和即時數據上表現不同。在即時數據中,通常只知道開盤價,而在即時K線圖收盤前,價格通常會多次波動,直到設定即時K線圖的最終最高價、最低價和收盤價。

如果我們在圖表上新增一個腳本,等待它在即時K線圖上進行計算,然後重新載入頁面,有時會看到腳本的繪圖略有變化。這種行為是一種常被稱為指標重繪的不同類型的行為之一。這是我們關注的重繪類型,當使用重繪時,我們將引用它。這是因為當腳本中使用某些功能時,它們在歷史K線圖圖和即時K線圖上的計算方式會有所不同。

除了在歷史數據中發生的重繪行為之外,還有一些其他類型的行為(正確或不正確地稱為重繪),包括在過去K線圖上使用負偏移繪圖,以及透過誤解對request .security函數的呼叫而取得的本來不可用的未來資訊。這可能會將即時數據中不可用的數據引入到腳本計算中。

並非所有指標都會受到我們在此討論的重繪類型的影響。在大多數情況下,這取決於程式碼中是否使用了某些功能或語言構造。請注意,這種重繪效應不是一個bug,而是與TradingView上的歷史K線圖和即時K線圖資訊之間的固有差異有關的結果。

我們可以在以下情況下看到重繪:

1. 使用calc_on_every_tick = true的策略。參數calc_on_every_tick = false的策略也可能容易重新繪製,但程度較輕。

2. 使用request.security從比圖表的主要商品更高的時間週期請求數據:

// Add this indicator on 1 minute chart
//@version=5
indicator("My Script")
c = request.security(syminfo.tickerid, "5", close)
plot(close)
plot(c, color=color.red)
無論前瞻參數的值為何,本研究將對即時數據和歷史數據進行不同的計算(請參閱了解前瞻)。

3. 使用request.security從低於主圖表的時間週期請求數據(更多資訊請參閱此處):

// Add this indicator to a 5 minute chart
//@version=5
indicator("My Script")
c = request.security(syminfo.tickerid, "1", close, lookahead=barmerge.lookahead_off)
plot(close)
plot(c, color=color.red)

如果lookahead=barmerge.lookahead_off,則會發生重繪。當lookahead=barmerge.lookahead_on時,重新繪製的可能性較小。當1分鐘和5分鐘更新速度超過對方時,這種情況仍然可能發生。

4. 所有腳本計算都取決於它們的起點。日內數據與週、月或年的開始對齊,具體取決於時間週期。因此,此類腳本產生的結果有時可能會有所不同。在這些情況下,腳本將依賴起點:

  • 當他們使用valuewhenbarssinceema函數時(由於其演算法的特殊性)
  • 任何回測策略(無論calc_on_every_tick參數如何定義)

時間週期和起點開始之間存在依賴性:

  • 1–14分鐘 — 與一週的開始一致
  • 15–29分鐘 — 與月初一致
  • 30分鐘以上 — 與年初一致

處理數據時考慮歷史長度的以下限制:

  • 終極方案擁有40000個歷史K線
  • 精英方案擁有30000個歷史K線
  • 專家方案擁有25000個歷史K線
  • 高級會員擁有20000個歷史K線
  • 標準會員和進階會員擁有10000個歷史K線
  • 其他方案擁有5000個歷史K線

5. 歷史數據發生變化,例如:拆分。

6. 腳本中存在以下變數,通常會導致重新繪製: