Tài nguyên đang được tải lên... tải...

FMZ PINE Script Doc

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2022-04-28 16:05:05, Cập nhật: 2024-10-12 17:25:27

[TOC]

img

Giới thiệu về từ khóa, ngữ pháp, cài đặt

Cấu trúc mã

Cấu trúc chung của mã trong Pine là:

<version>
<declaration_statement>
<code>

Chú ý

Ghi chú biểu tượng được hỗ trợ bởi ngôn ngữ Pine của FMZ: ghi chú một dòng//, ghi chú nhiều dòng/* */, chẳng hạn như phương pháp ghi chú trong ví dụ sau:

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // calculate the MACD indicator

/*
The plot function draws the indicator line on the chart
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')

Phiên bản

Một hướng dẫn trình biên dịch dưới dạng sau cho biết trình biên dịch phiên bản nào của Pine mà kịch bản được viết bằng:

//@version=5

mặc định là phiên bản V5, mà có thể được bỏ qua từ mã//@version=5.

Tuyên bố

  • indicator()
  • strategy()

Tuyên bố tuyên bố xác định loại kịch bản, từ đó xác định những gì được cho phép trong đó, và cách nó được sử dụng và thực thi. Đặt các thuộc tính chính của kịch bản, chẳng hạn như tên của nó, nơi nó sẽ xuất hiện khi nó được thêm vào biểu đồ, độ chính xác và định dạng của các giá trị số nó hiển thị, và một số giá trị số điều chỉnh hành vi thời gian chạy của nó, ví dụ, số lượng tối đa các đối tượng vẽ để hiển thị trong biểu đồ. Đối với các chiến lược, thuộc tính bao gồm các lập luận kiểm soát kiểm tra lại, chẳng hạn như vốn ban đầu, hoa hồng, trượt, vv.indicator()hoặcstrategy()tuyên bố phải được bao gồm trong một mã chiến lược trong Pine của FMZ.

Các dòng trong kịch bản không phải là bình luận hoặc hướng dẫn trình biên dịch, mà là các câu lệnh thực hiện thuật toán của kịch bản.

  • Tuyên bố biến thể
  • Việc phân bổ lại các biến
  • Tuyên bố chức năng
  • Các cuộc gọi hàm tích hợp, các cuộc gọi hàm được xác định bởi người dùng
  • if, for, whilehoặcswitchvà các cấu trúc khác

Báo cáo có thể được sắp xếp theo nhiều cách khác nhau

  • Một số câu lệnh có thể được thể hiện trong một dòng, chẳng hạn như hầu hết các tuyên bố biến, các dòng chỉ chứa một cuộc gọi hàm hoặc các tuyên bố hàm một dòng.
  • Các lệnh trong phạm vi toàn cầu của một kịch bản (tức là các phần không phải là một phần của một khối cục bộ) không thể bắt đầu với mộtspacehoặctabCác ký tự bắt đầu ở vị trí đầu tiên của một dòng theo định nghĩa là một phần của phạm vi toàn cầu của kịch bản.
  • Alocal blockluôn được yêu cầu cho các tuyên bố cấu trúc hoặc chức năng nhiều dòng. Một khối cục bộ phải được nhấp một tab hoặc bốn khoảng trống (nếu không, nó sẽ được phân tích như là mã liên kết của dòng trước, được xác định là nội dung liên tục của dòng mã trước), và mỗi khối cục bộ xác định phạm vi cục bộ khác nhau.
  • Nhiều câu chỉ dẫn một dòng có thể được liên kết trên một dòng bằng cách sử dụng dấu phẩy (,) làm phân định.
  • Một dòng có thể chứa bình luận hoặc chỉ bình luận.
  • Các đường cũng có thể được bọc (tiếp tục trên nhiều đường).

Ví dụ, bao gồm ba khối cục bộ, một trong tuyên bố hàm tùy chỉnh và hai trong tuyên bố biến bằng cách sử dụng cấu trúc if như sau:

indicator("", "", true)             // Declaration statement (global scope), can be omitted

barIsUp() =>                        // Function declaration (global scope)
    close > open                    // Local block (local scope)

plotColor = if barIsUp()            // Variable declaration (global scope)
    color.green                     // Local block (local scope)
else
    color.red                       // Local block (local scope)

runtime.log("color", color = plotColor)  // Call a built-in function to output the log (global scope)

Mã dòng mới

Các đường dài có thể được chia thành nhiều đường, hoặc bọc. Một đường bị bọc phải được nhét bằng bất kỳ lượng không gian trắng nào, miễn là nó không phải là số nhân của 4 (các ranh giới này được sử dụng để nhét các khối cục bộ).

a = open + high + low + close

Nó có thể được bọc như sau: (lưu ý rằng số lượng khoảng trống được nhấp vào mỗi dòng không phải là số nhân của 4):

a = open +
      high +
          low +
             close

Một cuộc gọi dài có thể được gói như sau:

close1 = request.security(syminfo.tickerid, "D", close)      // closing price data series of syminfo.tickerid daily level of the current trading pair
close2 = request.security(syminfo.tickerid, "240", close)    // closing price data series of syminfo.tickerid 240-minute level of the current trading pair
plot(ta.correlation(close, open, 100),                       // Line-long plot() calls can be wrapped
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

Các câu lệnh trong các tuyên bố hàm được xác định bởi người dùng cũng có thể được bọc. Tuy nhiên, vì một khối cục bộ phải bắt đầu một cách tổng hợp với một dấu chấm (4 khoảng trống hoặc 1 tab), khi chia nó vào dòng tiếp theo, sự tiếp tục của một câu lệnh phải bắt đầu với nhiều hơn một dấu chấm (không bằng 4 số nhân của khoảng trống). Ví dụ:

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)

a = test(close, open)
plot(a, title="a")

Dòng thời gian

Dòng thời gian không phải là một kiểu dữ liệu hoặc định dạng, thay vào đó, nó là một khái niệm về một cấu trúc cơ bản trong ngôn ngữ PINE. Được sử dụng để lưu trữ các giá trị thay đổi liên tục theo thời gian, mỗi giá trị tương ứng với một thời điểm trong thời gian. Cấu trúc của khái niệm chuỗi thời gian phù hợp để xử lý và ghi lại một loạt dữ liệu thay đổi theo thời gian.

Lấy biến tích hợpopenví dụ,openbiến tích hợp ghi lại giá mở của mỗi biểu diễn int BAR, nếu điều nàyopenlà một thời gian đại diện int 5 phút dữ liệu.openbiến ghi lại giá mở của mỗi 5 phút biểu diễn int BAR (bar).openĐể tham chiếu đến các giá trị trước (giá trị quá khứ) trong chuỗi thời gian, chúng tôi sử dụng[]Khi chiến lược được thực hiện trên một biểu diễn int BAR nhất định,open[1]Ý nghĩa là đề cập đến giá mở đầu của đại diện int trước đó BAR của đại diện int hiện tại BAR.

Mặc dùDòng thời gianlà rất giống với cấu trúc dữ liệu array, mặc dù ngôn ngữ PINE cũng có một loại mảng.

Các chuỗi thời gian được thiết kế trong ngôn ngữ của cây thông có thể dễ dàng tính toán giá trị tích lũy của giá đóng cửa trong mã chiến lược, và không cần phải sử dụng các cấu trúc vòng như cho, chỉ có chức năng tích hợpta.cum(close)Trong một ví dụ khác, chúng ta cần tính giá trị trung bình của sự khác biệt giữa giá cao nhất và giá thấp nhất của 14 int biểu diễn BAR cuối cùng (tức là 14 int biểu diễn BAR gần nhất với thời điểm hiện tại khi mã được thực thi), có thể được viết như sau:ta.sma(high - low, 14)

Kết quả gọi một hàm trên một chuỗi thời gian cũng sẽ để lại một dấu vết trên chuỗi thời gian, một lần nữa chúng ta sử dụng[]Ví dụ, khi kiểm tra xem giá đóng của biểu diễn int hiện tại BAR vượt quá giá trị tối đa của giá cao nhất trong 10 biểu diễn int cuối cùng BAR (không bao gồm biểu diễn int hiện tại BAR).breach = close > ta.highest(close, 10)[1], và chúng ta cũng có thể viếtbreach = close > ta.highest(close[1], 10)Vậy.ta.highest(close, 10)[1]ta.highest(close[1], 10)là tương đương.

Điều này có thể được xác minh bằng mã sau:

strategy("test pine", "test", true) 

a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)

plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)

Mã thử nghiệm ở trên sẽ phát ra các giá trị của a và b trên mỗi BAR trong chuỗi thời gian tương ứng.

Các lập luận mẫu của thư viện lớp thương mại ngôn ngữ thông

Hướng dẫn để thiết lập các lập luận của mẫu Pine Language Trade Class Library của chiến lược PINE.

img

Cài đặt giao dịch

  • Chế độ thực thi Mô hình giá đóng cửa: Mô hình được thực hiện chỉ sau khi BAR hiện tại được hoàn thành và giao dịch được thực hiện khi BAR tiếp theo bắt đầu. Mô hình giá thời gian thực: Mô hình được thực hiện mỗi khi giá di chuyển, và có một tín hiệu để thực hiện giao dịch ngay lập tức.
  • Kích thước lô mở mặc định: Nếu lệnh giao dịch không xác định số tiền giao dịch, giao dịch sẽ được thực hiện theo số tiền đã thiết lập.
  • Số lượng đặt hàng tối đa cho một giao dịch duy nhất: Xác định số lượng tối đa của mỗi lệnh để tránh ảnh hưởng đến thị trường theo thị trường thực tế và thiết lập lập lập luận này.
  • Điểm trượt: Xác định trượt khi đặt lệnh theoPricing Currency PrecisionVí dụ, độ chính xác tiền tệ định giá được đặt là 2, chính xác đến dấu thập phân thứ hai, chính xác đến 0,01. Sau đó, mỗi điểm điểm trượt đại diện cho 0,01 đơn vị định giá. Tại thời điểm này, điểm trượt được đặt là 5, và sự trượt khi đặt lệnh là 0,05 (slip đề cập đến phần giá tràn ra khi đặt lệnh giao dịch tốt hơn và lệnh khuyết tật).
  • Số thời gian dài nhất của biến: ảnh hưởng đến số lượng K-line BAR trong biểu đồ.SetMaxBarLentrongjavascript srategy.

Các lựa chọn tương lai

  • Mã đa dạng: mã hợp đồng, nó chỉ cần được đặt khi đối tượng trao đổi là đối tượng trao đổi không phải tại chỗ.
  • Số lượng giao dịch tối thiểu: Số lượng giao dịch tối thiểu của hợp đồng khi đặt lệnh.

Các tùy chọn giao dịch trực tiếp

  • Tiến độ khôi phục tự động: Khôi phục tự động trạng thái trước khi dừng chiến lược cuối cùng.
  • Thời gian thử lại lệnh: Nếu lệnh không được thực hiện, lệnh sẽ bị hủy và lệnh sẽ được đặt lại để thử giao dịch.
  • Khoảng thời gian thăm dò mạng (milliseconds): Chỉ có hiệu lực cho giao thức REST, nó kiểm soát khoảng thời gian yêu cầu mạng để ngăn chặn các yêu cầu quá thường xuyên và vượt quá giới hạn trao đổi.
  • Thời gian đồng bộ hóa tài khoản (giây): thời gian đồng bộ hóa dữ liệu tài khoản.
  • Thời gian đồng bộ hóa vị trí sau khi mở một vị trí (tỷ giây): Chỉ đối với các vị trí lặp lại do sự chậm trễ dữ liệu trong một số sàn giao dịch, việc thiết lập thời gian đồng bộ hóa lớn hơn có thể giảm bớt các vấn đề như vậy.
  • Nâng cao đòn bẩy: thiết lập số đòn bẩy.

Giao dịch tại chỗ, các thiết lập khác

  • Số lượng giao dịch của một lô: khối lượng giao dịch mặc định của một lô, chỉ có giá trị tại chỗ.
  • Số lượng giao dịch tối thiểu: Số lượng giao dịch tối thiểu.
  • Định giá chính xác tiền tệ: Độ chính xác của giá, tức là số lượng chữ số thập phân trong giá.
  • Độ chính xác của loại giao dịch: độ chính xác của số lượng đơn đặt hàng, tức là số lượng vị trí thập phân của số lượng đơn đặt hàng.
  • Phí xử lý: Tính toán một số dữ liệu theo cài đặt này, 0,002 có nghĩa là 2/1000.
  • Khoảng thời gian thống kê lợi nhuận và lỗ: Nó chỉ được sử dụng để hiển thị thống kê lợi nhuận và lỗ trên thị trường thực.
  • Thử lại thất bại (ms): Khoảng thời gian thử lại khi yêu cầu mạng thất bại.
  • Sử dụng proxy: Chỉ hợp lệ cho giao thức REST.
  • ẩn lỗi mạng phổ biến: ẩn nhật ký lỗi phổ biến trong khu vực nhật ký.
  • Địa chỉ cơ sở chuyển đổi: chỉ hợp lệ cho giao thức REST.
  • Thông báo đẩy: nhắn đẩy đến hộp thư, v.v.

Giao dịch đơn đặt hàng

Vị trí mở

strategy(title = "open long example", pyramiding = 3)                                // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.01)                                         // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10))       // The condition is triggered, the order is executed, and the market price opens a long position
strategy.entry("long3", strategy.long, 0.03, limit = 30000)                          // Specify the (lower) price, plan to place a buy order, wait for a deal to open a position, and open a position at a limit price

Vị trí đóng cửa

strategy(title = "close long example", pyramiding = 2)                              // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.1)                                         // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.1)                                         // Open a long position at the market price, specify the group label as long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%")   // To close a position, specify to close 50% of the positions whose group label is long1
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%")   // To close a position, specify to close 80% of the positions whose group label is long2

Cơ chế thương mại

Cơ chế vị trí của ngôn ngữ PINE tương tự như vị trí một chiều. Ví dụ, khi giữ một vị trí theo hướng dài (vị trí dài), nếu có lệnh bán, lệnh được lên kế hoạch, v.v. (trong hướng ngược lại của vị trí), việc thực hiện sẽ được kích hoạt, và vị trí theo hướng dài sẽ được đóng đầu tiên. (Khép tất cả các vị trí dài), và sau đó thực hiện lệnh kích hoạt (trong hướng ngược lại so với vị trí trước khi đóng).

Trật tự dự kiến

Khi đặt lệnh bằng lệnh đặt lệnh, nếu không có giá nào được chỉ định, mặc định là lệnh thị trường. Ngoài lệnh thị trường, bạn cũng có thể đặt lệnh thông qua lệnh được lên kế hoạch, không hoạt động ngay lập tức để đặt lệnh.Đơn đặt hàng thực tế/kiểm tra hậu quảHệ thống sẽ chỉ đặt lệnh khi giá thị trường thời gian thực đáp ứng các điều kiện để kích hoạt các lệnh được lên kế hoạch. Do đó, nó là bình thường cho các lệnh này có một sự lệch nhẹ trong giá giao dịch.strategy.entrychức năng để đặt một đơn đặt hàng, chúng ta có thể chỉ địnhlimit, stop arguments.

var isTrade = false 
if not barstate.ishistory and not isTrade
    isTrade := true 
    strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order")                     // stop
    strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order")                    // limit
    strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order")   // stop-limit    
  • lệnh giới hạn

    Đặt giá giới hạn của lệnh.directionlập luận làstrategy.long), lệnh sẽ chỉ được kích hoạt khi giá thị trường hiện tại thấp hơn giá này. Khi lệnh là một lệnh bán (tức là,directionlập luận làstrategy.short), lệnh sẽ chỉ được kích hoạt nếu giá thị trường hiện tại cao hơn giá này.

  • lệnh dừng

    Đặt giá dừng lỗ của lệnh. Khi lệnh là lệnh mua, lệnh sẽ chỉ được kích hoạt khi giá thị trường hiện tại cao hơn giá này. Khi lệnh là lệnh bán, lệnh sẽ chỉ được kích hoạt nếu giá hiện tại của thị trường thấp hơn giá đó.

  • lệnh dừng giới hạn

    Cáclimitstopcác đối số có thể được thiết lập cùng một lúc, và lệnh sẽ được kích hoạt ở mức giá đáp ứng các điều kiện đầu tiên.

Trình tự phần trăm vốn chủ sở hữu

//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)  

// Simple moving average crossover strategy
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// If the moving average crossover condition is met, buy or sell
if (longCondition)
    strategy.entry("Long", strategy.long)  

if (shortCondition)
    strategy.entry("Short", strategy.short)
  

Sau khi xác địnhdefault_qty_type=strategy.percent_of_equity, đặtdefault_qty_valueSố lượng đơn đặt hàng được tính theo số tiền được mệnh giá bằng tiền tệ trong tài khoản. Ví dụ: nếu tài khoản lưu hành có 10.000 USDT, đặt đơn đặt hàng 1% có nghĩa là đặt đơn đặt hàng với tỷ lệ 100 USDT (được tính dựa trên giá hiện tại khi bán).

Tuyên bố, cấu trúc logic từ khóa

var

var là một từ khóa được sử dụng để phân bổ và khởi tạo một lần các biến. Nói chung, ngữ pháp gán biến mà không chứa từ khóa var làm cho giá trị của biến s được ghi đè mỗi khi dữ liệu được cập nhật. Ngược lại, khi các biến được gán bằng từ khóa var, chúng có thể giữ trạng thái bất chấp cập nhật dữ liệu, thay đổi nó chỉ khi các điều kiện trong biểu thức if được đáp ứng.

var variable_name = expression

Giải thích:

  • variable_name- Bất kỳ tên nào của biến người dùng được phép trong Pine Script (nó có thể chứa ký tự Latinh chữ cái lớn và chữ cái nhỏ, số và dấu gạch dưới (_), nhưng nó không thể bắt đầu với một số).
  • expression- Bất kỳ biểu thức toán học nào, giống như định nghĩa một biến định kỳ.

Ví dụ

// Var keyword example
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
    var x = close
    b := x
    green_bars_count := green_bars_count + 1
    if green_bars_count >= 10
        var y = close
        c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")

Các biến a giữ giá đóng của thanh đầu tiên của mỗi thanh trong loạt. Chất biến b giữ giá đóng của thanh giá green đầu tiên trong chuỗi. Chất biến c giữ giá đóng của thanh green thứ mười trong chuỗi.

Trên FMZ, nó được chia thành mô hình giá thời gian thực và mô hình giá đóng cửa.varvarip.

strategy("test pine", "test 1", true) 

// Test var varip
var i = 0
varip ii = 0

// Print the i and ii changed in each round of the strategy logic on the graph
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)

// Each round of logic execution increments i and ii by 1
if true
    i := i + 1
    ii := ii + 1
  • Mô hình giá thời gian thực Mã thử nghiệm trên được thực hiện trong hai giai đoạn: 1. giai đoạn đại diện int lịch sử. 2. giai đoạn đại diện int thời gian thực. Trong mô hình giá thời gian thực, giai đoạn đại diện int lịch sử, các biến i và ii được khai báo bởivar, varipđược thực hiện từng bước tại mỗi vòng thực thi mã chiến lược (vìif trueVì vậy, có thể thấy rằng các số được hiển thị trên biểu diễn int BAR của kết quả backtest được tăng thêm 1 một lần. Khi giai đoạn biểu diễn int lịch sử kết thúc, giai đoạn biểu diễn int thời gian thực bắt đầu.var, varipVì nó là một mô hình giá thời gian thực, mã chiến lược sẽ được thực hiện một lần cho mỗi thay đổi giá trong một biểu diễn int BAR,i := i + 1ii := ii + 1giá trị của i sẽ không được cập nhật cho đến khi biểu diễn int hiện tại BAR được hoàn thành (tức là giá trị trước đó sẽ không được khôi phục khi biểu diễn logic chiến lược được thực hiện trong vòng tiếp theo). Vì vậy, có thể thấy rằng biến i vẫn tăng 1 cho mỗi BAR. Nhưng biến ii được tích lũy nhiều lần cho mỗi BAR.

  • Mô hình giá đóng cửa Vì mô hình giá đóng thực hiện chiến lược logic chỉ một lần mỗi đại diện int BAR đi.varvariptrong ví dụ trên, hành vi chính xác giống nhau tăng dần ở mô hình giá đóng cửa, cả trong giai đoạn đại diện int lịch sử và giai đoạn đại diện int thời gian thực, tăng thêm 1 cho mỗi đại diện int BAR.

khác nhau

varp (var intrabar persist) là một từ khóa được sử dụng để gán và khởi tạo một lần các biến. Nó tương tự như từ khóa var, nhưng một biến được khai báo bằng varip giữ giá trị của nó giữa các bản cập nhật nến trực tiếp.

varip variable_name = expression

Giải thích:

  • variable_name- Bất kỳ tên nào của biến người dùng được phép trong chữ viết Pine (nó có thể chứa ký tự Latinh chữ cái lớn và chữ cái nhỏ, số và dấu gạch dưới (_), nhưng nó không thể bắt đầu bằng một số).
  • expression- Bất kỳ biểu thức toán học nào, như thời gian xác định biến số thường xuyên.

Ví dụ

// varip
varip int v = -1
v := v + 1
plot(v)

Khi sử dụng var, đồ thị sẽ trả về giá trị của bar_index. Với varip, hành vi tương tự xảy ra trên các thanh lịch sử, nhưng trên các thanh trực tiếp, biểu đồ trả về một giá trị tăng một cho mỗi dấu chấm.

Nhận xétNó chỉ có thể được sử dụng với các loại đơn giản như float, int, bool, string và mảng của các loại này.

đúng

Nó đại diện cho giá trị của một biến bool, hoặc một giá trị có thể được tính khi một biểu thức sử dụng mộtso sánhhoặchợp lý operator.

Nhận xétVui lòng xem mô tả củaSo sánhCác nhà khai thác vàhợp lý. Operators.

Xem thêm bool

sai

Nó đại diện cho giá trị của một biến bool và kết quả của các hoạt động so sánh và các hoạt động logic.

Nhận xétVui lòng xem mô tả củaSo sánhCác nhà khai thác vàhợp lý. Operators.

Xem thêm bool

nếu

Một câu lệnh If định nghĩa một khối các câu lệnh phải được thực thi khi điều kiện của một biểu thức được đáp ứng.

Mã chung từ:

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    ...
    var_decl_thenN
    return_expression_then
else if [optional block]
    var_decl_else0
    var_decl_else1
    ...
  var_decl_elseN
  return_expression_else
else
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else

Nhận xét var_declarationX- Chất biến này nhận được giá trị của câu lệnh ifcondition- Nếu điều kiện là đúng, logic trong lệnh khốithenđược sử dụng (var_decl_then0, var_decl_then1Nếu điều kiện là sai, logic trong khối câu lệnhelse ifhoặcelseđược sử dụng (var_decl_else0, var_decl_else1, v.v.).return_expression_thenreturn_expression_else- biểu thức cuối cùng trong mô-đun hoặc biểu thức từ khối else trả về giá trị cuối cùng của câu lệnh.

Loại giá trị trả về của câu lệnh if phụ thuộc vào loạireturn_expression_thenreturn_expression_else. Khi chạy trên TradingView, các loại của chúng phải khớp: khi bạn có giá trị chuỗi trong khối else, không thể trả về giá trị nguyên từ khối đó. Khi chạy trên FMZ, ví dụ sau sẽ không báo cáo lỗi. Khi giá trị y là open, giá trị của đồ thị khi vẽ là n/a.

Ví dụ

// This code compiles
x = if close > open
    close
else
    open  

// This code doesn't compile by trading view
// y = if close > open
//     close
// else
//     "open"
plot(x)

Cácelsetrong trường hợp này, nếu điều kiện là false, biến var_declarationX được gán giá trị empty (na, false, hoặc ):

Ví dụ

// if
x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)

Nhiều khối else if có thể được sử dụng hoặc không sử dụng. Các khối then, else if, else được di chuyển bốn khoảng trống:

Ví dụ

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

Giá trị kết quả củaifNó có thể hữu ích nếu bạn cần các tác dụng phụ của các biểu thức, ví dụ trong giao dịch chiến lược:

Ví dụ

if (ta.crossover(high, low))
    strategy.entry("BBandLE", strategy.long, stop=low)
else
    strategy.cancel(id="BBandLE")

Nếu các câu lệnh có thể chứa nhau:

Ví dụ

// if
float x = na
if close > open
    if close > close[1]
        x := close
    else
        x := close[1]
else
    x := open
plot(x)

cho

Các cấu trúc for cho phép nhiều câu lệnh được thực hiện nhiều lần:

[var_declaration =] for counter = from_num to to_num [by step_num]
    statements | continue | break
    return_expression

var_declaration- Một tuyên bố biến tùy chọn sẽ được gán như là giá trị của loops return_expression.counter- Một biến giữ giá trị đếm vòng lặp, tăng / giảm bằng 1 hoặc giá trị step_num trên mỗi lần lặp lại của vòng lặp.from_num- Giá trị bắt đầu của bộ đếm. series int/float giá trị/các biểu thức được phép.to_num- Giá trị cuối cùng của bộ đếm. Vòng lặp bị phá vỡ khi bộ đếm lớn hơn to_num (hoặc nhỏ hơn to_num trong trường hợp từ_num > to_num). series int/float giá trị/expressions được phép, nhưng chúng chỉ được đánh giá trên lần lặp đầu tiên của vòng lặp.step_num- Giá trị gia tăng / giảm của bộ đếm. Nó là tùy chọn. mặc định là +1 hoặc -1, tùy thuộc vào số lớn nhất của from_num hoặc to_num. Khi sử dụng các giá trị, bộ đếm cũng được gia tăng / giảm theo số lớn nhất của from_num hoặc to_num, vì vậy dấu +/- của step_num là tùy chọn.statements | continue | break- Bất kỳ số câu lệnh, hoặc các từ khóa tiếp tục hoặc break , được nhấp vào 4 khoảng trống hoặc một tab.return_expression- Giá trị trả về của vòng lặp, nếu có, được gán cho biến trong var_declaration. Nếu vòng lặp kết thúc do các từ khóa continue hoặc break, giá trị trả về của vòng lặp là giá trị trả về của biến cuối cùng được gán giá trị trước khi vòng lặp kết thúc.continue- Một từ khóa chỉ có thể được sử dụng trong vòng lặp.break- Từ khóa để thoát khỏi vòng lặp.

Ví dụ

// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
    int result = 0
    for i = 1 to lookback
        if close[i] > close
            result += 1
    result
plot(qtyOfHigherCloses(14))

Xem thêm for...in while

cho... trong

Cácfor...inconstruct cho phép lặp lại nhiều câu lệnh cho mỗi phần tử trong mảng. Nó có thể được sử dụng với bất kỳ đối số nào:array_element, hoặc với hai lập luận:[index, array_element]. Hình thức thứ hai không ảnh hưởng đến chức năng của vòng lặp. Nó theo dõi chỉ số của lặp hiện tại trong biến đầu tiên của tuple.

[var_declaration =] for array_element in array_id
    statements | continue | break
    return_expression

[var_declaration =] for [index, array_element] in array_id
    statements | continue | break
    return_expression

var_declaration- Một tuyên bố biến tùy chọn mà sẽ được gán giá trị của các vòng lặpreturn_expression. index- Một biến tùy chọn theo dõi chỉ số lặp hiện tại. Chỉ số bắt đầu từ 0. Các biến là không thể thay đổi trong cơ thể vòng lặp. Khi được sử dụng, nó phải được chứa trong một tuple cũng chứaarray_element. array_element- Một biến chứa mỗi phần tử mảng liên tiếp được xử lý trong vòng lặp.array_id- ID mảng của vòng lặp lặp.statements | continue | break- Bất kỳ số câu lệnh, hoặc các từ khóa tiếp tục hoặc break , được nhấp vào 4 khoảng trống hoặc một tab.return_expression- Giá trị trả về của vòng lặp được gán cho biến trongvar_declarationNếu vòng lặp kết thúc do các từ khóa continue hoặc break, giá trị trả về của vòng lặp là biến được gán lần cuối trước khi vòng lặp kết thúc.continue- Một từ khóa chỉ có thể được sử dụng trong vòng lặp.break- Từ khóa để thoát khỏi vòng lặp.

Cho phép sửa đổi các phần tử của mảng hoặc kích thước của chúng trong một vòng lặp. Ở đây, chúng tôi sử dụng một đối số hình thức củafor...inđể xác định, cho mỗi thanh, bao nhiêu thanh có giá trị OHLC lớn hơn SMA của giá trị close:

Ví dụ

// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[ ] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
    int result = 0
    for currentElement in array
        if currentElement > value
            result += 1
        result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))

Ở đây, chúng ta sử dụng hình thức hai đối số của cho... trong để thiết lập các giá trị của chúng tôiisPosmảng đếntruekhi giá trị tương ứng của họ trongvaluesArraymảng là dương tính:

Ví dụ

// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)  

for [index, value] in valuesArray
    if value > 0
        array.set(isPos, index, true)  

if barstate.islastconfirmedhistory
    runtime.log(str.tostring(isPos))

Xem thêm for while array.sum array.min array.max

trong khi

Cácwhilecâu lệnh cho phép lặp đi lặp lại có điều kiện của các khối mã gốc.

variable_declaration = while boolean_expression
    ...
    continue
    ...
    break
    ...
    return_expression

Giải thích:variable_declaration- Thông báo biến tùy chọn.return expressioncó thể cung cấp một giá trị khởi tạo cho biến này.boolean_expression- Nếu đúng, thực hiện khối địa phương củawhileNếu không đúng, việc thực thi kịch bản tiếp tục sau khiwhile statement. continue- Cáccontinuetừ khóa làm cho vòng lặp phân nhánh đến lần lặp tiếp theo.break- CácbreakChữ khóa làm cho vòng lặp kết thúc.while statement. return_expression- Dòng tùy chọn cung cấp giá trị trả vềwhile statement.

Ví dụ

// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter   = i_n
int factorial = 1
while counter > 0
    factorial := factorial * counter
    counter   := counter - 1

plot(factorial)

Nhận xétCác khối mã gốc sau khi ban đầuwhileđể kết thúc mộtwhilevòng lặp, biểu thức boolean sauwhilephải trở thành sai, hoặcbreakphải bị hành quyết.

chuyển đổi

Người vận hành chuyển đổi chuyển điều khiển sang một trong một số câu lệnh dựa trên điều kiện và giá trị của biểu thức.

[variable_declaration = ] switch expression
    value1 => local_block
    value2 => local_block
    ...
    => default_local_block

[variable_declaration = ] switch
    boolean_expression1 => local_block
    boolean_expression2 => local_block
    ...
    => default_local_block

chuyển đổi với biểu thức:

Ví dụ

// Switch using an expression

string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])

float ma = switch i_maType
    "EMA" => ta.ema(close, 10)
    "SMA" => ta.sma(close, 10)
    "RMA" => ta.rma(close, 10)
    // Default used when the three first cases do not match.
    => ta.wma(close, 10)

plot(ma)

chuyển đổi mà không có biểu thức:

Ví dụ

strategy("Switch without an expression", overlay = true)

bool longCondition  = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

switch
    longCondition  => strategy.entry("Long ID", strategy.long)
    shortCondition => strategy.entry("Short ID", strategy.short)

Quay lạiGiá trị của biểu thức cuối cùng trong khối lệnh cục bộ được thực thi.

Nhận xétChỉ có một tronglocal_blockcác trường hợp hoặcdefault_local_blockcó thể bị hành quyết.default_local_blockchỉ được giới thiệu với=>tag, và chỉ được thực hiện nếu khối trước đó không được thực hiện.switchtuyên bố được gán cho một biến vàdefault_local_blockkhông được chỉ định, lệnh trả vềnanếulocal_blockKhi gán kết quả của mộtswitchtuyên bố cho một biến, tất cảlocal_blockcác instance phải trả về một giá trị cùng kiểu.

Xem thêm if ?:

loạt

series là một từ khóa chỉ ra kiểu chuỗi dữ liệu.series keyword.

Người điều hành

=

Được sử dụng để gán giá trị cho các biến, nhưng chỉ khi biến được khai báo (được sử dụng lần đầu tiên).

:=

Định giá trị cho biến bên trái. Sử dụng để gán giá trị cho các biến đã được tuyên bố trước đó.

!=

Không bằng với. áp dụng cho các biểu thức của bất kỳ loại nào.

expr1 != expr2

Quay lạiGiá trị boolean, hoặc một chuỗi các giá trị boolean.

%

Modulo (số nguyên còn lại) áp dụng cho các biểu thức số.

expr1 % expr2

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

Nhận xétTrong Pine Script, khi số nguyên còn lại được tính toán, tỷ lệ được cắt ngắn, tức là làm tròn về phía giá trị tuyệt đối thấp nhất. Giá trị kết quả sẽ có cùng dấu hiệu như cổ tức.

Ví dụ: -1 % 9 = -1 - 9 * cắt giảm(-1/9) = -1 - 9 * cắt giảm(-0.111) = -1 - 9 * 0 = -1.

%=

Đặt Modulo áp dụng cho các biểu thức số.

expr1 %= expr2

Ví dụ

// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

*

Đặt phép nhân, áp dụng cho các biểu thức số.

expr1 * expr2

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

*=

Đặt phép nhân, áp dụng cho các biểu thức số.

expr1 *= expr2

Ví dụ

// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

+

Thêm hoặc cộng đơn. áp dụng cho các biểu thức số hoặc chuỗi.

expr1 + expr2
+ expr

Quay lạiNhị phân+của chuỗi trả về sự kết hợp của expr1 và expr2 Số trả về một số nguyên hoặc giá trị dấu phẩy động, hoặc một chuỗi các giá trị: Binary + trả về expr1 cộng với expr2. Unary + trả về expres (không có gì được thêm vào đối xứng toán tử unary).

Nhận xétBạn có thể sử dụng các toán tử số học với các số cũng như với các biến chuỗi.

+=

Đặt thêm áp dụng cho các biểu thức số hoặc chuỗi.

expr1 += expr2

Ví dụ

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

Quay lạiĐối với chuỗi, trả về kết nối của expr1 và expr2. Đối với số, trả về một số nguyên hoặc giá trị phơi, hoặc chuỗi giá trị.

Nhận xétBạn có thể sử dụng các toán tử số học với các số cũng như với các biến chuỗi.

-

Phân trừ hoặc trừ số đơn áp dụng cho các biểu thức số.

expr1 - expr2
- expr

Quay lạiTrả về một số nguyên hoặc giá trị dấu phẩy động, hoặc chuỗi các giá trị: Binary + trả về expr1 trừ expr2. Đơn vị-trả về sự phủ nhận của expr.

Nhận xétBạn có thể sử dụng các toán tử số học với các số cũng như với các biến chuỗi.

-=

Đặt phép trừ. áp dụng cho các biểu thức số.

expr1 -= expr2

Ví dụ

// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

/

Đặt phân chia. áp dụng cho các biểu thức số.

expr1 / expr2

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

/=

Đặt phân chia. áp dụng cho các biểu thức số.

expr1 /= expr2

Ví dụ

// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)

Quay lạiGiá trị nguyên hoặc phơi, hoặc chuỗi các giá trị.

<

Ít hơn. áp dụng cho các biểu thức số.

expr1 < expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

<=

Ít hơn hoặc bằng. áp dụng cho các biểu thức số.

expr1 <= expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

==

Tương đương với. áp dụng cho các biểu thức của bất kỳ loại nào.

expr1 == expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

=>

Các toán tử => được sử dụng trong user-defined function declarations vàswitch statements.

Ngữ pháp tuyên bố hàm là:

<identifier>([<argument_name>[=<default_value>]], ...) =>
    <local_block>
    <function_result>

A<local_block>là không hoặc nhiều lệnh Pine Script.<function_result>là một biến, một biểu thức, hoặc một tuple.

Ví dụ

// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) => 
    sum = x + y
    sumChange = ta.change(sum, 10)
    // Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))

Nhận xétBạn có thể tìm hiểu thêm về các chức năng được xác định bởi người dùng trong các trang trong Hướng dẫn người dùng về Phương thức tuyên bố và thư viện kịch bản.

>

Ứng dụng cho các biểu thức số.

expr1 > expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

>=

To hơn hoặc bằng với. áp dụng cho các biểu thức số.

expr1 >= expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

?:

Đơn vị điều kiện thứ ba.

expr1 ? expr2 : expr3

Ví dụ

// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)  

// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)

Quay lạiExpr2 nếu Expr1 được đánh giá là true, Expr3 nếu không. Giá trị không (0 và cũng là NaN, +Infinity, -Infinity) được coi là sai, bất kỳ giá trị nào khác là true.

Nhận xétSử dụng na cho else nhánh nếu bạn không cần nó. Bạn có thể kết hợp hai hoặc nhiều hơn?: toán tử để đạt được tương đương với một câu lệnh giống như switch (xem ví dụ ở trên). Bạn có thể sử dụng các toán tử số học với các số cũng như với các biến hàng.

Xem thêm na

[]

Chữ ký tự chuỗi. Cho phép truy cập vào các giá trị trước của chuỗi expr1. expr2 là số thanh trong quá khứ, và nó phải là số.

expr1[expr2]

Ví dụ

// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
    a := low
plot(a)

Quay lạiMột loạt các giá trị.

Xem thêm math.floor

Và logic. áp dụng cho các biểu thức boolean.

expr1 and expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

hoặc

Có thể áp dụng cho các biểu thức boolean.

expr1 or expr2

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

không

Từ chối logic (NOT) áp dụng cho các biểu thức boolean.

not expr1

Quay lạiGiá trị boolean, hoặc chuỗi các giá trị boolean.

Từ khóa kiểu dữ liệu

bool

Từ khóa được sử dụng để tuyên bố rõ ràng loại bool (boolean) của một biến hoặc một đối số. Bool biến có thể có giá trị: true, false hoặc na.

Ví dụ

// bool
bool b = true    // Same as `b = true`
b := na
plot(b ? open : close)

Nhận xétNói rõ về kiểu trong tuyên bố biến là tùy chọn, ngoại trừ khi nó được khởi tạo bằng na. Tìm hiểu thêm về kiểu Pine Script trong trang Sổ tay người dùng trên Hệ thống kiểu.

Xem thêm var varip int float color string true false

int

Từ khóa được sử dụng để tuyên bố rõ ràng loại int (tổng) của một biến hoặc một đối số.

Ví dụ

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

Nhận xétNói rõ về kiểu trong tuyên bố biến là tùy chọn, ngoại trừ khi nó được khởi tạo bằng na. Tìm hiểu thêm về kiểu Pine Script trong trang Sổ tay người dùng trên Hệ thống kiểu.

Xem thêm var varip float bool color string

trôi

Từ khóa được sử dụng để tuyên bố rõ ràng loại float (điểm nổi) của một biến hoặc một đối số.

Ví dụ

// float
float f = 3.14    // Same as `f = 3.14`
f := na
plot(f)

Nhận xétViệc đề cập rõ ràng đến loại trong tuyên bố biến là tùy chọn, ngoại trừ khi nó được khởi tạo bằng na.

Xem thêm var varip int bool color string

chuỗi

Từ khóa được sử dụng để tuyên bố rõ ràng loại string của một biến hoặc một đối số.

Ví dụ

// string
string s = "Hello World!"    // Same as `s = "Hello world!"`
// string s = na // same as "" 
plot(na, title=s)

Nhận xétNói rõ về kiểu trong tuyên bố biến là tùy chọn, ngoại trừ khi nó được khởi tạo bằng na. Tìm hiểu thêm về kiểu Pine Script trong trang Sổ tay người dùng trên Hệ thống kiểu.

Xem thêm var varip int float bool str.tostring str.format

màu sắc

Từ khóa được sử dụng để tuyên bố rõ ràng loại color của một biến hoặc một đối số.

Ví dụ

// color
color textColor = color.green
if barstate.islastconfirmedhistory
    runtime.log("test", textcolor = textColor)

Nhận xétCác chữ cái có định dạng như sau: #RRGGBB hoặc #RRGGBBAA. Các cặp chữ cái đại diện cho các giá trị thập phân 00 đến FF (0 đến 255 trong thập phân), trong đó các cặp RR, GG và BB là các giá trị cho các thành phần màu đỏ, xanh lá cây và xanh dương. AA là một giá trị tùy chọn cho độ minh bạch của màu (hoặc thành phần alpha) trong đó 00 là vô hình và FF mờ. Khi không có cặp AA được cung cấp, FF được sử dụng. Các chữ cái thập phân có thể là chữ cái lớn hoặc nhỏ.

Nói rõ về kiểu trong tuyên bố biến là tùy chọn, ngoại trừ khi nó được khởi tạo bằng na. Tìm hiểu thêm về kiểu Pine Script trong trang Sổ tay người dùng trên Hệ thống kiểu.

Xem thêm var varip int float string color.rgb color.new

mảng

Từ khóa được sử dụng để tuyên bố rõ ràng loại array của một biến hoặc một đối số.array.new<type>, array.from function.

Ví dụ

// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))

Nhận xétCác đối tượng mảng luôn có dạng series.

Xem thêm var array.new array.from

Các đối tượng

Các đối tượng trong ngôn ngữ PINE là các trường hợp của các loại được xác định bởi người dùng (UDT), có thể được hiểu là các lớp không có phương pháp cho phép người dùng tạo các loại tùy chỉnh trong các chiến lược để tổ chức các giá trị khác nhau trong một thực thể.

Định nghĩa các loại

Hãy xác định một loại lệnh để lưu trữ thông tin lệnh:

type order
    float price
    float amount
    string symbol
  • Các loại được khai báo bằng cách sử dụngtype keyword.
  • Từ khóa kiểu được theo sau bởi tên kiểu.
  • Loại dòng đầu tiên xác định tên kiểu, chốt bốn khoảng trống và xác định các trường có trong kiểu.
  • Mỗi trường cần phải tuyên bố kiểu dữ liệu của nó, chẳng hạn như int, float, string.

Tạo các đối tượng

Sử dụng loại được khai báo, gọinew()hàm để tạo một đối tượng:

order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)

Bạn cũng có thể tạo các đối tượng trống:

order order1 = na

Hãy xem một ví dụ thực tế:

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1)   // Output {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}

Trong ví dụ này:

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

Nó cũng có thể được viết như sau:

order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

Loại đối tượng để sử dụng từ khóa var

//@version=5
indicator("Objects using `var` demo")

//@type A custom type to hold index, price, and volume information.
type BarInfo
    int   index = bar_index
    float price = close
    float vol   = volume

//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()

// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")

Khi bạn sử dụng từ khóa var để tuyên bố một biến được gán cho một đối tượng có kiểu được xác định bởi người dùng, từ khóa sẽ tự động áp dụng cho tất cả các trường của đối tượng. Điều này có nghĩa là một đối tượng được tuyên bố bằng từ khóa var sẽ duy trì trạng thái của nó giữa mỗi lần lặp mà không cần phải khởi tạo lại các giá trị trường của nó trong mỗi lần lặp.

  • Đối tượng firstBar được khai báo bằng từ khóa var, vì vậy các trường của nó (index, price, vol) sẽ giữ lại giá trị của chúng trong mỗi lần lặp lại, bắt đầu từ mục đầu tiên và kết thúc với mục cuối cùng.
  • Đối tượng currentBar không được tuyên bố bằng từ khóa var, vì vậy các trường của nó sẽ được khởi tạo lại trên mỗi mục nhập và bạn sẽ có một đối tượng mới trên mỗi lần lặp lại.

Bằng cách vẽ các trường chỉ mục của hai đối tượng, bạn có thể so sánh sự khác biệt giữa chúng. firstBar.index sẽ duy trì giá trị được đặt trước đó trong mỗi lần lặp lại, trong khi currentBar.index sẽ được khởi tạo lại trong mỗi lần lặp lại với giá trị bar_index của mục nhập hiện tại.

Các loại đối tượng để sử dụng từ khóa varip

//@version=5
indicator("Objects using `varip` fields demo")

//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
    int       bars  = 0
    varip int ticks = 0

//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()

// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars  += 1
counter.ticks += 1

// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)

Trong Pine, từ khóa varip được sử dụng để chỉ ra rằng các trường của objects tồn tại trong suốt quá trình thực thi kịch bản và không quay lại trên các thanh chưa xác nhận. Trong tuyên bố của kiểu Counter, trường bars không sử dụng từ khóa varip, vì vậy nó sẽ quay lại trên mỗi thanh chưa xác nhận. Đối tượng counter được tuyên bố bằng từ khóa var, vì vậy nó tồn tại trong suốt quá trình thực thi kịch bản. Trong mỗi lần lặp lại, cả trường thanh và trường cục được tăng thêm 1. Trường thanh quay trở lại trên mỗi thanh chưa xác nhận, trong khi trường cục không quay trở lại. Cuối cùng, bằng cách vẽ các trường counter.bars và counter.ticks, bạn có thể so sánh sự khác biệt giữa chúng. Giá trị của counter.bars quay trở lại trên mỗi thanh chưa xác nhận, trong khi giá trị của counter.ticks tiếp tục tăng cho đến khi kết thúc thực thi kịch bản.


Thêm nữa

Người ăn xinTại sao chiến lược quảng trường sao chép chiến lược của Pine không thể thực hiện

Những nhà phát minh định lượng - những giấc mơ nhỏĐược rồi, chúng ta kiểm tra xem.

Người ăn xinTheo dõi xu hướng được tối ưu hóa của Zhang Giang

Những nhà phát minh định lượng - những giấc mơ nhỏXin chào, tôi muốn hỏi chiến lược cụ thể của bạn là gì?