[TOC]
Struktur umum yang diikuti oleh kod dalam Pine:
<version>
<declaration_statement>
<code>
Simbol komen yang disokong oleh bahasa Pine di FMZ: komen satu baris//
Nota berbilang baris/* */
Sebagai contoh, bagaimana nota ditulis dalam contoh berikut:
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // 计算MACD指标
/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')
Arahan kompilator dalam bentuk berikut memberitahu kompilator versi Pine yang digunakan untuk skrip:
//@version=5
Secara lalai, versi v5 boleh diabaikan dalam kod//@version=5
。
indicator()
strategy()
Pernyataan pengisytiharan menentukan jenis skrip, yang seterusnya menentukan apa yang dibenarkan di dalamnya, dan bagaimana ia digunakan dan dilaksanakan. Ia menetapkan sifat-sifat utama skrip, seperti namanya, di mana ia akan muncul apabila ia ditambah ke dalam carta, ketepatan dan format nilai yang ditunjukkannya, dan nilai-nilai untuk mengawal tindakan tertentu semasa ia berjalan, seperti jumlah objek peta maksimum yang akan ditunjukkan dalam carta. Untuk strategi, sifat-sifat termasuk parameter yang dikawal semula, seperti modal awal, komisen, titik meluncur, dan lain-lain.indicator()
ataustrategy()
Kenyataan rasmi:
Garis yang tidak memberi komen atau arahan kompilator dalam skrip adalah pernyataan, yang mewujudkan algoritma skrip. Pernyataan boleh menjadi salah satu daripada ini.
if
,for
,while
atauswitch
Struktur lainPerkataan boleh disusun dengan pelbagai cara
空格
atau制表符
(Kunci tab) bermula。 Karakter pertama mereka juga mestilah karakter pertama baris tersebut。 Baris yang bermula pada kedudukan pertama baris, menjadi sebahagian daripada skop global skrip mengikut definisi。local block
。 Satu blok tempatan mesti dikurangkan ke dalam satu tanda pengenal atau empat ruang kosong ((jika tidak, ia akan diuraikan sebagai kod berturut-turut baris sebelumnya, iaitu dihakimi sebagai kesinambungan baris sebelumnya), dan setiap blok tempatan mentakrifkan ruang lingkup tempatan yang berbeza。Sebagai contoh, termasuk tiga blok lokal, satu dalam deklarasi fungsi tersuai, dan dua menggunakan struktur if dalam deklarasi pembolehubah, seperti berikut:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Baris panjang boleh dibahagikan kepada beberapa baris, atau “dibungkus”. Baris yang dibungkus mesti menyusut ke dalam apa-apa jumlah ruang, asalkan ia bukan kelipatan 4 (perbatasan ini digunakan untuk menyusut ke dalam blok tempatan).
a = open + high + low + close
Ia boleh dibungkus sebagai (perhatikan bahawa jumlah ruang yang dikurangkan dalam setiap baris bukanlah kelipatan 4):
a = open +
high +
low +
close
Panggilan plot ((() yang panjang boleh dibungkus dalam ▽.
close1 = request.security(syminfo.tickerid, "D", close) // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close) // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100), // 一行长的plot()调用可以被包装
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
Perkataan dalam deklarasi fungsi yang ditakrifkan oleh pengguna juga boleh dibungkus. Namun, kerana blok tempatan secara gramatikal mesti bermula dengan pengurangan (- 4 ruang kosong atau 1 tanda kerja), apabila membahagikannya ke baris seterusnya, bahagian lanjutan perkataannya mesti bermula dengan pengurangan lebih daripada satu (- tidak sama dengan kelipatan 4 ruang kosong). Contohnya:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Rangkaian masa bukanlah jenis atau format data, tetapi konsep struktur asas dalam bahasa PINE. Ia digunakan untuk menyimpan nilai yang berubah secara berturut-turut dalam masa, setiap nilai sesuai dengan satu titik masa. Struktur konsep ini sangat sesuai untuk digunakan untuk memproses dan merekodkan rangkaian data yang berubah dari masa ke masa.
Dengan pembolehubah terbina dalamopen
Sebagai contoh,open
Variabel terbina dalam merekodkan harga pembukaan setiap BAR K, jikaopen
Ia adalah 5 minit K.open
Variabel yang dirakamkan ialah setiap 5 minit K bar (kolom). Apabila program strategi anda dijalankan, kod anda merujukopen
Untuk merujuk kepada nilai sebelumnya dalam urutan masa (nilai masa lalu), kita menggunakan[]
Operator sejarah, apabila strategi dijalankan pada baris KBAR,open[1]
Maksudnya ialah merujuk kepada harga pembukaan K bar sebelum K bar semasa.
WalaupunJadual masaIa mudah untuk memikirkan struktur data “array”, walaupun bahasa PINE juga mempunyai jenis array. Tetapi mereka dan urutan masa adalah konsep yang sama sekali berbeza.
PINE direka bentuk sebagai siri masa, yang membolehkan anda dengan mudah mengira nilai terkumpul harga penutupan dalam kod strategi, dan tidak memerlukan struktur pusingan seperti for, hanya menggunakan fungsi terbina dalam bahasa PINEta.cum(close)
Sebagai contoh lain, kita perlu mengira nilai purata perbezaan antara nilai tertinggi dan yang terendah bagi 14 baris K BAR terakhir (iaitu 14 baris K BAR yang paling dekat pada masa semasa ketika kod dijalankan) yang boleh ditulis sebagai:ta.sma(high - low, 14)
Hasil panggilan fungsi pada urutan masa juga akan meninggalkan jejak pada urutan masa, juga boleh digunakan[]
Operator sejarah merujuk kepada nilai sebelum. Sebagai contoh, untuk menguji sama ada harga penutupan Kbar semasa melebihi nilai maksimum nilai tertinggi dalam BAR 10 Kbar terakhir (tidak termasuk Kbar semasa). Kita boleh menulisbreach = close > ta.highest(close, 10)[1]
Ia juga boleh ditulis sebagai,breach = close > ta.highest(close[1], 10)
Oleh itu.ta.highest(close, 10)[1]
danta.highest(close[1], 10)
Ia adalah sama.
Ia 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 pada urutan masa yang sesuai, dan dapat dilihat bahawa nilai a dan b selalu sama, jadi kedua-dua cara menyatakan adalah setara.
Tarikh data rujukan
Trading View mempunyai had maksimum untuk rujukan data sejarah (maksimum 5000), seperti kod berikut:
//@version=6
indicator("test")
ema = ta.ema(close, 10000) // 报错:Error on bar 0: The 'ema'->'sum' function references too many historical candles (10000), the limit is 5000.
plot(ema, "ema")
// pre10000 = ema[10000] // 报错:Invalid number of bars back specified in the history-referencing operator. It accepts a value between 0 and 5000.
// plot(pre10000, "pre10000")
“Tetapan urus niaga” dalam “Pine Language Transaction Classroom” menggunakan strategi bahasa PINE di FMZ, parameter: “Jumlah kitaran terpanjang pembolehubah” menetapkan jumlah maksimum data yang boleh dirujuk.
indicator("test")
ema = ta.ema(close, 1000) // ema = ta.ema(close, 3000) 则报错:Invalid number 3000 of bars back specified in the history-referencing operator. It accepts a value between 0 and 2000.
plot(ema, "ema")
Parameter “variabel terpanjang tempoh” tidak boleh ditetapkan terlalu besar, dan dalam strategi yang sesuai, data boleh dirujuk.
Panduan untuk menetapkan parameter pada templat binaan “Pine Language Transaction Class Library” untuk PINE Policy.
定价货币精度
Parameter dan parameter ini menentukan harga slippage pada masa pesanan. Sebagai contoh, penetapan ketepatan mata wang harga adalah 2, iaitu tepat ke nombor kedua, tepat kepada 0.01. Maka setiap titik slippage mewakili 0.01 unit penetapan. Pada masa ini, penetapan nilai slippage adalah 5, dan harga slippage pada masa pesanan adalah 0.05 (harga slippage merujuk kepada bahagian harga yang terlampau pada masa pesanan untuk lebih baik dan menutup pesanan).javascript
Panggilan dalam strategiSetMaxBarLen
Fungsi yang sama.strategy(title = "open long example", pyramiding = 3) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓
strategy(title = "close long example", pyramiding = 2) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1) // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // 平仓,指定平掉分组标签为long2的仓位的80%持仓
Mekanisme pegangan dalam bahasa PINE adalah sama seperti pegangan unidirectional. Sebagai contoh, apabila anda memegang kedudukan dalam arah yang berlainan, jika anda mempunyai pesanan untuk menjual operasi, pelan, dan sebagainya, maka anda akan melakukan pelaksanaan perintah yang bertentangan dengan arah pegangan.
Apabila menggunakan arahan pesanan, apabila tidak ditetapkan sebarang harga, harga pasaran secara lalai. Selain harga pasaran, anda juga boleh membuat pesanan melalui senarai rancangan, tetapi tidak akan segera melakukan pesanan.Rekod semulaMaklumat status masa ((iaitu tetingkap status semasa strategi berjalan) dilihat dalam tab “Pelan pesanan” di bahagian halaman. Sistem hanya akan benar-benar memesan apabila pasaran memenuhi syarat harga masa nyata yang mencetuskan satu-satu rancangan ini. Oleh itu, pesanan ini berada dalam keadaan yang agak kecil pada harga transaksi adalah keadaan biasa.strategy.entry
Kita boleh menetapkan fungsi yang kita mahu.limit
、stop
Parameter
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
Tetapkan harga terhad untuk pesanan, apabila pesanan adalah pembelian (iaitudirection
Parameternya ialahstrategy.long
), hanya apabila harga pasaran semasa lebih rendah daripada harga tersebut, pesanan akan dicetuskan.
Apabila pesanan adalah untuk dijual (iaitudirection
Parameternya ialahstrategy.short
), hanya apabila harga pasaran semasa lebih tinggi daripada harga tersebut, pesanan akan dicetuskan.
Tetapkan harga hentian pesanan, apabila pesanan untuk membeli, pesanan akan dicetuskan hanya jika harga pasaran semasa lebih tinggi daripada harga tersebut. Apabila pesanan adalah untuk menjual, pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih rendah daripada harga tersebut.
Ia boleh diletakkan pada masa yang samalimit
、stop
Parameter, pesanan akan dicetuskan pada harga pertama yang memenuhi syarat.
//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
// 如果均线交叉条件满足,则买入或卖出
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
Tentukandefault_qty_type=strategy.percent_of_equity
Selepas, tetapandefault_qty_value
Sebagai peratusan ((0 ~ 100), 1 ialah 1%. Jumlah pesanan berdasarkan jumlah mata wang dalam akaun. Sebagai contoh: akaun semasa mempunyai 10000 USDT, menetapkan pesanan 1%, iaitu menggunakan pesanan pesanan 100 USDT (berdasarkan harga semasa semasa semasa dijual).
var adalah kata kunci untuk variable alokasi dan inisialisasi sekali pakai. Secara amnya, sintaks penugasan pemboleh ubah yang tidak mengandungi kata kunci var menyebabkan nilai pemboleh ubah ditutup setiap kali data diperbaharui. Sebaliknya, apabila menggunakan kata kunci var untuk menugaskan pemboleh ubah, walaupun data diperbaharui, mereka masih boleh menyimpan keadaan yang sama dan hanya mengubahnya jika syarat dalam if-expressions dipenuhi.
var variable_name = expression
Terangkan:
variable_name
- apa-apa nama pemboleh ubah pengguna yang dibenarkan dalam Pine Script ((boleh mengandungi huruf Latin, nombor dan garis bawah dalam huruf besar dan kecil))_), tetapi tidak boleh bermula dengan nombor) 。expression
- Sebarang ungkapan aritmatika, seperti definisi pembolehubah biasa.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 ‘a’ mengekalkan harga penutupan pada baris pertama setiap baris dalam siri. Peubah ‘b’ mengekalkan harga penutupan batang harga aluminium hijau pertama dalam siri. Variable ‘c’ mengekalkan harga penutupan untuk ketupat hijau ketupat kesepuluh dalam siri.
Di FMZ, ia dibahagikan kepada model harga masa nyata, model harga penutupan, dan model harga penutupan.var
、varip
Kami menggunakan kod berikut untuk menguji variabel yang diisytiharkan:
strategy("test pine", "test 1", true)
// 测试 var varip
var i = 0
varip ii = 0
// 将策略逻辑每轮改变的i、ii打印在图上
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)
// 每轮逻辑执行都给i、ii递增1
if true
i := i + 1
ii := ii + 1
Model harga masa nyata
Kode ujian di atas dibahagikan kepada dua peringkat semasa pelaksanaan: 1) K-baris sejarah; 2) K-baris sebenar; 3) K-baris model masa nyata; 4) K-baris sejarah.var
、varip
Variabel i, ii yang diisytiharkan akan melakukan operasi tambahan setiap kali kod dasar dijalankan (keranaif true
Oleh itu, anda dapat melihat bahawa setiap nombor yang ditunjukkan pada bar K hasil pengesanan kembali adalah 1 tambahan. Apabila fasa K sejarah berakhir, fasa K sebenar bermula.var
、varip
Variabel yang diisytiharkan mula berubah. Oleh kerana ia adalah model harga masa nyata, setiap perubahan harga dalam K-bar akan menjalankan kod strategi sekali, dan setiap perubahan harga dalam K-bar akan menghasilkan perubahan yang berbeza.i := i + 1
danii := ii + 1
Semua dijalankan sekali. Perbezaan ialah ii diubah setiap kali. Walaupun i juga diubah setiap kali, tetapi pada pusingan seterusnya pelaksanaan logik strategi akan kembali ke nilai sebelumnya, sehingga nilai i yang ditetapkan tidak dikemas kini sehingga Kbar semasa habis ((iaitu, pada pusingan seterusnya pelaksanaan logik strategi tidak akan kembali ke nilai sebelumnya). Oleh itu, dapat dilihat bahawa pembolehubah i masih meningkat setiap BAR 1. Tetapi pembolehubah ii bertambah beberapa kali setiap BAR.
Model Harga Penutupan
Oleh kerana model harga penutupan adalah satu logik strategi yang dijalankan apabila setiap BAR K line telah selesai. Oleh itu, dalam model harga penutupan, fasa K-line sejarah dan fasa K-line masa nyata,var
、varip
Variabel yang diisytiharkan menunjukkan peningkatan yang sama dalam contoh di atas, iaitu peningkatan 1 BAR bagi setiap baris K.
varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi pembolehubah sekali gus. Ia serupa dengan kata kunci var, tetapi pembolehubah yang menggunakan varip menyatakan mengekalkan nilainya di antara kemas kini K-line dalam masa nyata.
varip variable_name = expression
Terangkan:
variable_name
- Sebarang nama pemboleh ubah pengguna yang dibenarkan dalam skrip Pine boleh mengandungi huruf Latin, nombor dan garis bawah dalam huruf besar dan kecil_), tetapi tidak boleh bermula dengan nombor) 。expression
- Sebarang ungkapan aritmatika, seperti apabila menentukan pembolehubah biasa. Pada baris K pertama, ungkapan hanya dikira sekali dan ia diperuntukkan kepada pembolehubah sekali.Contoh
// varip
varip int v = -1
v := v + 1
plot(v)
Dengan var, peta akan mengembalikan nilai bar_index. Dengan varp, tindakan yang sama berlaku pada garis K sejarah, tetapi pada garis K masa nyata, peta akan mengembalikan nilai yang meningkat satu untuk setiap tick.
Nota Hanya boleh digunakan dengan jenis yang mudah, seperti float, int, bool, string, dan array jenis ini.
Menunjukkan nilai bagi jenis Boolean, atau apabila digunakan dalam ungkapanPerbandinganatauLogikNilai yang boleh dikira oleh operator.
Nota Lihat jugaPerbandinganOperator danLogikKeterangan pengendali
Lihat juga
bool
Menunjukkan nilai pembolehubah jenis Boolean, dan hasil operasi perbandingan, operasi logik.
Nota Lihat jugaPerbandinganOperator danLogikKeterangan pengendali
Lihat juga
bool
Perkataan if mentakrifkan blok perkataan yang mesti dilaksanakan apabila syarat ungkapan dipenuhi. Bahasa skrip Pine edisi ke-4 membolehkan anda menggunakan sintaks else if.
Kod umum berasal 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
Nota
var_declarationX
- Variabel ini mengambil nilai if
condition
- Jika syarat adalah true, gunakan blok pernyataanthen
Logik dalamvar_decl_then0
,var_decl_then1
Jika syaratnya adalah false, gunakan blok kalimat.else if
atauelse
Logik dalamvar_decl_else0
,var_decl_else1
Antara lain:
return_expression_then , return_expression_else
- ungkapan terakhir dalam modul atau ungkapan dari blokelse akan mengembalikan nilai akhir ungkapan. Jika pengisytiharan pembolehubah berada di akhir, nilai akan menjadi nilai hasil.
Jenis nilai yang dikembalikan oleh pernyataan if bergantung kepadareturn_expression_then
danreturn_expression_else
Jenis-jenis tersebut harus bersesuaian apabila dijalankan pada TradingView: apabila anda mempunyai nilai senar dalam blokelse, tidak mungkin untuk mengembalikan nilai integer dari blok then. Apabila dijalankan pada FMZ, contoh berikut tidak akan tersilap, apabila nilai y diambil “open”, nilai pada plot adalah n/a.
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)
Boleh dikurangkanelse
Dalam kes ini, jika syaratnya adalah false, maka variabel var_declarationX akan diberikan satu nilai tunjangan yang kosong (na, false atau ):
Contoh
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Anda boleh menggunakan lebih daripada satu blok else if atau tidak sama sekali. then, else if, else blok dipindahkan empat ruang kosong:
Contoh
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
boleh abaikanif
Nilai hasil pernyataan ((var_declarationX= boleh diabaikan) . Ia mungkin berguna jika anda memerlukan kesan sampingan dari ungkapan, seperti dalam perdagangan strategi:
Contoh
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
If boleh digabungkan:
Contoh
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
Struktur ‘for’ membolehkan pelaksanaan berganda:
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Satu deklarasi pembolehubah yang boleh dipilih, yang akan ditugaskan sebagai nilai return_expression untuk pusingan balik.
counter
- Variabel yang menyimpan nilai penghitung pusingan, naik / turun 1 atau step_num nilai pada setiap iterasi pusingan.
from_num
- Nilai permulaan pengira. Percuma menggunakan nilai terhad / ungkapan int / float.
to_num
- Nilai akhir meter. Apabila meter lebih besar daripada to_num (atau lebih kecil daripada to_num dalam keadaan from_num > to_num), kitaran dipotong. Penggunaan nilai terendah / ungkapan int / float berturut-turut dibenarkan, tetapi mereka hanya dinilai pada iterasi pertama kitaran.
step_num
- Penghitung kenaikan / penurunan. Ia adalah pilihan. Nilai lalai adalah + 1 atau -1, bergantung kepada yang terbesar dari dari_num atau to_num. Apabila menggunakan nilai, penghitung juga akan meningkat / menurun berdasarkan yang terbesar dari dari_num atau to_num, jadi tanda + / - dari step_num adalah pilihan.
statements | continue | break
- Sebilangan besar perkataan, atau kata kunci ‘terus’ atau ‘pecah’, dikurangkan menjadi 4 ruang atau satu tab.
return_expression
- Nilai pulangan gelung, jika ada, diberikan kepada pembolehubah dalam var_declaration. Jika gelung keluar kerana kata kunci continue atau break, nilai pulangan gelung adalah nilai pulangan pembolehubah terakhir yang diberikan sebelum gelung keluar.
continue
- Kata kunci yang hanya boleh digunakan dalam pusingan balik. Ia menyebabkan iterasi pusingan balik berikutnya dilaksanakan.
break
- Kata kunci untuk keluar daripada 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
for...in
Struktur membolehkan pelaksanaan berulang pelbagai pernyataan untuk setiap elemen dalam array. Ia boleh digunakan dengan mana-mana argumen:array_element
, atau digunakan bersama dengan dua argumen:[index, array_element]
Bentuk kedua tidak menjejaskan fungsi kitaran. Ia mengesan indeks iterasi semasa dalam pembolehubah pertama dalam subset.
[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
- satu pilihan pengisytiharan pembolehubah, yang akan diberikan kepada kitaranreturn_expression
Nilai
index
- Variabel pilihan yang mengesan indeks perkalian semasa. Indeks bermula dari 0. Variabel tidak berubah dalam badan pusingan. Apabila digunakan, ia mesti termasuk dalam satu yang juga termasuk.array_element
Dalam subgroups:
array_element
- mengandungi pembolehubah bagi setiap elemen susunan berturut-turut yang akan diuruskan dalam kitaran. Pembolehubah tersebut tidak berubah dalam kitaran.
array_id
- Array ID untuk iterasi lingkaran.
statements | continue | break
- Sebilangan besar perkataan, atau kata kunci ‘terus’ atau ‘pecah’, dikurangkan menjadi 4 ruang atau satu tab.
return_expression
- Nilai pulangan pusingan diberikan kepadavar_declaration
Jika loop keluar kerana kata kunci ‘continue’ atau ‘break’, maka nilai yang dikembalikan untuk loop adalah variabel yang diberi nilai terakhir sebelum loop keluar.
continue
- Kata kunci yang hanya boleh digunakan dalam pusingan balik. Ia menyebabkan iterasi pusingan balik berikutnya dilaksanakan.
break
- Kata kunci untuk keluar daripada lingkaran.
Mengubah unsur atau saiz array dalam loop dibenarkan.
Di sini, kita menggunakanfor...in
Bentuk parameter tunggal untuk menentukan berapa banyak nilai OHLC bagi setiap baris K yang lebih besar daripada nilai SMA ‘close’:
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 dua bentuk parameter for…in untuk mengekspresikanisPos
Array yang ditetapkan sebagai true
Apabila mereka berada di dalam kita,valuesArray
Nombor yang sesuai dalam array adalah masa yang betul:
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
while
Perkataan ini membenarkan pengulangan bersyarat bagi blok kod tempatan.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Terangkan:
variable_declaration
- Pengisytiharan pembolehubah pilihan.return expression
Anda boleh memberikan nilai inisialisasi kepada pembolehubah ini.
boolean_expression
- Jika benar, laksanakanwhile
Blok tempatan untuk pernyataan. Jika false, maka dalamwhile
Selepas ayat, lanjutkan dengan skrip.
continue
- continue
Kata kunci menyebabkan kitaran bercabang ke iterasi seterusnya.
break
- break
Kata kunci menyebabkan kitaran berakhir.while
“Saya tidak tahu apa-apa”, kata beliau.
return_expression
- Disediakan.while
Garis pilihan yang dikembalikan oleh pernyataan.
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)
Nota
Permulaanwhile
Blok kod tempatan selepas baris mesti disusun dalam empat ruang atau satu tanda pengukur. Untuk menamatkan.while
Peredaran.while
Ekspresi Boolean seterusnya mesti berubah menjadi false, atau ia mesti dijalankan.break
。
Operator switch memindahkan kawalan ke salah satu daripada beberapa pernyataan berdasarkan syarat 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
Switch 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)
Switch 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)
Nilai yang dikembalikan Nilai ungkapan terakhir dalam blok pernyataan tempatan yang dilaksanakan.
Nota
Hanya boleh dijalankanlocal_block
contoh ataudefault_local_block
Satu.default_local_block
hanya dengan=>
Tanda-tanda diperkenalkan bersama-sama, dan hanya dilaksanakan jika blok sebelumnya tidak dilaksanakan. Jikaswitch
Hasil pernyataan yang diberikan kepada satu pembolehubah dan tidak ditentukandefault_local_block
Jika tidak dilaksanakan,local_block
, maka ia akan kembali kepadana
switch
Apabila hasil daripada pernyataan diberikan kepada pembolehubah, semualocal_block
Instan mesti mengembalikan nilai yang sama.
Lihat juga
if
?:
series adalah kata kunci untuk menunjukkan jenis siri data.series
Kata kunci biasanya tidak diperlukan.
Digunakan untuk memberi nilai kepada pemboleh ubah, tetapi hanya apabila menyatakan pemboleh ubah ((untuk penggunaan pertama) ).
Operator penyerahan nilai, memberikan nilai kepada pembolehubah di sebelah kiri. Digunakan untuk penyerahan nilai kepada pembolehubah yang telah diisytiharkan sebelumnya.
Tidak sama dengan. Ia boleh digunakan untuk sebarang jenis ungkapan.
expr1 != expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Bilangan modular ((bilangan bulat tambahan) . Digunakan untuk ungkapan nilai berangka .
expr1 % expr2
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Nota Dalam skrip Pine, penjual akan dipotong apabila jumlah keseluruhan yang tersisa dikira. Iaitu, mengelilingi ke nilai mutlak terkecil. Nilai yang diperoleh akan mempunyai simbol yang sama dengan dividen.
Contoh: -1 % 9 = -1 - 9 * truncate ((-1⁄9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1。
Tugas modular. Digunakan untuk ungkapan berangka.
expr1 %= expr2
Contoh
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Perkalian. Digunakan untuk ungkapan nombor.
expr1 * expr2
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Perkalian ditetapkan. Digunakan untuk ungkapan nilai nombor.
expr1 *= expr2
Contoh
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Tambah atau satuan positif ≠ berlaku untuk ungkapan nilai atau rentetan ≠
expr1 + expr2
+ expr
Nilai yang dikembalikan
String binari+
Kembalikan gabungan expr1 dan expr2
Nombor mengembalikan nilai nombor bulat atau floating point, atau satu siri nilai:
Binari ‘+’ kembali kepada expr1 tambah expr2。
Yuan + mengembalikan expr ((tidak menambah apa-apa kepada simetri operator yuan)
Nota Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.
Penambahan ditetapkan. Digunakan untuk ungkapan atau rentetan nombor.
expr1 += expr2
Contoh
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Nilai yang dikembalikan Untuk string, kembalikan sambungan expr1 dan expr2. Untuk nombor, kembalikan nilai integer atau floating point, atau satu siri nilai.
Nota Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.
Pengurangan atau satuan negatif. Digunakan untuk ungkapan berangka.
expr1 - expr2
- expr
Nilai yang dikembalikan
Mengembalikan nombor bulat atau nilai titik terapung, atau satu siri nilai:
Binari ‘+’ kembali kepada expr1 tolak daripada expr2。
satuan-
Mengembalikan ungkapan negatif untuk express.
Nota Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.
Peruntukan pengurangan. Digunakan untuk ungkapan nilai.
expr1 -= expr2
Contoh
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Pengecualian: Digunakan untuk ungkapan berangka.
expr1 / expr2
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Tugas penghapusan: Digunakan untuk ungkapan nilai.
expr1 /= expr2
Contoh
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠
Kurang daripada ≠ berlaku untuk ungkapan nilai ≠
expr1 < expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Kurang daripada atau sama dengan. Digunakan untuk ungkapan nilai.
expr1 <= expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Sama dengan … berlaku untuk sebarang jenis ungkapan …
expr1 == expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Operator ‘=>’ digunakan untuk menyatakan fungsi yang ditakrifkan pengguna danswitch
Dalam ayat.
Sintaks pengisytiharan fungsi adalah:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Satu.<local_block>
0 atau lebih perkataan Pine.
<function_result>
adalah satu pembolehubah, satu ungkapan atau satu subset.
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))
Nota Anda boleh mendapatkan maklumat lanjut mengenai fungsi yang ditakrifkan oleh pengguna di halaman fungsi pengisytiharan dan perpustakaan skrip dalam buku panduan pengguna.
Lebih besar daripada ≠ berlaku untuk ungkapan nilai ≠
expr1 > expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Lebih besar daripada atau sama dengan. Digunakan untuk ungkapan nilai.
expr1 >= expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Pengendali Syarat Trivial
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)
Nilai yang dikembalikan Jika expr1 dinilai sebagai true, maka expr2, jika tidak, maka expr3。 Nilai sifar ((0 dan NaN+, Infinity,-Infinity) dianggap sebagai false, dan nilai lain adalah true。
Nota Jika anda tidak perlu, sila gunakan na sebagai cawangan daripada naelse. Anda boleh menggunakan dua atau lebih?: operator untuk mewujudkan pernyataan yang serupa dengan kata laluan switch () (lihat contoh di atas). Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.
Lihat juga
na
Rangkaian subtitle menyediakan akses kepada nilai-nilai terdahulu dalam siri expr1 expr2 adalah bilangan k baris yang lalu, mestilah nilai-nilai 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)
Nilai yang dikembalikan Satu siri nilai.
Lihat juga
math.floor
Logik AND ≠ berlaku untuk ungkapan Boolean ≠
expr1 and expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Logik OR。 berlaku untuk ekspresi Boolean。
expr1 or expr2
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Logik berbalikbalik ((NOT) . Digunakan untuk ungkapan Boolean .
not expr1
Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.
Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Nota Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.
Lihat juga
var
varip
int
float
color
string
true
false
Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit dengan jenis int () atau integer ().
Contoh
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Nota Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.
Lihat juga
var
varip
float
bool
color
string
Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Nota Jenis yang dinyatakan dengan jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia diinisialisasi dengan na
Lihat juga
var
varip
int
bool
color
string
Kata kunci “string” untuk menyatakan parameter atau pembolehubah secara eksplisit.
Contoh
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Nota Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.
Lihat juga
var
varip
int
float
bool
str.tostring
str.format
Kata kunci jenis “color” yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Nota Huruf warna mempunyai format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili nilai enam belas digit dari 00 ke FF (((0 ke 255 dalam nombor desimal), di mana pasangan RR, GG dan BB adalah nilai peratusan warna merah, hijau dan biru. AA adalah peratusan warna transparansi ((atau alfa), di mana 00 tidak dapat dilihat, FF tidak transparan. Apabila tidak menyediakan pasangan AA, FF digunakan. Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.
Lihat juga
var
varip
int
float
string
color.rgb
color.new
Kata kunci untuk jenis matriks matriks matriks yang digunakan untuk menyatakan pembolehubah atau parameter secara eksplisit. Boleh digunakanarray.new<type>
,array.from
Fungsi mencipta objek array ((atau ID) }}.
Contoh
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Nota Array object selalu berupa array array.
Lihat juga
var
array.new
array.from
Objek Objek bahasa PINE adalah contoh jenis yang ditentukan oleh pengguna ((UDT), yang boleh difahami sebagai kelas tanpa kaedah, yang membolehkan pengguna membuat jenis tersuai dalam strategi untuk mengatur nilai yang berbeza dalam satu entiti.
Tentukan jenis
Mari kita tentukan jenis order untuk menyimpan maklumat pesanan:
type order
float price
float amount
string symbol
type
Jenis pengisytiharan kata kunciCipta objek
Menggunakan jenis baik yang diisytiharkan, panggilannew()
Objek penciptaan fungsi:
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 membuat objek kosong:
order order1 = na
Berikut adalah contoh sebenar:
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) // 输出 {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}
Contoh ayat ini:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Ia juga boleh ditulis dalam bentuk berikut:
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 menggunakan var pengisytiharan kata kunci yang diberikan kepada variabel objek yang jenisnya ditentukan oleh pengguna, kata kunci itu secara automatik digunakan untuk semua bidang objek tersebut. Ini bermakna bahawa objek yang diisytiharkan dengan var kata kunci akan mengekalkan statusnya di antara setiap iterasi tanpa perlu menginisialisasi semula nilai bidangnya pada setiap iterasi.
Dengan memetakan medan indeks dua objek, anda boleh membandingkan perbezaan di antara mereka. firstBar.index akan mengekalkan nilai yang ditetapkan sebelumnya dalam setiap iterasi, sementara currentBar.index akan diinisialisasi semula sebagai bar_index nilai item semasa dalam setiap iterasi.
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)
Dalam Pine, menggunakan kata kunci varip dapat menunjukkan bidang objek yang berterusan sepanjang pelaksanaan skrip, dan tidak berputar di dalam lajur yang tidak diiktiraf. Dalam jenis pengisytiharan Counter, medan bars tidak menggunakan kata kunci varip, dan oleh itu akan berputar di dalam setiap lajur yang tidak disahkan. medan ticks menggunakan kata kunci varip, dan oleh itu ia tidak akan berputar di dalam lajur yang tidak disahkan. Objek counter diisytiharkan menggunakan kata kunci var, oleh itu ia akan kekal sepanjang pelaksanaan skrip. Dalam setiap iterasi, medan bars dan medan ticks akan ditambah 1. Bidang bars akan berputar di dalam setiap lajur yang tidak disahkan, manakala medan ticks tidak. Akhirnya, dengan memetakan medan counter.bars dan counter.ticks, anda boleh membandingkan perbezaan di antara mereka. Nilai counter.bars akan diputar balik dalam setiap lajur yang tidak disahkan, sementara nilai counter.ticks akan terus meningkat sehingga akhir skrip dijalankan.
Ubah nilai medan
”`pine 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)
if strategy.position_size != 0 runtime.log(order1) order1.price := 999 order1.amount := 100 runtime.log(order1) r