[TOC]
Struktur umum yang kod dalam Pine berikut:
<version>
<declaration_statement>
<code>
Nota simbol yang disokong oleh bahasa Pine FMZ: nota satu baris//
, nota berbilang baris/* */
, seperti kaedah nota dalam contoh berikut:
[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')
Arahan kompilator dari bentuk berikut memberitahu kompilator versi Pine yang skrip ditulis dengan:
//@version=5
Secara lalai adalah versi V5, yang boleh dihilangkan dari kod//@version=5
.
indicator()
strategy()
Perintah pengisytiharan menentukan jenis skrip, yang seterusnya menentukan apa yang dibenarkan di dalamnya, dan bagaimana ia digunakan dan dilaksanakan. Tetapkan sifat utama skrip, seperti namanya, di mana ia akan muncul apabila ditambah ke carta, ketepatan dan format nilai berangka yang dipaparkan, dan nilai berangka tertentu yang mengawal tingkah laku runtime, contohnya, bilangan maksimum objek lukisan untuk dipaparkan dalam carta.indicator()
ataustrategy()
pernyataan pengisytiharan mesti dimasukkan dalam kod strategi di Pine of FMZ.
Baris dalam skrip yang bukan komen atau arahan kompilator, yang merupakan pernyataan, yang melaksanakan algoritma skrip. Perintah boleh menjadi salah satu kandungan ini.
if
, for
, while
atauswitch
dan pembinaan lainPengumuman boleh disusun dengan pelbagai cara
space
atautab
(kunci tab). Karakter pertama mereka juga mesti menjadi watak pertama baris. Baris yang bermula di kedudukan pertama baris adalah oleh definisi sebahagian daripada skop global skrip.local block
adalah sentiasa diperlukan untuk struktur atau multi-baris fungsi pengisytiharan. Blok tempatan mesti ditarik dengan satu tab atau empat ruang (kalau tidak, ia akan dianalisis sebagai kod yang disambung baris sebelumnya, yang ditentukan sebagai kandungan berterusan baris sebelumnya kod), dan setiap blok tempatan mentakrifkan skop tempatan yang berbeza.Sebagai contoh, sertakan tiga blok tempatan, satu dalam pengisytiharan fungsi tersuai, dan dua dalam pengisytiharan pembolehubah menggunakan struktur jika, seperti berikut:
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)
Garis panjang boleh dibahagikan kepada beberapa baris, atau
a = open + high + low + close
Ia boleh dibungkus sebagai (perhatikan bahawa bilangan ruang yang ditarik setiap baris tidak merupakan kelipatan 4):
a = open +
high +
low +
close
Satu panggilan plot panjang boleh dibungkus sebagai:
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)
Perkataan dalam pengisytiharan fungsi yang ditakrifkan oleh pengguna juga boleh dibungkus. Walau bagaimanapun, kerana blok tempatan mesti bermula secara sintaksis dengan tiruan (4 ruang atau 1 tab), apabila membahagikannya ke baris seterusnya, kesinambungan pernyataan mesti bermula dengan lebih daripada satu tiruan (tidak sama dengan 4 kelipatan ruang).
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Siri masa bukan jenis atau format data, sebaliknya, ia adalah konsep struktur asas dalam bahasa PINE. Digunakan untuk menyimpan nilai yang berubah secara berterusan dalam masa, setiap nilai sepadan dengan satu titik dalam masa. Struktur konsep siri masa sesuai untuk memproses dan merakam satu siri data yang berubah dari masa ke masa.
Ambil pembolehubah terbina dalamopen
Sebagai contoh,open
pembolehubah terbina dalam mencatat harga pembukaan setiap perwakilan int BAR, jika iniopen
adalah data tempoh perwakilan int 5 minit. Kemudian iniopen
pembolehubah merakam harga pembukaan setiap 5 minit int perwakilan BAR (bar).open
Untuk merujuk kepada nilai terdahulu (nilai masa lalu) dalam siri masa, kita menggunakan[]
Apabila strategi dijalankan pada perwakilan int BAR tertentu,open[1]
Maknanya adalah merujuk kepada harga pembukaan perwakilan int sebelumnya BAR daripada perwakilan int semasa BAR.
WalaupunSiri masaadalah sangat mengingatkan struktur data
Siri masa yang direka dalam bahasa pine boleh dengan mudah mengira nilai kumulatif harga penutupan dalam kod strategi, dan tidak perlu menggunakan struktur gelung seperti untuk, hanya fungsi terbina dalamta.cum(close)
Untuk contoh lain, kita perlu mengira nilai purata perbezaan antara harga tertinggi dan harga terendah 14 bar perwakilan int terakhir (iaitu, 14 bar perwakilan int yang paling dekat dengan masa semasa apabila kod dijalankan), yang boleh ditulis sebagai:ta.sma(high - low, 14)
Hasil panggilan fungsi pada siri masa juga akan meninggalkan jejak pada siri masa, sekali lagi kita menggunakan[]
Sebagai contoh, apabila menguji sama ada harga penutupan perwakilan int BAR semasa melebihi nilai maksimum harga tertinggi dalam 10 perwakilan int BAR terakhir (tidak termasuk perwakilan int BAR semasa).breach = close > ta.highest(close, 10)[1]
, dan kita juga boleh menulisbreach = close > ta.highest(close[1], 10)
Jadi.ta.highest(close, 10)[1]
danta.highest(close[1], 10)
adalah sama.
Ini boleh disahkan dengan kod berikut:
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)
Kod ujian di atas akan mengeluarkan nilai a dan b pada setiap BAR dalam siri masa yang sepadan.
Arahan untuk menetapkan argumen templat terbina dalam
Pricing Currency Precision
contohnya, ketepatan mata wang harga ditetapkan kepada 2, yang tepat kepada titik perpuluhan kedua, tepat kepada 0.01. Kemudian setiap titik titik seluncur mewakili 0.01 unit harga. pada masa ini, titik seluncur ditetapkan kepada 5, dan seluncur apabila meletakkan pesanan adalah 0.05 (seluncur merujuk kepada bahagian harga yang melimpah apabila meletakkan pesanan untuk perdagangan pesanan yang lebih baik dan cacat).SetMaxBarLen
dalamjavascript
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
Mekanisme kedudukan bahasa PINE adalah sama dengan kedudukan satu hala. Sebagai contoh, apabila memegang kedudukan dalam arah panjang (posisi panjang), jika terdapat pesanan untuk operasi jual, pesanan yang dirancang, dan lain-lain (dalam arah yang bertentangan dengan kedudukan), pelaksanaan akan dicetuskan, dan kedudukan dalam arah panjang akan ditutup terlebih dahulu. (Tutup semua kedudukan panjang), dan kemudian pelaksanaan pesanan yang dicetuskan (dalam arah yang bertentangan berbanding dengan kedudukan sebelum penutupan).
Apabila meletakkan pesanan menggunakan perintah penempatan pesanan, jika tidak ada harga yang ditentukan, lalai adalah pesanan pasaran. Sebagai tambahan kepada pesanan pasaran, anda juga boleh meletakkan pesanan melalui pesanan yang dirancang, yang tidak beroperasi dengan segera untuk meletakkan pesanan. Perintah yang dirancang wujud dalam antrian pesanan yang dirancang program apabila ia tidak dicetuskan, dan boleh dilihat di tab strategy.entry
fungsi untuk meletakkan pesanan, kita boleh menentukanlimit
, 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
Perintah had
Tetapkan harga had pesanan. Apabila pesanan adalah pesanan beli (iaitu,direction
hujah adalahstrategy.long
), pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih rendah daripada harga ini.
Apabila pesanan adalah pesanan jual (iaitu,direction
hujah adalahstrategy.short
), pesanan hanya akan dicetuskan jika harga pasaran semasa lebih tinggi daripada harga ini.
Perintah berhenti
Tetapkan harga stop loss pesanan. Apabila pesanan adalah pesanan beli, pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih tinggi daripada harga ini. Apabila pesanan adalah pesanan jual, pesanan hanya akan dicetuskan jika harga semasa pasaran lebih rendah daripada harga itu.
Perintah stop-limit
Peraturanlimit
danstop
argument boleh ditetapkan pada masa yang sama, dan pesanan akan dicetuskan pada harga yang memenuhi syarat terlebih dahulu.
//@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)
Selepas menentukandefault_qty_type=strategy.percent_of_equity
, setdefault_qty_value
kepada jumlah peratusan (0~100), 1 bermaksud 1%. kuantiti pesanan dikira mengikut jumlah mata wang yang diisytiharkan dalam akaun. Sebagai contoh: jika akaun semasa mempunyai 10,000 USDT, menetapkan pesanan 1% bermakna meletakkan pesanan dengan skala 100 USDT (dikira berdasarkan harga semasa semasa penjualan).
var adalah kata kunci yang digunakan untuk memperuntukkan dan satu kali inisialisasi pembolehubah.
Secara umum, tatabahasa penugasan pembolehubah yang tidak mengandungi kata kunci var menyebabkan nilai pembolehubah
var variable_name = expression
Penjelasan:
variable_name
- Sebarang nama pembolehubah pengguna yang dibenarkan dalam Pine Script (ia boleh mengandungi aksara besar dan kecil Latin, nombor dan tanda bawah (_), tetapi ia tidak boleh bermula dengan nombor).expression
- Sebarang ungkapan aritmatika, seperti menentukan pembolehubah biasa. ungkapan akan dinilai dan diberikan kepada pembolehubah untuk satu kali.Contoh
// 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")
Peralihan
Pada FMZ, ia dibahagikan kepada model harga masa nyata dan model harga penutupan.var
danvarip
.
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
Model harga masa nyata
Kod ujian di atas dijalankan dalam dua fasa: 1. fasa perwakilan int sejarah. 2. fasa perwakilan int masa nyata. Dalam model harga masa nyata, fasa perwakilan int sejarah, pembolehubah i dan ii yang dinyatakan olehvar
, varip
dilaksanakan secara tambahan pada setiap pusingan pelaksanaan kod strategi (keranaif true
maka blok kod bersyarat yang sesuai pasti dilaksanakan). Oleh itu, dapat dilihat bahawa nombor yang dipaparkan pada perwakilan int BAR hasil backtest ditingkatkan dengan 1 satu demi satu. Apabila fasa perwakilan int sejarah berakhir, fasa perwakilan int masa nyata bermula.var
, varip
kerana ia adalah model harga masa nyata, kod strategi akan dilaksanakan sekali untuk setiap perubahan harga dalam perwakilan int BAR,i := i + 1
danii := ii + 1
Perbezaan adalah bahawa ii dimodifikasi setiap kali. Walaupun i juga dimodifikasi setiap kali, nilai sebelumnya akan dipulihkan apabila logik strategi dilaksanakan pada pusingan seterusnya, dan nilai i tidak akan dikemas kini sehingga perwakilan int semasa BAR selesai (iaitu, nilai sebelumnya tidak akan dipulihkan apabila logik strategi dilaksanakan pada pusingan seterusnya). Jadi dapat dilihat bahawa pembolehubah i masih meningkat sebanyak 1 untuk setiap BAR. Tetapi pembolehubah ii dikumpulkan beberapa kali untuk setiap BAR.
Model harga penutupan
Oleh kerana model harga penutupan melaksanakan logik strategi hanya sekali per perwakilan int BAR hilang.var
danvarip
dalam contoh di atas bertindak sama secara tambahan pada model harga penutupan, kedua-dua dalam fasa perwakilan int sejarah dan fasa perwakilan int masa nyata, meningkat sebanyak 1 setiap perwakilan int BAR.
varp (var intrabar persist) adalah kata kunci yang digunakan untuk menetapkan dan satu kali inisialisasi pembolehubah. Ia serupa dengan kata kunci var, tetapi pembolehubah yang diisytiharkan dengan varip mengekalkan nilainya antara kemas kini lilin langsung.
varip variable_name = expression
Penjelasan:
variable_name
- Mana-mana nama pembolehubah pengguna yang dibenarkan dalam skrip Pine (ia boleh mengandungi aksara Latin huruf besar dan kecil, nombor, dan tanda bawah (_), tetapi ia tidak boleh bermula dengan nombor).expression
- Sebarang ungkapan aritmetik, seperti masa yang menentukan pembolehubah biasa. pada bar K-garis pertama, ungkapan dinilai dan diberikan kepada pembolehubah hanya sekali.Contoh
// varip
varip int v = -1
v := v + 1
plot(v)
Apabila menggunakan var, plot akan mengembalikan nilai bar_index. Dengan varip, tingkah laku yang sama berlaku pada bar sejarah, tetapi pada bar hidup, carta mengembalikan nilai yang meningkat satu untuk setiap tanda.
CatatanIa hanya boleh digunakan dengan jenis mudah seperti float, int, bool, string, dan array jenis ini.
Ia mewakili nilai pembolehubah bool, atau nilai yang boleh dikira apabila ungkapan menggunakanperbandinganataulogik operator.
CatatanSila lihat peneranganPerbandinganPengendali danLogik Operators.
Lihat juga
bool
Ia mewakili nilai pembolehubah bool dan hasil operasi perbandingan dan operasi logik.
CatatanSila lihat peneranganPerbandinganPengendali danLogik Operators.
Lihat juga
bool
Perintah If menentukan blok pernyataan yang mesti dilaksanakan apabila syarat ungkapan dipenuhi. Versi 4 bahasa skrip Pine membolehkan anda menggunakan tatabahasa
Kod sejagat dari:
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
Catatan
var_declarationX
- Variabel ini mendapat nilai if statementcondition
- Jika keadaan adalah benar, logik dalam blok pernyataanthen
digunakan (var_decl_then0
, var_decl_then1
Jika keadaan adalah salah, logik dalam blok pernyataanelse if
atauelse
digunakan (var_decl_else0
, var_decl_else1
, dll.).return_expression_then
danreturn_expression_else
- Ungkapan terakhir dalam modul atau ungkapan dari blok lain-lain mengembalikan nilai akhir pernyataan.
Jenis nilai pulangan if pernyataan bergantung kepada jenisreturn_expression_then
danreturn_expression_else
. Apabila berjalan pada TradingView, jenis mereka mesti sepadan: apabila anda mempunyai nilai rentetan dalam blok else, tidak mungkin untuk mengembalikan nilai bulat dari blok tersebut. Apabila berjalan pada FMZ, contoh berikut tidak akan melaporkan ralat. Apabila nilai y adalah
Contoh
// 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)
Peraturanelse
blok boleh dihilangkan. Dalam kes ini, jika keadaan itu salah, pembolehubah var_declarationX diberikan nilai
Contoh
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Beberapa blok
Contoh
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Nilai hasil daripadaif
pernyataan boleh diabaikan (
Contoh
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Jika pernyataan boleh mengandungi satu sama lain:
Contoh
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
Konstruksi
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Deklarasi pembolehubah pilihan yang akan diberikan sebagai nilai loopcounter
- Peubah yang memegang nilai kiraan gelung, meningkatkan / mengurangkan dengan 1 atau nilai step_num pada setiap pengulangan gelung.from_num
- Nilai permulaan kaunter. to_num
- Nilai akhir kaunter. gelung pecah apabila kaunter lebih besar daripada to_num (atau kurang daripada to_num dalam kes dari_num > to_num). step_num
- Nilai peningkatan/pengurangan kaunter. Ia adalah pilihan. lalai adalah +1 atau -1, bergantung kepada yang terbesar dari_num atau to_num. Apabila menggunakan nilai, kaunter juga meningkat/dikurangkan mengikut yang terbesar dari_num atau to_num, jadi tanda +/- langkah_num adalah pilihan.statements | continue | break
- Sebarang bilangan pernyataan, atau kata kunci return_expression
- Nilai pulangan gelung, jika terdapat, diberikan kepada pembolehubah dalam var_declaration. Jika gelung keluar kerana kata kunci continue
- Kata kunci yang hanya boleh digunakan dalam gelung.break
- Kata kunci untuk keluar dari gelung.
Contoh
// 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))
Lihat juga
for...in
while
Peraturanfor...in
construct membolehkan beberapa pernyataan diulang untuk setiap elemen dalam array. Ia boleh digunakan dengan mana-mana argumen:array_element
, atau dengan dua hujah:[index, array_element]
. Bentuk kedua tidak mempengaruhi fungsi gelung. Ia menjejaki indeks pengulangan semasa dalam pembolehubah pertama 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
- Deklarasi pembolehubah pilihan yang akan diberikan nilai gelungreturn_expression
.
index
- Peubah pilihan yang menjejaki indeks pengulangan semasa. Indeks bermula pada 0. Peubah tidak berubah dalam badan gelung. Apabila digunakan, ia mesti terkandung dalam tuple yang juga mengandungiarray_element
.
array_element
- Peubah yang mengandungi setiap unsur array berturut-turut untuk diproses dalam gelung.array_id
- ID array untuk pengulangan gelung.statements | continue | break
- Sebarang bilangan pernyataan, atau kata kunci return_expression
- Nilai pulangan gelung diberikan kepada pembolehubah dalamvar_declaration
Jika gelung keluar kerana kata kunci continue
- Kata kunci yang hanya boleh digunakan dalam gelung.break
- Kata kunci untuk keluar dari gelung.
Membolehkan untuk mengubah suai elemen array atau saiz mereka dalam gelung.
Di sini, kita menggunakan bentuk satu argumen darifor...in
untuk menentukan, untuk setiap bar, berapa bar mempunyai nilai OHLC yang lebih besar daripada SMA nilai
Contoh
// 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))
Di sini, kita menggunakan bentuk dua argumen untuk... dalam untuk menetapkan nilai-nilai kitaisPos
array kepadatrue
apabila nilai yang sepadan dalam kitavaluesArray
array adalah positif:
Contoh
// 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))
Lihat juga
for
while
array.sum
array.min
array.max
Peraturanwhile
Pernyataan membolehkan pengulangan bersyarat blok kod asli.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Penjelasan:variable_declaration
- Pengisytiharan pembolehubah pilihan.return expression
boleh memberikan nilai inisialisasi untuk pembolehubah ini.boolean_expression
- Jika benar, jalankan blok tempatanwhile
Jika salah, pelaksanaan skrip diteruskan selepaswhile
statement.
continue
- Thecontinue
Kata kunci menyebabkan gelung untuk cabang ke pengulangan seterusnya.break
- Thebreak
Pengeluaran skrip diteruskan selepaswhile
statement.
return_expression
- Baris pilihan yang memberikan nilai pulanganwhile
statement.
Contoh
// 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)
CatatanBlok kod asli selepas awalwhile
garis mesti diletakkan dengan empat ruang atau tab. Untuk menamatkanwhile
gelung, ungkapan Boolean berikutwhile
mesti akhirnya menjadi palsu, ataubreak
mesti dieksekusi.
Operator suis memindahkan kawalan ke salah satu daripada beberapa pernyataan berdasarkan keadaan dan nilai ungkapan.
[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
menukar dengan ungkapan:
Contoh
// 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)
menukar tanpa ungkapan:
Contoh
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)
KembaliNilai ungkapan terakhir dalam blok arahan tempatan yang dilaksanakan.
CatatanHanya satu daripadalocal_block
kes ataudefault_local_block
boleh dilaksanakan.default_local_block
hanya diperkenalkan dengan=>
tag, dan hanya dilaksanakan jika blok sebelumnya tidak dilaksanakan.switch
pernyataan ditetapkan kepada pembolehubah dandefault_local_block
tidak ditentukan, pernyataan kembalina
jikalocal_block
Apabila menetapkan hasil daripadaswitch
pernyataan kepada pembolehubah, semualocal_block
contoh mesti mengembalikan nilai jenis yang sama.
Lihat juga
if
?:
Series adalah kata kunci yang menunjukkan jenis siri data.series
keyword.
Digunakan untuk menetapkan nilai kepada pembolehubah, tetapi hanya apabila pembolehubah diisytiharkan (pertama digunakan).
Operator penugasan menetapkan nilai kepada pembolehubah di sebelah kiri. Digunakan untuk menetapkan nilai kepada pembolehubah yang telah diisytiharkan sebelumnya.
Tidak sama dengan. boleh digunakan untuk ungkapan jenis apa pun.
expr1 != expr2
KembaliNilai Boolean, atau urutan nilai Boolean.
Modulo (sisa bilangan bulat). boleh digunakan untuk ungkapan nombor.
expr1 % expr2
KembaliNilai integer atau float, atau siri nilai.
CatatanDalam Pine Script, apabila baki bilangan bulat dikira, perbandingan dipotong, iaitu dibulatkan ke arah nilai mutlak terendah.
Contoh: -1 % 9 = -1 - 9 * truncate(-1/9) = -1 - 9 * truncate(-0.111) = -1 - 9 * 0 = -1.
Tugas Modulo. boleh digunakan untuk ungkapan nombor.
expr1 %= expr2
Contoh
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
KembaliNilai integer atau float, atau siri nilai.
Tugas perkalian. boleh digunakan untuk ungkapan nombor.
expr1 * expr2
KembaliNilai integer atau float, atau siri nilai.
Tugas perkalian. boleh digunakan untuk ungkapan nombor.
expr1 *= expr2
Contoh
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
KembaliNilai integer atau float, atau siri nilai.
Penjumlahan atau unari tambah. boleh digunakan untuk ungkapan nombor atau rentetan.
expr1 + expr2
+ expr
KembaliBinari+
daripada rentetan mengembalikan gabungan expr1 dan expr2
Nombor mengembalikan bilangan bulat atau nilai koma terapung, atau urutan nilai:
Binari
CatatanAnda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.
Peruntukan penambahan. Berlaku untuk ungkapan nombor atau rentetan.
expr1 += expr2
Contoh
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
KembaliUntuk rentetan, mengembalikan konketen expr1 dan expr2. Untuk nombor, mengembalikan bilangan bulat atau nilai terapung, atau siri nilai.
CatatanAnda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.
Pengurangan atau unary tolak. boleh digunakan untuk ungkapan nombor.
expr1 - expr2
- expr
KembaliMengembalikan bilangan bulat atau nilai koma terapung, atau siri nilai:
Binari -
Mengembalikan penolakan expr.
CatatanAnda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.
Tugas pengurangan. boleh digunakan untuk ungkapan nombor.
expr1 -= expr2
Contoh
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
KembaliNilai integer atau float, atau siri nilai.
Tugas pembahagian. boleh digunakan untuk ungkapan nombor.
expr1 / expr2
KembaliNilai integer atau float, atau siri nilai.
Tugas pembahagian. boleh digunakan untuk ungkapan nombor.
expr1 /= expr2
Contoh
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
KembaliNilai integer atau float, atau siri nilai.
Kurang daripada. boleh digunakan untuk ungkapan nombor.
expr1 < expr2
KembaliNilai boolean, atau siri nilai boolean.
Kurang daripada atau sama dengan.
expr1 <= expr2
KembaliNilai boolean, atau siri nilai boolean.
Sama dengan. boleh digunakan untuk ungkapan jenis apa pun.
expr1 == expr2
KembaliNilai boolean, atau siri nilai boolean.
Operator switch
statements.
Grammar pengisytiharan fungsi adalah:
<identifier>([<argument_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
A<local_block>
adalah sifar atau lebih perintah Pine Script.<function_result>
adalah pembolehubah, ungkapan, atau tuple.
Contoh
// 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))
PerkataanAnda boleh belajar lebih lanjut mengenai fungsi yang ditakrifkan pengguna di halaman Manual Pengguna pada Mengisytiharkan fungsi dan perpustakaan skrip.
Lebih besar daripada. boleh digunakan untuk ungkapan nombor.
expr1 > expr2
KembaliNilai boolean, atau siri nilai boolean.
Lebih besar daripada atau sama dengan.
expr1 >= expr2
KembaliNilai boolean, atau siri nilai boolean.
Operator ternar bersyarat.
expr1 ? expr2 : expr3
Contoh
// 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)
Kembaliexpr2 jika expr1 dinilai benar, expr3 sebaliknya. Nilai sifar (0 dan juga NaN, +Infinity, -Infinity) dianggap salah, mana-mana nilai lain adalah benar.
CatatanGunakan na untuk
Lihat juga
na
Subscript siri. Memberi akses kepada nilai sebelumnya siri expr1. expr2 adalah bilangan bar pada masa lalu, dan ia mesti berangka. Float akan dibulatkan ke bawah.
expr1[expr2]
Contoh
// [] 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)
KembaliSatu siri nilai.
Lihat juga
math.floor
Logical AND. Boleh digunakan untuk ungkapan boolean.
expr1 and expr2
KembaliNilai boolean, atau siri nilai boolean.
OR logik. boleh digunakan untuk ungkapan boolean.
expr1 or expr2
KembaliNilai boolean, atau siri nilai boolean.
Penolakan logik (BUKAN). Boleh digunakan untuk ungkapan boolean.
not expr1
KembaliNilai boolean, atau siri nilai boolean.
Kata kunci digunakan untuk menyatakan secara eksplisit jenis
Contoh
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.
Lihat juga
var
varip
int
float
color
string
true
false
Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis
Contoh
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.
Lihat juga
var
varip
float
bool
color
string
Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis
Contoh
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.
Lihat juga
var
varip
int
bool
color
string
Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis
Contoh
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.
Lihat juga
var
varip
int
float
bool
str.tostring
str.format
Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis
Contoh
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
CatatanWarna literal mempunyai format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili nilai heksadesimal 00 hingga FF (0 hingga 255 dalam desimal) di mana pasangan RR, GG dan BB adalah nilai untuk komponen warna
Mengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.
Lihat juga
var
varip
int
float
string
color.rgb
color.new
Kata kunci digunakan untuk menyatakan secara eksplisit jenis array.new<type>
, array.from
function.
Contoh
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
CatatanObjek array sentiasa berupa
Lihat juga
var
array.new
array.from
Objek dalam bahasa PINE adalah contoh jenis yang ditakrifkan pengguna (UDT), yang boleh difahami sebagai kelas tanpa kaedah yang membolehkan pengguna membuat jenis tersuai dalam strategi untuk mengatur nilai yang berbeza dalam entiti.
Menentukan jenis
Mari kita tentukan jenis pesanan untuk menyimpan maklumat pesanan:
type order
float price
float amount
string symbol
type
keyword.Mencipta objek
Menggunakan jenis yang diisytiharkan, memanggilnew()
fungsi untuk mencipta objek:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
Anda juga boleh mencipta objek kosong:
order order1 = na
Mari kita lihat contoh praktikal:
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"}
Dalam contoh ini:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Ia juga boleh ditulis sebagai:
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Jenis objek untuk penggunaan kata kunci 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")
Apabila anda menggunakan kata kunci var untuk mengisytiharkan pembolehubah yang diberikan kepada objek jenis yang ditakrifkan pengguna, kata kunci secara automatik terpakai kepada semua medan objek. Ini bermakna objek yang diisytiharkan melalui kata kunci var akan mengekalkan keadaannya antara setiap pengulangan tanpa perlu menghidupkan semula nilai medan di setiap pengulangan.
Dengan merangka bidang indeks kedua-dua objek, anda boleh membandingkan perbezaan di antara mereka. firstBar.index akan mengekalkan nilai yang ditetapkan sebelum ini dalam setiap pengulangan, sementara currentBar.index akan dimulakan semula dalam setiap pengulangan ke nilai bar_index entri semasa.
Jenis objek untuk menggunakan kata kunci 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)
Dalam Pine, kata kunci varip digunakan untuk menunjukkan bahawa medan objek kekal sepanjang pelaksanaan skrip dan tidak kembali pada bar yang tidak disahkan. Dalam pengisytiharan jenis Counter, medan bar tidak menggunakan kata kunci varip, jadi ia kembali pada setiap bar yang tidak disahkan. medan kutu menggunakan kata kunci varip, jadi ia tidak kembali pada bar yang tidak disahkan. Objek counter diisytiharkan menggunakan kata kunci var, jadi ia berterusan sepanjang pelaksanaan skrip. Dalam setiap pengulangan, kedua-dua medan bar dan medan tik meningkat sebanyak 1. medan bar bergulir kembali pada setiap bar yang tidak disahkan, sementara medan tik tidak bergulir kembali. Akhirnya, dengan memetakan medan counter.bars dan counter.ticks, anda boleh membandingkan perbezaan di antara mereka. Nilai counter.bars kembali pada setiap bar yang tidak disahkan, sementara nilai counter.ticks terus meningkat sehingga akhir pelaksanaan skrip.
PengemisMengapa strategi Square Duplicate tidak boleh menjadi strategi Pine?
Pencipta Kuantiti - Impian KecilBaiklah, mari kita lihat.
PengemisPengesan Trend yang Dioptimumkan
Pencipta Kuantiti - Impian KecilHalo, boleh saya tanya strategi apa sebenarnya?