[TOC]
Cấu trúc chung của mã trong Pine là:
<version>
<declaration_statement>
<code>
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')
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
.
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.
if
, for
, while
hoặcswitch
và các cấu trúc khácBáo cáo có thể được sắp xếp theo nhiều cách khác nhau
space
hoặctab
Cá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.local block
luô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.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)
Các đường dài có thể được chia thành nhiều đường, hoặc
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 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ợpopen
ví dụ,open
biế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àyopen
là một thời gian đại diện int 5 phút dữ liệu.open
biế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
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]
và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.
Hướng dẫn để thiết lập các lập luận của mẫu
Pricing Currency Precision
Ví 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).SetMaxBarLen
trongjavascript
srategy.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
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ế 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).
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.entry
chứ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.direction
lậ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à,direction
lậ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áclimit
vàstop
cá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.
//@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_value
Số 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).
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
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
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.var
vàvarip
.
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 true
Vì 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
, varip
Vì 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 + 1
vàii := ii + 1
giá 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.var
vàvarip
trong 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.
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.
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
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
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_then1
Nếu điều kiện là sai, logic trong khối câu lệnhelse if
hoặcelse
được sử dụng (var_decl_else0
, var_decl_else1
, v.v.).return_expression_then
vàreturn_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_then
vàreturn_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à
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ácelse
trong trường hợp này, nếu điều kiện là false, biến var_declarationX được gán giá trị
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
Ví dụ
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Giá trị kết quả củaif
Nó 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)
Các cấu trúc
[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 loopcounter
- 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. 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). 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 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
- 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
Cácfor...in
construct 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 return_expression
- Giá trị trả về của vòng lặp được gán cho biến trongvar_declaration
Nếu vòng lặp kết thúc do các từ khóa 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ị
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ôiisPos
mảng đếntrue
khi giá trị tương ứng của họ trongvaluesArray
mả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
Cácwhile
câ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 expression
có 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ủawhile
Nếu không đúng, việc thực thi kịch bản tiếp tục sau khiwhile
statement.
continue
- Cáccontinue
từ khóa làm cho vòng lặp phân nhánh đến lần lặp tiếp theo.break
- Cácbreak
Chữ 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ộtwhile
vòng lặp, biểu thức boolean sauwhile
phải trở thành sai, hoặcbreak
phải bị hành quyết.
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_block
các trường hợp hoặcdefault_local_block
có thể bị hành quyết.default_local_block
chỉ đượ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.switch
tuyên bố được gán cho một biến vàdefault_local_block
không được chỉ định, lệnh trả vềna
nếulocal_block
Khi gán kết quả của mộtswitch
tuyên bố cho một biến, tất cảlocal_block
các instance phải trả về một giá trị cùng kiểu.
Xem thêm
if
?:
series là một từ khóa chỉ ra kiểu chuỗi dữ liệu.series
keyword.
Đượ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
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ề 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ử 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
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.
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.
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 được sử dụng để tuyên bố rõ ràng loại
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
Từ khóa được sử dụng để tuyên bố rõ ràng loại
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
Từ khóa được sử dụng để tuyên bố rõ ràng loại
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
Từ khóa được sử dụng để tuyên bố rõ ràng loại
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
Từ khóa được sử dụng để tuyên bố rõ ràng loại
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
Từ khóa được sử dụng để tuyên bố rõ ràng loại 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
Xem thêm
var
array.new
array.from
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
type
keyword.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.
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 object
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ì?