Pine Script® v6現已登場

Dec 10, 2024

今天,我們很高興宣布推出Pine Script® v6!這個專為交易者設計的升級版程式語言,包含了多項優化和長期以來的功能增強,為Pine Script®程式設計師提供更高的效率和實用性,並為語言的進一步發展奠定了基礎。

這篇文章概述了Pine v6中一些最值得注意的升級。請參閱我們的發行說明,了解更多關於v6的新功能,並了解未來改進的最新資訊。

v6 轉換工具

與之前的版本更新類似,Pine v6中的升級不會影響使用早期版本編寫的個人或已發佈腳本。從現在起,所有新功能將僅在最新的Pine版本中實現,因此如果您希望使用新功能,我們建議將您的腳本轉換為v6。最簡單的方法是使用我們全新的v6轉換工具,您可以在Pine編輯器 的「管理腳本」選單中,選擇「將程式碼轉換為v6」來啟用它。

請注意,並非所有腳本都能自動轉換為v6,在某些情況下,可能需要手動編輯以確保轉換後的腳本能如預期運行。如果您在自動轉換過程中遇到問題,或希望手動將腳本轉換為v6,請參閱我們的實用遷移指南

動態請求

TradingView提供了來自全球的數萬種可交易工具、財務指標和經濟指標的商品。request.*()函數系列允許Pine腳本檢索任何可用商品的數據,無論圖表使用的是哪個商品或時間週期,都可以獲取不同時間週期的數據。

這些函數是強大的工具,擁有眾多的應用場景。然而,它們之前有一個顯著的限制:需要使用「簡單字串」值來指定請求的商品和時間週期,這代表內容必須在第一根K線時已知,並且之後無法更改。此外,所有request.*()函數呼叫都必須在腳本的全域範圍內執行。換句話說,代碼中的每個request.*()實例只能為單一商品和時間週期提取數據,且不允許在迴圈、條件結構或導出的庫函數中使用request.*()函數呼叫。

在Pine Script® v6中,我們移除了這些限制。現在,腳本可以使用「序列字串」值來定義任何request.*()函數呼叫的內容。此外,現在允許在局部範圍內呼叫request.*()函數。透過這些更改,您可以計算或修改任何歷史K線上的商品,並動態請求其數據、創建商品集合,並在迴圈內獲取其數據,以及使用request.*()函數執行許多其他以前不可能的操作。欲了解更多詳情,請參閱我們用戶手冊中的「動態請求」部分。

要了解如何使用動態請求,請查看內建績效指標的工作原理。它將以逗號分隔的商品和時間週期字串拆分為數組,然後在迴圈中動態呼叫request.security()函數,從每個數據集提取數值。過去,像這樣的腳本需要多次呼叫input.symbol()input.timeframe(),而每個商品-時間週期組合都需要在程式碼中單獨呼叫request.security()函數。

如需其他參考,請查看TradingView帳戶發佈的這些腳本,這些腳本還利用動態請求從其他內容中取得數據。

  • 外匯熱圖。此指標根據使用者指定的貨幣代碼清單,為貨幣對組合建立股票代碼ID。它動態地請求迴圈內每對組合的數據,然後使用該數據填充顏色編碼表。
  • 報價條小工具。此指標從用戶定義的商品清單中,建立股票代碼ID陣列。它在迴圈中請求每個股票ID的價格和每日變化資訊,然後使用這些數據來更新滾動的「報價」顯示。
  • LibraryCOT。以前,該程式庫僅提供創建程式碼ID的工具,用於請求CFTC交易者承諾(COT)數據,因為程式庫無法匯出包含request.*()呼叫的函數。隨著動態請求的引入,這個限制不再適用。該程式庫現在導出了requestCommitmentOfTraders()函數,該函數在內部呼叫request.security()來直接獲取COT數據,為程式設計師提供了更多的便捷性和多樣性。

此外,所有 CFTC數據程式碼之前都被保留在switch語法中,以回傳「簡單」值,這大大限制了可請求的數量。隨著動態請求的引入,已不再需要「簡單字串」股票代碼ID,這使得該程式庫可以將報告代碼儲存在map中,並支援更多商品。

布林優化

在Pine Script® v6中,最值得注意的改進可能不太明顯,但您可能會注意到程式碼效率的差異。我們重新設計了Pine中布林值的內部實現,並引入了短路(或稱「延遲」)求值,允許andor操作在不需要進一步評估表達式的情況下停止評估,從而提高了程式碼執行效率。

這些變更提升了大多數腳本在TradingView上的執行效率。特別是在依賴條件語法並使用大量布林值的相對較大腳本中,效率的提升尤為明顯,我們在對一些最受歡迎的開源社群腳本進行測試時也證實了這一點。

作為額外的優勢,延遲的布林求值通常能讓程式碼更加簡潔和清晰。例如:如果您有一個依賴於陣列項目的條件,您可能需要先檢查陣列大小,以確保該項目的索引存在,因為如果索引超出範圍,腳本將停止並引發錯誤。在Pine v6中,透過延遲求值,您可以創建一個單一的條件表達式,先檢查陣列再嘗試訪問元素,而這在v5中是無法實現的。

//@version=6
indicator("Lazy evaluation demo")

//@variable A "bool" array without a fixed size.
array<bool> myArray = array.new<bool>()

// Push a new value into `myArray` when the `close` is above the `open`.
if close > open
   myArray.push(true)

// Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`.
// It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`.
if myArray.size() != 0 and myArray.first()
   label.new(bar_index, high, "Test")

文字大小和格式

所有顯示文字的繪圖類型(如:邊框標籤表格)現在都可以使用排版點來指定文字大小 — 這與標準文字編輯器中使用的點數相同。之前,您必須在任意size.*常數之間進行選擇,例如:size.large(24)和size.huge(36)。現在,透過新的排版點規範,您可以確保文字大小完全符合您的需求,甚至可以創建在之前Pine版本中無法實現的超大文字大小。

此外,我們為這些繪圖類型引入了新的text_formatting參數,您可以使用它來使文字變為斜體、加粗或同時加粗和斜體。

//@version=6
indicator("Text size showcase", overlay = true)

var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1)

if barstate.islastconfirmedhistory
    t.cell(0, 0, "text_size = size.huge", text_size = size.huge)
    t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)

策略訂單調整

主動策略腳本用戶可能知道,在Pine v5中,策略最多只能模擬9000筆策略交易,超過後會停止計算並引發錯誤,除非您使用的是深度回測模式。對於模擬頻繁交易並建立快訊觸發器的策略來說,這種限制尤其不方便。

在Pine Script® v6中,策略在達到9000筆交易限制後不再停止計算或引發錯誤。相反,策略會裁剪最舊的訂單以騰出空間給新的訂單。被裁剪的訂單不會出現在策略模擬器中,但策略會繼續計算,並不會遇到問題。若要檢查最舊的未裁剪訂單的交易索引,可以使用新的strategy.closedtrades.first_index變數。該索引可作為strategy.closedtrades.*()函數呼叫中的trade_num參數。

負數組索引

在Pine v6 中,array.get()array.set()array.insert()array.remove()函數現在可以接受負數index參數,用來引用從陣列尾端開始的項目,提供了一種更簡潔、方便的方式來倒序引用陣列元素。例如:呼叫array.get(myArray, -2)會獲取myArray中倒數第二個元素,這等同於array.get(myArray, array.size(myArray) – 2)

為了隨時了解Pine Script®體驗的最新改進,請關注用戶手冊的版本發行說明 — 其中在v6部分還包括了一些未在這篇文章中提及的額外變更。

希望您會覺得這些功能和我們預期的一樣有用,請繼續向我們提供您的反饋和建議,讓我們能夠將平台打造得更好。我們為您建構TradingView,並且隨時樂於聽取您的想法。

— TradingView團隊

Look first Then leap

TradingView專門為您打造,請確保您充分利用我們出色的功能