[TOC]
Struktur umum yang diikuti oleh kod dalam Pine:
<version>
<declaration_statement>
<code>
Simbol nota yang disokong oleh bahasa Pine FMZ: nota satu baris//
Di bawah ini adalah beberapa contoh:/* */
Sebagai contoh, tulisan komen 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')
Perintah penyimpang dalam bentuk berikut memberitahu penyimpang versi skrip yang ditulis oleh Pine:
//@version=5
Secara lalai, versi v5 boleh dilepaskan dalam kod.//@version=5
。
indicator()
strategy()
Perkataan pengisytiharan menentukan jenis skrip, yang juga menentukan apa kandungan yang diizinkan di dalamnya, dan bagaimana ia digunakan dan dilaksanakan. Menetapkan sifat-sifat penting skrip, seperti namanya, di mana ia akan muncul apabila ia ditambah ke dalam carta, ketepatan dan format nilai yang dipaparkan, dan mengawal beberapa nilai tindakan semasa ia dijalankan, seperti jumlah objek lukisan maksimum yang akan dipaparkan di carta. Untuk polisi, sifat termasuk parameter yang mengawal pengulangan semula, seperti modal awal, komisen, titik slaid, dan lain-lain. FMZ tidak memerlukan Pine untuk dimasukkan dalam kod strategi.indicator()
ataustrategy()
Pernyataan yang dibuat.
Baris skrip yang bukan komen atau arahan penyusun adalah ayat yang melaksanakan algoritma skrip. Sebuah ayat boleh menjadi salah satu daripada mereka.
if
,for
,while
atauswitch
Struktur setaraPerkataan boleh disusun dalam pelbagai cara
空格
atau制表符
(kunci tab) bermula. Karakter pertama mereka juga mesti menjadi watak pertama baris tersebut. Baris yang bermula di kedudukan pertama baris, oleh definisi, menjadi sebahagian daripada ruang lingkup global skrip.local block
│ Sebuah blok tempatan mesti dikurangkan ke dalam satu karakter tetingkap atau empat ruang (jika tidak, akan diselesaikan sebagai barisan kod bersiri sebelumnya, iaitu ditetapkan sebagai kandungan berterusan barisan kod sebelumnya), dan setiap blok tempatan mentakrifkan satu jangkauan tempatan yang berbeza.Sebagai contoh, termasuk tiga blok tempatan, satu dalam deklarasi fungsi kustom, dua dalam deklarasi pembolehubah menggunakan struktur if, dengan kod 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 mengecilkan berapa banyak ruang, selagi ia bukan kelipatan 4 (batas-batas ini digunakan untuk mengecilkan bahagian).
a = open + high + low + close
Ia boleh dibungkus sebagai (perhatikan bahawa jumlah ruang yang dikurangkan setiap baris tidak merupakan kelipatan 4):
a = open +
high +
low +
close
Satu panggilan plot panjang (() boleh 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)
Perkataan dalam deklarasi fungsi yang ditakrifkan pengguna juga boleh dibungkus. Walau bagaimanapun, kerana blok tempatan secara sintetik mesti bermula dengan pengurangan ((4 ruang atau 1 tanda), apabila membahagikannya ke baris seterusnya, bahagian lanjutan pernyataan mesti bermula dengan lebih daripada satu pengurangan ((tidak sama dengan kelipatan 4 ruang); 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")
Urutan masa bukan jenis data atau format, tetapi merupakan konsep struktur asas dalam bahasa PINE. Ia digunakan untuk menyimpan nilai yang berubah secara berturut-turut dalam masa, setiap nilai yang sepadan dengan satu titik masa. Struktur urutan masa sesuai untuk digunakan untuk memproses dan merakam satu set data yang berubah dari masa ke masa.
Variabel terbina dalamopen
Sebagai contoh,open
Variabel terbina dalam merakam harga buka untuk setiap baris K BAR, jika iniopen
Jadi ini adalah data untuk 5 minit kitaran garis K.open
Yang dirakamkan dalam pembolehubah adalah harga pembukaan baris BAR (bar) K setiap 5 minit.open
Ini merujuk kepada harga bukaan BAR pada garis K yang kini berada. Untuk merujuk kepada nilai sebelumnya dalam urutan masa (nilai masa lalu), kita menggunakan[]
Operator sejarah, apabila dasar dijalankan pada bar baris Kopen[1]
Maksudnya adalah merujuk kepada harga buka bar bar K sebelum garis K semasa.
WalaupunUrutan masaIa mudah untuk memikirkan struktur data seperti "arry", walaupun bahasa PINE juga mempunyai jenis arry. Tetapi mereka adalah konsep yang sama sekali berbeza dengan urutan masa.
Perkembangan siri masa seperti ini dapat dengan mudah dikira sebagai nilai kumulatif harga penutupan dalam kod strategi tanpa menggunakan struktur berputar seperti for, hanya menggunakan fungsi terbina dalam bahasa PINE.ta.cum(close)
Untuk contoh lain, kita perlu mengira purata perbezaan antara harga tertinggi dan harga terendah untuk 14 baris K terakhir BAR (iaitu 14 baris K terdekat pada saat pelaksanaan kod semasa) yang boleh ditulis sebagai:ta.sma(high - low, 14)
Hasil panggilan fungsi pada urutan masa juga akan meninggalkan jejak pada urutan masa, yang juga boleh digunakan[]
Operator sejarah merujuk kepada nilai sebelum ini. Sebagai contoh, apabila harga penutupan baris K BAR semasa diuji melebihi nilai maksimum harga tertinggi dalam 10 baris K BAR terakhir (tidak termasuk baris K BAR semasa), kita boleh menulis sebagaibreach = 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)
Saya tidak mahu mengkritiknya.
Anda boleh mengesahkan dengan menggunakan 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 a dan b pada setiap BAR dengan nilai pada urutan masa masing-masing, dan anda dapat melihat bahawa nilai a dan b sentiasa sama, jadi kedua-dua kaedah penggambaran sama.
Panduan tetapan parameter untuk template terbina dalam dasar PINE "Pine Language Exchange Library".
定价货币精度
Parameter dan parameter ini menentukan harga geser semasa pesanan; sebagai contoh, penentuan ketepatan mata wang ditetapkan kepada 2, iaitu tepat ke tempat kedua bilangan kecil, tepat ke 0.01; maka nilai titik geser mewakili 0.01 unit harga; pada masa ini, nilai titik geser ditetapkan kepada 5, dan harga geser semasa pesanan adalah 0.05 ((Harga geser menunjukkan bahagian harga pemindahan pesanan untuk lebih baik dan perisian pesanan).javascript
Panggilan dalam strategiSetMaxBarLen
Fungsi berfungsi 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 pemegang PINE adalah serupa dengan pemegang satu arah. Sebagai contoh, apabila memegang kedudukan berbilang arah ("multi-head holding"), jika terdapat pesanan untuk menjual operasi, senarai rancangan, dan lain-lain (berbanding arah kebalikan dari arah pemegang), perintah pemicu pelaksanaan akan dilakukan terlebih dahulu untuk meratakan kedudukan berbilang arah ("meratakan semua pemegang berbilang arah) dan kemudian melaksanakan perintah pemicu berhubung arah kebalikan dari arah pemegang sebelum kedudukan.
Apabila menggunakan arahan order order, jika tidak menetapkan sebarang harga, anda akan memilih sebagai harga pasaran secara lalai. Selain daripada harga pasaran, anda juga boleh membuat order melalui order rancangan, yang tidak akan mengoperasikan order segera.Peranti sebenar / Ujian semulaMaklumat status masa (iaitu tetingkap status semasa pelaksanaan dasar) dilihat dalam tab penghapusan "pesanan yang dirancang"; sistem hanya akan benar-benar membuat pesanan apabila harga masa nyata pasaran memenuhi syarat untuk mencetuskan pesanan rancangan ini. Oleh itu, pesanan ini mempunyai sedikit kecacatan pada harga urus niaga adalah keadaan normal.strategy.entry
Apabila kita mengurutkan fungsi, kita boleh menetapkanlimit
、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 harga terhad untuk pesanan, apabila pesanan adalah pembayaran (iaitu)direction
Parameter ialahstrategy.long
Perintah hanya akan dicetuskan apabila harga pasaran semasa berada di bawah harga tersebut.
Apabila pesanan adalah pesanan jualan (iaitudirection
Parameter ialahstrategy.short
Perintah hanya akan dicetuskan apabila harga pasaran semasa lebih tinggi daripada harga tersebut.
Perintah berhenti
Tetapkan harga berhenti rugi untuk pesanan, apabila pesanan adalah untuk membeli, pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih tinggi daripada harga tersebut. Apabila pesanan adalah pesanan jual beli, pesanan hanya akan dicetuskan apabila harga pasaran semasa berada di bawah harga tersebut.
Perintah stop-limit
Boleh diset pada masa yang samalimit
、stop
Parameter, pesanan dipicu pada harga yang memenuhi syarat terlebih dahulu.
//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// 简单的均线交叉策略
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
Kemudian, tetapandefault_qty_value
Untuk jumlah peratusan ((0 ~ 100), 1 iaitu 1%;; jumlah unit dikira mengikut jumlah mata wang yang ditagih dalam akaun;; contoh: akaun semasa mempunyai 10000 USDT, atur pesanan 1% iaitu menggunakan pesanan unit yang berskala 100 USDT ((dikira mengikut harga semasa ketika dijual)).
var adalah kata kunci untuk pembahagian dan inisialisasi variabel sekali pakai. Selalunya, sintaks pemisahan pemboleh ubah yang tidak mengandungi kata kunci var akan menyebabkan nilai pemboleh ubah ditutup setiap kali data diperbaharui. Sebaliknya, apabila pemboleh ubah pemisahan menggunakan kata kunci var, walaupun data diperbaharui, mereka masih boleh mengekalkan status yang tidak stabil dan hanya mengubahnya apabila syarat dalam if-expressions dipenuhi.
var variable_name = expression
Menjelaskan:
variable_name
- Nama mana-mana pemboleh ubah pengguna yang dibenarkan dalam Pine Script (boleh mengandungi aksara Latin besar dan kecil, nombor dan tanda bawah (_), tetapi tidak boleh dimulakan dengan nombor)expression
- mana-mana ungkapan aritmatika, seperti menentukan 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
Pada FMZ, model harga sebenar, model harga penutupan, dan model harga penutupan digunakan untukvar
、varip
Kami menggunakan kod berikut untuk menguji pemboleh ubah yang dinyatakan.
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
Kod ujian di atas dibahagikan kepada dua fasa semasa pelaksanaan: 1, K-Line Sejarah; 2, K-Line Riil; dan 3, K-Line Riil.var
、varip
Variabel yang dinyatakan i, ii akan dijalankan pada setiap kali pelaksanaan kod dasar keranaif true
Oleh itu pasti menjalankan blok kod syarat yang sepadan) ; jadi anda dapat melihat bahawa setiap nombor yang ditunjukkan pada BAR baris K hasil ulangan adalah beransur-ansur 1; apabila fasa baris K sejarah berakhir, mulakan fasa baris K masa nyata.var
、varip
Variabel yang diisytiharkan mula berubah. Oleh kerana model harga masa nyata, setiap perubahan harga dalam garis K BAR akan menjalankan kod strategi berulang kali.i := i + 1
danii := ii + 1
Ia akan dilaksanakan sekali sahaja. Perbezaan adalah bahawa ia akan diubah setiap kali. Walaupun ia akan diubah setiap kali, ia akan kembali ke nilai sebelumnya apabila logik strategi dijalankan pada pusingan seterusnya, sehingga ia tidak akan diperbaharui untuk menentukan nilai i (iaitu ia tidak akan kembali ke nilai sebelumnya apabila logik strategi dijalankan pada pusingan seterusnya). Jadi anda dapat melihat bahawa pembolehubah i masih menjadi tambahan BAR1 untuk setiap root; tetapi pembolehubah ii ditambah beberapa kali untuk setiap BAR.
Model harga penutupan
Oleh kerana model harga penutupan adalah satu logik strategi yang dijalankan apabila setiap garis K BAR berakhir. Jadi dalam model harga penutupan, peringkat K garis sejarah dan tahap K garis masa nyata,var
、varip
Variabel yang diisytiharkan dalam contoh di atas adalah sama sepenuhnya dengan peningkatan, iaitu peningkatan 1 untuk setiap baris K BAR.
varip (var intrabar persist) adalah kata kunci yang digunakan untuk mengagihkan dan menginisiatifkan pembolehubah secara serentak. Ia serupa dengan kata kunci var, tetapi pembolehubah yang menggunakan deklarasi varip menyimpan nilainya di antara kemas kini baris K masa nyata.
varip variable_name = expression
Menjelaskan:
variable_name
- Nama mana-mana pemboleh ubah pengguna yang dibenarkan dalam skrip Pine (boleh mengandungi huruf besar dan kecil, angka dan garis bawah, tetapi tidak boleh dimulakan dengan nombor)expression
- mana-mana ungkapan aritmatika, seperti ketika menentukan pembolehubah biasa. Pada baris K pertama, ungkapan hanya dikira sekali dan diberikan kepada pembolehubah sekali.Contoh
// varip
varip int v = -1
v := v + 1
plot(v)
Apabila var digunakan, grafik akan mengembalikan nilai bar_index. Menggunakan varip, tindakan yang sama berlaku pada baris K sejarah, tetapi pada baris K masa nyata, grafik akan mengembalikan satu nilai yang meningkat satu untuk setiap tik.
Nota:Hanya boleh digunakan dengan jenis mudah, seperti float, int, boolean, string, dan array jenis ini.
Menunjukkan nilai kepada pembolehubah jenis boolean atau apabila ungkapan digunakanPerbandinganatauLogikNilai yang boleh dikira apabila operator.
Nota:Sila lihatPerbandinganOperator danLogikPenerangan pengendali.
Sampai jumpa lagi
bool
Menunjukkan nilai pembolehubah jenis Boolean, serta hasil operasi perbandingan, operasi logik.
Nota:Sila lihatPerbandinganOperator danLogikPenerangan pengendali.
Sampai jumpa lagi
bool
Perkataan if mendefinisikan blok perkataan yang mesti dilaksanakan apabila memenuhi syarat ungkapan. Bahasa skrip Pine versi ke-4 membolehkan anda menggunakan sintaks
Kod yang digunakan ialah:
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 daripada if statementcondition
- Jika syarat adalah benar, block ayat digunakanthen
Logiknyavar_decl_then0
,var_decl_then1
dan sebagainya). Jika syarat adalah false, block ayat digunakan.else if
atauelse
Logiknyavar_decl_else0
,var_decl_else1
Dan sebagainya) ‖.return_expression_then , return_expression_else
- Ungkapan terakhir dalam modul atau ungkapan dari blokelse akan mengembalikan nilai akhir pernyataan tersebut. Jika ungkapan pembolehubah pada akhir, nilainya akan menjadi nilai hasil.
Jenis nilai yang dikembalikan oleh if statement bergantung kepadareturn_expression_then
danreturn_expression_else
Jenis. Apabila dijalankan pada TradingView, jenis mereka mesti sepadan: tidak mungkin untuk mengembalikan nilai bulat dari blok kalimat then apabila anda mempunyai nilai baris dalam blokelse. Apabila dijalankan pada FMZ, contoh berikut tidak akan memberikan error, apabila 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)
Boleh disingkirkanelse
Blok. Dalam kes ini, jika syarat adalah false, nilai terhad yang kosong akan diberikan kepada pembolehubah var_declarationX:
Contoh
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Blok yang digunakan boleh menggunakan pelbagai blok if atau tidak digunakan. Blok then, if, dan if yang dipindahkan ke empat ruang:
Contoh
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
boleh diabaikan.if
Nilai hasil pernyataan ((
Contoh
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
If-statements boleh mengandungi satu sama lain:
Contoh
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
Struktur 'for' membolehkan berulang kali menjalankan beberapa set statement:
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Pengisytiharan pembolehubah pilihan yang akan ditetapkan sebagai nilai return_expression untuk putaran semula.counter
- Menyimpan nilai pemegang kira-kira, meningkatkan / mengurangkan nilai 1 atau step_num pada setiap pengulangan.from_num
- Nilai permulaan perhitung. Mengizinkan penggunaan int/float thresholds/expressions.to_num
- Nilai akhir penghitung. Loop terputus apabila penghitung lebih besar daripada to_num ((atau kurang daripada to_num dalam kes from_num > to_num).step_num
- Meningkatkan/mengurangkan nilai penghitung. Ia adalah pilihan. Nilai lalai adalah +1 atau-1, bergantung kepada yang terbesar dari_num atau to_num. Apabila menggunakan nilai, penghitung juga akan meningkat/mengurangkan mengikut yang terbesar dari_num atau to_num, jadi simbol +/- untuk step_num adalah pilihan.statements | continue | break
- Bilangan ayat yang dikehendaki, atau kata kunci "continue" atau "break" yang dikehendaki, dikurangkan kepada empat ruang atau satu tab.return_expression
- Nilai pulangan kitaran, jika ada, diberikan kepada pembolehubah dalam var_declaration. Jika kitaran keluar kerana kata kunci "continue" atau "break", nilai pulangan kitaran adalah nilai pulangan pembolehubah terakhir yang diberikan nilai sebelum kitaran keluar.continue
- Kata kunci yang hanya boleh digunakan dalam pusingan semula.break
- Kata kunci untuk keluar dari lingkaran semula.
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 ini membolehkan beberapa pernyataan untuk setiap elemen dalam array dilakukan berulang-ulang. Ia boleh digunakan bersama-sama dengan mana-mana parameter:array_element
, atau digunakan bersama dengan dua parameter:[index, array_element]
❏ Bentuk kedua tidak mempengaruhi fungsi putaran. ❏ Ia mengesan indeks yang sedang diulang pada pembolehubah pertama dalam kumpulan unsur. ❏ Bentuk kedua tidak mempengaruhi fungsi putaran. ❏ Bentuk kedua mengesan indeks yang sedang diulang pada pembolehubah pertama dalam kumpulan unsur.
[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
- Pengisytiharan pembolehubah pilihan yang akan diberikan kepada putaranreturn_expression
Nilai tersebut adalah:index
- Mengesan pembolehubah pilihan dalam indeks berulang semasa; indeks bermula dari 0; pembolehubah tidak berubah dalam lingkaran; apabila digunakan, ia mesti disertakan dalam satu yang juga disertakanarray_element
Perbandingan antara unsur-unsur ini adalah sebagai berikut:array_element
- Mengandung pembolehubah bagi setiap unsur barisan berturut-turut yang akan diuruskan dalam pusingan; pembolehubah ini tidak berubah dalam pusingan;array_id
- Array ID yang berulang-ulang berpusing.statements | continue | break
- Bilangan ayat yang dikehendaki, atau kata kunci "continue" atau "break" yang dikehendaki, dikurangkan kepada empat ruang atau satu tab.return_expression
- Nilai pulangan kitaran dialokasikan kepadavar_declaration
Variabel dalam, jika wujud. Jika gelung keluar kerana kata kunci "continue" atau "break", nilai balik gelung adalah variabel yang diberikan nilai terakhir sebelum gelung keluar.continue
- Kata kunci yang hanya boleh digunakan dalam pusingan semula.break
- Kata kunci untuk keluar dari lingkaran semula.
Ianya membolehkan anda mengubah elemen atau saiz array dalam gelung.
Di sini, kita gunakanfor...in
Bentuk parameter tunggal untuk menentukan berapa banyak baris K yang mempunyai nilai OHLC yang lebih besar daripada SMA yang mempunyai paras penutupan:
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 gunakan dua bentuk parameter for...in untuk merangkumi parameter kita.isPos
Nilai aritmatika ditetapkan sebagaitrue
Apabila mereka berada di kawasan kami,valuesArray
Nilai yang sepadan dalam aritmatika adalah pada masa yang tepat:
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
Perkataan membenarkan pengulangan syarat blok kod tempatan.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Menjelaskan:variable_declaration
- Pengisytiharan pembolehubah pilihan.return expression
Nilai initialization boleh diberikan kepada pembolehubah ini.boolean_expression
- Jika benar, jalankanwhile
Blok tempatan ayat. Jika false, diwhile
Selepas kalimat, teruskan menjalankan skrip.continue
- continue
Kata kunci membawa kepada cabang berputar ke iterasi seterusnya.break
- break
Kata kunci membawa kepada penghentian gelung.while
Perkataan itu diteruskan selepas kalimat tersebut.return_expression
- Disediakanwhile
Baris pilihan yang dikembalikan oleh ayat tersebut.
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 disempurnakan kepada empat ruang atau satu tanda jam.while
Pelanconganwhile
Ekspresi Boolean seterusnya mesti akhirnya menjadi false, atau mesti dijalankanbreak
。
Operator switch memindahkan kawalan ke salah satu daripada beberapa pernyataan berdasarkan nilai syarat dan 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
Pertukaran 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)
Pertukaran 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 pulanganNilai ungkapan terakhir dalam blok ayat tempatan yang dijalankan.
Nota:Hanya boleh dilaksanakanlocal_block
contoh ataudefault_local_block
Salah seorang daripada mereka.default_local_block
Hanya dengan=>
Penanda masuk bersama-sama, dan hanya dijalankan apabila blok sebelumnya tidak dijalankan; jikaswitch
Hasil pernyataan diberikan kepada satu pembolehubah dan tidak ditentukandefault_local_block
Jika tidak dilaksanakan,local_block
Jika anda menggunakan kata yang sama, maka ia akan kembali kepada anda.na
◄ akanswitch
Apabila hasil pernyataan diberikan kepada pembolehubah, semualocal_block
Contoh mestilah mengembalikan nilai jenis yang sama.
Sampai jumpa lagi
if
?:
series adalah kata kunci yang menunjukkan jenis siri data.series
Kata kunci biasanya tidak diperlukan.
Digunakan untuk memberi nilai kepada pembolehubah, tetapi hanya apabila memaklumkan pembolehubah (untuk pertama kalinya).
Operator pemesanan, memberi pemesanan kepada pembolehubah di sebelah kiri.
Tidak sama dengan. Berlaku untuk mana-mana jenis ungkapan.
expr1 != expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Modul ((bilangan bilangan bulat) ⇒ digunakan untuk ungkapan bilangan ⇒
expr1 % expr2
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Nota:Dalam skrip Pine, pedagang akan dipotong ketika mengira baki bilangan bulat; iaitu, menempatkannya kepada nilai mutlak terendah; 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.
Tunjuk modem. ^ Untuk ekspresi nombor. ^
expr1 %= expr2
Contoh
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Perkalian.. digunakan untuk ungkapan bilangan..
expr1 * expr2
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Tanda perkalian.. digunakan untuk ungkapan bilangan..
expr1 *= expr2
Contoh
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Tambahan atau satuan nombor sebenar. Untuk ungkapan nombor atau tali.
expr1 + expr2
+ expr
Nilai pulanganSistem binari pada senar+
Mengembalikan gabungan dari express1 dan express2
Nombor kembali bilangan bulat atau nilai titik terapung, atau satu siri nilai:
Benzene biner +'kembali express1 ditambah express2.
Satu unit + satu unit mengembalikan express (tidak menambah apa-apa pada simetri operator satu unit).
Nota:Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.
Tanda-tanda penjumlahan. Untuk ungkapan nombor atau rentetan.
expr1 += expr2
Contoh
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Nilai pulanganUntuk strings, kembalikan sambungan antara express1 dan express2; untuk digit, kembalikan bilangan bulat atau nilai floatpoint, atau satu siri nilai.
Nota:Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.
Pengurangan atau nombor negatif tunggal.
expr1 - expr2
- expr
Nilai pulanganMengembalikan bilangan bulat atau nilai float, atau satu siri nilai:
Benzene biner +'kembali kepada express1 dikurangkan dari express2.
Satu Yuan-
Mengembalikan kata negatif dari express.
Nota:Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.
Peruntukan pengurangan... digunakan untuk ungkapan bilangan...
expr1 -= expr2
Contoh
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Pengecualian. Berlaku untuk ungkapan bilangan.
expr1 / expr2
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Kecuali penunjuk. Untuk ekspresi bilangan.
expr1 /= expr2
Contoh
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.
Lebih kecil daripada. Berlaku untuk ungkapan bilangan.
expr1 < expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Lebih kecil daripada atau sama dengan.
expr1 <= expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Ia sama dengan. boleh digunakan untuk mana-mana jenis ungkapan.
expr1 == expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Operator '=>' digunakan untuk pengisytiharan fungsi yang ditakrifkan pengguna danswitch
Dalam ayat-ayat tersebut.
Perkataan fungsi adalah:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Satu.<local_block>
Ia adalah satu daripada dua perkataan yang digunakan dalam bahasa Inggeris.<function_result>
Ia adalah satu variabel, satu ungkapan, atau satu kumpulan unsur.
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 mempelajari lebih lanjut mengenai fungsi yang ditakrifkan pengguna di halaman fungsi pengisytiharan dan perpustakaan skrip dalam manual pengguna.
Lebih besar daripada. Berlaku untuk ungkapan bilangan.
expr1 > expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Lebih besar daripada atau sama dengan. Berlaku untuk ungkapan bilangan.
expr1 >= expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Operator tiga syarat.
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 pulanganJika express1 dinilai sebagai true, express2 akan dinilai sebagai true, jika tidak, express3 akan dinilai sebagai true. Nilai sifar ((0 dan NaN+, Infinity,-Infinity) dianggap sebagai false dan semua nilai lain adalah true.
Nota:Jika anda tidak memerlukan, sila gunakan na sebagai cawangan??else??. Anda boleh menggunakan dua atau lebih operator: untuk mencapai pernyataan yang serupa dengan kata ganti (lihat contoh di atas). Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.
Sampai jumpa lagi
na
Sub-label barisan↑ menyediakan akses kepada nilai terdahulu barisan expr1↑ expr2 ialah bilangan baris k yang lalu, mestilah nilai↑ float akan disampingkan 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 pulanganSatu siri nilai.
Sampai jumpa lagi
math.floor
Logik AND... digunakan untuk ungkapan Boolean...
expr1 and expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Logik OR↑ digunakan untuk ungkapan Boolean↑
expr1 or expr2
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Permintaan logik sebaliknya ((NOT) ⇒ digunakan untuk ungkapan Boolean.
not expr1
Nilai pulanganNilai Boolean, atau satu set nilai Boolean.
Kata kunci jenis "Bool" yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter. Nilai pembolehubah "Bool" boleh menjadi true, false atau na.
Contoh
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Baca lebih lanjut mengenai jenis Pine di halaman manual pengguna sistem jenis.
Sampai jumpa lagi
var
varip
int
float
color
string
true
false
Kata kunci jenis
Contoh
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Baca lebih lanjut mengenai jenis Pine di halaman manual pengguna sistem jenis.
Sampai jumpa lagi
var
varip
float
bool
color
string
Kata kunci jenis float float (float point) yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.
Contoh
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na.
Sampai jumpa lagi
var
varip
int
bool
color
string
Kata kunci jenis "string" yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.
Contoh
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Baca lebih lanjut mengenai jenis Pine di halaman manual pengguna sistem jenis.
Sampai jumpa lagi
var
varip
int
float
bool
str.tostring
str.format
Kata kunci jenis "color" yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.
Contoh
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Nota:Aksara warna mempunyai 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 red, green, dan blue untuk warna. AA adalah nilai pilihan untuk ketelusan warna (atau alpha), di mana 00 tidak kelihatan, FF tidak telus. Apabila AA tidak disediakan, menggunakan FF. Huruf enam belas digit boleh ditulis besar atau kecil. Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Lihat halaman panduan pengguna sistem jenis untuk mengetahui lebih lanjut mengenai jenis Pine.
Sampai jumpa lagi
var
varip
int
float
string
color.rgb
color.new
Kata kunci jenis array array yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter; 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:Objek barisan sentiasa dalam bentuk barisan baris.
Sampai jumpa lagi
var
array.new
array.from
Objek dalam bahasa PINE adalah contoh jenis yang ditakrifkan pengguna (UDT), yang boleh difahami sebagai kelas tanpa kaedah, yang membolehkan pengguna membuat jenis kustom dalam dasar untuk mengatur nilai yang berbeza dalam satu entiti.
Definisi jenis
Mari kita tentukan jenis pesanan untuk menyimpan maklumat pesanan:
type order
float price
float amount
string symbol
type
Jenis pengisytiharan kata kunci.Mencipta objek
Menggunakan jenis yang diisytiharkan, panggilannew()
Fungsi mencipta objek:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
Objek kosong juga boleh dicipta:
order order1 = na
Di bawah ini 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 digunakan 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")
Apabila anda menggunakan pernyataan kata kunci var untuk menugaskan pembolehubah kepada objek jenis yang ditakrifkan pengguna, kata kunci itu akan secara automatik digunakan untuk semua medan objek tersebut. Ini bermakna objek yang dinyatakan dengan kata kunci var akan mengekalkan keadaannya di antara setiap iterasi, tanpa perlu menginisialisasi semula nilai bidangnya pada setiap iterasi.
Dengan melukis bidang indeks dua objek, anda boleh membandingkan perbezaan antara mereka. firstBar.index akan mengekalkan nilai yang ditetapkan sebelumnya dalam setiap iterasi, sementara currentBar.index akan diisytiharkan semula dalam setiap iterasi sebagai nilai bar_index untuk entri semasa.
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)
Dalam Pine, menggunakan kata kunci varip boleh menunjukkan bahawa bidang objek akan terus wujud sepanjang pelaksanaan skrip, dan tidak akan berputar semula di dalam lajur yang tidak diiktiraf. Dalam pernyataan jenis Counter, medan bars tidak menggunakan kata kunci varip, jadi ia akan berputar di setiap lajur yang tidak disahkan; sedangkan medan ticks menggunakan kata kunci varip, jadi ia tidak akan berputar di setiap lajur yang tidak disahkan. Objek counter diisytiharkan dengan kata kunci var, jadi ia akan kekal sepanjang pelaksanaan skrip. Dalam setiap iterasi, kedua-dua medan bars dan ticks akan ditambahkan 1; medan bars akan berputar dalam setiap lajur yang tidak diiktiraf, sedangkan medan ticks tidak akan berputar. Akhirnya, perbandingan antara perbezaan antara mereka dapat dilakukan dengan melukis bidang counter.bars dan counter.ticks. Nilai counter.bars akan bergolak dalam setiap bar yang tidak disahkan, sementara nilai counter.ticks akan terus meningkat sehingga skrip selesai dijalankan.
Mengubah nilai medan
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")
Boleh digunakan:=
Operator penyerahan semula mengubah nilai bidang objek.
Kumpulan objek
Contoh menyatakan satu set kosong yang akan menyimpan objek dengan jenis order yang ditakrifkan oleh 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 disalin
Dalam Pine, objek diletakkan melalui rujukan. Apabila objek sedia ada diletakkan kepada pembolehubah baru, kedua-duanya menunjuk kepada 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, kita mencipta objek pivot1 dan menetapkan bidang xnya kepada 1000. Kemudian, kita menyatakan bahawa sebuah pivot2 mengandungi pembolehubah yang merujuk kepada objek pivot1 itu, jadi kedua-duanya menunjuk kepada contoh yang sama. Oleh itu, mengubah pivot2.x juga akan mengubah pivot1.x, kerana kedua-duanya merujuk kepada bidang x dari objek yang sama.
Untuk membuat salinan yang bebas daripada objek asal, dalam kes ini kita boleh menggunakan kaedah copy ((() terbina dalam. Dalam contoh ini, kita menyatakan pivot2 merujuk kepada pembolehubah contoh salinan objek pivot1. Sekarang, mengubah pivot2.x tidak akan mengubah pivot1.x kerana ia merujuk kepada medan objek x yang berasingan:
//@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 diperhatikan bahawa kaedah salinan TradingView adalah copy shorthand. Jika objek mempunyai jenis medan khusus (seperti array), medan dalam salinan shorthand objek itu akan menunjuk kepada contoh yang sama dengan objek tersebut. Platform FMZ secara langsung mengimplementasikan salinan mendalam tanpa memerlukan pemprosesan tambahan, contohnya:
Menyalin 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 ujian, labelInfo.copy ((labelInfo1) adalah salinan dalaman apabila dijalankan, mengubah labelInfo1 tidak akan menjejaskan labelInfo2
Kaedah dalam bahasa Pine adalah fungsi khusus yang berkaitan dengan jenis terbina dalam atau pengguna yang ditakrifkan dalam contoh tertentu. Dalam kebanyakan hal, mereka adalah sama seperti fungsi biasa, tetapi menyediakan senaman yang lebih pendek dan lebih mudah. Pengguna boleh menggunakan simbol titik untuk mengakses kaedah secara langsung pada pembolehubah, seperti mengakses medan objek Pine. Pine merangkumi semua jenis khusus kaedah terbina dalam, termasuk nombor kumpulan, matriks, pemetaan matriks, baris, baris pengisi, dan lain-lain. Kaedah ini memberi pengguna cara yang lebih ringkas untuk memanggil program khusus jenis ini dalam skrip.
Kaedah terbina dalam
Contohnya, kod 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)
Ini adalah satu-satunya cara untuk menghidupkan semula mereka.
//@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)
Di sini anda boleh melihat sokongan PINE.Methods
Selepas itu, kodarray.avg(sourceArray)
Dengan menggunakan kaedah ini, pengguna boleh menulis dalam bentuk:sourceArray.avg()
Saya tidak tahu apa yang berlaku.
Nota: FMZ tidak disokong buat masa iniarray.avg
Permohonan seperti itu.
Kaedah yang ditakrifkan pengguna
Pine membenarkan pengguna untuk mentakrifkan kaedah kustom yang digunakan bersama-sama dengan mana-mana objek jenis yang dibina atau ditakrifkan oleh pengguna. Kaedah definisi adalah sama dengan fungsi definisi, tetapi dengan dua perbezaan utama:
1, kata kunci method mesti dimasukkan sebelum nama fungsi. 2, parameter kaedah, di mana jenis parameter pertama mesti dinyatakan secara eksplisit kerana ia menyatakan jenis objek yang akan dikaitkan dengan kaedah tersebut.
Sebagai contoh, dalam kod berikut, kod untuk mengira penunjuk Brin dibungkus sebagai kaedah 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)
Diubah 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
wuhuoyanBagaimana untuk menjalankan pelbagai transaksi pada masa yang sama untuk kontrak Bitcoin?
Awan ringanBolehkah anda beritahu saya, adakah pine boleh berdagang lebih banyak? Adakah ia boleh berdagang lebih banyak seperti JS? Terima kasih.
Lisa20231Terima kasih untuk maklumat lanjut.
seniWow! bagaimana skrip pine ini menggunakan okx simulator pada platform?
seniIni sama dengan strategi platform tradingview yang boleh disalin terus ke platform pencipta untuk digunakan!
Pencipta Kuantiti - Impian KecilBahasa PINE hanya boleh melakukan dasar varietasi tunggal, strategi pelbagai varietasi adalah yang terbaik atau menulis reka bentuk dengan python, javascript, c ++.
Pencipta Kuantiti - Impian KecilOh, ya, OKX agak istimewa, mereka mempunyai alamat yang sama di persekitaran analog dan persekitaran cakera sebenar, hanya membuat perbezaan di tempat lain.
Awan ringanTidak boleh menggunakan okx analog.
Pencipta Kuantiti - Impian KecilMasalah seni bina yang pelbagai ini tidak dapat diselesaikan dengan baik, kerana setiap pertukaran mempunyai antara muka yang berbeza, dan batasan frekuensi antara muka juga tidak sama, yang akan menimbulkan banyak masalah.
Pencipta Kuantiti - Impian KecilBaiklah, terima kasih kerana mencadangkan, dan laporkan permintaan ini di sini.
Awan ringanPerasaan yang lebih baik untuk disatukan dengan JS, JS boleh menyesuaikan diri dengan pelbagai cara berdagang.
Pemangsa trendAdakah anda akan mempertimbangkan lebih banyak varieti pada masa akan datang?
Pencipta Kuantiti - Impian KecilTidak sopan.
Awan ringanBaiklah, terima kasih banyak.
Pencipta Kuantiti - Impian KecilHalo, sementara, strategi bahasa PINE hanya boleh menggunakan satu jenis sahaja.
Pencipta Kuantiti - Impian KecilTidak sopan, terima kasih atas sokongan anda. Dokumen akan terus diperbaiki.
Pencipta Kuantiti - Impian KecilYa, saya faham.
Pencipta Kuantiti - Impian KecilPINE template library, parameter yang boleh ditetapkan untuk menukar alamat pangkalan pertukaran.