FMZ PINE Script

Dicipta dalam: 2022-05-06 14:27:06, dikemas kini pada: 2025-01-23 10:19:06
comments   18
hits   13760

[TOC]

Kata kunci, tatabahasa, penerangan tetapan

Struktur kod

Struktur umum yang diikuti oleh kod dalam Pine:

<version>
<declaration_statement>
<code>

Nota

Simbol komen yang disokong oleh bahasa Pine di FMZ: komen satu baris//Nota berbilang baris/* */Sebagai contoh, bagaimana nota ditulis dalam contoh berikut:

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // 计算MACD指标

/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')

Penerbitan

Arahan kompilator dalam bentuk berikut memberitahu kompilator versi Pine yang digunakan untuk skrip:

//@version=5

Secara lalai, versi v5 boleh diabaikan dalam kod//@version=5

Kenyataan

  • indicator()
  • strategy()

Pernyataan pengisytiharan menentukan jenis skrip, yang seterusnya menentukan apa yang dibenarkan di dalamnya, dan bagaimana ia digunakan dan dilaksanakan. Ia menetapkan sifat-sifat utama skrip, seperti namanya, di mana ia akan muncul apabila ia ditambah ke dalam carta, ketepatan dan format nilai yang ditunjukkannya, dan nilai-nilai untuk mengawal tindakan tertentu semasa ia berjalan, seperti jumlah objek peta maksimum yang akan ditunjukkan dalam carta. Untuk strategi, sifat-sifat termasuk parameter yang dikawal semula, seperti modal awal, komisen, titik meluncur, dan lain-lain.indicator()ataustrategy()Kenyataan rasmi:

Kod

Garis yang tidak memberi komen atau arahan kompilator dalam skrip adalah pernyataan, yang mewujudkan algoritma skrip. Pernyataan boleh menjadi salah satu daripada ini.

  • Pengisytiharan pemboleh ubah
  • Penjenamaan semula pemboleh ubah
  • Pengisytiharan fungsi
  • Panggilan fungsi terbina dalam, panggilan fungsi yang ditakrifkan pengguna
  • ifforwhileatauswitchStruktur lain

Perkataan boleh disusun dengan pelbagai cara

  • Sesetengah ungkapan boleh dinyatakan dengan satu baris, seperti kebanyakan deklarasi pembolehubah, yang hanya mengandungi satu baris panggilan fungsi atau deklarasi fungsi baris tunggal. Yang lain, seperti struktur, selalu memerlukan lebih banyak baris, kerana mereka memerlukan satu blok tempatan.
  • Perkataan dalam skop global skrip (iaitu, bahagian yang tidak tergolong dalam blok tempatan) tidak boleh dianggap sebagai空格atau制表符(Kunci tab) bermula。 Karakter pertama mereka juga mestilah karakter pertama baris tersebut。 Baris yang bermula pada kedudukan pertama baris, menjadi sebahagian daripada skop global skrip mengikut definisi。
  • Struktur atau pernyataan fungsi berbilang baris sentiasa memerlukanlocal block。 Satu blok tempatan mesti dikurangkan ke dalam satu tanda pengenal atau empat ruang kosong ((jika tidak, ia akan diuraikan sebagai kod berturut-turut baris sebelumnya, iaitu dihakimi sebagai kesinambungan baris sebelumnya), dan setiap blok tempatan mentakrifkan ruang lingkup tempatan yang berbeza。
  • Pelbagai ungkapan tunggal boleh disusun dalam satu baris dengan menggunakan tanda koma ((,) sebagai pemisah.
  • Satu baris boleh mengandungi komen atau hanya komen.
  • Baris juga boleh dibungkus ((terus dalam pelbagai baris) )

Sebagai contoh, termasuk tiga blok lokal, satu dalam deklarasi fungsi tersuai, dan dua menggunakan struktur if dalam deklarasi pembolehubah, seperti berikut:

indicator("", "", true)             // 声明语句(全局范围),可以省略不写

barIsUp() =>                        // 函数声明(全局范围)
    close > open                    // 本地块(本地范围)

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

runtime.log("color", color = plotColor)  // 调用一个内置函数输出日志 (全局范围)

Kod ganti baris

Baris panjang boleh dibahagikan kepada beberapa baris, atau “dibungkus”. Baris yang dibungkus mesti menyusut ke dalam apa-apa jumlah ruang, asalkan ia bukan kelipatan 4 (perbatasan ini digunakan untuk menyusut ke dalam blok tempatan).

a = open + high + low + close

Ia boleh dibungkus sebagai (perhatikan bahawa jumlah ruang yang dikurangkan dalam setiap baris bukanlah kelipatan 4):

a = open +
      high +
          low +
             close

Panggilan plot ((() yang panjang boleh dibungkus dalam ▽.

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100),                       // 一行长的plot()调用可以被包装
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

Perkataan dalam deklarasi fungsi yang ditakrifkan oleh pengguna juga boleh dibungkus. Namun, kerana blok tempatan secara gramatikal mesti bermula dengan pengurangan (- 4 ruang kosong atau 1 tanda kerja), apabila membahagikannya ke baris seterusnya, bahagian lanjutan perkataannya mesti bermula dengan pengurangan lebih daripada satu (- tidak sama dengan kelipatan 4 ruang kosong). Contohnya:

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)

a = test(close, open)
plot(a, title="a")

Jadual masa

Rangkaian masa bukanlah jenis atau format data, tetapi konsep struktur asas dalam bahasa PINE. Ia digunakan untuk menyimpan nilai yang berubah secara berturut-turut dalam masa, setiap nilai sesuai dengan satu titik masa. Struktur konsep ini sangat sesuai untuk digunakan untuk memproses dan merekodkan rangkaian data yang berubah dari masa ke masa. Dengan pembolehubah terbina dalamopenSebagai contoh,openVariabel terbina dalam merekodkan harga pembukaan setiap BAR K, jikaopenIa adalah 5 minit K.openVariabel yang dirakamkan ialah setiap 5 minit K bar (kolom). Apabila program strategi anda dijalankan, kod anda merujukopenUntuk merujuk kepada nilai sebelumnya dalam urutan masa (nilai masa lalu), kita menggunakan[]Operator sejarah, apabila strategi dijalankan pada baris KBAR,open[1]Maksudnya ialah merujuk kepada harga pembukaan K bar sebelum K bar semasa.

WalaupunJadual masaIa mudah untuk memikirkan struktur data “array”, walaupun bahasa PINE juga mempunyai jenis array. Tetapi mereka dan urutan masa adalah konsep yang sama sekali berbeza.

PINE direka bentuk sebagai siri masa, yang membolehkan anda dengan mudah mengira nilai terkumpul harga penutupan dalam kod strategi, dan tidak memerlukan struktur pusingan seperti for, hanya menggunakan fungsi terbina dalam bahasa PINEta.cum(close)Sebagai contoh lain, kita perlu mengira nilai purata perbezaan antara nilai tertinggi dan yang terendah bagi 14 baris K BAR terakhir (iaitu 14 baris K BAR yang paling dekat pada masa semasa ketika kod dijalankan) yang boleh ditulis sebagai:ta.sma(high - low, 14)

Hasil panggilan fungsi pada urutan masa juga akan meninggalkan jejak pada urutan masa, juga boleh digunakan[]Operator sejarah merujuk kepada nilai sebelum. Sebagai contoh, untuk menguji sama ada harga penutupan Kbar semasa melebihi nilai maksimum nilai tertinggi dalam BAR 10 Kbar terakhir (tidak termasuk Kbar semasa). Kita boleh menulisbreach = close > ta.highest(close, 10)[1]Ia juga boleh ditulis sebagai,breach = close > ta.highest(close[1], 10)Oleh itu.ta.highest(close, 10)[1]danta.highest(close[1], 10)Ia adalah sama.

Ia boleh disahkan dengan kod berikut:

strategy("test pine", "test", true) 

a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)

plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)

Kod ujian di atas akan mengeluarkan nilai a dan b pada setiap BAR pada urutan masa yang sesuai, dan dapat dilihat bahawa nilai a dan b selalu sama, jadi kedua-dua cara menyatakan adalah setara.

Tarikh data rujukan

Trading View mempunyai had maksimum untuk rujukan data sejarah (maksimum 5000), seperti kod berikut:

//@version=6
indicator("test")

ema = ta.ema(close, 10000)      // 报错:Error on bar 0: The 'ema'->'sum' function references too many historical candles (10000), the limit is 5000.
plot(ema, "ema")

// pre10000 = ema[10000]        // 报错:Invalid number of bars back specified in the history-referencing operator. It accepts a value between 0 and 5000.
// plot(pre10000, "pre10000")

“Tetapan urus niaga” dalam “Pine Language Transaction Classroom” menggunakan strategi bahasa PINE di FMZ, parameter: “Jumlah kitaran terpanjang pembolehubah” menetapkan jumlah maksimum data yang boleh dirujuk.

FMZ PINE Script

indicator("test")

ema = ta.ema(close, 1000)  // ema = ta.ema(close, 3000) 则报错:Invalid number 3000 of bars back specified in the history-referencing operator. It accepts a value between 0 and 2000.
plot(ema, "ema")

Parameter “variabel terpanjang tempoh” tidak boleh ditetapkan terlalu besar, dan dalam strategi yang sesuai, data boleh dirujuk.

Parameter modem perpustakaan kelas pertukaran bahasa Pine

Panduan untuk menetapkan parameter pada templat binaan “Pine Language Transaction Class Library” untuk PINE Policy.

FMZ PINE Script

Tetapan perdagangan

  • Perlaksanaan Model harga penutupan: model dijalankan apabila BAR semasa habis, dan perdagangan dijalankan apabila BAR akar bermula. Model harga masa nyata: setiap kali harga berubah, model dijalankan, dan ada isyarat untuk melakukan perdagangan dengan segera.
  • Nombor tangan terbuka secara lalai: Jika arahan perdagangan tidak menentukan jumlah perdagangan, pelaksanaan perdagangan mengikut jumlah yang ditetapkan.
  • Jumlah pesanan maksimum dalam satu transaksi: Berdasarkan cakupan sebenar, dalam kombinasi dengan tetapan parameter ini, tentukan jumlah pesanan maksimum untuk setiap pesanan, untuk mengelakkan kejutan cakupan.
  • Peluang penurunan harga: berdasarkan定价货币精度Parameter dan parameter ini menentukan harga slippage pada masa pesanan. Sebagai contoh, penetapan ketepatan mata wang harga adalah 2, iaitu tepat ke nombor kedua, tepat kepada 0.01. Maka setiap titik slippage mewakili 0.01 unit penetapan. Pada masa ini, penetapan nilai slippage adalah 5, dan harga slippage pada masa pesanan adalah 0.05 (harga slippage merujuk kepada bahagian harga yang terlampau pada masa pesanan untuk lebih baik dan menutup pesanan).
  • Bilangan kitaran terpanjang: bilangan BAR pada garisan K yang mempengaruhi grafik, denganjavascriptPanggilan dalam strategiSetMaxBarLenFungsi yang sama.

Opsyen Niaga Hadapan

  • Kod varieti: Kod kontrak, yang perlu ditetapkan apabila objek pertukaran adalah objek pertukaran bukan tunai.
  • Minimum jumlah kontrak: jumlah minimum kontrak yang boleh diuruskan semasa anda membuat pesanan.

Pilihan Sebenar

  • Kembali semula secara automatik: Kembali semula ke keadaan sebelum strategi terakhir berhenti.
  • Bilangan percubaan semula pesanan: Pesanan yang tidak berjaya akan membatalkan pesanan, dan pesanan semula akan cuba untuk berdagang, parameter ini digunakan untuk mengehadkan jumlah percubaan semula maksimum.
  • Interval tinjauan rangkaian ((ms): hanya sah untuk protokol REST, mengawal selang permintaan rangkaian, mengelakkan permintaan terlalu kerap, melebihi had bursa.
  • Tempoh penyegerakan akaun (dalam detik): tempoh masa untuk penyegerakan data akaun.
  • Masa sinkronisasi kedudukan selepas pembukaan kedudukan (((ms): hanya untuk beberapa pertukaran yang berulang pembukaan kedudukan yang disebabkan oleh kelewatan data, masa sinkronisasi yang lebih besar dapat mengurangkan masalah seperti itu.
  • Ganda Leverage: Tetapkan Ganda Leverage.

Perdagangan tunai, tetapan lain

  • Jumlah transaksi satu tangan: jumlah transaksi satu tangan secara lalai, hanya berlaku untuk barangan tunai.
  • Jumlah minimum transaksi: jumlah minimum transaksi.
  • Ketepatan harga mata wang: ketepatan harga, iaitu angka kecil harga.
  • Ketepatan jenis dagangan: ketepatan pesanan seterusnya, iaitu digit kecil pesanan seterusnya.
  • Bayaran: Untuk mengira beberapa data berdasarkan tetapan ini, 0.002 menunjukkan 2 per seribu.
  • Jarak statistik kerugian: Hanya digunakan untuk menunjukkan statistik kerugian di cakera.
  • Kegagalan cuba semula ((ms): selang cuba semula apabila permintaan rangkaian gagal.
  • Penggunaan ejen: hanya sah untuk REST
  • Hiding common network errors: Hiding common error logs in the log area.
  • Alamat pangkalan suis: hanya sah untuk protokol REST.
  • Pemberitahuan push: Pelancaran mesej ke peti mel dan sebagainya.

Buat pesanan

Pembukaan Kedai

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)                          // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓

Kedudukan rata

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 perdagangan

Mekanisme pegangan dalam bahasa PINE adalah sama seperti pegangan unidirectional. Sebagai contoh, apabila anda memegang kedudukan dalam arah yang berlainan, jika anda mempunyai pesanan untuk menjual operasi, pelan, dan sebagainya, maka anda akan melakukan pelaksanaan perintah yang bertentangan dengan arah pegangan.

Borang rancangan

Apabila menggunakan arahan pesanan, apabila tidak ditetapkan sebarang harga, harga pasaran secara lalai. Selain harga pasaran, anda juga boleh membuat pesanan melalui senarai rancangan, tetapi tidak akan segera melakukan pesanan.Rekod semulaMaklumat status masa ((iaitu tetingkap status semasa strategi berjalan) dilihat dalam tab “Pelan pesanan” di bahagian halaman. Sistem hanya akan benar-benar memesan apabila pasaran memenuhi syarat harga masa nyata yang mencetuskan satu-satu rancangan ini. Oleh itu, pesanan ini berada dalam keadaan yang agak kecil pada harga transaksi adalah keadaan biasa.strategy.entryKita boleh menetapkan fungsi yang kita mahu.limitstopParameter

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    
  • Pesanan had

Tetapkan harga terhad untuk pesanan, apabila pesanan adalah pembelian (iaitudirectionParameternya ialahstrategy.long), hanya apabila harga pasaran semasa lebih rendah daripada harga tersebut, pesanan akan dicetuskan. Apabila pesanan adalah untuk dijual (iaitudirectionParameternya ialahstrategy.short), hanya apabila harga pasaran semasa lebih tinggi daripada harga tersebut, pesanan akan dicetuskan.

  • Perintah berhenti

Tetapkan harga hentian pesanan, apabila pesanan untuk membeli, pesanan akan dicetuskan hanya jika harga pasaran semasa lebih tinggi daripada harga tersebut. Apabila pesanan adalah untuk menjual, pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih rendah daripada harga tersebut.

  • pesanan berhenti-batas

Ia boleh diletakkan pada masa yang samalimitstopParameter, pesanan akan dicetuskan pada harga pertama yang memenuhi syarat.

Peratusan hak dan kepentingan

//@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_equitySelepas, tetapandefault_qty_valueSebagai peratusan ((0 ~ 100), 1 ialah 1%. Jumlah pesanan berdasarkan jumlah mata wang dalam akaun. Sebagai contoh: akaun semasa mempunyai 10000 USDT, menetapkan pesanan 1%, iaitu menggunakan pesanan pesanan 100 USDT (berdasarkan harga semasa semasa semasa dijual).

Pernyataan, kata kunci struktur logik

var

var adalah kata kunci untuk variable alokasi dan inisialisasi sekali pakai. Secara amnya, sintaks penugasan pemboleh ubah yang tidak mengandungi kata kunci var menyebabkan nilai pemboleh ubah ditutup setiap kali data diperbaharui. Sebaliknya, apabila menggunakan kata kunci var untuk menugaskan pemboleh ubah, walaupun data diperbaharui, mereka masih boleh menyimpan keadaan yang sama dan hanya mengubahnya jika syarat dalam if-expressions dipenuhi.

var variable_name = expression

Terangkan:

  • variable_name- apa-apa nama pemboleh ubah pengguna yang dibenarkan dalam Pine Script ((boleh mengandungi huruf Latin, nombor dan garis bawah dalam huruf besar dan kecil))_), tetapi tidak boleh bermula dengan nombor) 。
  • expression- Sebarang ungkapan aritmatika, seperti definisi pembolehubah biasa.

Contoh

// Var keyword example
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
    var x = close
    b := x
    green_bars_count := green_bars_count + 1
    if green_bars_count >= 10
        var y = close
        c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")

Variabel ‘a’ mengekalkan harga penutupan pada baris pertama setiap baris dalam siri. Peubah ‘b’ mengekalkan harga penutupan batang harga aluminium hijau pertama dalam siri. Variable ‘c’ mengekalkan harga penutupan untuk ketupat hijau ketupat kesepuluh dalam siri.

Di FMZ, ia dibahagikan kepada model harga masa nyata, model harga penutupan, dan model harga penutupan.varvaripKami menggunakan kod berikut untuk menguji variabel yang diisytiharkan:

strategy("test pine", "test 1", true) 

// 测试 var varip
var i = 0
varip ii = 0

// 将策略逻辑每轮改变的i、ii打印在图上
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)

// 每轮逻辑执行都给i、ii递增1
if true
    i := i + 1
    ii := ii + 1
  • Model harga masa nyata Kode ujian di atas dibahagikan kepada dua peringkat semasa pelaksanaan: 1) K-baris sejarah; 2) K-baris sebenar; 3) K-baris model masa nyata; 4) K-baris sejarah.varvaripVariabel i, ii yang diisytiharkan akan melakukan operasi tambahan setiap kali kod dasar dijalankan (keranaif trueOleh itu, anda dapat melihat bahawa setiap nombor yang ditunjukkan pada bar K hasil pengesanan kembali adalah 1 tambahan. Apabila fasa K sejarah berakhir, fasa K sebenar bermula.varvaripVariabel yang diisytiharkan mula berubah. Oleh kerana ia adalah model harga masa nyata, setiap perubahan harga dalam K-bar akan menjalankan kod strategi sekali, dan setiap perubahan harga dalam K-bar akan menghasilkan perubahan yang berbeza.i := i + 1danii := ii + 1Semua dijalankan sekali. Perbezaan ialah ii diubah setiap kali. Walaupun i juga diubah setiap kali, tetapi pada pusingan seterusnya pelaksanaan logik strategi akan kembali ke nilai sebelumnya, sehingga nilai i yang ditetapkan tidak dikemas kini sehingga Kbar semasa habis ((iaitu, pada pusingan seterusnya pelaksanaan logik strategi tidak akan kembali ke nilai sebelumnya). Oleh itu, dapat dilihat bahawa pembolehubah i masih meningkat setiap BAR 1. Tetapi pembolehubah ii bertambah beberapa kali setiap BAR.

  • Model Harga Penutupan Oleh kerana model harga penutupan adalah satu logik strategi yang dijalankan apabila setiap BAR K line telah selesai. Oleh itu, dalam model harga penutupan, fasa K-line sejarah dan fasa K-line masa nyata,varvaripVariabel yang diisytiharkan menunjukkan peningkatan yang sama dalam contoh di atas, iaitu peningkatan 1 BAR bagi setiap baris K.

varip

varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi pembolehubah sekali gus. Ia serupa dengan kata kunci var, tetapi pembolehubah yang menggunakan varip menyatakan mengekalkan nilainya di antara kemas kini K-line dalam masa nyata.

varip variable_name = expression

Terangkan:

  • variable_name- Sebarang nama pemboleh ubah pengguna yang dibenarkan dalam skrip Pine boleh mengandungi huruf Latin, nombor dan garis bawah dalam huruf besar dan kecil_), tetapi tidak boleh bermula dengan nombor) 。
  • expression- Sebarang ungkapan aritmatika, seperti apabila menentukan pembolehubah biasa. Pada baris K pertama, ungkapan hanya dikira sekali dan ia diperuntukkan kepada pembolehubah sekali.

Contoh

// varip
varip int v = -1
v := v + 1
plot(v)

Dengan var, peta akan mengembalikan nilai bar_index. Dengan varp, tindakan yang sama berlaku pada garis K sejarah, tetapi pada garis K masa nyata, peta akan mengembalikan nilai yang meningkat satu untuk setiap tick.

Nota Hanya boleh digunakan dengan jenis yang mudah, seperti float, int, bool, string, dan array jenis ini.

true

Menunjukkan nilai bagi jenis Boolean, atau apabila digunakan dalam ungkapanPerbandinganatauLogikNilai yang boleh dikira oleh operator.

Nota Lihat jugaPerbandinganOperator danLogikKeterangan pengendali

Lihat juga bool

false

Menunjukkan nilai pembolehubah jenis Boolean, dan hasil operasi perbandingan, operasi logik.

Nota Lihat jugaPerbandinganOperator danLogikKeterangan pengendali

Lihat juga bool

if

Perkataan if mentakrifkan blok perkataan yang mesti dilaksanakan apabila syarat ungkapan dipenuhi. Bahasa skrip Pine edisi ke-4 membolehkan anda menggunakan sintaks else if.

Kod umum berasal dari:

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    ...
    var_decl_thenN
    return_expression_then
else if [optional block]
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else
else
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else

Nota var_declarationX- Variabel ini mengambil nilai if condition- Jika syarat adalah true, gunakan blok pernyataanthenLogik dalamvar_decl_then0var_decl_then1Jika syaratnya adalah false, gunakan blok kalimat.else ifatauelseLogik dalamvar_decl_else0var_decl_else1Antara lain: return_expression_then , return_expression_else- ungkapan terakhir dalam modul atau ungkapan dari blokelse akan mengembalikan nilai akhir ungkapan. Jika pengisytiharan pembolehubah berada di akhir, nilai akan menjadi nilai hasil.

Jenis nilai yang dikembalikan oleh pernyataan if bergantung kepadareturn_expression_thendanreturn_expression_elseJenis-jenis tersebut harus bersesuaian apabila dijalankan pada TradingView: apabila anda mempunyai nilai senar dalam blokelse, tidak mungkin untuk mengembalikan nilai integer dari blok then. Apabila dijalankan pada FMZ, contoh berikut tidak akan tersilap, apabila nilai y diambil “open”, nilai pada plot adalah n/a.

Contoh

// This code compiles
x = if close > open
    close
else
    open  

// This code doesn’t compile by trading view
// y = if close > open
//     close
// else
//     "open"
plot(x)

Boleh dikurangkanelseDalam kes ini, jika syaratnya adalah false, maka variabel var_declarationX akan diberikan satu nilai tunjangan yang kosong (na, false atau ):

Contoh

// if
x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)

Anda boleh menggunakan lebih daripada satu blok else if atau tidak sama sekali. then, else if, else blok dipindahkan empat ruang kosong:

Contoh

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

boleh abaikanifNilai hasil pernyataan ((var_declarationX= boleh diabaikan) . Ia mungkin berguna jika anda memerlukan kesan sampingan dari ungkapan, seperti dalam perdagangan strategi:

Contoh

if (ta.crossover(high, low))
    strategy.entry("BBandLE", strategy.long, stop=low)
else
    strategy.cancel(id="BBandLE")

If boleh digabungkan:

Contoh

// if
float x = na
if close > open
    if close > close[1]
        x := close
    else
        x := close[1]
else
    x := open
plot(x)

for

Struktur ‘for’ membolehkan pelaksanaan berganda:

[var_declaration =] for counter = from_num to to_num [by step_num]
    statements | continue | break
    return_expression

var_declaration- Satu deklarasi pembolehubah yang boleh dipilih, yang akan ditugaskan sebagai nilai return_expression untuk pusingan balik. counter- Variabel yang menyimpan nilai penghitung pusingan, naik / turun 1 atau step_num nilai pada setiap iterasi pusingan. from_num- Nilai permulaan pengira. Percuma menggunakan nilai terhad / ungkapan int / float. to_num- Nilai akhir meter. Apabila meter lebih besar daripada to_num (atau lebih kecil daripada to_num dalam keadaan from_num > to_num), kitaran dipotong. Penggunaan nilai terendah / ungkapan int / float berturut-turut dibenarkan, tetapi mereka hanya dinilai pada iterasi pertama kitaran. step_num- Penghitung kenaikan / penurunan. Ia adalah pilihan. Nilai lalai adalah + 1 atau -1, bergantung kepada yang terbesar dari dari_num atau to_num. Apabila menggunakan nilai, penghitung juga akan meningkat / menurun berdasarkan yang terbesar dari dari_num atau to_num, jadi tanda + / - dari step_num adalah pilihan. statements | continue | break- Sebilangan besar perkataan, atau kata kunci ‘terus’ atau ‘pecah’, dikurangkan menjadi 4 ruang atau satu tab. return_expression- Nilai pulangan gelung, jika ada, diberikan kepada pembolehubah dalam var_declaration. Jika gelung keluar kerana kata kunci continue atau break, nilai pulangan gelung adalah nilai pulangan pembolehubah terakhir yang diberikan sebelum gelung keluar. continue- Kata kunci yang hanya boleh digunakan dalam pusingan balik. Ia menyebabkan iterasi pusingan balik berikutnya dilaksanakan. break- Kata kunci untuk keluar daripada lingkaran.

Contoh

// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
    int result = 0
    for i = 1 to lookback
        if close[i] > close
            result += 1
    result
plot(qtyOfHigherCloses(14))

Lihat juga for...in while

for…in

for...inStruktur membolehkan pelaksanaan berulang pelbagai pernyataan untuk setiap elemen dalam array. Ia boleh digunakan dengan mana-mana argumen:array_element, atau digunakan bersama dengan dua argumen:[index, array_element]Bentuk kedua tidak menjejaskan fungsi kitaran. Ia mengesan indeks iterasi semasa dalam pembolehubah pertama dalam subset.

[var_declaration =] for array_element in array_id
    statements | continue | break
    return_expression

[var_declaration =] for [index, array_element] in array_id
    statements | continue | break
    return_expression

var_declaration- satu pilihan pengisytiharan pembolehubah, yang akan diberikan kepada kitaranreturn_expressionNilai index- Variabel pilihan yang mengesan indeks perkalian semasa. Indeks bermula dari 0. Variabel tidak berubah dalam badan pusingan. Apabila digunakan, ia mesti termasuk dalam satu yang juga termasuk.array_elementDalam subgroups: array_element- mengandungi pembolehubah bagi setiap elemen susunan berturut-turut yang akan diuruskan dalam kitaran. Pembolehubah tersebut tidak berubah dalam kitaran. array_id- Array ID untuk iterasi lingkaran. statements | continue | break- Sebilangan besar perkataan, atau kata kunci ‘terus’ atau ‘pecah’, dikurangkan menjadi 4 ruang atau satu tab. return_expression- Nilai pulangan pusingan diberikan kepadavar_declarationJika loop keluar kerana kata kunci ‘continue’ atau ‘break’, maka nilai yang dikembalikan untuk loop adalah variabel yang diberi nilai terakhir sebelum loop keluar. continue- Kata kunci yang hanya boleh digunakan dalam pusingan balik. Ia menyebabkan iterasi pusingan balik berikutnya dilaksanakan. break- Kata kunci untuk keluar daripada lingkaran.

Mengubah unsur atau saiz array dalam loop dibenarkan. Di sini, kita menggunakanfor...inBentuk parameter tunggal untuk menentukan berapa banyak nilai OHLC bagi setiap baris K yang lebih besar daripada nilai SMA ‘close’:

Contoh

// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
    int result = 0
    for currentElement in array
        if currentElement > value
            result += 1
        result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))

Di sini, kita menggunakan dua bentuk parameter for…in untuk mengekspresikanisPosArray yang ditetapkan sebagai trueApabila mereka berada di dalam kita,valuesArrayNombor yang sesuai dalam array adalah masa yang betul:

Contoh

// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)  

for [index, value] in valuesArray
    if value > 0
        array.set(isPos, index, true)  

if barstate.islastconfirmedhistory
    runtime.log(str.tostring(isPos))

Lihat juga for while array.sum array.min array.max

while

whilePerkataan ini membenarkan pengulangan bersyarat bagi blok kod tempatan.

variable_declaration = while boolean_expression
    ...
    continue
    ...
    break
    ...
    return_expression

Terangkan: variable_declaration- Pengisytiharan pembolehubah pilihan.return expressionAnda boleh memberikan nilai inisialisasi kepada pembolehubah ini. boolean_expression- Jika benar, laksanakanwhileBlok tempatan untuk pernyataan. Jika false, maka dalamwhileSelepas ayat, lanjutkan dengan skrip. continue - continueKata kunci menyebabkan kitaran bercabang ke iterasi seterusnya. break - breakKata kunci menyebabkan kitaran berakhir.while“Saya tidak tahu apa-apa”, kata beliau. return_expression- Disediakan.whileGaris pilihan yang dikembalikan oleh pernyataan.

Contoh

// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter   = i_n
int factorial = 1
while counter > 0
    factorial := factorial * counter
    counter   := counter - 1

plot(factorial)

Nota PermulaanwhileBlok kod tempatan selepas baris mesti disusun dalam empat ruang atau satu tanda pengukur. Untuk menamatkan.whilePeredaran.whileEkspresi Boolean seterusnya mesti berubah menjadi false, atau ia mesti dijalankan.break

switch

Operator switch memindahkan kawalan ke salah satu daripada beberapa pernyataan berdasarkan syarat dan nilai ungkapan.

[variable_declaration = ] switch expression
    value1 => local_block
    value2 => local_block
    ...
    => default_local_block

[variable_declaration = ] switch
    boolean_expression1 => local_block
    boolean_expression2 => local_block
    ...
    => default_local_block

Switch dengan ungkapan:

Contoh

// Switch using an expression

string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])

float ma = switch i_maType
    "EMA" => ta.ema(close, 10)
    "SMA" => ta.sma(close, 10)
    "RMA" => ta.rma(close, 10)
    // Default used when the three first cases do not match.
    => ta.wma(close, 10)

plot(ma)

Switch tanpa ungkapan:

Contoh

strategy("Switch without an expression", overlay = true)

bool longCondition  = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

switch
    longCondition  => strategy.entry("Long ID", strategy.long)
    shortCondition => strategy.entry("Short ID", strategy.short)

Nilai yang dikembalikan Nilai ungkapan terakhir dalam blok pernyataan tempatan yang dilaksanakan.

Nota Hanya boleh dijalankanlocal_blockcontoh ataudefault_local_blockSatu.default_local_blockhanya dengan=>Tanda-tanda diperkenalkan bersama-sama, dan hanya dilaksanakan jika blok sebelumnya tidak dilaksanakan. JikaswitchHasil pernyataan yang diberikan kepada satu pembolehubah dan tidak ditentukandefault_local_blockJika tidak dilaksanakan,local_block, maka ia akan kembali kepadanaswitchApabila hasil daripada pernyataan diberikan kepada pembolehubah, semualocal_blockInstan mesti mengembalikan nilai yang sama.

Lihat juga if ?:

series

series adalah kata kunci untuk menunjukkan jenis siri data.seriesKata kunci biasanya tidak diperlukan.

Pengendali

=

Digunakan untuk memberi nilai kepada pemboleh ubah, tetapi hanya apabila menyatakan pemboleh ubah ((untuk penggunaan pertama) ).

:=

Operator penyerahan nilai, memberikan nilai kepada pembolehubah di sebelah kiri. Digunakan untuk penyerahan nilai kepada pembolehubah yang telah diisytiharkan sebelumnya.

!=

Tidak sama dengan. Ia boleh digunakan untuk sebarang jenis ungkapan.

expr1 != expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

%

Bilangan modular ((bilangan bulat tambahan) . Digunakan untuk ungkapan nilai berangka .

expr1 % expr2

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

Nota Dalam skrip Pine, penjual akan dipotong apabila jumlah keseluruhan yang tersisa dikira. Iaitu, mengelilingi ke nilai mutlak terkecil. Nilai yang diperoleh akan mempunyai simbol yang sama dengan dividen.

Contoh: -1 % 9 = -1 - 9 * truncate ((-19) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1。

%=

Tugas modular. Digunakan untuk ungkapan berangka.

expr1 %= expr2

Contoh

// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

*

Perkalian. Digunakan untuk ungkapan nombor.

expr1 * expr2

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

*=

Perkalian ditetapkan. Digunakan untuk ungkapan nilai nombor.

expr1 *= expr2

Contoh

// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

+

Tambah atau satuan positif ≠ berlaku untuk ungkapan nilai atau rentetan ≠

expr1 + expr2
+ expr

Nilai yang dikembalikan String binari+Kembalikan gabungan expr1 dan expr2 Nombor mengembalikan nilai nombor bulat atau floating point, atau satu siri nilai: Binari ‘+’ kembali kepada expr1 tambah expr2。 Yuan + mengembalikan expr ((tidak menambah apa-apa kepada simetri operator yuan)

Nota Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.

+=

Penambahan ditetapkan. Digunakan untuk ungkapan atau rentetan nombor.

expr1 += expr2

Contoh

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

Nilai yang dikembalikan Untuk string, kembalikan sambungan expr1 dan expr2. Untuk nombor, kembalikan nilai integer atau floating point, atau satu siri nilai.

Nota Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.

-

Pengurangan atau satuan negatif. Digunakan untuk ungkapan berangka.

expr1 - expr2
- expr

Nilai yang dikembalikan Mengembalikan nombor bulat atau nilai titik terapung, atau satu siri nilai: Binari ‘+’ kembali kepada expr1 tolak daripada expr2。 satuan-Mengembalikan ungkapan negatif untuk express.

Nota Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.

-=

Peruntukan pengurangan. Digunakan untuk ungkapan nilai.

expr1 -= expr2

Contoh

// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

/

Pengecualian: Digunakan untuk ungkapan berangka.

expr1 / expr2

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

/=

Tugas penghapusan: Digunakan untuk ungkapan nilai.

expr1 /= expr2

Contoh

// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)

Nilai yang dikembalikan Bilangan bulat atau nilai titik terapung, atau satu siri nilai ≠

<

Kurang daripada ≠ berlaku untuk ungkapan nilai ≠

expr1 < expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

<=

Kurang daripada atau sama dengan. Digunakan untuk ungkapan nilai.

expr1 <= expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

==

Sama dengan … berlaku untuk sebarang jenis ungkapan …

expr1 == expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

=>

Operator ‘=>’ digunakan untuk menyatakan fungsi yang ditakrifkan pengguna danswitchDalam ayat.

Sintaks pengisytiharan fungsi adalah:

<identifier>([<parameter_name>[=<default_value>]], ...) =>
    <local_block>
    <function_result>

Satu.<local_block>0 atau lebih perkataan Pine. <function_result>adalah satu pembolehubah, satu ungkapan atau satu subset.

Contoh

// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) => 
    sum = x + y
    sumChange = ta.change(sum, 10)
    // Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))

Nota Anda boleh mendapatkan maklumat lanjut mengenai fungsi yang ditakrifkan oleh pengguna di halaman fungsi pengisytiharan dan perpustakaan skrip dalam buku panduan pengguna.

>

Lebih besar daripada ≠ berlaku untuk ungkapan nilai ≠

expr1 > expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

>=

Lebih besar daripada atau sama dengan. Digunakan untuk ungkapan nilai.

expr1 >= expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

?:

Pengendali Syarat Trivial

expr1 ? expr2 : expr3

Contoh

// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)  

// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)

Nilai yang dikembalikan Jika expr1 dinilai sebagai true, maka expr2, jika tidak, maka expr3。 Nilai sifar ((0 dan NaN+, Infinity,-Infinity) dianggap sebagai false, dan nilai lain adalah true。

Nota Jika anda tidak perlu, sila gunakan na sebagai cawangan daripada naelse. Anda boleh menggunakan dua atau lebih?: operator untuk mewujudkan pernyataan yang serupa dengan kata laluan switch () (lihat contoh di atas). Anda boleh menggunakan pengendali aritmatika dengan nombor dan juga rangkaian pembolehubah. Dalam kes rangkaian, pengendali digunakan untuk elemen.

Lihat juga na

[]

Rangkaian subtitle menyediakan akses kepada nilai-nilai terdahulu dalam siri expr1 expr2 adalah bilangan k baris yang lalu, mestilah nilai-nilai float akan dibulatkan ke bawah

expr1[expr2]

Contoh

// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
    a := low
plot(a)

Nilai yang dikembalikan Satu siri nilai.

Lihat juga math.floor

and

Logik AND ≠ berlaku untuk ungkapan Boolean ≠

expr1 and expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

or

Logik OR。 berlaku untuk ekspresi Boolean。

expr1 or expr2

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

not

Logik berbalikbalik ((NOT) . Digunakan untuk ungkapan Boolean .

not expr1

Nilai yang dikembalikan Nilai Bur, atau satu siri nilai Bur.

Kata kunci jenis data

bool

Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

// bool
bool b = true    // Same as `b = true`
b := na
plot(b ? open : close)

Nota Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.

Lihat juga var varip int float color string true false

int

Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit dengan jenis int () atau integer ().

Contoh

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

Nota Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.

Lihat juga var varip float bool color string

float

Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

// float
float f = 3.14    // Same as `f = 3.14`
f := na
plot(f)

Nota Jenis yang dinyatakan dengan jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia diinisialisasi dengan na

Lihat juga var varip int bool color string

string

Kata kunci “string” untuk menyatakan parameter atau pembolehubah secara eksplisit.

Contoh

// string
string s = "Hello World!"    // Same as `s = "Hello world!"`
// string s = na // same as "" 
plot(na, title=s)

Nota Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.

Lihat juga var varip int float bool str.tostring str.format

color

Kata kunci jenis “color” yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

// color
color textColor = color.green
if barstate.islastconfirmedhistory
    runtime.log("test", textcolor = textColor)

Nota Huruf warna mempunyai format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili nilai enam belas digit dari 00 ke FF (((0 ke 255 dalam nombor desimal), di mana pasangan RR, GG dan BB adalah nilai peratusan warna merah, hijau dan biru. AA adalah peratusan warna transparansi ((atau alfa), di mana 00 tidak dapat dilihat, FF tidak transparan. Apabila tidak menyediakan pasangan AA, FF digunakan. Mengutip jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Untuk maklumat lanjut mengenai jenis Pin, lihat halaman manual pengguna sistem jenis.

Lihat juga var varip int float string color.rgb color.new

array

Kata kunci untuk jenis matriks matriks matriks yang digunakan untuk menyatakan pembolehubah atau parameter secara eksplisit. Boleh digunakanarray.new<type>,array.fromFungsi mencipta objek array ((atau ID) }}.

Contoh

// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))

Nota Array object selalu berupa array array.

Lihat juga var array.new array.from

Objects

Objek Objek bahasa PINE adalah contoh jenis yang ditentukan oleh pengguna ((UDT), yang boleh difahami sebagai kelas tanpa kaedah, yang membolehkan pengguna membuat jenis tersuai dalam strategi untuk mengatur nilai yang berbeza dalam satu entiti.

Tentukan jenis

Mari kita tentukan jenis order untuk menyimpan maklumat pesanan:

type order
    float price
    float amount
    string symbol
  • gunatypeJenis pengisytiharan kata kunci
  • Nama jenis selepas kata kunci type.
  • Baris pertama type mentakrifkan nama jenis, kemudian kurung ke dalam empat ruang untuk mentakrifkan bidang yang mengandungi jenis tersebut.
  • Setiap medan perlu menyatakan jenis datanya, seperti int, float, string.

Cipta objek

Menggunakan jenis baik yang diisytiharkan, panggilannew()Objek penciptaan fungsi:

order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)

Anda juga boleh membuat objek kosong:

order order1 = na

Berikut adalah contoh sebenar:

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1)   // 输出 {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}

Contoh ayat ini:

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

Ia juga boleh ditulis dalam bentuk berikut:

order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

Jenis objek untuk penggunaan kata kunci var

//@version=5
indicator("Objects using `var` demo")

//@type A custom type to hold index, price, and volume information.
type BarInfo
    int   index = bar_index
    float price = close
    float vol   = volume

//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()

// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")

Apabila menggunakan var pengisytiharan kata kunci yang diberikan kepada variabel objek yang jenisnya ditentukan oleh pengguna, kata kunci itu secara automatik digunakan untuk semua bidang objek tersebut. Ini bermakna bahawa objek yang diisytiharkan dengan var kata kunci akan mengekalkan statusnya di antara setiap iterasi tanpa perlu menginisialisasi semula nilai bidangnya pada setiap iterasi.

  • Objek firstBar diisytiharkan menggunakan kata kunci var, jadi bidangnya (index, price, vol) akan mengekalkan nilainya dalam setiap iterasi, bermula dari item pertama hingga item terakhir berakhir.
  • Objek currentBar tidak menggunakan pengisytiharan kata kunci var, oleh itu bidangnya akan diinisialisasi semula pada setiap entri dan akan mempunyai objek baru pada setiap iterasi.

Dengan memetakan medan indeks dua objek, anda boleh membandingkan perbezaan di antara mereka. firstBar.index akan mengekalkan nilai yang ditetapkan sebelumnya dalam setiap iterasi, sementara currentBar.index akan diinisialisasi semula sebagai bar_index nilai item semasa dalam setiap iterasi.

Jenis objek untuk penggunaan kata kunci varip

//@version=5
indicator("Objects using `varip` fields demo")

//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
    int       bars  = 0
    varip int ticks = 0

//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()

// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars  += 1
counter.ticks += 1

// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)

Dalam Pine, menggunakan kata kunci varip dapat menunjukkan bidang objek yang berterusan sepanjang pelaksanaan skrip, dan tidak berputar di dalam lajur yang tidak diiktiraf. Dalam jenis pengisytiharan Counter, medan bars tidak menggunakan kata kunci varip, dan oleh itu akan berputar di dalam setiap lajur yang tidak disahkan. medan ticks menggunakan kata kunci varip, dan oleh itu ia tidak akan berputar di dalam lajur yang tidak disahkan. Objek counter diisytiharkan menggunakan kata kunci var, oleh itu ia akan kekal sepanjang pelaksanaan skrip. Dalam setiap iterasi, medan bars dan medan ticks akan ditambah 1. Bidang bars akan berputar di dalam setiap lajur yang tidak disahkan, manakala medan ticks tidak. Akhirnya, dengan memetakan medan counter.bars dan counter.ticks, anda boleh membandingkan perbezaan di antara mereka. Nilai counter.bars akan diputar balik dalam setiap lajur yang tidak disahkan, sementara nilai counter.ticks akan terus meningkat sehingga akhir skrip dijalankan.

Ubah nilai medan

”`pine type order float price float amount string symbol

if strategy.position_size == 0 and open > close strategy.entry(“long”, strategy.long, 1)

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

if strategy.position_size != 0 runtime.log(order1) order1.price := 999 order1.amount := 100 runtime.log(order1) r