[TOC]
Struktur umum kode di Pine adalah sebagai berikut:
<version>
<declaration_statement>
<code>
Catatan simbol yang didukung oleh bahasa Pine FMZ: catatan satu baris//
, catatan multi-baris/* */
, seperti metode catatan 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')
Instruksi compiler dari bentuk berikut memberi tahu compiler versi Pine mana yang ditulis dengan skrip:
//@version=5
Standar adalah versi V5, yang dapat dihilangkan dari kode//@version=5
.
indicator()
strategy()
Pernyataan deklarasi menentukan jenis skrip, yang pada gilirannya menentukan apa yang diizinkan di dalamnya, dan bagaimana itu digunakan dan dijalankan. Tetapkan properti kunci skrip, seperti namanya, di mana itu akan muncul ketika ditambahkan ke grafik, presisi dan format nilai numerik yang ditampilkan, dan nilai numerik tertentu yang mengatur perilaku runtime, misalnya, jumlah maksimum objek gambar untuk ditampilkan di grafik. Untuk strategi, atribut termasuk argumen yang mengontrol backtesting, seperti modal awal, komisi, geser, dll.indicator()
ataustrategy()
pernyataan deklarasi harus disertakan dalam kode strategi di Pine of FMZ.
Baris dalam skrip yang bukan komentar atau instruksi compiler, yang merupakan pernyataan, yang mengimplementasikan algoritma skrip.
if
, for
, while
atauswitch
dan konstruksi lainnyaLaporan dapat diatur dengan berbagai cara
space
atautab
(tombol tab). karakter pertama mereka juga harus karakter pertama baris. baris yang dimulai di posisi pertama baris adalah oleh definisi bagian dari ruang lingkup global skrip.local block
selalu diperlukan untuk struktur atau deklarasi fungsi multi-baris. Blok lokal harus ditarik dengan satu tab atau empat spasi (jika tidak, itu akan dianalisis sebagai kode terkonkaden dari baris sebelumnya, yang ditentukan sebagai konten berkelanjutan dari baris kode sebelumnya), dan setiap blok lokal mendefinisikan ruang lingkup lokal yang berbeda.Misalnya, sertakan tiga blok lokal, satu di deklarasi fungsi kustom, dan dua di deklarasi variabel menggunakan struktur if, sebagai 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 dapat dibagi menjadi beberapa baris, atau
a = open + high + low + close
Hal ini dapat dibungkus sebagai (perhatikan bahwa jumlah spasi yang terindikasi per baris tidak merupakan kelipatan dari 4):
a = open +
high +
low +
close
Sebuah panggilan plot panjang dapat 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)
Pernyataan dalam deklarasi fungsi yang didefinisikan pengguna juga dapat dibungkus. Namun, karena blok lokal secara sintaksis harus dimulai dengan tiruan (4 spasi atau 1 tab), ketika membaginya ke baris berikutnya, kelanjutan pernyataan harus dimulai dengan lebih dari satu tiruan (tidak sama dengan 4 kali lipat 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")
Seri waktu bukanlah jenis atau format data, melainkan merupakan konsep struktur dasar dalam bahasa PINE. Digunakan untuk menyimpan nilai yang berubah terus menerus dalam waktu, setiap nilai sesuai dengan titik waktu. Struktur konsep seri waktu cocok untuk memproses dan merekam serangkaian data yang berubah dari waktu ke waktu.
Ambil variabel bawaanopen
sebagai contoh,open
variabel built-in mencatat harga pembukaan dari setiap representasi int BAR, jika iniopen
adalah data periode representasi int 5 menit. Kemudian iniopen
variabel mencatat harga pembukaan dari setiap 5 menit int representasi BAR (bar).open
Untuk merujuk pada nilai sebelumnya (nilai masa lalu) dalam deret waktu, kita menggunakan[]
Ketika strategi dijalankan pada representasi int BAR tertentu,open[1]
Artinya adalah untuk merujuk pada harga pembukaan dari representasi int sebelumnya BAR dari representasi int saat ini BAR.
Meskipunderet waktusangat mengingatkan pada struktur data
Deret waktu yang dirancang dalam bahasa pinus dapat dengan mudah menghitung nilai kumulatif dari harga penutupan dalam kode strategi, dan tidak perlu menggunakan struktur loop seperti untuk, hanya fungsi built-inta.cum(close)
Untuk contoh lain, kita perlu menghitung nilai rata-rata perbedaan antara harga tertinggi dan harga terendah dari 14 int representasi BARs terakhir (yaitu, 14 int representasi BARs terdekat dengan saat ini ketika kode dijalankan), yang dapat ditulis sebagai:ta.sma(high - low, 14)
Hasil panggilan fungsi pada seri waktu juga akan meninggalkan jejak pada seri waktu, lagi kita menggunakan[]
contohnya ketika menguji apakah harga penutupan dari representasi int BAR saat ini melebihi nilai maksimum dari harga tertinggi dalam 10 representasi int BAR terakhir (tidak termasuk representasi int BAR saat ini).breach = close > ta.highest(close, 10)[1]
, dan kita juga bisa menulisbreach = close > ta.highest(close[1], 10)
Jadi.ta.highest(close, 10)[1]
danta.highest(close[1], 10)
adalah setara.
Hal ini dapat diverifikasi dengan kode 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)
Kode tes di atas akan menghasilkan nilai a dan b pada setiap BAR dalam deret waktu yang sesuai.
Instruksi untuk mengatur argumen template terintegrasi
Pricing Currency Precision
Pada saat ini, titik slippage ditetapkan menjadi 5, dan slippage saat menempatkan order adalah 0.05 (slipage mengacu pada bagian dari harga yang meluap saat menempatkan order untuk trading order yang lebih baik dan handicap).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 posisi bahasa PINE mirip dengan posisi satu arah. Misalnya, ketika memegang posisi dalam arah panjang (posisi panjang), jika ada pesanan untuk operasi jual, pesanan yang direncanakan, dll. (dalam arah yang berlawanan dengan posisi), eksekusi akan dipicu, dan posisi dalam arah panjang akan ditutup terlebih dahulu. (Tutup semua posisi panjang), dan kemudian eksekusi pesanan yang dipicu (dalam arah yang berlawanan relatif dengan posisi sebelum penutupan).
Saat menempatkan order menggunakan perintah penempatan order, jika tidak ada harga yang ditentukan, default adalah order pasar. Selain order pasar, Anda juga dapat menempatkan order melalui order terencana, yang tidak beroperasi segera untuk menempatkan order.pesanan nyata/pengujian latar belakang. Sistem hanya akan menempatkan pesanan ketika harga pasar real-time memenuhi kondisi untuk memicu pesanan yang direncanakan ini. Oleh karena itu adalah normal bagi pesanan ini untuk memiliki sedikit penyimpangan dalam harga perdagangan.strategy.entry
fungsi untuk menempatkan pesanan, kita dapat 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
urutan batas
Tentukan harga batas order.direction
Argumen adalahstrategy.long
), order hanya akan dipicu ketika harga pasar saat ini lebih rendah dari harga ini.
Ketika pesanan adalah pesanan jual (yaitu,direction
Argumen adalahstrategy.short
), pesanan hanya akan dipicu jika harga pasar saat ini lebih tinggi dari harga ini.
perintah berhenti
Tentukan harga stop loss dari order. Ketika order adalah order beli, order hanya akan dipicu ketika harga pasar saat ini lebih tinggi dari harga ini. Ketika sebuah order adalah order jual, order hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.
perintah stop-limit
Peraturanlimit
danstop
argument dapat ditetapkan pada saat yang sama, dan order akan dipicu pada harga yang memenuhi kondisi pertama.
//@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)
Setelah menentukandefault_qty_type=strategy.percent_of_equity
, setdefault_qty_value
untuk jumlah persentase (0~100), 1 berarti 1%. jumlah pesanan dihitung sesuai dengan jumlah mata uang denominasi di rekening. misalnya: jika rekening arus memiliki 10.000 USDT, menetapkan pesanan 1% berarti menempatkan pesanan dengan skala 100 USDT (dihitung berdasarkan harga saat ini saat penjualan).
var adalah kata kunci yang digunakan untuk mengalokasikan dan satu kali inisialisasi variabel.
Secara umum, grammar penugasan variabel yang tidak mengandung kata kunci var menyebabkan nilai variabel
var variable_name = expression
Penjelasan:
variable_name
- Sebarang nama variabel pengguna yang diizinkan dalam Pine Script (itu dapat berisi huruf besar dan kecil huruf Latin, angka dan tanda bawah (_), tetapi tidak dapat dimulai dengan angka).expression
- Setiap ekspresi aritmatika, seperti mendefinisikan variabel reguler.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")
Variabel
Pada FMZ, dibagi menjadi model harga real-time 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 real-time
Kode tes di atas dijalankan dalam dua fase: 1. fase representasi int historis. 2. fase representasi int real-time. Dalam model harga real-time, fase representasi int historis, variabel i dan ii yang dinyatakan olehvar
, varip
dieksekusi secara bertahap pada setiap putaran pelaksanaan kode strategi (karenaif true
Jadi, dapat dilihat bahwa angka yang ditampilkan pada representasi int BAR dari hasil backtest ditingkatkan 1 satu per satu. Ketika fase representasi int historis berakhir, fase representasi int real-time dimulai.var
, varip
karena ini adalah model harga real-time, kode strategi akan dijalankan sekali untuk setiap perubahan harga dalam representasi int BAR,i := i + 1
danii := ii + 1
Perbedaannya adalah bahwa ii dimodifikasi setiap kali. Meskipun i juga dimodifikasi setiap kali, nilai sebelumnya akan dipulihkan ketika logika strategi dieksekusi pada putaran berikutnya, dan nilai i tidak akan diperbarui sampai representasi int saat ini BAR selesai (yaitu, nilai sebelumnya tidak akan dipulihkan ketika logika strategi dieksekusi pada putaran berikutnya). Jadi dapat dilihat bahwa variabel i masih meningkat 1 untuk setiap BAR. Tetapi variabel ii dikumpulkan beberapa kali untuk setiap BAR.
Model harga penutupan
Karena model harga penutupan menjalankan logika strategi hanya sekali per representasi int BAR pergi.var
danvarip
dalam contoh di atas berperilaku persis sama secara bertahap pada model harga penutupan, baik dalam fase representasi int historis dan fase representasi int real-time, meningkat sebesar 1 per representasi int BAR.
varip (var intrabar persist) adalah kata kunci yang digunakan untuk menetapkan dan satu kali inisialisasi variabel.
varip variable_name = expression
Penjelasan:
variable_name
- Sebarang nama variabel pengguna yang diizinkan dalam skrip Pine (itu dapat berisi huruf besar dan kecil huruf Latin, angka, dan tanda tipis (_), tetapi tidak dapat dimulai dengan angka).expression
- Setiap ekspresi aritmatika, seperti waktu yang mendefinisikan variabel reguler. pada garis K pertama, ungkapan dievaluasi dan ditugaskan ke variabel hanya sekali.Contoh
// varip
varip int v = -1
v := v + 1
plot(v)
Saat menggunakan var, plot akan mengembalikan nilai bar_index. Dengan varip, perilaku yang sama terjadi pada bilah historis, tetapi pada bilah hidup, grafik mengembalikan nilai yang meningkat satu untuk setiap tik.
PengamatanIni hanya dapat digunakan dengan tipe sederhana seperti float, int, bool, string, dan array dari jenis ini.
Ini mewakili nilai variabel bool, atau nilai yang dapat dihitung ketika ekspresi menggunakanperbandinganataulogis operator.
PengamatanSilakan lihat deskripsiPerbandinganOperator danLogis Operators.
Lihat juga
bool
Ini mewakili nilai variabel bool dan hasil operasi perbandingan dan operasi logis.
PengamatanSilakan lihat deskripsiPerbandinganOperator danLogis Operators.
Lihat juga
bool
Sebuah pernyataan If mendefinisikan blok pernyataan yang harus dieksekusi ketika kondisi ekspresi terpenuhi.
Kode universal 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
Pengamatan
var_declarationX
- Variabel ini mendapatkan nilai dari pernyataan ifcondition
- Jika kondisi adalah benar, logika dalam blok pernyataanthen
digunakan (var_decl_then0
, var_decl_then1
, dll.). Jika kondisi adalah false, logika dalam blok pernyataanelse if
atauelse
digunakan (var_decl_else0
, var_decl_else1
, dll.).return_expression_then
danreturn_expression_else
Jika variabel dinyatakan terakhir, nilainya akan menjadi nilai hasil.
Jenis nilai yang dikembalikan dari pernyataan if tergantung pada jenisreturn_expression_then
danreturn_expression_else
. Saat berjalan di TradingView, jenisnya harus cocok: ketika Anda memiliki nilai string di blok else, tidak mungkin untuk mengembalikan nilai bulat dari blok tersebut. Saat berjalan di FMZ, contoh berikut tidak akan melaporkan kesalahan. Ketika 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
block dapat dihilangkan. Dalam hal ini, jika kondisi adalah false, variabel 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 dariif
pernyataan dapat diabaikan (
Contoh
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Jika pernyataan dapat berisi 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 variabel opsional yang akan ditugaskan sebagai nilai dari loopcounter
- Variabel yang memegang nilai konter loop, meningkatkan / mengurangi dengan 1 atau nilai step_num pada setiap iterasi loop.from_num
- Nilai awal dari counter. to_num
- Nilai akhir dari counter. loop putus ketika counter lebih besar dari to_num (atau kurang dari to_num dalam kasus dari_num > to_num). step_num
- Increment/decrement value of the counter. Ini opsional. Default adalah +1 atau -1, tergantung pada yang terbesar dari from_num atau to_num. Saat menggunakan nilai, counter juga increment/decremented sesuai dengan yang terbesar dari from_num atau to_num, jadi tanda +/- dari step_num opsional.statements | continue | break
- Sebarang jumlah pernyataan, atau kata kunci return_expression
Jika loop keluar karena kata kunci continue
- Kata kunci yang hanya bisa digunakan dalam loop.break
- Kata kunci untuk keluar dari lingkaran.
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 memungkinkan beberapa pernyataan untuk diulang untuk setiap elemen dalam array.array_element
, atau dengan dua argumen:[index, array_element]
. Bentuk kedua tidak mempengaruhi fungsi loop. Ini melacak indeks iterasi saat ini dalam variabel pertama dari 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 variabel opsional yang akan diberikan nilai loopreturn_expression
.
index
- Variabel opsional yang melacak indeks iterasi saat ini. Indeks dimulai pada 0. Variabel tidak berubah dalam tubuh loop. Ketika digunakan, ia harus terkandung dalam tuple yang juga berisiarray_element
.
array_element
- Variabel yang berisi setiap elemen array berturut-turut yang akan diproses dalam loop.array_id
- ID array dari iterasi loop.statements | continue | break
- Sebarang jumlah pernyataan, atau kata kunci return_expression
- Nilai pengembalian loop ditugaskan untuk variabel divar_declaration
Jika loop keluar karena kata kunci continue
- Kata kunci yang hanya bisa digunakan dalam loop.break
- Kata kunci untuk keluar dari lingkaran.
Memungkinkan untuk memodifikasi elemen array atau ukuran mereka dalam loop.
Di sini, kita menggunakan bentuk satu argumen darifor...in
Untuk menentukan, untuk setiap bar, berapa banyak bar yang memiliki nilai OHLC yang lebih besar dari SMA dari 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 dari kitaisPos
array ketrue
ketika nilai yang sesuai di 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 memungkinkan iterasi bersyarat dari blok kode asli.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Penjelasan:variable_declaration
- Deklarasi variabel opsional.return expression
dapat memberikan nilai inisialisasi untuk variabel ini.boolean_expression
- Jika benar, eksekusi blok lokal dariwhile
Jika salah, eksekusi skrip terus setelahwhile
statement.
continue
- Thecontinue
kata kunci menyebabkan loop untuk cabang ke iterasi berikutnya.break
- Thebreak
Keyword menyebabkan loop untuk mengakhiri. Eksekusi skrip dilanjutkan setelahwhile
statement.
return_expression
- Baris opsional yang memberikan nilai pengembalianwhile
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)
PengamatanBlok kode asli setelah awalwhile
garis harus ditarik dengan empat spasi atau tab.while
loop, ungkapan boolean berikutwhile
harus akhirnya menjadi palsu, ataubreak
harus dilaksanakan.
Operator switch mentransfer kontrol ke salah satu dari beberapa pernyataan berdasarkan kondisi dan nilai ekspresi.
[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
beralih 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)
beralih tanpa ekspresi:
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)
PengembalianNilai dari ekspresi terakhir dalam blok perintah lokal yang dijalankan.
PengamatanHanya satu darilocal_block
kasus ataudefault_local_block
dapat dieksekusi.default_local_block
hanya diperkenalkan dengan=>
tag, dan hanya dieksekusi jika blok sebelumnya tidak dijalankan.switch
pernyataan ditugaskan untuk variabel dandefault_local_block
tidak ditentukan, pernyataan kembalina
Jikalocal_block
Ketika menetapkan hasil dari aswitch
pernyataan untuk variabel, semualocal_block
contoh harus mengembalikan nilai dari tipe yang sama.
Lihat juga
if
?:
seri adalah kata kunci yang menunjukkan jenis seri data.series
keyword.
Digunakan untuk menetapkan nilai untuk variabel, tetapi hanya ketika variabel dinyatakan (pertama kali digunakan).
Operator penugasan menugaskan nilai ke variabel di sebelah kiri. Digunakan untuk menugaskan nilai ke variabel yang dinyatakan sebelumnya.
Tidak sama dengan. berlaku untuk ekspresi dari semua jenis.
expr1 != expr2
PengembalianNilai boolean, atau urutan nilai boolean.
Modulo (sisa bilangan bulat) berlaku untuk ekspresi numerik.
expr1 % expr2
PengembalianNilai integer atau float, atau deret nilai.
PengamatanDalam Pine Script, ketika sisa bilangan bulat dihitung, kuozien dipotong, yaitu dibulatkan ke arah nilai absolut terendah. Nilai yang dihasilkan akan memiliki tanda yang sama dengan dividen.
Contoh: -1 % 9 = -1 - 9 * truncate(-1/9) = -1 - 9 * truncate(-0.111) = -1 - 9 * 0 = -1.
Modulo penugasan. berlaku untuk ekspresi numerik.
expr1 %= expr2
Contoh
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
PengembalianNilai integer atau float, atau deret nilai.
Penugasan perkalian, berlaku untuk ekspresi numerik.
expr1 * expr2
PengembalianNilai integer atau float, atau deret nilai.
Penugasan perkalian, berlaku untuk ekspresi numerik.
expr1 *= expr2
Contoh
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
PengembalianNilai integer atau float, atau deret nilai.
Penjumlahan atau unary plus. berlaku untuk ekspresi numerik atau string.
expr1 + expr2
+ expr
PengembalianBinary+
dari string mengembalikan kombinasi dari expr1 dan expr2
Nomor mengembalikan bilangan bulat atau nilai tanda koma mengapung, atau urutan nilai:
Biner
PengamatanAnda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.
Assignment aditif. berlaku untuk ekspresi numerik atau string.
expr1 += expr2
Contoh
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
PengembalianUntuk string, mengembalikan konkatenasi dari expr1 dan expr2. Untuk angka, mengembalikan bilangan bulat atau nilai float, atau deret nilai.
PengamatanAnda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.
Pengurangan atau unary dikurangi.
expr1 - expr2
- expr
PengembalianMengembalikan bilangan bulat atau nilai tanda gerak, atau deret nilai:
Biner -
mengembalikan negasi dari expr.
PengamatanAnda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.
Penugasan pengurangan, dapat diterapkan pada ekspresi numerik.
expr1 -= expr2
Contoh
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
PengembalianNilai integer atau float, atau deret nilai.
Penugasan pembagian. berlaku untuk ekspresi numerik.
expr1 / expr2
PengembalianNilai integer atau float, atau deret nilai.
Penugasan pembagian. berlaku untuk ekspresi numerik.
expr1 /= expr2
Contoh
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
PengembalianNilai integer atau float, atau deret nilai.
Kurang dari. berlaku untuk ekspresi numerik.
expr1 < expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Kurang dari atau sama dengan.
expr1 <= expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Sama dengan. berlaku untuk ekspresi dari jenis apapun.
expr1 == expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Operator switch
statements.
Grammar deklarasi fungsi adalah:
<identifier>([<argument_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
A<local_block>
adalah nol atau lebih pernyataan Pine Script.<function_result>
adalah variabel, ekspresi, 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))
PengamatanAnda dapat mempelajari lebih lanjut tentang fungsi yang didefinisikan pengguna di halaman Manual Pengguna pada Deklarasi fungsi dan pustaka skrip.
Lebih besar dari. berlaku untuk ekspresi numerik.
expr1 > expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Lebih besar dari atau sama dengan.
expr1 >= expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Operator ternary 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)
Pengembaliannilai nol (0 dan juga NaN, +Infinity, -Infinity) dianggap salah, nilai lain adalah benar.
PengamatanGunakan na untuk
Lihat juga
na
Subscript seri. Memberi akses ke nilai sebelumnya dari seri expr1. expr2 adalah jumlah bar di masa lalu, dan harus berangka.
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)
PengembalianSerangkaian nilai.
Lihat juga
math.floor
Logical AND, dapat diterapkan pada ekspresi boolean.
expr1 and expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Logical OR. Terapkan pada ekspresi boolean.
expr1 or expr2
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Negasi logis (BUKAN). Terapkan pada ekspresi boolean.
not expr1
PengembalianNilai Boolean, atau serangkaian nilai Boolean.
Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe
Contoh
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
PengamatanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.
Lihat juga
var
varip
int
float
color
string
true
false
Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe
Contoh
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
PengamatanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.
Lihat juga
var
varip
float
bool
color
string
Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe
Contoh
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
PengamatanMengutip secara eksplisit tipe dalam deklarasi variabel adalah opsional, kecuali ketika ini diinitialisasi dengan na.
Lihat juga
var
varip
int
bool
color
string
Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe
Contoh
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
PengamatanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.
Lihat juga
var
varip
int
float
bool
str.tostring
str.format
Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe
Contoh
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
PengamatanColor literals memiliki format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili nilai heksadesimal 00 hingga FF (0 sampai 255 dalam desimal) di mana pasangan RR, GG dan BB adalah nilai untuk komponen warna
Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.
Lihat juga
var
varip
int
float
string
color.rgb
color.new
Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe array.new<type>
, array.from
function.
Contoh
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
PengamatanObjek array selalu berupa
Lihat juga
var
array.new
array.from
Objek dalam bahasa PINE adalah contoh dari tipe yang didefinisikan pengguna (UDT), yang dapat dipahami sebagai kelas tanpa metode yang memungkinkan pengguna untuk membuat tipe kustom dalam strategi untuk mengatur nilai yang berbeda dalam entitas.
Definisi jenis
Mari kita tentukan jenis order untuk menyimpan informasi order:
type order
float price
float amount
string symbol
type
keyword.Membuat objek
Menggunakan tipe yang dinyatakan, memanggilnew()
fungsi untuk membuat 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 dapat membuat objek kosong:
order order1 = na
Mari kita lihat contoh praktis:
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)
Hal ini juga dapat 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")
Ketika Anda menggunakan kata kunci var untuk mendeklarasikan variabel yang ditugaskan ke objek tipe yang didefinisikan pengguna, kata kunci secara otomatis berlaku untuk semua bidang objek.
Dengan memetakan bidang indeks dari dua objek, Anda dapat membandingkan perbedaan antara mereka. firstBar.index akan mempertahankan nilai yang ditetapkan sebelumnya di setiap iterasi, sementara currentBar.index akan diinisialisasi kembali di setiap iterasi ke nilai bar_index dari entri saat ini.
Jenis objek untuk penggunaan 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)
Di Pine, kata kunci varip digunakan untuk menunjukkan bahwa bidang object
PengemisMengapa Strategi Square Duplikat Strategi Pine Tidak Bisa Terwujud
Penemu Kuantitas - Mimpi KecilBaiklah, mari kita periksa.
PengemisOptimized Trend Tracker dari Zhang Jianhui
Penemu Kuantitas - Mimpi KecilHalo, apakah Anda ingin tahu strategi apa yang sebenarnya?