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
僅供教育用途。不構成投資建議。