Chào đón Pine Script v5

Oct 7, 2021

Hôm nay, Pine đã hoàn thành phiên bản v5! Phiên bản mới của ngôn ngữ lập trình chỉ báo và chiến lược của chúng tôi mang đến một loạt các tính năng và cải tiến mới thú vị. Pine hiện mạnh mẽ hơn bao giờ hết và những thay đổi trong v5 sẽ giúp chúng tôi nâng ngôn ngữ này lên một tầm cao mới. Bài đăng này chỉ giới thiệu một số tính năng mới nhất hiện có; hãy chắc chắn bạn đọc Release Notes và Migration Guide

Chuyển đổi v4 sang v5

Các tập lệnh Pine hiện tại sử dụng các phiên bản trước của Pine sẽ tiếp tục chạy không thay đổi, nhưng chúng tôi đã cung cấp một công cụ chuyển đổi trong Pine Editor để giúp các lập trình viên chuyển đổi các tập lệnh v4 của họ sang v5. Các cải tiến trong tương lai đối với Pine sẽ được triển khai riêng cho v5, vì vậy chúng tôi khuyên bạn nên chuyển đổi các chỉ số và chiến lược của mình nếu bạn muốn hưởng lợi từ các tính năng mới. Công cụ chuyển đổi v4 sang v5 khả dụng khi tập lệnh v4 được tải trong Trình chỉnh sửa, từ menu thả xuống Thêm:

Lưu ý rằng không phải tất cả mã v4 đều có thể được chuyển đổi tự động. Nếu bạn gặp sự cố chuyển đổi hoặc muốn chuyển đổi các tập lệnh của mình theo cách thủ công, trong tài liệu Migration Guide có các hướng dẫn về chuyển đổi v4 sang v5.

Thư viện

Một bổ sung quan trọng cho Pine trong v5 là các thư viện. Thư viện là một tính năng mới cho phép bạn tạo các chức năng tùy chỉnh để sử dụng lại trong các tập lệnh khác. Khi một thư viện được xuất bản, các tập lệnh khác (có thể là chỉ báo, chiến lược hoặc thậm chí là các thư viện khác) có thể nhập và sử dụng các chức năng của nó. Bạn có thể sử dụng các thư viện để bao gồm các thuật toán phức tạp hoặc các hàm thường được sử dụng để bạn hoặc toàn thể cộng đồng Pine có thể dễ dàng sử dụng lại chúng.

Bắt đầu làm việc với thư viện, hãy xem hướng dẫn Thư viện. Ở cuối bài đăng này, bạn sẽ xem các ví dụ về xuất bản bởi các thành viên của chúng tôi trong nhóm PineCoders. Bạn có thể xuất bản thư viện từ đây.

Giá trị mặc định cho các chức năng do người dùng xác định

Một cải tiến song hành với các thư viện: một giá trị mặc định có thể được xác định cho các tham số trong các hàm do người dùng xác định, điều này có hiệu quả làm cho chúng trở thành tùy chọn. Trong ví dụ dưới đây, chúng tôi khai báo một hàm tùy chỉnh customPow () để nâng cơ sở lên sức mạnh của exp. Nếu exp không được chỉ định khi hàm được gọi, thì 2 được sử dụng:

//@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

Câu lệnh switch mới là một bước ngoặt của câu lệnh if quen thuộc. Nếu bạn đã từng phải tạo một cây lớn các câu lệnh if-else, bạn sẽ đánh giá cao việc đạt được kết quả mong muốn sẽ thuận tiện hơn như thế nào với switch. Bạn có thể tìm hiểu thêm trong Reference Manual. Hãy xem nó hoạt động trong đoạn mã dưới đây. Đây là chỉ báo Average True Range được tích hợp sẵn của chúng tôi, hiện sử dụng câu lệnh chuyển đổi để cung cấp các thuật toán khác nhau trong các tính toán của nó:

//@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)

Bộ Công cụ Vẽ

Một cải tiến lớn với công cụ vẽ trong Pine: new line.all, label.all, box.all, và table.all built-in biến mảng luôn chứa ID của tất cả các bản vẽ thuộc loại được chỉ định do tập lệnh của bạn vẽ.

Ví dụ: bạn có thể sử dụng để cắt bớt số lượng bản vẽ được hiển thị trên biểu đồ dựa trên giá trị do người dùng xác định. Trong tập lệnh bên dưới, chúng tôi vẽ một dòng trên mỗi lượt mở hàng ngày mới (tối đa giới hạn ~ 50, dựa trên giới hạn dòng mặc định của tập lệnh). Sau đó, chúng tôi kiểm tra xem số dòng được phép mặc dù đầu vào của tập lệnh đã vượt quá hay chưa và xóa dòng cũ nhất nếu có:

//@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

Một tính năng khác của Pine đã được chờ đợi từ lâu đi kèm với v5 là vòng lặp while. Câu lệnh while tạo ra một vòng lặp sẽ dừng khi điều kiện sai hoặc lệnh break được sử dụng trong vòng lặp.

Ví dụ: đây là một chỉ báo tính toán sự khác biệt giữa khoảng cách trung bình mà chúng ta cần nhìn lại để tìm âm lượng lên và xuống bằng tổng âm lượng của n thanh cuối cùng. Chúng ta càng cần nhìn lại để tìm khối lượng tăng hoặc giảm, giá trị của nó càng giảm hoặc tăng:

//@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)

Vòng lặp while của tập lệnh thực thi cho đến khi tìm thấy âm lượng yêu cầu trong cả khối lượng tăng và giảm và chúng tôi chưa nhìn lại quá số thanh tối đa được phép. Tập lệnh cũng giới thiệu một tính năng khác được thêm vào Pine v5: runtime.error().

runtime.error()

Hàm runtime.error() giờ đây có thể tạm dừng việc thực thi một tập lệnh và hiển thị thông báo lỗi trên bất kỳ điều kiện nào bạn có thể xác định trong Pine. Điều này sẽ hữu ích cho những người tạo tập lệnh, những người muốn ngăn người dùng sử dụng các chỉ báo của họ không chính xác. Nó cũng có thể được sử dụng như một công cụ gỡ lỗi không chính thống, để tạm dừng thực thi trong một vòng lặp hoặc từ bên trong một hàm, chẳng hạn.

Để sử dụng hàm mới, chỉ cần gọi hàm runtime.error () khi các điều kiện của bạn được đáp ứng. Khi thực thi, nó sẽ tạm dừng tập lệnh và hiển thị dấu chấm than quen thuộc bên cạnh tên của chỉ báo. Khi người dùng nhấp vào biểu tượng dấu chấm than, thông báo bạn đã sử dụng trong lệnh gọi hàm sẽ xuất hiện.

Đoạn mã dưới đây là chỉ báo VWAP đơn giản với hai lỗi tùy chỉnh. Biểu tượng đầu tiên xuất hiện khi mã không có bất kỳ dữ liệu khối lượng nào: VWAP được tính toán dựa trên khối lượng, vì vậy nếu không có khối lượng, tập lệnh không thể hoạt động. Cái thứ hai xuất hiện khi khung thời gian trên biểu đồ là 1D trở lên. Các phép tính VWAP cơ bản tích lũy dữ liệu trung bình động có trọng số theo khối lượng trên mỗi thanh mới và đặt lại vào đầu một ngày mới, vì vậy chỉ báo này chỉ hữu ích trên khung thời gian trong ngày.

//@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)

Các thông số chiến lược mới

Tin tốt cho các lập trình viên chiến lược! Chúng tôi đã thêm một loạt các biến và hàm mới cung cấp cho bạn khả năng hiển thị về các thuộc tính, thống kê và chỉ số giao dịch. Giá trị của chúng cập nhật khi trình giả lập nhà môi giới thực hiện lệnh của bạn, vì vậy bạn có thể theo dõi các giá trị khi chiến lược của bạn tiến triển.

Click vào đây để xem Pine Reference Manual để biết thông tin chi tiết cho từng loại

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

 

Không gian tên mới

Cộng đồng những người viết mã Pine của chúng tôi nói với chúng tôi rằng họ đánh giá cao tốc độ bổ sung chưa từng có mà chúng tôi đã thực hiện cho Pine trong vài năm qua và chúng tôi dự định sẽ duy trì tốc độ tương tự trong tương lai. Tuy nhiên, điều này tạo ra một dòng liên tục các hàm Pine mới và các biến tích hợp. Để hỗ trợ sự phát triển điên cuồng này, chúng tôi cần tổ chức tốt hơn khoảng 600 tên hiện tại được sử dụng trong ngôn ngữ. Chúng tôi đã làm điều này bằng cách thêm các không gian tên mới để nhóm các chức năng theo những cách phản ánh tốt hơn việc sử dụng chúng. Nhiều tên tham số hàm cũng được đổi tên để dễ hiểu hơn.

Một ví dụ về không gian tên mới là ta., Hiện bao gồm tất cả các biến và chức năng liên quan đến phân tích kỹ thuật. Điều này giúp bạn duyệt Sách hướng dẫn tham khảo dễ dàng hơn và tìm thấy tất cả các biến và hàm trả về giá trị của các chỉ số phổ biến. Theo đó, sma() giờ là ta.sma(). Việc ghi nhớ các vùng tên mới là không cần thiết; nếu bạn nhập tên cũ hơn của một hàm mà không có vùng tên của nó trong Trình chỉnh sửa và nhấn phím nóng Tự động điền (Ctrl + Dấu cách hoặc Cmd + Dấu cách trên MacOS), một cửa sổ bật lên hiển thị các đề xuất phù hợp sẽ xuất hiện: 

Tương tự khi tra cứu Hướng dẫn sử dụng tài liệu tham khảo; gõ một tên hàm quen thuộc mà không có vùng tên của nó sẽ hiển thị tên mới của nó. Bạn có thể xem danh sách đầy đủ các thay đổi đối với v5 trong Migration Guide.

Xuất bản Thư viện

Các ấn phẩm sau đây là ví dụ về các thư viện do PineCoders xuất bản trên TradingView giúp chúng tôi thử nghiệm các tính năng mới của Pine:

ColorScheme của RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

Chúng tôi hy vọng các tính năng mới này sẽ giúp bạn nhiều. Và mong bạn tiếp tục gửi đến cho chúng tôi những phản hồi, gợi ý – Chúng tôi xây dựng TradingView là cho bạn và cộng đồng.

Look first Then leap

TradingView được xây dựng dành cho bạn, vì vậy nhớ đảm bảo bạn tận dụng hiệu quả nhất các tính năng tuyệt vời của chúng tôi
Khởi chạy Biểu đồ