你好,Pine腳本v5

Oct 7, 2021

今天,Pine升級到v5!我們的指標和策略編程語言的新版本帶來了許多令人興奮的新功能和改進。Pine現在比以往任何時候都更強大,v5中的變化將幫助我們將語言提升到新的水平。這篇文章僅介紹了一些可用的最新功能;請務必閱讀我們的發行說明遷移指南

V4至V5轉換器

使用先前版本Pine的現有Pine腳本將繼續保持不變,但我們在Pine編輯器中提供了一個轉換工具來幫助編碼人員將他們的v4腳本轉換為v5。未來對Pine的改進將專門針對v5推出,因此如果您希望從新功能中受益,我們建議您轉換您的指標和策略。當在編輯器中加載v4腳本時,從更多下拉選單中可以使用v4到v5轉換工具:

請注意,並非所有v4代碼都可以自動轉換。如果您遇到轉換問題或更喜歡手動轉換腳本,我們的遷移指南記錄了v4和v5之間的所有更改,將為您提供指導。

腳本庫

Pine V5附帶的一個關鍵補充是腳本庫。腳本庫是一種新型出版物,允許您創建要在其他腳本中重用的自定義函數。發布腳本庫後,其他腳本(指標、策略甚至其他庫)可以導入它並使用其功能。您可以使用腳本庫來包含複雜的算法或常用函數,以便您或整個Pine社區可以輕鬆地重用它們。

要開始使用腳本庫,請參閱我們關於腳本庫的用戶手冊頁面。在本文的末尾,您將找到我們PineCoders團隊成員發布的腳本庫示例。您可以從此處的腳本提要中查看已發布的腳本庫。

用戶定義函數的預設值

與腳本庫相輔相成的改進:可以為用戶定義函數中的參數定義默認值,這有效地使它們成為可選的。在下面的示例中,我們說明了一個自訂函數customPow(),它將base提升到exp的冪。如果調用函數時未指定exp,則使用2:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

SWITCH

新的switch語句是對熟悉的if語句的一個轉折。如果您曾經不得不建立一棵if-else語句的大樹,您就會意識到使用switch實現所需的結果是多麼方便。您可以在我們的參考手冊中了解更多信息。在下面的代碼中查看它的實際效果。它是我們內置的平均真實範圍指標,它現在使用switch語句在其計算中提供不同的平滑算法:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

繪圖集

使用Pine繪圖的生活質量的重大改進:新的line.alllabel.allbox.alltable.all內置數組變量始終包含腳本繪製的所有指定類型圖形的ID。

例如,您可以使用它根據用戶定義的值修剪圖表上顯示的繪圖數量。在下面的腳本中,我們在每個新的每日開盤價上畫一條線(根據腳本的預設線限制,上限為~50)。然後我們檢查是否超過了腳本輸入允許的列數,如果是,則刪除最舊的列:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

v5附帶的另一個期待已久的Pine功能是while循環。while語句建立一個循環,當條件為假或在循環中使用break命令時,該循環將停止。

例如,這裡有一個指標,它計算我們需要回顧的平均距離之間的差異,以找到等於最後n根K線總成交量的上漲和下跌成交量。我們需要進一步回顧以找到上漲或下跌的量,其價值越看跌或看漲:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

腳本的while循環會一直執行,直到在上漲和下跌交易量中都找到所需的交易量,而且我們還沒有回過頭來超過允許的最大K線數。該腳本還展示了添加到Pine v5的另一個功能:runtime.error()

runtime.error()

runtime.error()函數現在可以停止腳本的執行並在您可以在 Pine中定義的任何條件下顯示錯誤消息。這對於想要防止用戶錯誤使用指標的腳本建立者會派上用場。它還可以用作非正統的調試工具,例如在循環期間或從函數內部停止執行。

要使用新函數,只需在滿足條件時調用runtime.error()函數即可。當它執行時,它將停止腳本並在指標名稱旁邊顯示熟悉的感嘆號。當用戶點擊感嘆號圖標時,將出現您在函數調用中使用的消息。

下面的代碼是一個帶有兩個自定義錯誤的準系統VWAP指標。當交易品種沒有任何成交量數據時出現第一個:VWAP是根據成交量計算的,因此如果沒有成交量,腳本將無法運行。當圖表上的時間週期為1D或更高時,會出現第二個。基本VWAP計算在每個新K線上累積成交量加權移動平均數據,並在新一天開始時重設,因此該指標僅在日內時間週期內有用。

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

新的策略參數

策略編碼人員的好消息!我們增加了一大堆新變量和函數,讓您可以了解交易屬性、統計數據和指標。它們的值會隨著經紀商模擬器執行您的訂單而更新,因此您可以隨著策略的進展跟踪值。

點擊此處查看Pine參考手冊,了解每一項的詳細資訊

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

新命名空間

Pine程序員社群告訴我們,他們感謝我們在過去幾年中對Pine進行的前所未有的增加速度,我們打算在未來保持同樣的速度。然而,這會創建一個源源不斷的新Pine函數和內置變量。為了支持這種瘋狂的增長,我們需要更好地組織語言中使用的約600個當前名稱。我們通過添加新的命名空間來實現這一點,以便以更好地反映其用途的方式對函數進行分組。許多函數參數名稱也被重命名以使其更易於理解。

新命名空間的一個示例是ta.,它現在包括與技術分析相關的所有變量和函數。這使您可以更輕鬆地瀏覽參考手冊並找到所有返回常用指標值的變量和函數。因此,sma()現在是ta.sma()。沒有必要記住新的命名空間;如果您在編輯器中鍵入沒有命名空間的函數的舊名稱並按自動完成快捷鍵(Ctrl + Space,或MacOS上的Cmd + Space),則會出現一個顯示匹配建議的彈出視窗:

搜尋參考手冊時也是如此;鍵入一個熟悉的函數名而不帶它的命名空間將調出它的新名稱。您可以在我們的遷移指南中查看v5的完整更改列表。

已發表腳本庫

以下出版物是幫助我們測試Pine新功能的PineCoders在TradingView上發布的腳本庫示例:

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

我們希望您發現新功能很有用。請繼續向我們提供反饋和建議 — 我們正在為您構建 TradingView,我們總是渴望知道您對我們平台更新的看法。

Look first Then leap

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