[TOC]
Kode Pine mengikuti struktur umum:
<version>
<declaration_statement>
<code>
Simbol komentar yang didukung oleh bahasa Pine di FMZ: komentar satu baris//
Komentar beberapa baris/* */
Misalnya, cara menulis komentar 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')
Instruksi compiler dalam bentuk berikut ini memberi tahu compiler versi apa yang digunakan untuk skrip Pine:
//@version=5
Versi v5 secara default, dapat dihapus dalam kode//@version=5
。
indicator()
strategy()
Pernyataan deklarasi menentukan jenis skrip, yang kemudian menentukan apa yang diizinkan di dalamnya, dan bagaimana digunakan dan dijalankan. Atribut utama skrip ditetapkan, seperti namanya, di mana ia akan muncul ketika ditambahkan ke dalam grafik, akurasi dan format dari nilai yang ditampilkan, dan nilai yang mengatur perilaku tertentu saat berjalan, seperti jumlah maksimum objek grafik yang akan ditampilkan dalam grafik.indicator()
ataustrategy()
Pernyataan pernyataan.
Sebuah skrip tidak memiliki komentar atau perintah compiler, melainkan kalimat, yang mengimplementasikan algoritma skrip. Sebuah kalimat dapat menjadi salah satu dari hal-hal tersebut.
if
,for
,while
atauswitch
Struktur lainnyaPernyataan dapat disusun dengan berbagai cara
空格
atau制表符
(Tab) dimulai。 Karakter pertama mereka juga harus menjadi karakter pertama dari baris tersebut。 Baris yang dimulai pada posisi pertama dari baris, menurut definisi menjadi bagian dari ruang lingkup global dari skrip。local block
。 Sebuah blok lokal harus disinkronkan ke dalam satu tanda baca atau empat ruang kosong (jika tidak, akan diuraikan ke dalam baris kode serialisasi sebelumnya, yang akan dianggap sebagai konten lanjutan dari baris kode sebelumnya), dan masing-masing blok lokal mendefinisikan sebuah ruang lingkup lokal yang berbeda。Misalnya, termasuk tiga blok lokal, satu dalam deklarasi fungsi khusus dan dua menggunakan struktur if dalam deklarasi variabel, dengan kode sebagai berikut:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Baris panjang dapat dibagi dalam beberapa baris, atau “dibungkus”. Baris yang dibungkus harus menyusut ke dalam jumlah ruang kosong, asalkan bukan kelipatan 4.
a = open + high + low + close
Dapat dikemas dalam (perhatikan bahwa jumlah spasi yang dikurangi per baris bukanlah kelipatan dari 4):
a = open +
high +
low +
close
Sebuah panggilan plot ((() yang panjang dapat dikemas menjadi。
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)
Pernyataan dalam deklarasi fungsi yang didefinisikan pengguna juga dapat dikemas. Namun, karena blok lokal secara gramatikal harus dimulai dengan tanda kurung (((4 spasi atau 1 tanda kerja), ketika membagi-bagi ke baris berikutnya, bagian lanjutan dari pernyataan harus dimulai dengan satu atau lebih tanda kurung (((tidak sama dengan kelipatan 4 spasi) . Misalnya:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Serial waktu bukanlah sebuah jenis data atau format, tetapi sebuah konsep struktur dasar dalam bahasa PINE. Serial waktu digunakan untuk menyimpan nilai-nilai yang berubah secara berurutan, masing-masing nilai yang sesuai dengan satu titik waktu. Struktur konsep ini sangat cocok untuk digunakan untuk memproses dan merekam serangkaian data yang berubah dari waktu ke waktu.
Dengan variabel bawaanopen
Misalnya,open
Variabel internal mencatat harga open bar untuk setiap K line, jikaopen
adalah 5 menit dari siklus K. Jadi iniopen
Variabel yang tercatat adalah harga open setiap 5 menit K baris BAR (kolom). Ketika program strategi Anda sedang dijalankan, kode yang dikutipopen
Untuk referensi nilai sebelumnya dalam urutan waktu (value in the past), kita menggunakan[]
Operator historis, ketika kebijakan dijalankan pada garis KBAR,open[1]
Maksudnya adalah mengacu pada harga pembukaan dari garis K BAR sebelumnya dari garis K BAR saat ini.
MeskipunUrutan waktuStruktur data “array” mudah diingat, meskipun bahasa PINE juga memiliki tipe array. Namun, mereka dan urutan waktu adalah konsep yang sama sekali berbeda.
Bahasa PINE dirancang dengan urutan waktu yang dapat dengan mudah dihitung dalam kode kebijakan nilai akumulasi harga closeout, dan tidak perlu menggunakan struktur loop seperti for, hanya menggunakan fungsi built-in bahasa PINEta.cum(close)
Sebagai contoh lain, kita perlu menghitung 14 garis K BAR terakhir (yaitu 14 garis K BAR terdekat dari saat saat saat kode dijalankan) dengan rata-rata perbedaan antara nilai maksimum dan minimum yang dapat ditulis sebagai:ta.sma(high - low, 14)
Hasil dari panggilan fungsi pada urutan waktu juga akan meninggalkan jejak pada urutan waktu.[]
Operator sejarah merujuk nilai sebelumnya. Sebagai contoh, untuk menguji apakah nilai closeout dari garis BAR K saat ini melebihi nilai maksimum dari nilai tertinggi dari garis BAR K 10 terakhir (tidak termasuk garis BAR K saat ini). Kita dapat menuliskan sebagaibreach = close > ta.highest(close, 10)[1]
Atau bisa juga ditulis sebagai:breach = close > ta.highest(close[1], 10)
Karena itu.ta.highest(close, 10)[1]
Danta.highest(close[1], 10)
Ini adalah nilai yang sama.
Verifikasi dapat dilakukan dengan menggunakan 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 mengekspor nilai a dan b pada masing-masing BAR pada urutan waktu yang sesuai, dan dapat dilihat bahwa nilai a dan b selalu sama, sehingga kedua metode ini sama.
Referensi data historis
Trading View memiliki batasan jumlah maksimum untuk referensi data historis (maksimal 5000), seperti kode 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")
“Setelan transaksi” dalam “Pine Language Transaction Classroom” menggunakan kebijakan bahasa PINE di FMZ, parameter: “Jumlah siklus terpanjang variabel” secara khusus mengatur jumlah maksimum data yang dapat dikutip.
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 periode” tidak boleh terlalu besar, dan dalam kebijakan yang sesuai, data dapat dikutip.
Panduan pengaturan parameter untuk template PINE built-in “Pine Language Transaction Repository”.
定价货币精度
Parameter dan parameter ini menentukan harga slippage pada saat pesanan. Sebagai contoh, harga mata uang presisi diatur 2, yaitu tepat ke detik desimal, tepat ke 0.01. Maka setiap titik slippage mewakili 0.01 unit harga. Pada saat ini, harga slippage diatur 5, dan harga slippage pada saat pesanan adalah 0.05 ((harga slippage adalah bagian dari harga yang terlampaui saat pesanan dilakukan 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 mirip dengan pegangan unidirectional. Sebagai contoh, ketika memegang posisi dalam arah yang berlawanan dengan arah pegangan, jika ada perintah yang menjual operasi, rencana, dan lain-lain yang memicu eksekusi, maka akan dilunasi terlebih dahulu posisi dalam arah yang berlawanan dengan arah pegangan, dan kemudian dieksekusi.
Jika tidak ada harga yang ditentukan, maka daftar harga secara default. Selain daftar harga, Anda juga dapat melakukan pemesanan melalui daftar rencana, dan daftar rencana tidak akan langsung melakukan pemesanan. Daftar rencana dapat ditampilkan di antrian program yang tidak ada pada saat pemicu.Disket/Pengukuran UlangDalam tabel “Pelan Perintah” pada informasi status waktu (yaitu, status saat strategi berjalan) terlihat. Sistem hanya akan benar-benar memesan ketika harga pasar real-time memenuhi kondisi yang memicu rencana ini. Oleh karena itu, pesanan ini memiliki sedikit deviasi pada harga transaksi adalah hal yang normal.strategy.entry
Fungsi yang kita pesan, kita bisa menentukanlimit
、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
Setel harga batas untuk pesanan, yaitudirection
Parameternya adalahstrategy.long
), perintah hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.
Ketika pesanan adalah untuk dijual (yaitudirection
Parameternya adalahstrategy.short
), hanya jika harga pasar saat ini lebih tinggi dari harga tersebut, perintah akan dipicu.
Setel harga stop loss untuk order, dimana order akan dipicu hanya jika harga pasar saat ini lebih tinggi dari harga tersebut. Ketika sebuah pesanan adalah untuk menjual, pesanan hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.
Dapat disetel pada saat yang samalimit
、stop
Parameter, perintah dipicu 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)
Menentukandefault_qty_type=strategy.percent_of_equity
Setelah, pengaturandefault_qty_value
Sebagai persentase ((0 ~ 100), 1 adalah 1%. Menghitung jumlah pesanan berdasarkan jumlah mata uang yang terdaftar di akun. Misalnya: akun saat ini memiliki 10.000 USDT, mengatur pesanan 1%, yaitu menggunakan pesanan pesanan skala 100 USDT (dihitung berdasarkan harga saat ini saat dijual).
var adalah kata kunci untuk variabel yang dialokasikan dan diinisialisasi sekali pakai. Biasanya, sintaks pemberian nilai variabel tanpa kata kunci var akan menyebabkan nilai variabel ditimpa setiap kali data diperbarui. Sebaliknya, ketika menggunakan kata kunci var untuk mendistribusikan variabel, meskipun data diperbarui, mereka tetap dapat mempertahankan statusnya dan hanya mengubahnya jika memenuhi kondisi dalam if-expressions.
var variable_name = expression
Menjelaskan:
variable_name
- Nama variabel pengguna apa pun yang diizinkan dalam Pine Script (yang dapat berisi huruf Latin, angka, dan garis bawah dalam huruf besar dan kecil)_), tetapi tidak dimulai dengan angka) 。expression
- Setiap ekspresi aritmatika, seperti mendefinisikan variabel reguler. Menghitung ekspresi dan mengalokasikannya ke variabel sekali.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’ mempertahankan nilai closeout dari setiap baris pertama dari setiap baris dalam seri. Variabel ‘b’ mempertahankan harga penutupan dari batang harga pertama dalam seri. Variabel ‘c’ mempertahankan harga penutupan dari seri ke-10 dari kentang hijau.
Di FMZ, model harga real-time, model harga close-out, dan model harga close-out.var
、varip
Variabel yang dinyatakan akan kita uji dengan kode berikut:
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 waktu nyata
Kode tes di atas terbagi dalam dua tahap: 1) Sejarah K-Line; 2) K-Line Real-Time; 3) K-Line Real-Time.var
、varip
Variabel i, ii dari deklarasi akan melakukan operasi tambahan setiap kali kode kebijakan dijalankan (karenaif true
Jadi pastilah melakukan blok kode kondisional yang sesuai) 。 Jadi kita bisa melihat bahwa angka yang ditampilkan pada garis BAR hasil pengukuran kembali adalah masing-masing meningkat 1 。 Ketika tahap K baris sejarah berakhir, tahap K baris real-time dimulai 。var
、varip
Variabel yang dinyatakan mulai berubah. Karena model harga real-time, setiap perubahan harga dalam K-line BAR dilakukan sekali dalam kode strategi, dan setiap perubahan harga dalam K-line BAR dilakukan sekali dalam kode strategi.i := i + 1
Danii := ii + 1
Semua akan dieksekusi sekali. Perbedaannya adalah bahwa ii akan diubah setiap kali. Meskipun i juga diubah setiap kali, namun pada saat pelaksanaan strategi logis pada putaran berikutnya akan dikembalikan ke nilai sebelumnya, sampai saat K garis BAR selesai, maka akan diperbarui untuk menentukan nilai i (yaitu, pada saat pelaksanaan strategi logis pada putaran berikutnya tidak akan dikembalikan lagi nilai sebelumnya).
Model Harga Penutupan
Karena model harga close out hanya menjalankan satu logika strategi untuk setiap garis K BAR. Jadi, dalam model harga close out, fase garis K historis dan fase garis K real-time,var
、varip
Variabel yang dinyatakan dalam contoh di atas menunjukkan peningkatan yang sama, yaitu peningkatan 1 BAR untuk setiap baris K.
varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel satu kali. Kata kunci ini mirip dengan kata kunci var, tetapi variabel yang menggunakan deklarasi varip mempertahankan nilainya antara pembaruan K-line secara real-time.
varip variable_name = expression
Menjelaskan:
variable_name
- Nama variabel pengguna apa pun yang diizinkan dalam skrip Pine (( dapat berisi huruf Latin huruf besar dan kecil, angka dan garis bawah)_), tetapi tidak dimulai dengan angka) 。expression
- Setiap ekspresi aritmatika, seperti ketika mendefinisikan variabel reguler. Pada baris pertama K, ekspresi hanya dihitung sekali dan dialokasikan ke variabel sekali.Contoh
// varip
varip int v = -1
v := v + 1
plot(v)
Dengan var, gambar akan mengembalikan nilai bar_index. Dengan varp, tindakan yang sama terjadi pada garis K historis, tetapi pada garis K real-time, gambar akan mengembalikan nilai yang meningkat satu untuk setiap tick.
Catatan Hanya dapat digunakan dengan tipe sederhana, seperti float, int, bool, string, dan array dari tipe-tipe tersebut.
Mengekspresikan nilai dari variabel tipe Boolean, atau digunakan ketika ekspresiPerbandinganatauLogikaNilai yang dapat dihitung oleh operator.
Catatan Lihat jugaPerbandinganOperator danLogikaDeskripsi operator.
Lihat juga
bool
Menunjukkan nilai dari variabel tipe Boolean, dan hasil dari operasi perbandingan, operasi logis.
Catatan Lihat jugaPerbandinganOperator danLogikaDeskripsi operator.
Lihat juga
bool
If statement mendefinisikan blok kalimat yang harus dieksekusi untuk memenuhi kondisi ekspresi. Bahasa skrip Pine edisi 4 memungkinkan Anda menggunakan sintaksis else if.
Kode 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
Catatan
var_declarationX
- Variabel ini mengambil nilai dari if statement
condition
- menggunakan blok kalimat jika kondisi adalah truethen
Logika di dalamnyavar_decl_then0
,var_decl_then1
Jika kondisi adalah false, gunakan blok kalimat.else if
atauelse
Logika di dalamnyavar_decl_else0
,var_decl_else1
Dan lain-lain.
return_expression_then , return_expression_else
- Ekspresi terakhir dalam modul atau ekspresi dari blokelse akan mengembalikan nilai akhir dari pernyataan. Jika deklarasi variabel berada di akhir, nilainya akan menjadi nilai hasil.
Jenis nilai yang dikembalikan oleh pernyataan if tergantung padareturn_expression_then
Danreturn_expression_else
Jenis-jenis tersebut harus cocok ketika berjalan di TradingView: ketika Anda memiliki nilai string di blok else, tidak mungkin untuk mengembalikan nilai integer dari blok then statement. Ketika berjalan di FMZ, contoh berikut tidak akan salah, ketika nilai y mengambil nilai “open”, nilai saat 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)
Bisa dihilangkanelse
Dalam hal ini, jika kondisi adalah false, maka variabel var_declarationX akan diberikan sebuah nullempty threshold ((na, false atau null):
Contoh
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Anda dapat menggunakan lebih dari satu blok else if atau tidak sama sekali. then, else if, dan else dipindahkan ke empat ruang kosong:
Contoh
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Bisa diabaikanif
Nilai hasil dari pernyataan ((var_declarationX= dapat dihapus) . Ini mungkin berguna jika Anda membutuhkan efek samping dari ekspresi, misalnya dalam perdagangan strategi:
Contoh
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Jika pernyataan dapat saling mencakup:
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’ memungkinkan beberapa pernyataan untuk dieksekusi berulang:
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Sebuah deklarasi variabel yang dapat dipilih, yang akan ditugaskan sebagai nilai return_expression dari return loop.
counter
- Variabel yang menyimpan nilai penghitung putaran balik, naik / turun 1 atau step_num nilai pada setiap iterasi putaran balik.
from_num
- Nilai awal dari counter. Diizinkan untuk menggunakan thresholdseries int/float threshold/expression.
to_num
- Nilai akhir dari counter. Apabila counter lebih besar dari to_num (atau lebih kecil dari to_num dalam kasus from_num > to_num), loop terputus. Penggunaan thresholdseries int/float thresholds/expressions diizinkan, tetapi mereka hanya dievaluasi pada iterasi pertama dari loop.
step_num
- Penghitung nilai naik/turun. Itu adalah pilihan. Nilai default adalah +1 atau -1, tergantung pada yang terbesar dari from_num atau to_num.
statements | continue | break
- Sebanyak kalimat, atau kata kunci ‘continue’ atau ‘break’, yang bisa dikurangi menjadi 4 spasi atau 1 tab.
return_expression
- Pengembalian nilai loop, jika ada, dialokasikan ke variabel dalam var_declaration. Jika loop keluar karena kata kunci continue atau break, pengembalian nilai loop adalah pengembalian nilai dari variabel terakhir yang dialokasikan sebelum loop keluar.
continue
- Kata kunci yang hanya dapat digunakan dalam loop. Kata kunci yang menyebabkan iterasi berikutnya dari loop dilaksanakan.
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
for...in
Struktur memungkinkan untuk melakukan beberapa pernyataan berulang untuk setiap elemen dalam array. Ia dapat digunakan dengan argumen apa pun:array_element
, atau digunakan bersama dengan dua argumen:[index, array_element]
Bentuk kedua tidak memengaruhi fungsi loop. Ini melacak indeks iterasi saat ini dalam variabel pertama dari 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
- Sebuah deklarasi variabel yang dapat dipilih, yang akan diberikan kepada loopreturn_expression
Nilai dari
index
- Variabel pilihan yang mengikuti indeks iterasi saat ini. Indeks dimulai dari 0. Variabel tidak dapat diubah dalam lingkaran.array_element
Dalam subgrup:
array_element
- berisi variabel untuk setiap elemen array berurutan yang akan diproses dalam loop. Variabel tersebut tidak berubah dalam loop.
array_id
- Array ID dari iterasi lingkaran.
statements | continue | break
- Sebanyak kalimat, atau kata kunci ‘continue’ atau ‘break’, yang bisa dikurangi menjadi 4 spasi atau 1 tab.
return_expression
- nilai yang dikembalikan dari loop yang dialokasikan kevar_declaration
Variabel dalam, jika ada. Jika loop keluar karena kata kunci ‘continue’ atau ‘break’, maka nilai yang dikembalikan dari loop adalah variabel yang diberikan terakhir sebelum loop keluar.
continue
- Kata kunci yang hanya dapat digunakan dalam loop. Kata kunci yang menyebabkan iterasi berikutnya dari loop dilaksanakan.
break
- Kata kunci untuk keluar dari lingkaran.
Diizinkan untuk mengubah elemen atau ukuran array dalam loop.
Di sini, kita menggunakanfor...in
Bentuk parameter tunggal untuk menentukan berapa banyak nilai OHLC pada setiap baris K yang lebih besar dari 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 mendapatkan nilai kita.isPos
Array akan di set ke true
Ketika mereka berada di kami,valuesArray
Nilai yang sesuai dalam array adalah waktu yang benar:
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
Pernyataan ini mengizinkan iterasi kondisional dari blok kode lokal.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Menjelaskan:
variable_declaration
- Deklarasi variabel yang dapat dipilih.return expression
Anda dapat memberikan nilai inisialisasi untuk variabel ini.
boolean_expression
- Jika benar, maka dilakukanwhile
Blok lokal dari kalimat. Jika false, maka diwhile
Setelah kalimat, lanjutkan dengan naskahnya.
continue
- continue
Kata kunci menyebabkan siklus bercabang ke iterasi berikutnya.
break
- break
Kata kunci menyebabkan loop berakhir.while
Setelah itu, lanjutkan dengan kalimat selanjutnya.
return_expression
- Berikanwhile
Garis pilihan yang dikembalikan oleh kalimat.
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)
Catatan
Awalnyawhile
Blok kode lokal setelah baris harus disinkronkan ke dalam empat spasi atau satu tanda pengenal. Untuk mengakhiri.while
Siklus,while
Ekspresi Boolean di belakang harus berubah menjadi false, atau harus dieksekusi.break
。
Operator switch mengalihkan kendali 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
“Switch” dengan ekspresi:
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 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)
Mengembalikan nilai Nilai dari ekspresi terakhir dalam blok pernyataan lokal yang dieksekusi
Catatan
Hanya bisa dilakukanlocal_block
Contoh ataudefault_local_block
Salah satunya.default_local_block
Hanya dengan=>
Tanda-tanda yang diperkenalkan bersama, dan hanya dilakukan jika tidak dilakukan blok sebelumnya. Jikaswitch
Hasil dari sebuah pernyataan diberikan pada sebuah variabel dan tidak ditentukandefault_local_block
Jika tidak dilakukan,local_block
, maka kalimat tersebut akan dikembalikanna
Akanswitch
Semua hasil dari pernyataan yang dibagikan ke variabellocal_block
Contoh harus mengembalikan nilai dengan tipe yang sama.
Lihat juga
if
?:
series adalah kata kunci untuk menunjukkan jenis rangkaian data.series
Kata kunci biasanya tidak diperlukan.
digunakan untuk memberikan nilai pada variabel, tetapi hanya pada saat deklarasi variabel ((pertama kali digunakan) }}.
Operator pemberian nilai, memberikan nilai pada variabel di sebelah kiri. Digunakan untuk pemberian nilai pada variabel yang dinyatakan sebelumnya.
Tidak sama dengan. Ekspresi yang berlaku untuk semua jenis.
expr1 != expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Bilangan modular ((bilangan bulat tambahan) . Digunakan untuk ekspresi nilai numerik
expr1 % expr2
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Catatan Dalam skrip Pine, ketika menghitung sisa dari bilangan bulat, transaksi akan dipotong. Yaitu, putar ke nilai mutlak terkecil. Nilai yang diperoleh akan memiliki simbol yang sama dengan dividen.
Contoh: -1 % 9 = -1 - 9 * truncate ((-1⁄9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1。
Modul ditunjuk. Digunakan untuk ekspresi numerik.
expr1 %= expr2
Contoh
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Perkalian berlaku untuk ekspresi angka
expr1 * expr2
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Perkalian ditetapkan. Digunakan untuk ekspresi angka.
expr1 *= expr2
Contoh
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Tambahkan atau satuan positif. Digunakan untuk ekspresi angka atau string.
expr1 + expr2
+ expr
Mengembalikan nilai
String biner+
Kembali ke penggabungan express1 dan express2
Angka yang dikembalikan adalah bilangan bulat atau floating point, atau serangkaian nilai:
Binari ‘+’ mengembalikan expr1 ditambah expr2 .
Satuan + mengembalikan expr ((tidak menambahkan apa pun ke simetri operator satuan) .
Catatan Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.
Penggantian huruf berlaku untuk ekspresi angka atau string .
expr1 += expr2
Contoh
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Mengembalikan nilai Untuk string, mengembalikan ekspr1 dan ekspr2 berurutan. Untuk angka, mengembalikan nilai integer atau floating point, atau serangkaian nilai.
Catatan Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.
Pengurangan atau satuan negatif. Digunakan untuk ekspresi numerik.
expr1 - expr2
- expr
Mengembalikan nilai
Mengembalikan nilai integer atau floating point, atau serangkaian nilai:
Bilangan biner ‘+’ kembali ke ekspr1 dikurangi ekspr2。
Satuan-
Mengembalikan ekspresi negatif dari express.
Catatan Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.
Pengurangan hukum ditetapkan. Digunakan untuk ekspresi numerik.
expr1 -= expr2
Contoh
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Pengecualian berlaku untuk ekspresi numerik
expr1 / expr2
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Tugas penghapusan. Digunakan untuk ekspresi numerik.
expr1 /= expr2
Contoh
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.
Kurang dari ≠ berlaku untuk ekspresi angka ≠
expr1 < expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Kurang dari atau sama dengan ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠
expr1 <= expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Persamaan ≠ ≠ ≠ ≠ ≠
expr1 == expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Operator ‘=>’ digunakan untuk deklarasi fungsi yang didefinisikan pengguna danswitch
Di dalam kalimat.
Fungsi deklarasi sintaksis adalah:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Satu.<local_block>
adalah nol atau lebih kalimat Pine.
<function_result>
adalah sebuah variabel, sebuah ekspresi, atau sebuah 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))
Catatan Anda dapat mempelajari lebih lanjut tentang fungsi yang didefinisikan pengguna di halaman fungsi deklarasi dan skrip di buku panduan pengguna.
Lebih besar dari ≠ berlaku untuk ekspresi angka ≠
expr1 > expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Lebih besar atau sama dengan ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠
expr1 >= expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Operator Kondisi Triangular.
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)
Mengembalikan nilai Jika expr1 dinilai sebagai true, maka expr2, jika tidak, maka expr3。 Nilai nol ((0 dan NaN+, Infinity,-Infinity) dianggap sebagai false, dan nilai lainnya adalah true。
Catatan Jika Anda tidak membutuhkannya, gunakan na sebagai cabang dari naelse. Anda dapat menggunakan kombinasi dua atau lebih operator: untuk mewujudkan pernyataan yang mirip dengan kalimat switch () (lihat contoh di atas). Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.
Lihat juga
na
Seri subtitle。 Memberikan akses ke nilai-nilai sebelumnya dari seri expr1。 expr2 adalah jumlah k baris yang lalu, dan harus berjumlah。 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)
Mengembalikan nilai Sejumlah nilai.
Lihat juga
math.floor
Logika AND。 berlaku untuk ekspresi Boolean。
expr1 and expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Logika OR。 berlaku untuk ekspresi Boolean。
expr1 or expr2
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Logika terbalik ((NOT) ≠ berlaku untuk ekspresi Boolean ≠
not expr1
Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.
Kata kunci dari tipe bool ((Bool) untuk menyatakan variabel atau parameter secara eksplisit. Nilai dari variabel “Bool” dapat berupa true, false, atau na.
Contoh
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Catatan Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.
Lihat juga
var
varip
int
float
color
string
true
false
Kata kunci dari tipe int ([integer]) untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Catatan Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.
Lihat juga
var
varip
float
bool
color
string
Kata kunci dari tipe float () untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Catatan Jenis yang disebutkan secara jelas dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na.
Lihat juga
var
varip
int
bool
color
string
Kata kunci dari tipe “string” untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Catatan Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.
Lihat juga
var
varip
int
float
bool
str.tostring
str.format
Kata kunci dari tipe “color” untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Catatan Tanda warna memiliki format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili angka enam belas digit dari 00 ke FF ((0 ke 255 dalam desimal), di mana pasangan RR, GG dan BB adalah nilai persentase warna merah, hijau, dan biru. AA adalah transparansi warna (atau persentase alpha), di mana 00 tidak terlihat, FF tidak transparan. Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.
Lihat juga
var
varip
int
float
string
color.rgb
color.new
Kata kunci dari tipe array array yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.array.new<type>
,array.from
Fungsi membuat objek array ((atau ID) }}.
Contoh
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Catatan Array object selalu berupa array array.
Lihat juga
var
array.new
array.from
Object Object dalam bahasa PINE adalah contoh dari user-defined type (UDT), yang dapat dipahami sebagai kelas tanpa metode, yang memungkinkan pengguna untuk membuat jenis kustom dalam kebijakan yang mengatur nilai yang berbeda dalam satu entitas.
Definisi tipe
Mari kita definisikan tipe order untuk menyimpan informasi order:
type order
float price
float amount
string symbol
type
Jenis pernyataan kata kunci.Menciptakan objek
Menggunakan tipe yang dinyatakan baik, panggilannew()
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
Di bawah ini adalah contoh nyata:
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 kalimat ini:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Anda juga dapat menuliskannya 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")
Ketika menggunakan deklarasi kata kunci var untuk variabel yang diberikan pada objek dengan tipe yang ditentukan pengguna, kata kunci tersebut secara otomatis diterapkan pada semua bidang objek tersebut. Ini berarti bahwa objek yang dinyatakan melalui deklarasi kata kunci var akan mempertahankan statusnya di antara setiap iterasi tanpa perlu menginisialisasi kembali nilai bidangnya di setiap iterasi.
Dengan memetakan bidang indeks dari dua objek, Anda dapat membandingkan perbedaan di antara mereka. firstBar.index akan mempertahankan nilai yang ditetapkan sebelumnya dalam setiap iterasi, sementara currentBar.index akan di-inisialisasi kembali sebagai bar_index untuk item saat ini dalam setiap iterasi.
Jenis objek untuk penggunaan varip keyword
//@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, menggunakan kata kunci varip dapat mengindikasikan bahwa bidang objek akan terus ada sepanjang proses eksekusi skrip, dan tidak akan bergulir kembali di kolom yang belum dikonfirmasi. Dalam pernyataan tipe Counter, bidang bars tidak menggunakan kata kunci varip, sehingga akan bergulir di setiap kolom yang tidak dikonfirmasi. Bidang ticks menggunakan kata kunci varip, sehingga tidak akan bergulir di dalam kolom yang tidak dikonfirmasi. Objek counter dinyatakan menggunakan kata kunci var, sehingga akan terus ada sepanjang proses eksekusi skrip. Dalam setiap iterasi, bars dan ticks akan ditambahkan 1 ≠ bars akan berbalik di setiap kolom yang belum dikonfirmasi, sedangkan ticks tidak. Akhirnya, dengan memetakan bidang counter.bars dan counter.ticks, perbedaan antara keduanya dapat dibandingkan. Nilai counter.bars akan bergulir kembali di setiap kolom yang belum dikonfirmasi, sedangkan nilai counter.ticks akan terus meningkat sampai akhir eksekusi skrip.
Mengubah Nilai Bidang
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)
runtime.error("stop")
Dapat digunakan:=
Operator penugasan ulang mengubah nilai dari bidang objek.
Koleksi objek
Contoh menyatakan sebuah array kosong yang akan menyimpan objek dari tipe order yang didefinisikan pengguna:
”`pine type order float price float amount string symbol
arrOrder = array.new()