[TOC]
Struktur umum yang diikuti oleh kode di Pine:
<version>
<declaration_statement>
<code>
Simbol komentar yang didukung oleh FMZ dalam bahasa Pine: single line commentary//
Di sini, saya akan menjelaskan lebih lanjut./* */
Seperti contoh di bawah ini:
[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')
Perintah pengkompilasi dalam bentuk berikut memberi tahu pengkompilasi versi mana dari skrip yang ditulis oleh Pine:
//@version=5
Versi v5 secara default dapat dihilangkan dalam kode//@version=5
。
indicator()
strategy()
Pernyataan menentukan tipe skrip, yang juga menentukan apa yang diizinkan di dalamnya, dan bagaimana digunakan dan dieksekusi. Atribut kunci skrip diatur, seperti namanya, di mana akan muncul ketika ditambahkan ke grafik, akurasi dan format nilai yang ditampilkan, dan beberapa nilai yang mengatur perilaku saat dijalankan, seperti jumlah maksimum objek gambar yang akan ditampilkan di grafik. Untuk kebijakan, atribut termasuk parameter yang mengendalikan retrieval, seperti modal awal, komisi, titik geser, dll.indicator()
Ataustrategy()
Pernyataan tersebut ditulis oleh seorang blogger.
Baris dalam skrip yang bukan komentar atau instruksi kompilasi adalah kalimat yang mengimplementasikan algoritma skrip. Sebuah kalimat bisa menjadi salah satu dari mereka.
if
,for
,while
atauswitch
Struktur e.g.Kalimat dapat disusun dengan berbagai cara
空格
atau制表符
(tab) dimulai. Karakter pertama mereka juga harus menjadi karakter pertama baris tersebut. Baris yang dimulai dari posisi pertama baris, oleh definisi, menjadi bagian dari ruang lingkup global skrip.local block
Sebuah blok lokal harus terkuras menjadi satu karakter atau empat ruang (jika tidak, akan diselesaikan sebagai baris kode serial sebelumnya, yang ditentukan sebagai konten lanjutan dari baris kode sebelumnya), dan setiap blok lokal mendefinisikan ruang lingkup lokal yang berbeda.Misalnya, termasuk tiga blok lokal, satu dalam deklarasi fungsi kustom, dua dalam deklarasi variabel menggunakan struktur if, 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 menjadi beberapa baris, atau "dibungkus". Baris yang dibungkus harus menyusut ke dalam jumlah ruang apa pun, asalkan tidak merupakan kelipatan dari 4 (batas ini digunakan untuk menyusut bagian).
a = open + high + low + close
Ini dapat dibungkus sebagai (perhatikan bahwa jumlah ruang yang disempurnakan per baris tidak merupakan kelipatan dari 4):
a = open +
high +
low +
close
Sebuah panggilan plot panjang dapat dibungkus 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 dibungkus. Namun, karena blok lokal secara sintetis harus dimulai dengan penyusutan ((4 ruang atau 1 karakter), ketika membaginya ke baris berikutnya, bagian lanjutan dari pernyataan harus dimulai dengan lebih dari satu penyusutan ((tidak sama dengan kelipatan 4 ruang); 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 jenis data atau format, tetapi merupakan konsep struktur dasar dalam bahasa PINE. Serial waktu digunakan untuk menyimpan nilai yang berubah secara berurutan dalam waktu, masing-masing nilai sesuai dengan titik waktu. Serial waktu memiliki struktur yang sangat cocok untuk digunakan untuk memproses, merekam, dan merekam serangkaian data yang berubah seiring waktu.
Variabel internalopen
Misalnya,open
Variabel built-in mencatat harga buka untuk setiap garis K BAR, jika iniopen
Jadi ini adalah data dari siklus garis K selama 5 menit.open
Yang tercatat dalam variabel adalah harga awal dari setiap 5 menit K baris BAR (kolom); ketika program strategi Anda sedang dijalankan, referensi dalam kodeopen
Dengan kata lain, kita menggunakan harga awal dari garis BAR di mana kita berada saat ini. Untuk mengacu pada nilai sebelumnya dalam urutan waktu (nilai masa lalu), kita menggunakan[]
Operator sejarah, ketika kebijakan dijalankan pada garis K BAR tertentu.open[1]
Ini berarti bahwa harga awal dari garis K BAR sebelumnya adalah garis K BAR saat ini.
MeskipunUrutan waktuSangat mudah untuk mengingat struktur data yang disebut "array", meskipun bahasa PINE juga memiliki jenis arryx. Namun, mereka adalah konsep yang sama sekali berbeda dari urutan waktu.
Perancangan deret waktu seperti ini dapat dengan mudah dihitung dalam kode strategi dan tidak memerlukan struktur loop seperti for, hanya menggunakan fungsi built-in yang menggunakan bahasa PINE.ta.cum(close)
Sebagai contoh lain, kita perlu menghitung rata-rata perbedaan antara harga tertinggi dan harga terendah dari 14 baris K terakhir BAR (yaitu 14 baris K BAR terdekat pada saat kode dijalankan) yang dapat ditulis sebagai:ta.sma(high - low, 14)
Hasil panggilan fungsi pada urutan waktu juga akan meninggalkan jejak pada urutan waktu.[]
Operator sejarah mengacu pada nilai sebelumnya. Sebagai contoh, untuk menguji apakah harga penutupan baris K BAR saat ini melebihi nilai maksimum dari harga tertinggi dari 10 baris K BAR terakhir (tidak termasuk baris K BAR saat ini), kita dapat menulis sebagaibreach = close > ta.highest(close, 10)[1]
Anda bisa menulisnya sebagai:breach = close > ta.highest(close[1], 10)
Jadi.ta.highest(close, 10)[1]
danta.highest(close[1], 10)
Saya tidak tahu apa yang akan terjadi.
Anda dapat memverifikasi 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 pengujian di atas akan mengekspresikan nilai a dan b pada setiap BAR pada urutan waktu yang sesuai, dan Anda dapat melihat bahwa nilai a dan b selalu sama, jadi kedua metode penggambaran ini sama.
Peraturan parameter untuk template built-in dari kebijakan PINE "Pine Language Exchange Library".
定价货币精度
Parameter dan parameter ini menentukan harga geser pada saat pesanan dilakukan. Misalnya, penentuan harga dengan akurasi mata uang ditetapkan menjadi 2, yaitu tepat ke tempat kedua dari bilangan kecil, tepat ke 0.01; maka nilai titik geser masing-masing mewakili 0.01 unit harga. Pada saat ini, nilai titik geser ditetapkan menjadi 5, dan harga geser pada saat pesanan adalah 0.05 ((Harga geser menunjukkan harga geser pada saat pesanan untuk lebih baik dan untuk memperhitungkan bagian harga yang lebih tinggi dari transaksi pesanan)).javascript
Panggilan dalam kebijakanSetMaxBarLen
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%持仓
PINE memiliki mekanisme pemegang yang mirip dengan pemegang satu arah. Sebagai contoh, ketika memegang posisi multi-headed ("multi-headed holding"), jika ada pesanan untuk menjual operasi, daftar rencana, dll. (dibalik arah pemegang), maka pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang).
Saat menggunakan perintah order, jika tidak ditentukan harga apapun, default adalah order dengan harga pasar. Selain harga pasar, Anda juga dapat melakukan order dengan order rencana, yang tidak langsung dioperasikan.Disk nyata / retestingInformasi status waktu (misalnya status saat kebijakan berjalan) terlihat pada tab "Peraturan yang direncanakan" pada halaman pemisah. Sistem hanya akan benar-benar membuat pesanan ketika harga pasar real-time memenuhi kondisi untuk memicu pesanan tersebut. Jadi pesanan ini memiliki sedikit kesesuaian pada harga transaksi.strategy.entry
Jadi kita bisa menentukan fungsi yang akan kita atur.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
Perintah limit
Menetapkan batas harga untuk pesanan, yaitu ketika pesanan adalah pembayaran.direction
Parameternya adalahstrategy.long
Jika harga pasar saat ini lebih rendah dari harga tersebut, maka order akan dipicu.
Bila pesanan adalah pesanan jual (yaitudirection
Parameternya adalahstrategy.short
Jika harga pasar saat ini lebih tinggi dari harga tersebut, maka order akan dipicu.
stop order
Menetapkan harga stop loss untuk pesanan, ketika pesanan adalah pembayaran, pesanan hanya akan dipicu ketika harga pasar saat ini lebih tinggi dari harga tersebut. Saat pesanan adalah pesanan jual beli, pesanan hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.
Stop-limit Perintah
Dapat disetel pada saat yang samalimit
、stop
Parameter, pemesanan 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)
Tentukandefault_qty_type=strategy.percent_of_equity
Setelah itu, aturdefault_qty_value
Untuk jumlah persentase ((0-100), 1 atau 1%;; jumlah unit dihitung berdasarkan jumlah mata uang yang ditagih di akun;; misalnya: akun saat ini memiliki 10000 USDT, atur untuk melakukan pemesanan 1%, yaitu menggunakan pemesanan unit skala 100 USDT (dihitung berdasarkan harga saat penjualan).
var adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel sekaligus. Biasanya, sintaksis pembagian variabel tanpa kata kunci var akan menyebabkan nilai variabel tertutup setiap kali data diperbarui. Sebaliknya, ketika menggunakan kata kunci var untuk mendistribusikan variabel, meskipun data diperbarui, mereka masih dapat mempertahankan statusnya, hanya mengubahnya ketika kondisi dalam if-expressions terpenuhi.
var variable_name = expression
Penjelasan:
variable_name
- Sebarang nama variabel pengguna yang diizinkan di Pine Script (bisa berisi huruf besar dan kecil, angka, dan tanda tipis, tetapi tidak dapat dimulai dengan angka)expression
- Setiap ekspresi aritmatika, seperti mendefinisikan variabel biasa. Menghitung ekspresi dan mengalihkannya 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
Di FMZ, model harga real-time, model harga penutupan, dan model harga akhir dibagi menjadi dua, yaitu model harga real-time dan model harga penutupan.var
、varip
Variabel yang dinyatakan kami 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 real-time
Kode pengujian di atas dibagi menjadi dua tahap saat dijalankan: 1, K-line sejarah; 2, K-line real-time.var
、varip
Variabel i, ii yang dinyatakan akan melakukan operasi inkremental setiap kali kode kebijakan dijalankan karenaif true
Jadi tentu saja menjalankan blok kode kondisi yang sesuai). Jadi kita dapat melihat bahwa angka-angka yang ditampilkan pada hasil retrieval K-line BAR masing-masing meningkat menjadi 1. Ketika fase K-line sejarah berakhir, fase K-line real-time dimulai.var
、varip
Variabel yang diproklamasikan mulai berubah. Karena model harga real-time, setiap perubahan harga dalam garis KBAR akan mengeksekusi kode strategi berulang kali.i := i + 1
danii := ii + 1
Perbedaan adalah bahwa ii setiap kali dimodifikasi. Meskipun setiap kali dimodifikasi, i akan kembali ke nilai sebelumnya saat menjalankan logika strategi pada putaran berikutnya, dan tidak akan diperbarui sampai garis K saat ini BAR habis (yaitu tidak kembali ke nilai sebelumnya saat menjalankan logika strategi pada putaran berikutnya).
Model Harga Penutupan
Karena model harga penutupan hanya menjalankan satu strategi logis setiap kali garis K BAR berakhir. Jadi dalam model harga penutupan, tahap garis K historis dan fase garis K real-time,var
、varip
Variabel yang dinyatakan dalam contoh di atas secara inkremental menunjukkan konsistensi yang sempurna, yaitu setiap garis K BAR bertambah 1 {\displaystyle 1}.
varip (var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel sekaligus. Ini mirip dengan kata kunci var, tetapi variabel yang menggunakan deklarasi varip mempertahankan nilainya di antara pembaruan baris K secara real-time.
varip variable_name = expression
Penjelasan:
variable_name
- Sebarang nama variabel pengguna yang diizinkan dalam skrip Pine (bisa berisi huruf besar dan kecil, angka, dan garis tipis, tetapi tidak dapat dimulai dengan angka).expression
- Setiap ekspresi aritmatika, seperti ketika mendefinisikan variabel biasa. Pada baris K pertama, ekspresi hanya dihitung sekali dan diberikan kepada variabel sekali.Contoh
// varip
varip int v = -1
v := v + 1
plot(v)
Saat menggunakan var, grafik akan mengembalikan nilai bar_index. Menggunakan varip, perilaku yang sama akan terjadi pada garis K sejarah, tetapi pada garis K real-time, grafik akan mengembalikan satu nilai, yang meningkat satu untuk setiap tik.
PenjelasanHanya dapat digunakan dengan tipe sederhana, seperti float, int, boolean, string, dan array dari jenis tersebut.
Menunjukkan nilai dari variabel tipe Boolean, atau ketika ekspresi digunakanPerbandinganatauLogikaNilai yang dapat dihitung pada operator.
PenjelasanLihat juga:PerbandinganOperator danLogikaDeskripsi operator.
Sampai jumpa lagi
bool
Menunjukkan nilai dari variabel tipe Boolean, dan hasil dari operasi perbandingan, operasi logis.
PenjelasanLihat juga:PerbandinganOperator danLogikaDeskripsi operator.
Sampai jumpa lagi
bool
If statement mendefinisikan blok kalimat yang harus dieksekusi ketika memenuhi kondisi ekspresi. Bahasa skrip Pine versi 4 memungkinkan Anda menggunakan tata bahasa
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
Penjelasan
var_declarationX
- Variabel ini mengambil nilai dari pernyataan ifcondition
- Jika kondisi adalah benar, gunakan blok kalimatthen
Logika dalam (((var_decl_then0
,var_decl_then1
Jika kondisi false, gunakan blok kalimat.else if
Atauelse
Logika dalam (((var_decl_else0
,var_decl_else1
Dan sebagainya).return_expression_then , return_expression_else
- Ekspresi terakhir dalam modul atau ekspresi dari blokelse akan mengembalikan nilai akhir dari pernyataan tersebut. Jika variabel dinyatakan pada akhir, nilainya akan menjadi nilai hasil.
Jenis nilai yang dikembalikan untuk pernyataan if tergantung padareturn_expression_then
danreturn_expression_else
Jenis. Pada saat berjalan pada TradingView, jenis mereka harus cocok: tidak mungkin untuk mengembalikan nilai bulat dari then statement block ketika Anda memiliki nilai string pada blokelse. Pada saat berjalan pada FMZ, contoh berikut tidak akan memberikan kesalahan, ketika nilai y diambil sebagai "open", nilai ketika plot digambar 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
Blok. Dalam hal ini, jika kondisinya false, variabel var_declarationX akan diberikan ambang 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 dapat menggunakan beberapa
Contoh
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Tidak bisa diabaikanif
Nilai hasil dari pernyataan ((
Contoh
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Jika kalimat dapat saling memuat:
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 untuk mengulangi beberapa kalimat:
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Variabel opsional yang dinyatakan, yang akan ditugaskan sebagai nilai return_expression pada loop back.counter
- Menyimpan variabel dari nilai penghitung loopback, meningkat/kurang 1 atau step_num nilai pada setiap iterasi loopback;from_num
- Nilai awal dari counter. Mengizinkan penggunaan int/float threshold/ekspresi.to_num
- Nilai akhir dari counter; loop terputus ketika counter lebih besar dari to_num (atau lebih kecil dari to_num dalam kasus from_num > to_num); penggunaan int/float thresholds/ekspresi yang diizinkan, tetapi mereka hanya dinilai pada iterasi pertama loop;step_num
- Nilai meningkat/mengurangi dari kalkulator. Itu adalah opsional. Nilai default adalah +1 atau-1, tergantung pada yang terbesar dari from_num atau to_num. Ketika digunakan, kalkulator juga meningkat/mengurangi berdasarkan yang terbesar dari from_num atau to_num, sehingga simbol +/- untuk step_num adalah opsional.statements | continue | break
- Jumlah kalimat yang diinginkan, atau kata kunci "continue" atau "break" yang dapat dikunci menjadi 4 ruang atau tab;return_expression
- Nilai balik dari loop, jika ada, diberikan kepada variabel dalam var_declaration. Jika loop keluar karena kata kunci "continue loop" atau "break loop", nilai balik dari loop adalah nilai balik dari variabel terakhir yang diberikan nilai sebelum loop keluar.continue
- Kata kunci yang hanya dapat digunakan dalam lingkaran kembali. Itu menyebabkan pengulangan lingkaran kembali berikutnya dijalankan.break
- Kata kunci untuk keluar dari lingkaran kembali.
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))
Sampai jumpa lagi
for...in
while
for...in
Struktur memungkinkan beberapa pernyataan untuk dilakukan berulang untuk setiap elemen dalam suatu array. Ia dapat digunakan bersama dengan parameter manapun:array_element
, atau digunakan bersama dengan dua parameter:[index, array_element]
❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Ini melacak indeks iterasi saat ini pada variabel pertama dari modul. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop.
[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 pada loopreturn_expression
Nilai tersebut adalah:index
- Mengikuti variabel opsional dari indeks iterasi saat ini. Index dimulai dari 0. Variabel tidak dapat diubah dalam lingkaran.array_element
Pada dasarnya, ini adalah bagian dari sebuah kelompok.array_element
- berisi variabel dari setiap elemen array berturut-turut yang akan diproses dalam loop. Variabel ini tidak dapat diubah dalam loop.array_id
- Array ID yang diulang kembali.statements | continue | break
- Jumlah kalimat yang diinginkan, atau kata kunci "continue" atau "break" yang dapat dikunci menjadi 4 ruang atau tab;return_expression
- Nilai balik dari siklus diberikan kepadavar_declaration
Variabel di dalamnya, jika ada. Jika loop keluar karena kata kunci "continue loop" atau "break loop", maka nilai yang dikembalikan oleh loop adalah variabel yang diberi nilai terakhir sebelum loop keluar.continue
- Kata kunci yang hanya dapat digunakan dalam lingkaran kembali. Itu menyebabkan pengulangan lingkaran kembali berikutnya dijalankan.break
- Kata kunci untuk keluar dari lingkaran kembali.
Hal ini memungkinkan untuk memodifikasi elemen array atau ukurannya dalam loop.
Di sini, kita menggunakanfor...in
Bentuk parameter tunggal untuk menentukan berapa banyak baris K yang memiliki nilai OHLC yang lebih besar dari SMA dari ambang dekat:
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 membuat kitaisPos
Nilai dari array diatur sebagaitrue
Saat mereka berada di tempat kami,valuesArray
Nilai yang sesuai dalam arithmetic adalah:
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))
Sampai jumpa lagi
for
while
array.sum
array.min
array.max
while
Pernyataan memungkinkan pengulangan kondisi pada blok kode lokal.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Penjelasan:variable_declaration
- Deklarasi variabel opsional.return expression
Anda dapat memberikan nilai initialization untuk variabel ini.boolean_expression
- Jika benar, lakukanwhile
Blok lokal dari kalimat tersebut. Jika false, diwhile
Setelah kalimat, lanjutkan dengan mengeksekusi skrip.continue
- continue
Kata kunci menyebabkan cabang berputar ke iterasi berikutnya.break
- break
Kata kunci yang menyebabkan penghentian loop.while
Setelah kalimat, lanjutkan.return_expression
- Disediakanwhile
Kata-kata yang dikembalikan adalah baris opsional.
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)
PenjelasanAwalnyawhile
Blok kode lokal setelah baris harus dikompres menjadi empat ruang atau satu karakter.while
Anda bisa melihat gambarnya di bawah ini.while
Ekspresi Boolean berikutnya harus akhirnya berubah menjadi false, atau harus dijalankanbreak
。
Operator switch memindahkan kontrol ke salah satu dari beberapa kalimat berdasarkan nilai kondisi dan 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
Di sini, Anda dapat melihat beberapa gambar yang menarik.
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)
Kembali nilaiNilai dari ungkapan terakhir dalam blok kalimat lokal yang dijalankan.
PenjelasanHanya bisa dilakukanlocal_block
Contoh ataudefault_local_block
Salah satunya.default_local_block
Hanya dengan=>
Tanda-tanda digabungkan, dan hanya dieksekusi jika blok sebelumnya tidak dijalankan.switch
Hasil pernyataan diberikan kepada variabel dan tidak ditentukandefault_local_block
Jika tidak dilaksanakan,local_block
Jika tidak, maka kalimat itu akan kembali.na
Akan.switch
Hasil dari pernyataan diberikan kepada variabel, semualocal_block
Contoh harus mengembalikan nilai dengan tipe yang sama.
Sampai jumpa lagi
if
?:
series adalah kata kunci yang menunjukkan jenis seri data.series
Kata kunci biasanya tidak diperlukan.
Digunakan untuk memberi nilai pada variabel, tetapi hanya ketika variabel dinyatakan (untuk pertama kalinya).
Operator penugasan, memberikan penugasan pada variabel di sebelah kiri.
Tidak sama dengan. berlaku untuk semua jenis ekspresi.
expr1 != expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Modul ((bilangan bilangan bulat) ⇒ digunakan untuk ungkapan angka ⇒
expr1 % expr2
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
PenjelasanDalam skrip Pine, ketika menghitung sisa bilangan bulat, pedagang akan terpotong; yaitu, menempatkannya ke dalam angka absolut terendah; 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.
Nomor modular. Untuk ekspresi numerik.
expr1 %= expr2
Contoh
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
Perkalian.. Untuk ekspresi numerik..
expr1 * expr2
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
Penggambaran perkalian.
expr1 *= expr2
Contoh
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
Tambahkan atau satuan nomor asli.
expr1 + expr2
+ expr
Kembali nilaiSistem biner dari string+
Mengembalikan gabungan dari express1 dan express2
Nomor mengembalikan bilangan bulat atau nilai titik didih, atau rentang nilai:
Bilal +'kembali express1 plus express2.
Satu kata + satu kata kembali express (tidak menambahkan apa pun pada simetri operator satu kata).
PenjelasanAnda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.
Penggambaran kata ganti.
expr1 += expr2
Contoh
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Kembali nilaiUntuk string, kembalikan serangkaian expres1 dan expres2. Untuk angka, kembalikan bilangan bulat atau nilai floating point, atau rangkaian nilai.
PenjelasanAnda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.
Hukum pengurangan atau satuan negatif.
expr1 - expr2
- expr
Kembali nilaiMengembalikan bilangan bulat atau nilai floating point, atau rentang nilai:
Benzene binomial +'kembali express1 dikurangi express2.
Satu Yuan-
Mengembalikan negasi dari express.
PenjelasanAnda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.
Pengurangan fungsi......
expr1 -= expr2
Contoh
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
Pengecualian. ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
expr1 / expr2
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
Selain penunjukan. ⇒ digunakan untuk ekspresi numerik.
expr1 /= expr2
Contoh
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.
Lebih kecil dari. Berlaku untuk ekspresi numerik.
expr1 < expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Lebih kecil dari atau sama dengan.
expr1 <= expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Ini sama dengan. yang dapat digunakan untuk semua jenis ekspresi.
expr1 == expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Operator '=>' digunakan untuk deklarasi fungsi yang didefinisikan pengguna danswitch
Saya tidak tahu apa yang terjadi.
Fungsi yang dinyatakan dalam bahasa Inggris adalah:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Satu<local_block>
Kata-kata ini memiliki angka nol atau lebih dari kata Pine.<function_result>
Sebuah variabel, sebuah ekspresi, atau sebuah elemen.
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))
PenjelasanAnda dapat mempelajari lebih lanjut tentang fungsi yang didefinisikan pengguna di halaman deklarasi dan skrip di manual pengguna.
Lebih besar dari. Untuk ekspresi numerik.
expr1 > expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Lebih besar dari atau sama dengan.
expr1 >= expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Operator kondisi tiga kata.
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)
Kembali nilaiJika expres1 dinilai benar, expres2 akan dinilai benar, jika tidak, expres3 akan dinilai benar. Nilai nol ((0 dan NaN+, Infinity,-Infinity) dianggap salah, dan semua nilai lainnya adalah benar.
PenjelasanJika Anda tidak membutuhkannya, gunakan na sebagai cabang dari
Sampai jumpa lagi
na
Serial subtitle↑ memberikan akses ke nilai sebelumnya dari seri expr1↑ expr2 adalah jumlah k baris yang lalu, yang harus menjadi nilai↑ float akan disampingkan↑
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)
Kembali nilaiSebuah seri nilai.
Sampai jumpa lagi
math.floor
Logika AND digunakan untuk ekspresi Boolean.
expr1 and expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Logika OR↑ berlaku untuk ekspresi Boolean↑
expr1 or expr2
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Permintaan logis sebaliknya ((NOT) ⇒ berlaku untuk ekspresi Boolean ⇒
not expr1
Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.
Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit. Variabel "Bool" dapat memiliki nilai true, false atau na.
Contoh
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
PenjelasanMengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.
Sampai jumpa lagi
var
varip
int
float
color
string
true
false
Kata kunci dari tipe
Contoh
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
PenjelasanMengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.
Sampai jumpa lagi
var
varip
float
bool
color
string
Kata kunci tipe float float (float point) yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.
Contoh
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
PenjelasanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na.
Sampai jumpa lagi
var
varip
int
bool
color
string
Kata kunci untuk tipe "string" yang secara eksplisit menyatakan variabel atau parameter.
Contoh
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
PenjelasanMengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.
Sampai jumpa lagi
var
varip
int
float
bool
str.tostring
str.format
Kata kunci untuk tipe "color" yang secara eksplisit menyatakan variabel atau parameter.
Contoh
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
PenjelasanAksara warna memiliki format berikut: #RRGGBB atau #RRGGBBAA. Huruf mewakili nilai enam belas digit dari 00 hingga FF (dari 0 hingga 255 dalam sistem desimal), di mana RR, GG dan BB adalah nilai dari red, green, dan blue component warna. AA adalah opsional untuk transparansi warna (atau alpha component), di mana 00 tidak terlihat, FF tidak transparan. Ketika AA tidak disediakan, menggunakan FF. Huruf enam belas digit dapat ditulis besar atau kecil. Mengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.
Sampai jumpa lagi
var
varip
int
float
string
color.rgb
color.new
Kata kunci dari tipe array 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))
PenjelasanObjek array selalu dalam bentuk array berurutan.
Sampai jumpa lagi
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 jenis kustom dalam kebijakan yang mengatur nilai yang berbeda dalam satu entitas.
Definisi tipe
Mari kita definisikan jenis order untuk menyimpan informasi order:
type order
float price
float amount
string symbol
type
Jenis pernyataan kata kunci.Membuat objek
Menggunakan tipe yang dinyatakan dengan baik, panggilannew()
Fungsi 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 obyek 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 menulisnya dengan cara berikut:
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Penggunaan tipe objek untuk 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 pernyataan kata kunci var untuk menugaskan variabel ke objek dengan tipe yang didefinisikan pengguna, kata kunci tersebut akan secara otomatis diterapkan ke semua bidang dari objek tersebut. Ini berarti bahwa objek yang dinyatakan dengan kata kunci var akan mempertahankan keadaannya di antara setiap iterasi, tanpa perlu menginisialisasi kembali nilai bidangnya di setiap iterasi.
Dengan menggambar bidang indeks dari dua objek, Anda dapat membandingkan perbedaan antara keduanya. firstBar.index akan mempertahankan nilai yang sebelumnya ditetapkan di setiap iterasi, sementara currentBar.index akan diinisialisasi kembali ke nilai bar_index untuk entri saat ini di setiap iterasi.
Jenis objek untuk 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, menggunakan kata kunci varip dapat menunjukkan bahwa bidang objek terus ada sepanjang eksekusi skrip, tanpa bergulir kembali ke kolom yang belum dipastikan. Dalam pernyataan tipe Counter, bidang bars tidak menggunakan kata kunci varip, sehingga akan bergulir di setiap kolom yang tidak terkonfirmasi; sedangkan bidang ticks menggunakan kata kunci varip, sehingga tidak akan bergulir di setiap kolom yang tidak terkonfirmasi. Objek counter dinyatakan dengan kata kunci var, sehingga akan terus ada sepanjang eksekusi skrip. Dalam setiap iterasi, bars field dan ticks field akan ditambahkan 1; bars field akan bergulir di setiap kolom yang belum dipastikan, sedangkan ticks field tidak bergulir. Akhirnya, dengan menggambar bidang counter.bars dan counter.ticks, perbedaan antara keduanya dapat dibandingkan. Nilai counter.bars akan bergulir kembali di setiap kolom yang tidak terkonfirmasi, sementara nilai counter.ticks akan terus meningkat sampai skrip selesai dijalankan.
Mengubah nilai kolom
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 bidang objek.
Koleksi objek
Contoh menyatakan sebuah array kosong yang akan menyimpan objek dengan tipe order yang didefinisikan pengguna:
type order
float price
float amount
string symbol
arrOrder = array.new<order>()
order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")
array.push(arrOrder, order1)
array.push(arrOrder, order2)
runtime.log(arrOrder)
runtime.error("stop")
Atau
type order
float price
float amount
string symbol
var array<order> arrOrder = na
arrOrder := array.new<order>()
order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")
array.push(arrOrder, order1)
array.push(arrOrder, order2)
runtime.log(arrOrder)
runtime.error("stop")
Objek yang disalin
Dalam Pine, objek ditugaskan dengan referensi. Ketika objek yang ada ditugaskan ke variabel baru, keduanya menunjuk ke objek yang sama.
//@version=5
indicator("")
type pivotPoint
int x
float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)
Dalam contoh di bawah ini, kita membuat sebuah objek pivot1 dan mengatur bidang x-nya menjadi 1000. Kemudian, kita menyatakan sebuah pivot2 berisi variabel yang merujuk pada objek pivot1, sehingga keduanya menunjuk pada contoh yang sama. Oleh karena itu, mengubah pivot2.x juga akan mengubah pivot1.x, karena keduanya merujuk pada bidang x-nya.
Untuk membuat salinan yang independen dari objek asli, dalam hal ini kita dapat menggunakan metode copy ((() built-in. Dalam contoh ini, kita menyatakan pivot2 mengacu pada variabel dari contoh salinan dari objek pivot1. Sekarang, mengubah pivot2.x tidak mengubah pivot1.x karena ia mengacu pada bidang x dari objek yang terpisah:
//@version=5
indicator("")
type pivotPoint
int x
float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)
Perlu dicatat bahwa metode salinan TradingView adalah shorthand. Jika objek memiliki jenis khusus dari bidang (seperti array), bidang-bidang dalam salinan shorthand dari objek tersebut akan mengarah ke contoh yang sama dengan objek tersebut. FMZ platform secara langsung mengimplementasikan deep copy tanpa perlu prosesor tambahan, contohnya:
Salinan dalam
//@version=5
indicator("test deepCopy")
type orderInfo
float price
float amount
type labelInfo
orderInfo order
string labelMsg
labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)
labelInfo1.labelMsg := "labelInfo1->2" // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999 // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2
runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")
Hasil tes, labelInfo.copy ((labelInfo1) saat dijalankan sebagai deep copy, modifikasi labelInfo1 tidak akan mempengaruhi labelInfo2.
Metode dalam bahasa Pine adalah fungsi khusus yang terkait dengan jenis built-in atau user-defined dari suatu contoh tertentu. Dalam banyak hal, mereka mirip dengan fungsi biasa, tetapi menawarkan tata bahasa yang lebih singkat dan lebih mudah. Pengguna dapat menggunakan simbol titik untuk mengakses metode pada variabel secara langsung, seperti mengakses bidang pada objek Pine.
Metode internal
Contoh kode skrip seperti ini:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
array.push(sourceArray, sourceInput)
array.shift(sourceArray)
// Update the mean and standard deviaiton values.
sampleMean := array.avg(sourceArray)
sampleDev := array.stdev(sourceArray) * multiplier
// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
"Siapa yang tidak tahu?"
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
sourceArray.push(sourceInput)
sourceArray.shift()
// Update the mean and standard deviaiton values.
sampleMean := sourceArray.avg()
sampleDev := sourceArray.stdev() * multiplier
// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
Anda dapat melihat dukungan dari PINE.Methods
Setelah itu, kodearray.avg(sourceArray)
Dengan menggunakan metode ini, pengguna dapat menuliskan:sourceArray.avg()
Saya tidak tahu.
Perhatian: FMZ tidak didukung saat iniarray.avg
Dia juga mengatakan bahwa dia tidak akan pernah bisa melakukan hal itu.
Metode yang didefinisikan pengguna
Pine memungkinkan pengguna untuk mendefinisikan metode kustom yang dapat digunakan bersama dengan objek dari jenis built-in atau user-defined. Metode definisi pada dasarnya sama dengan fungsi definisi, tetapi dengan dua perbedaan utama:
1, kata kunci method harus dimasukkan sebelum nama fungsi. 2, parameter dari metode, di mana tipe parameter pertama harus dinyatakan secara eksplisit karena menunjukkan jenis objek yang akan dikaitkan dengan metode tersebut.
Misalnya, dalam kode berikut, kode untuk menghitung indikator Brin dibungkus dengan metode yang disesuaikan pengguna:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sourceArray = array.new<float>(samplesInput)
var float sampleMean = na
var float sampleDev = na
// Identify if `n` bars have passed.
if bar_index % n == 0
// Update the queue.
sourceArray.push(sourceInput)
sourceArray.shift()
// Update the mean and standard deviaiton values.
sampleMean := sourceArray.avg()
sampleDev := sourceArray.stdev() * multiplier
// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand = sampleMean - sampleDev
plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)
Perubahan menjadi:
//@version=5
indicator("Custom Sample BB", overlay = true)
float sourceInput = input.source(close, "Source")
int samplesInput = input.int(20, "Samples")
int n = input.int(10, "Bars")
float multiplier = input.float(2.0, "StdDev")
var array<float> sour
WuhuanBagaimana cara menjalankan beberapa transaksi pada saat yang sama untuk kontrak bitcoin?
Awan ringanApakah pine dapat melakukan banyak transaksi seperti JS? Terima kasih.
Lisa20231Terima kasih atas informasinya.
seniWow! Bagaimana bisa script pine ini menggunakan simulasi okex di platform ini?
seniIni berarti bahwa strategi tradingview dapat disalin langsung ke platform penemu dan digunakan!
Penemu Kuantitas - Mimpi KecilBahasa PINE hanya dapat melakukan strategi varietas tunggal, strategi multi-varietas adalah yang terbaik atau menulis desain dengan python, javascript, c++.
Penemu Kuantitas - Mimpi KecilOh, ya, OKX agak istimewa, mereka memiliki alamat yang sama di lingkungan analog dan lingkungan nyata, hanya berbeda di tempat lain. Jadi tidak ada cara untuk beralih ke analog dengan mengubah alamat basis.
Awan ringanTidak bisa menggunakan okx analog...
Penemu Kuantitas - Mimpi KecilMasalah arsitektur yang beragam ini tidak dapat diselesaikan dengan baik, karena setiap pertukaran memiliki antarmuka yang berbeda dan batas frekuensi antarmuka yang tidak sama, yang akan menimbulkan banyak masalah.
Penemu Kuantitas - Mimpi KecilBaiklah, terima kasih atas saranmu, dan laporkan permintaan ini di sini.
Awan ringanPerasaan lebih baik untuk mengintegrasikan dengan JS, JS dapat lebih baik beradaptasi dengan berbagai cara transaksi.
Pemangsa TrendingApakah Anda akan mempertimbangkan lebih banyak varietas di masa depan?
Penemu Kuantitas - Mimpi KecilTidak sopan.
Awan ringanBaiklah, terima kasih banyak.
Penemu Kuantitas - Mimpi KecilHalo, sementara, strategi bahasa PINE hanya bisa menggunakan satu varietas.
Penemu Kuantitas - Mimpi KecilTidak sopan, terima kasih atas dukungannya. Dokumen akan terus disempurnakan.
Penemu Kuantitas - Mimpi KecilSaya tidak tahu.
Penemu Kuantitas - Mimpi KecilPINE template library, dimana parameter dapat diatur untuk mengubah alamat basis pertukaran.