FMZ PINE Script Dokumentasi

Dibuat di: 2022-05-06 14:27:06, diperbarui pada: 2025-01-23 10:19:06
comments   18
hits   13761

[TOC]

Kata kunci, tata bahasa, pengaturannya

Struktur Kode

Kode Pine mengikuti struktur umum:

<version>
<declaration_statement>
<code>

Catatan

Simbol komentar yang didukung oleh bahasa Pine di FMZ: komentar satu baris//Komentar beberapa baris/* */Misalnya, cara menulis komentar dalam contoh berikut:

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

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

Versi

Instruksi compiler dalam bentuk berikut ini memberi tahu compiler versi apa yang digunakan untuk skrip Pine:

//@version=5

Versi v5 secara default, dapat dihapus dalam kode//@version=5

Pernyataan

  • indicator()
  • strategy()

Pernyataan deklarasi menentukan jenis skrip, yang kemudian menentukan apa yang diizinkan di dalamnya, dan bagaimana digunakan dan dijalankan. Atribut utama skrip ditetapkan, seperti namanya, di mana ia akan muncul ketika ditambahkan ke dalam grafik, akurasi dan format dari nilai yang ditampilkan, dan nilai yang mengatur perilaku tertentu saat berjalan, seperti jumlah maksimum objek grafik yang akan ditampilkan dalam grafik.indicator()ataustrategy()Pernyataan pernyataan.

Kode

Sebuah skrip tidak memiliki komentar atau perintah compiler, melainkan kalimat, yang mengimplementasikan algoritma skrip. Sebuah kalimat dapat menjadi salah satu dari hal-hal tersebut.

  • Deklarasi Variabel
  • Reassignment dari variabel
  • Deklarasi Fungsi
  • Pemanggilan fungsi built-in, pemanggilan fungsi yang didefinisikan pengguna
  • ifforwhileatauswitchStruktur lainnya

Pernyataan dapat disusun dengan berbagai cara

  • Beberapa pernyataan dapat dituliskan dalam satu baris, seperti kebanyakan deklarasi variabel, yang hanya berisi satu baris panggilan fungsi atau deklarasi fungsi baris tunggal. Yang lain, seperti struktur, selalu membutuhkan lebih dari satu baris karena mereka membutuhkan satu blok lokal.
  • Pernyataan dalam ruang lingkup global skrip (yaitu bagian yang tidak termasuk dalam blok lokal) tidak dapat dianggap sebagai空格atau制表符(Tab) dimulai。 Karakter pertama mereka juga harus menjadi karakter pertama dari baris tersebut。 Baris yang dimulai pada posisi pertama dari baris, menurut definisi menjadi bagian dari ruang lingkup global dari skrip。
  • Struktur atau deklarasi fungsi multi-baris selalu membutuhkanlocal block。 Sebuah blok lokal harus disinkronkan ke dalam satu tanda baca atau empat ruang kosong (jika tidak, akan diuraikan ke dalam baris kode serialisasi sebelumnya, yang akan dianggap sebagai konten lanjutan dari baris kode sebelumnya), dan masing-masing blok lokal mendefinisikan sebuah ruang lingkup lokal yang berbeda。
  • Beberapa kalimat tunggal dapat diurutkan dalam satu baris dengan menggunakan tanda koma ((,) sebagai pemisah.
  • Satu baris bisa berisi komentar, atau hanya komentar.
  • Baris juga bisa dibungkus (berlanjut pada beberapa baris)

Misalnya, termasuk tiga blok lokal, satu dalam deklarasi fungsi khusus dan dua menggunakan struktur if dalam deklarasi variabel, dengan kode sebagai berikut:

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

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

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

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

Kode ganti baris

Baris panjang dapat dibagi dalam beberapa baris, atau “dibungkus”. Baris yang dibungkus harus menyusut ke dalam jumlah ruang kosong, asalkan bukan kelipatan 4.

a = open + high + low + close

Dapat dikemas dalam (perhatikan bahwa jumlah spasi yang dikurangi per baris bukanlah kelipatan dari 4):

a = open +
      high +
          low +
             close

Sebuah panggilan plot ((() yang panjang dapat dikemas menjadi。

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

Pernyataan dalam deklarasi fungsi yang didefinisikan pengguna juga dapat dikemas. Namun, karena blok lokal secara gramatikal harus dimulai dengan tanda kurung (((4 spasi atau 1 tanda kerja), ketika membagi-bagi ke baris berikutnya, bagian lanjutan dari pernyataan harus dimulai dengan satu atau lebih tanda kurung (((tidak sama dengan kelipatan 4 spasi) . Misalnya:

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

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

Urutan waktu

Serial waktu bukanlah sebuah jenis data atau format, tetapi sebuah konsep struktur dasar dalam bahasa PINE. Serial waktu digunakan untuk menyimpan nilai-nilai yang berubah secara berurutan, masing-masing nilai yang sesuai dengan satu titik waktu. Struktur konsep ini sangat cocok untuk digunakan untuk memproses dan merekam serangkaian data yang berubah dari waktu ke waktu. Dengan variabel bawaanopenMisalnya,openVariabel internal mencatat harga open bar untuk setiap K line, jikaopenadalah 5 menit dari siklus K. Jadi iniopenVariabel yang tercatat adalah harga open setiap 5 menit K baris BAR (kolom). Ketika program strategi Anda sedang dijalankan, kode yang dikutipopenUntuk referensi nilai sebelumnya dalam urutan waktu (value in the past), kita menggunakan[]Operator historis, ketika kebijakan dijalankan pada garis KBAR,open[1]Maksudnya adalah mengacu pada harga pembukaan dari garis K BAR sebelumnya dari garis K BAR saat ini.

MeskipunUrutan waktuStruktur data “array” mudah diingat, meskipun bahasa PINE juga memiliki tipe array. Namun, mereka dan urutan waktu adalah konsep yang sama sekali berbeda.

Bahasa PINE dirancang dengan urutan waktu yang dapat dengan mudah dihitung dalam kode kebijakan nilai akumulasi harga closeout, dan tidak perlu menggunakan struktur loop seperti for, hanya menggunakan fungsi built-in bahasa PINEta.cum(close)Sebagai contoh lain, kita perlu menghitung 14 garis K BAR terakhir (yaitu 14 garis K BAR terdekat dari saat saat saat kode dijalankan) dengan rata-rata perbedaan antara nilai maksimum dan minimum yang dapat ditulis sebagai:ta.sma(high - low, 14)

Hasil dari panggilan fungsi pada urutan waktu juga akan meninggalkan jejak pada urutan waktu.[]Operator sejarah merujuk nilai sebelumnya. Sebagai contoh, untuk menguji apakah nilai closeout dari garis BAR K saat ini melebihi nilai maksimum dari nilai tertinggi dari garis BAR K 10 terakhir (tidak termasuk garis BAR K saat ini). Kita dapat menuliskan sebagaibreach = close > ta.highest(close, 10)[1]Atau bisa juga ditulis sebagai:breach = close > ta.highest(close[1], 10)Karena itu.ta.highest(close, 10)[1]Danta.highest(close[1], 10)Ini adalah nilai yang sama.

Verifikasi dapat dilakukan dengan menggunakan kode berikut:

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

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

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

Kode tes di atas akan mengekspor nilai a dan b pada masing-masing BAR pada urutan waktu yang sesuai, dan dapat dilihat bahwa nilai a dan b selalu sama, sehingga kedua metode ini sama.

Referensi data historis

Trading View memiliki batasan jumlah maksimum untuk referensi data historis (maksimal 5000), seperti kode berikut:

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

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

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

“Setelan transaksi” dalam “Pine Language Transaction Classroom” menggunakan kebijakan bahasa PINE di FMZ, parameter: “Jumlah siklus terpanjang variabel” secara khusus mengatur jumlah maksimum data yang dapat dikutip.

FMZ PINE Script Dokumentasi

indicator("test")

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

Parameter “variabel terpanjang periode” tidak boleh terlalu besar, dan dalam kebijakan yang sesuai, data dapat dikutip.

Parameter modus Pine Language Transaction

Panduan pengaturan parameter untuk template PINE built-in “Pine Language Transaction Repository”.

FMZ PINE Script Dokumentasi

Pengaturan transaksi

  • Eksekusi Model harga penutupan: model dilakukan setelah BAR saat ini habis, dan transaksi dilakukan saat BAR bawah dimulai. Model harga real-time: setiap kali ada perubahan harga, model tersebut dieksekusi, dengan sinyal untuk segera melakukan transaksi.
  • Default open position number: Jika instruksi perdagangan tidak menentukan jumlah transaksi, transaksi dilakukan sesuai dengan jumlah yang ditetapkan.
  • Jumlah pesanan maksimum dalam satu transaksi: Berdasarkan cakupan aktual, dalam kombinasi dengan pengaturan parameter ini, tentukan jumlah pesanan maksimum untuk setiap pesanan, untuk menghindari dampak pada cakupan.
  • Nilai tukar: berdasarkan定价货币精度Parameter dan parameter ini menentukan harga slippage pada saat pesanan. Sebagai contoh, harga mata uang presisi diatur 2, yaitu tepat ke detik desimal, tepat ke 0.01. Maka setiap titik slippage mewakili 0.01 unit harga. Pada saat ini, harga slippage diatur 5, dan harga slippage pada saat pesanan adalah 0.05 ((harga slippage adalah bagian dari harga yang terlampaui saat pesanan dilakukan untuk lebih baik dan menutup pesanan).
  • Periode terpanjang variabel: jumlah BAR garis K yang mempengaruhi grafik, denganjavascriptPanggilan dalam strategiSetMaxBarLenFungsi yang sama.

Opsi Berjangka

  • Kode varietas: Kode kontrak, hanya perlu diatur jika objek pertukaran adalah objek pertukaran non-toko.
  • Minimum jumlah kontrak: jumlah minimum transaksi kontrak pada saat pesanan.

Opsi Nyata

  • Proses pemulihan otomatis: otomatis kembali ke keadaan sebelum strategi terakhir berhenti.
  • Order Re-Try: Order yang tidak berhasil akan membatalkan order, dan order ulang akan mencoba untuk melakukan transaksi. Parameter ini digunakan untuk membatasi jumlah maksimum order yang dapat dicoba ulang.
  • Interval survei jaringan ((milliseconds): hanya berlaku untuk protokol REST, mengontrol interval permintaan jaringan, menghindari permintaan yang terlalu sering, melampaui batas bursa.
  • Waktu sinkronisasi akun (dalam detik): Periode waktu data akun yang disinkronkan.
  • Waktu sinkronisasi posisi setelah pembukaan posisi (millisecond): hanya untuk beberapa pertukaran yang melakukan pembukaan posisi berulang yang disebabkan oleh keterlambatan data, pengaturan waktu sinkronisasi yang lebih besar dapat mengurangi masalah seperti itu.
  • Leverage multiplier: mengatur Leverage multiplier.

Perdagangan langsung, pengaturan lainnya

  • Volume transaksi satu tangan: volume transaksi satu tangan default, hanya berlaku untuk barang tunai.
  • Jumlah transaksi minimum: jumlah transaksi minimum.
  • Akurasi harga: Akurasi harga, yaitu angka kecil dari harga.
  • Akurasi jenis transaksi: Akurasi pesanan berikutnya, yaitu angka kecil dari pesanan berikutnya.
  • Biaya operasi: Untuk beberapa data berdasarkan pengaturan ini, 0.002 adalah 2 per seribu.
  • Interval statistik kerugian: hanya digunakan untuk menampilkan statistik kerugian pada hard disk.
  • Gagal mencoba kembali ((ms): Jangka waktu yang dibutuhkan untuk mencoba kembali ketika permintaan jaringan gagal.
  • Penggunaan proxy: hanya berlaku untuk protokol REST
  • Hide common network errors: Hide common error logs in the log area.
  • Switching base address: hanya berlaku untuk REST.
  • Pesan Pelancaran: Pesan Pelancaran ke kotak surat, dll.

Tempatkan pesanan

Memulai Posisi

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

Posisi kosong

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 mirip dengan pegangan unidirectional. Sebagai contoh, ketika memegang posisi dalam arah yang berlawanan dengan arah pegangan, jika ada perintah yang menjual operasi, rencana, dan lain-lain yang memicu eksekusi, maka akan dilunasi terlebih dahulu posisi dalam arah yang berlawanan dengan arah pegangan, dan kemudian dieksekusi.

Daftar rencana

Jika tidak ada harga yang ditentukan, maka daftar harga secara default. Selain daftar harga, Anda juga dapat melakukan pemesanan melalui daftar rencana, dan daftar rencana tidak akan langsung melakukan pemesanan. Daftar rencana dapat ditampilkan di antrian program yang tidak ada pada saat pemicu.Disket/Pengukuran UlangDalam tabel “Pelan Perintah” pada informasi status waktu (yaitu, status saat strategi berjalan) terlihat. Sistem hanya akan benar-benar memesan ketika harga pasar real-time memenuhi kondisi yang memicu rencana ini. Oleh karena itu, pesanan ini memiliki sedikit deviasi pada harga transaksi adalah hal yang normal.strategy.entryFungsi yang kita pesan, kita bisa menentukanlimitstopParameter

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    
  • Limit order

Setel harga batas untuk pesanan, yaitudirectionParameternya adalahstrategy.long), perintah hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut. Ketika pesanan adalah untuk dijual (yaitudirectionParameternya adalahstrategy.short), hanya jika harga pasar saat ini lebih tinggi dari harga tersebut, perintah akan dipicu.

  • Stop perintah

Setel harga stop loss untuk order, dimana order akan dipicu hanya jika harga pasar saat ini lebih tinggi dari harga tersebut. Ketika sebuah pesanan adalah untuk menjual, pesanan hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.

  • stop-limit order

Dapat disetel pada saat yang samalimitstopParameter, perintah dipicu pada harga pertama yang memenuhi syarat.

Persentase hak dan kewajiban

//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)  

// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// 如果均线交叉条件满足,则买入或卖出
if (longCondition)
    strategy.entry("Long", strategy.long)  

if (shortCondition)
    strategy.entry("Short", strategy.short)
  

Menentukandefault_qty_type=strategy.percent_of_equitySetelah, pengaturandefault_qty_valueSebagai persentase ((0 ~ 100), 1 adalah 1%. Menghitung jumlah pesanan berdasarkan jumlah mata uang yang terdaftar di akun. Misalnya: akun saat ini memiliki 10.000 USDT, mengatur pesanan 1%, yaitu menggunakan pesanan pesanan skala 100 USDT (dihitung berdasarkan harga saat ini saat dijual).

Pernyataan, kata kunci struktur logis

var

var adalah kata kunci untuk variabel yang dialokasikan dan diinisialisasi sekali pakai. Biasanya, sintaks pemberian nilai variabel tanpa kata kunci var akan menyebabkan nilai variabel ditimpa setiap kali data diperbarui. Sebaliknya, ketika menggunakan kata kunci var untuk mendistribusikan variabel, meskipun data diperbarui, mereka tetap dapat mempertahankan statusnya dan hanya mengubahnya jika memenuhi kondisi dalam if-expressions.

var variable_name = expression

Menjelaskan:

  • variable_name- Nama variabel pengguna apa pun yang diizinkan dalam Pine Script (yang dapat berisi huruf Latin, angka, dan garis bawah dalam huruf besar dan kecil)_), tetapi tidak dimulai dengan angka) 。
  • expression- Setiap ekspresi aritmatika, seperti mendefinisikan variabel reguler. Menghitung ekspresi dan mengalokasikannya ke variabel sekali.

Contoh

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

Variabel ‘a’ mempertahankan nilai closeout dari setiap baris pertama dari setiap baris dalam seri. Variabel ‘b’ mempertahankan harga penutupan dari batang harga pertama dalam seri. Variabel ‘c’ mempertahankan harga penutupan dari seri ke-10 dari kentang hijau.

Di FMZ, model harga real-time, model harga close-out, dan model harga close-out.varvaripVariabel yang dinyatakan akan kita uji dengan kode berikut:

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

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

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

// 每轮逻辑执行都给i、ii递增1
if true
    i := i + 1
    ii := ii + 1
  • Model harga waktu nyata Kode tes di atas terbagi dalam dua tahap: 1) Sejarah K-Line; 2) K-Line Real-Time; 3) K-Line Real-Time.varvaripVariabel i, ii dari deklarasi akan melakukan operasi tambahan setiap kali kode kebijakan dijalankan (karenaif trueJadi pastilah melakukan blok kode kondisional yang sesuai) 。 Jadi kita bisa melihat bahwa angka yang ditampilkan pada garis BAR hasil pengukuran kembali adalah masing-masing meningkat 1 。 Ketika tahap K baris sejarah berakhir, tahap K baris real-time dimulai 。varvaripVariabel yang dinyatakan mulai berubah. Karena model harga real-time, setiap perubahan harga dalam K-line BAR dilakukan sekali dalam kode strategi, dan setiap perubahan harga dalam K-line BAR dilakukan sekali dalam kode strategi.i := i + 1Danii := ii + 1Semua akan dieksekusi sekali. Perbedaannya adalah bahwa ii akan diubah setiap kali. Meskipun i juga diubah setiap kali, namun pada saat pelaksanaan strategi logis pada putaran berikutnya akan dikembalikan ke nilai sebelumnya, sampai saat K garis BAR selesai, maka akan diperbarui untuk menentukan nilai i (yaitu, pada saat pelaksanaan strategi logis pada putaran berikutnya tidak akan dikembalikan lagi nilai sebelumnya).

  • Model Harga Penutupan Karena model harga close out hanya menjalankan satu logika strategi untuk setiap garis K BAR. Jadi, dalam model harga close out, fase garis K historis dan fase garis K real-time,varvaripVariabel yang dinyatakan dalam contoh di atas menunjukkan peningkatan yang sama, yaitu peningkatan 1 BAR untuk setiap baris K.

varip

varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel satu kali. Kata kunci ini mirip dengan kata kunci var, tetapi variabel yang menggunakan deklarasi varip mempertahankan nilainya antara pembaruan K-line secara real-time.

varip variable_name = expression

Menjelaskan:

  • variable_name- Nama variabel pengguna apa pun yang diizinkan dalam skrip Pine (( dapat berisi huruf Latin huruf besar dan kecil, angka dan garis bawah)_), tetapi tidak dimulai dengan angka) 。
  • expression- Setiap ekspresi aritmatika, seperti ketika mendefinisikan variabel reguler. Pada baris pertama K, ekspresi hanya dihitung sekali dan dialokasikan ke variabel sekali.

Contoh

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

Dengan var, gambar akan mengembalikan nilai bar_index. Dengan varp, tindakan yang sama terjadi pada garis K historis, tetapi pada garis K real-time, gambar akan mengembalikan nilai yang meningkat satu untuk setiap tick.

Catatan Hanya dapat digunakan dengan tipe sederhana, seperti float, int, bool, string, dan array dari tipe-tipe tersebut.

true

Mengekspresikan nilai dari variabel tipe Boolean, atau digunakan ketika ekspresiPerbandinganatauLogikaNilai yang dapat dihitung oleh operator.

Catatan Lihat jugaPerbandinganOperator danLogikaDeskripsi operator.

Lihat juga bool

false

Menunjukkan nilai dari variabel tipe Boolean, dan hasil dari operasi perbandingan, operasi logis.

Catatan Lihat jugaPerbandinganOperator danLogikaDeskripsi operator.

Lihat juga bool

if

If statement mendefinisikan blok kalimat yang harus dieksekusi untuk memenuhi kondisi ekspresi. Bahasa skrip Pine edisi 4 memungkinkan Anda menggunakan sintaksis else if.

Kode umum berasal dari:

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

Catatan var_declarationX- Variabel ini mengambil nilai dari if statement condition- menggunakan blok kalimat jika kondisi adalah truethenLogika di dalamnyavar_decl_then0var_decl_then1Jika kondisi adalah false, gunakan blok kalimat.else ifatauelseLogika di dalamnyavar_decl_else0var_decl_else1Dan lain-lain. return_expression_then , return_expression_else- Ekspresi terakhir dalam modul atau ekspresi dari blokelse akan mengembalikan nilai akhir dari pernyataan. Jika deklarasi variabel berada di akhir, nilainya akan menjadi nilai hasil.

Jenis nilai yang dikembalikan oleh pernyataan if tergantung padareturn_expression_thenDanreturn_expression_elseJenis-jenis tersebut harus cocok ketika berjalan di TradingView: ketika Anda memiliki nilai string di blok else, tidak mungkin untuk mengembalikan nilai integer dari blok then statement. Ketika berjalan di FMZ, contoh berikut tidak akan salah, ketika nilai y mengambil nilai “open”, nilai saat plot adalah n/a.

Contoh

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

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

Bisa dihilangkanelseDalam hal ini, jika kondisi adalah false, maka variabel var_declarationX akan diberikan sebuah nullempty threshold ((na, false atau null):

Contoh

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

Anda dapat menggunakan lebih dari satu blok else if atau tidak sama sekali. then, else if, dan else dipindahkan ke empat ruang kosong:

Contoh

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

Bisa diabaikanifNilai hasil dari pernyataan ((var_declarationX= dapat dihapus) . Ini mungkin berguna jika Anda membutuhkan efek samping dari ekspresi, misalnya dalam perdagangan strategi:

Contoh

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

Jika pernyataan dapat saling mencakup:

Contoh

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

for

Struktur ‘for’ memungkinkan beberapa pernyataan untuk dieksekusi berulang:

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

var_declaration- Sebuah deklarasi variabel yang dapat dipilih, yang akan ditugaskan sebagai nilai return_expression dari return loop. counter- Variabel yang menyimpan nilai penghitung putaran balik, naik / turun 1 atau step_num nilai pada setiap iterasi putaran balik. from_num- Nilai awal dari counter. Diizinkan untuk menggunakan thresholdseries int/float threshold/expression. to_num- Nilai akhir dari counter. Apabila counter lebih besar dari to_num (atau lebih kecil dari to_num dalam kasus from_num > to_num), loop terputus. Penggunaan thresholdseries int/float thresholds/expressions diizinkan, tetapi mereka hanya dievaluasi pada iterasi pertama dari loop. step_num- Penghitung nilai naik/turun. Itu adalah pilihan. Nilai default adalah +1 atau -1, tergantung pada yang terbesar dari from_num atau to_num. statements | continue | break- Sebanyak kalimat, atau kata kunci ‘continue’ atau ‘break’, yang bisa dikurangi menjadi 4 spasi atau 1 tab. return_expression- Pengembalian nilai loop, jika ada, dialokasikan ke variabel dalam var_declaration. Jika loop keluar karena kata kunci continue atau break, pengembalian nilai loop adalah pengembalian nilai dari variabel terakhir yang dialokasikan sebelum loop keluar. continue- Kata kunci yang hanya dapat digunakan dalam loop. Kata kunci yang menyebabkan iterasi berikutnya dari loop dilaksanakan. break- Kata kunci untuk keluar dari lingkaran.

Contoh

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

Lihat juga for...in while

for…in

for...inStruktur memungkinkan untuk melakukan beberapa pernyataan berulang untuk setiap elemen dalam array. Ia dapat digunakan dengan argumen apa pun:array_element, atau digunakan bersama dengan dua argumen:[index, array_element]Bentuk kedua tidak memengaruhi fungsi loop. Ini melacak indeks iterasi saat ini dalam variabel pertama dari subset.

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

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

var_declaration- Sebuah deklarasi variabel yang dapat dipilih, yang akan diberikan kepada loopreturn_expressionNilai dari index- Variabel pilihan yang mengikuti indeks iterasi saat ini. Indeks dimulai dari 0. Variabel tidak dapat diubah dalam lingkaran.array_elementDalam subgrup: array_element- berisi variabel untuk setiap elemen array berurutan yang akan diproses dalam loop. Variabel tersebut tidak berubah dalam loop. array_id- Array ID dari iterasi lingkaran. statements | continue | break- Sebanyak kalimat, atau kata kunci ‘continue’ atau ‘break’, yang bisa dikurangi menjadi 4 spasi atau 1 tab. return_expression- nilai yang dikembalikan dari loop yang dialokasikan kevar_declarationVariabel dalam, jika ada. Jika loop keluar karena kata kunci ‘continue’ atau ‘break’, maka nilai yang dikembalikan dari loop adalah variabel yang diberikan terakhir sebelum loop keluar. continue- Kata kunci yang hanya dapat digunakan dalam loop. Kata kunci yang menyebabkan iterasi berikutnya dari loop dilaksanakan. break- Kata kunci untuk keluar dari lingkaran.

Diizinkan untuk mengubah elemen atau ukuran array dalam loop. Di sini, kita menggunakanfor...inBentuk parameter tunggal untuk menentukan berapa banyak nilai OHLC pada setiap baris K yang lebih besar dari nilai SMA ‘close’:

Contoh

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

Di sini, kita menggunakan dua bentuk parameter for…in untuk mendapatkan nilai kita.isPosArray akan di set ke trueKetika mereka berada di kami,valuesArrayNilai yang sesuai dalam array adalah waktu yang benar:

Contoh

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

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

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

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

while

whilePernyataan ini mengizinkan iterasi kondisional dari blok kode lokal.

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

Menjelaskan: variable_declaration- Deklarasi variabel yang dapat dipilih.return expressionAnda dapat memberikan nilai inisialisasi untuk variabel ini. boolean_expression- Jika benar, maka dilakukanwhileBlok lokal dari kalimat. Jika false, maka diwhileSetelah kalimat, lanjutkan dengan naskahnya. continue - continueKata kunci menyebabkan siklus bercabang ke iterasi berikutnya. break - breakKata kunci menyebabkan loop berakhir.whileSetelah itu, lanjutkan dengan kalimat selanjutnya. return_expression- BerikanwhileGaris pilihan yang dikembalikan oleh kalimat.

Contoh

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

plot(factorial)

Catatan AwalnyawhileBlok kode lokal setelah baris harus disinkronkan ke dalam empat spasi atau satu tanda pengenal. Untuk mengakhiri.whileSiklus,whileEkspresi Boolean di belakang harus berubah menjadi false, atau harus dieksekusi.break

switch

Operator switch mengalihkan kendali ke salah satu dari beberapa pernyataan berdasarkan kondisi dan nilai ekspresi.

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

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

“Switch” dengan ekspresi:

Contoh

// Switch using an expression

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

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

plot(ma)

Switch tanpa ekspresi:

Contoh

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

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

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

Mengembalikan nilai Nilai dari ekspresi terakhir dalam blok pernyataan lokal yang dieksekusi

Catatan Hanya bisa dilakukanlocal_blockContoh ataudefault_local_blockSalah satunya.default_local_blockHanya dengan=>Tanda-tanda yang diperkenalkan bersama, dan hanya dilakukan jika tidak dilakukan blok sebelumnya. JikaswitchHasil dari sebuah pernyataan diberikan pada sebuah variabel dan tidak ditentukandefault_local_blockJika tidak dilakukan,local_block, maka kalimat tersebut akan dikembalikannaAkanswitchSemua hasil dari pernyataan yang dibagikan ke variabellocal_blockContoh harus mengembalikan nilai dengan tipe yang sama.

Lihat juga if ?:

series

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

Operator

=

digunakan untuk memberikan nilai pada variabel, tetapi hanya pada saat deklarasi variabel ((pertama kali digunakan) }}.

:=

Operator pemberian nilai, memberikan nilai pada variabel di sebelah kiri. Digunakan untuk pemberian nilai pada variabel yang dinyatakan sebelumnya.

!=

Tidak sama dengan. Ekspresi yang berlaku untuk semua jenis.

expr1 != expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

%

Bilangan modular ((bilangan bulat tambahan) . Digunakan untuk ekspresi nilai numerik

expr1 % expr2

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

Catatan Dalam skrip Pine, ketika menghitung sisa dari bilangan bulat, transaksi akan dipotong. Yaitu, putar ke nilai mutlak terkecil. Nilai yang diperoleh akan memiliki simbol yang sama dengan dividen.

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

%=

Modul ditunjuk. Digunakan untuk ekspresi numerik.

expr1 %= expr2

Contoh

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

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

*

Perkalian berlaku untuk ekspresi angka

expr1 * expr2

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

*=

Perkalian ditetapkan. Digunakan untuk ekspresi angka.

expr1 *= expr2

Contoh

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

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

+

Tambahkan atau satuan positif. Digunakan untuk ekspresi angka atau string.

expr1 + expr2
+ expr

Mengembalikan nilai String biner+Kembali ke penggabungan express1 dan express2 Angka yang dikembalikan adalah bilangan bulat atau floating point, atau serangkaian nilai: Binari ‘+’ mengembalikan expr1 ditambah expr2 . Satuan + mengembalikan expr ((tidak menambahkan apa pun ke simetri operator satuan) .

Catatan Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.

+=

Penggantian huruf berlaku untuk ekspresi angka atau string .

expr1 += expr2

Contoh

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

Mengembalikan nilai Untuk string, mengembalikan ekspr1 dan ekspr2 berurutan. Untuk angka, mengembalikan nilai integer atau floating point, atau serangkaian nilai.

Catatan Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.

-

Pengurangan atau satuan negatif. Digunakan untuk ekspresi numerik.

expr1 - expr2
- expr

Mengembalikan nilai Mengembalikan nilai integer atau floating point, atau serangkaian nilai: Bilangan biner ‘+’ kembali ke ekspr1 dikurangi ekspr2。 Satuan-Mengembalikan ekspresi negatif dari express.

Catatan Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.

-=

Pengurangan hukum ditetapkan. Digunakan untuk ekspresi numerik.

expr1 -= expr2

Contoh

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

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

/

Pengecualian berlaku untuk ekspresi numerik

expr1 / expr2

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

/=

Tugas penghapusan. Digunakan untuk ekspresi numerik.

expr1 /= expr2

Contoh

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

Mengembalikan nilai Bilangan bulat atau nilai floating point, atau serangkaian nilai.

<

Kurang dari ≠ berlaku untuk ekspresi angka ≠

expr1 < expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

<=

Kurang dari atau sama dengan ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠

expr1 <= expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

==

Persamaan ≠ ≠ ≠ ≠ ≠

expr1 == expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

=>

Operator ‘=>’ digunakan untuk deklarasi fungsi yang didefinisikan pengguna danswitchDi dalam kalimat.

Fungsi deklarasi sintaksis adalah:

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

Satu.<local_block>adalah nol atau lebih kalimat Pine. <function_result>adalah sebuah variabel, sebuah ekspresi, atau sebuah subset.

Contoh

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

Catatan Anda dapat mempelajari lebih lanjut tentang fungsi yang didefinisikan pengguna di halaman fungsi deklarasi dan skrip di buku panduan pengguna.

>

Lebih besar dari ≠ berlaku untuk ekspresi angka ≠

expr1 > expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

>=

Lebih besar atau sama dengan ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠ ≠

expr1 >= expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

?:

Operator Kondisi Triangular.

expr1 ? expr2 : expr3

Contoh

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

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

Mengembalikan nilai Jika expr1 dinilai sebagai true, maka expr2, jika tidak, maka expr3。 Nilai nol ((0 dan NaN+, Infinity,-Infinity) dianggap sebagai false, dan nilai lainnya adalah true。

Catatan Jika Anda tidak membutuhkannya, gunakan na sebagai cabang dari naelse. Anda dapat menggunakan kombinasi dua atau lebih operator: untuk mewujudkan pernyataan yang mirip dengan kalimat switch () (lihat contoh di atas). Anda dapat menggunakan operator arithmetic dengan angka dan array variabel. Dalam kasus menggunakan array, operator diterapkan pada elemen.

Lihat juga na

[]

Seri subtitle。 Memberikan akses ke nilai-nilai sebelumnya dari seri expr1。 expr2 adalah jumlah k baris yang lalu, dan harus berjumlah。 Float akan dibulatkan ke bawah。

expr1[expr2]

Contoh

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

Mengembalikan nilai Sejumlah nilai.

Lihat juga math.floor

and

Logika AND。 berlaku untuk ekspresi Boolean。

expr1 and expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

or

Logika OR。 berlaku untuk ekspresi Boolean。

expr1 or expr2

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

not

Logika terbalik ((NOT) ≠ berlaku untuk ekspresi Boolean ≠

not expr1

Mengembalikan nilai Nilai-nilai Boolean, atau rangkaian nilai Boolean.

Kata kunci tipe data

bool

Kata kunci dari tipe bool ((Bool) untuk menyatakan variabel atau parameter secara eksplisit. Nilai dari variabel “Bool” dapat berupa true, false, atau na.

Contoh

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

Catatan Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.

Lihat juga var varip int float color string true false

int

Kata kunci dari tipe int ([integer]) untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

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

Catatan Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.

Lihat juga var varip float bool color string

float

Kata kunci dari tipe float () untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

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

Catatan Jenis yang disebutkan secara jelas dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na.

Lihat juga var varip int bool color string

string

Kata kunci dari tipe “string” untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

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

Catatan Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.

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

color

Kata kunci dari tipe “color” untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

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

Catatan Tanda warna memiliki format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili angka enam belas digit dari 00 ke FF ((0 ke 255 dalam desimal), di mana pasangan RR, GG dan BB adalah nilai persentase warna merah, hijau, dan biru. AA adalah transparansi warna (atau persentase alpha), di mana 00 tidak terlihat, FF tidak transparan. Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika itu diinisialisasi dengan na. Lihat lebih banyak informasi tentang tipe Pine di halaman manual pengguna sistem tipe.

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

array

Kata kunci dari tipe array array yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.array.new<type>,array.fromFungsi membuat objek array ((atau ID) }}.

Contoh

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

Catatan Array object selalu berupa array array.

Lihat juga var array.new array.from

Objects

Object Object dalam bahasa PINE adalah contoh dari user-defined type (UDT), yang dapat dipahami sebagai kelas tanpa metode, yang memungkinkan pengguna untuk membuat jenis kustom dalam kebijakan yang mengatur nilai yang berbeda dalam satu entitas.

Definisi tipe

Mari kita definisikan tipe order untuk menyimpan informasi order:

type order
    float price
    float amount
    string symbol
  • menggunakantypeJenis pernyataan kata kunci.
  • type adalah nama tipe setelah kata kunci type
  • Baris pertama type mendefinisikan nama tipe, kemudian menyusut menjadi empat spasi untuk mendefinisikan bidang yang berisi tipe tersebut.
  • Setiap bidang harus menyatakan tipe datanya, misalnya int, float, string.

Menciptakan objek

Menggunakan tipe yang dinyatakan baik, panggilannew()Fungsi untuk membuat objek:

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

Anda juga dapat membuat objek kosong:

order order1 = na

Di bawah ini adalah contoh nyata:

type order
    float price
    float amount
    string symbol

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

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

Contoh kalimat ini:

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

Anda juga dapat menuliskannya dalam bentuk berikut:

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

Jenis objek untuk penggunaan kata kunci var

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

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

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

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

Ketika menggunakan deklarasi kata kunci var untuk variabel yang diberikan pada objek dengan tipe yang ditentukan pengguna, kata kunci tersebut secara otomatis diterapkan pada semua bidang objek tersebut. Ini berarti bahwa objek yang dinyatakan melalui deklarasi kata kunci var akan mempertahankan statusnya di antara setiap iterasi tanpa perlu menginisialisasi kembali nilai bidangnya di setiap iterasi.

  • FirstBar dideklarasikan menggunakan kata kunci var, sehingga bidangnya (index, price, vol) akan mempertahankan nilainya di setiap iterasi, mulai dari entri pertama hingga akhir entri terakhir.
  • Obyek currentBar tidak menggunakan deklarasi kata kunci var, sehingga bidangnya akan diinisialisasi ulang pada setiap entri, dan akan ada objek baru pada setiap iterasi.

Dengan memetakan bidang indeks dari dua objek, Anda dapat membandingkan perbedaan di antara mereka. firstBar.index akan mempertahankan nilai yang ditetapkan sebelumnya dalam setiap iterasi, sementara currentBar.index akan di-inisialisasi kembali sebagai bar_index untuk item saat ini dalam setiap iterasi.

Jenis objek untuk penggunaan varip keyword

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

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

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

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

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

Di Pine, menggunakan kata kunci varip dapat mengindikasikan bahwa bidang objek akan terus ada sepanjang proses eksekusi skrip, dan tidak akan bergulir kembali di kolom yang belum dikonfirmasi. Dalam pernyataan tipe Counter, bidang bars tidak menggunakan kata kunci varip, sehingga akan bergulir di setiap kolom yang tidak dikonfirmasi. Bidang ticks menggunakan kata kunci varip, sehingga tidak akan bergulir di dalam kolom yang tidak dikonfirmasi. Objek counter dinyatakan menggunakan kata kunci var, sehingga akan terus ada sepanjang proses eksekusi skrip. Dalam setiap iterasi, bars dan ticks akan ditambahkan 1 ≠ bars akan berbalik di setiap kolom yang belum dikonfirmasi, sedangkan ticks tidak. Akhirnya, dengan memetakan bidang counter.bars dan counter.ticks, perbedaan antara keduanya dapat dibandingkan. Nilai counter.bars akan bergulir kembali di setiap kolom yang belum dikonfirmasi, sedangkan nilai counter.ticks akan terus meningkat sampai akhir eksekusi skrip.

Mengubah Nilai Bidang

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)
    
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

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

Dapat digunakan:=Operator penugasan ulang mengubah nilai dari bidang objek.

Koleksi objek

Contoh menyatakan sebuah array kosong yang akan menyimpan objek dari tipe order yang didefinisikan pengguna:

”`pine type order float price float amount string symbol

arrOrder = array.new()