Little
Bird Trading

Pine Script 收盤與K線內:重繪、提醒和 calc_on_every_tick

閱讀約3分鐘 · 更新於

一個在歷史上看起來很乾淨的 Pine Script,實盤時可能觸發之後又消失的訊號。幾乎所有情況都歸結為一個問題:指令碼處理的是已收盤的K線,還是仍在形成的K線?

本指南介紹控制這一點的每個設定,以及我給價位提醒使用的設定。

歷史K線與實時K線

在歷史上,Pine 對每根K線只在收盤時執行一次指令碼。在實時K線上,每次價格更新都會再次執行。像close > level這樣的條件,可能在10:01為真,在10:03為假,到10:04又變為真。歷史只保留最後的答案。這個差異就是交易者所說的重繪。

barstate.isconfirmed

barstate.isconfirmed只在K線的最後一次更新,也就是收盤時為真。把它加入條件後,實時K線的表現就和歷史一致:

crossUp = ta.crossover(close, level) and barstate.isconfirmed
plotshape(crossUp, style=shape.triangleup, location=location.belowbar)
alertcondition(crossUp, "Close above level")

代價是速度。你在K線收盤時才拿到訊號,在較慢的週期上要晚一整根K線。

提醒頻率

建立提醒時,TradingView會問你它多久可以觸發一次:

  • Once Per Bar Close:只在K線收盤且條件為真時觸發。與回測一致。
  • Once Per Bar:條件在K線內第一次變為真時就觸發,即使K線最終收在相反的方向。
  • Once Per Minute和Only Once:對觸發次數的限制。

對價位提醒,我在1或5分鐘圖上使用 Once Per Bar Close。穿過價位的影線如果收盤時回到價位內側,就不會觸發,這樣能去掉大部分假突破。

策略:calc_on_every_tick 和 process_orders_on_close

策略預設在歷史K線和實時K線上都在K線收盤時執行。有兩個設定會改變這一點:

  • calc_on_every_tick=true讓策略在每次實時更新時執行。歷史無法做到這一點,所以實盤交易會開始與回測產生差異。
  • process_orders_on_close=true讓訂單在訊號K線收盤時成交。預設是在下一根K線開盤時成交。它適合以收盤價為基礎的出場,但可能讓入場看起來更好。

在策略於K線收盤時正常工作之前,把這兩項都保持關閉。指標與策略指南介紹了策略測試器的其餘假設。

Bar Magnifier

在歷史上,策略只知道每根K線的開盤價、最高價、最低價和收盤價。如果你的止損和目標都在同一根K線內,它就只能猜哪個先觸及。use_bar_magnifier=true會用更低週期的資料來判定,適用於付費的TradingView套餐。在信任較緊的止損和目標之前,先把它開啟。

request.security 與更高週期

把日線最高價引入5分鐘圖,是重繪的常見來源。在歷史上,日線K線已經完整,所以指令碼從當天的第一根K線起就能看到最終的最高價。在實時中,最高價還在不斷變動。請求前一個已完成的值:

prevHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)

帶有lookahead_on的[1],會在今天的每一根K線上給出昨天的最高價,歷史和實時都一樣。

檢查清單

  • 訊號使用barstate.isconfirmed,或者提醒設為 Once Per Bar Close。
  • 更高週期的值使用帶有lookahead_on的[1]。
  • 策略在K線收盤時執行,並關閉calc_on_every_tick。
  • 當止損和目標靠得很近時,開啟 Bar Magnifier。
  • 在交易之前,把一週的實時提醒與回測做對比。

不會移動的價位

我的交易計畫價位在交易時段開始前就定好,全天固定不變,所以畫出它們的指令碼沒有什麼可重繪的。Pine Script 價位指南介紹如何在TradingView上繪製它們。

常見問題

Pine Script 中的收盤和K線內有什麼區別?

收盤表示指令碼只在K線結束時執行一次。K線內表示指令碼在K線內每次價格更新時都執行,所以訊號可能在收盤前出現又消失。

如何避免 Pine Script 提醒重繪?

把提醒設為 Once Per Bar Close,或在條件中加入barstate.isconfirmed。對於更高週期的資料,使用前一根K線的值並配合lookahead_on。

策略回測會使用K線內的價格嗎?

只有K線內的成交會使用,而且要開啟 Bar Magnifier。歷史上的訊號在每根K線收盤時計算。

資料來源

  • TradingView Pine Script 使用者手冊:執行模型、重繪、提醒
  • TradingView幫助中心:Bar Magnifier

僅供教育用途。不構成投資建議。