Sumber daya yang dimuat... Pemuatan...

FMZ PINE Script dokumentasi

Penulis:Penemu Kuantitas - Mimpi Kecil, Dibuat: 2022-05-06 14:27:06, Diperbarui: 2024-10-12 15:27:04

[TOC]

Kata kunci, tata bahasa, dan pengaturan resume

Struktur kode

Struktur umum yang diikuti oleh kode di Pine:

<version>
<declaration_statement>
<code>

Komentar

Simbol komentar yang didukung oleh FMZ dalam bahasa Pine: single line commentary//Di sini, saya akan menjelaskan lebih lanjut./* */Seperti contoh di bawah ini:

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

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

Versi

Perintah pengkompilasi dalam bentuk berikut memberi tahu pengkompilasi versi mana dari skrip yang ditulis oleh Pine:

//@version=5

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

Pernyataan

  • indicator()
  • strategy()

Pernyataan menentukan tipe skrip, yang juga menentukan apa yang diizinkan di dalamnya, dan bagaimana digunakan dan dieksekusi. Atribut kunci skrip diatur, seperti namanya, di mana akan muncul ketika ditambahkan ke grafik, akurasi dan format nilai yang ditampilkan, dan beberapa nilai yang mengatur perilaku saat dijalankan, seperti jumlah maksimum objek gambar yang akan ditampilkan di grafik. Untuk kebijakan, atribut termasuk parameter yang mengendalikan retrieval, seperti modal awal, komisi, titik geser, dll.indicator()Ataustrategy()Pernyataan tersebut ditulis oleh seorang blogger.

Kode

Baris dalam skrip yang bukan komentar atau instruksi kompilasi adalah kalimat yang mengimplementasikan algoritma skrip. Sebuah kalimat bisa menjadi salah satu dari mereka.

  • Deklarasi Variabel
  • Penetapan ulang variabel
  • Deklarasi fungsi
  • Panggilan fungsi built-in, panggilan fungsi yang didefinisikan pengguna
  • ifforwhileatauswitchStruktur e.g.

Kalimat dapat disusun dengan berbagai cara

  • Beberapa pernyataan dapat diekspresikan dengan satu baris, seperti sebagian besar pernyataan variabel, yang hanya berisi satu baris panggilan fungsi atau pernyataan fungsi satu baris; yang lain, seperti struktur, selalu membutuhkan lebih dari satu baris karena mereka membutuhkan satu blok lokal.
  • Pernyataan dalam ruang lingkup global dari skrip (yaitu bagian yang tidak termasuk dalam bagian) tidak dapat digunakan untuk空格atau制表符(tab) dimulai. Karakter pertama mereka juga harus menjadi karakter pertama baris tersebut. Baris yang dimulai dari posisi pertama baris, oleh definisi, menjadi bagian dari ruang lingkup global skrip.
  • Struktur atau multi-baris pernyataan fungsi selalu membutuhkanlocal blockSebuah blok lokal harus terkuras menjadi satu karakter atau empat ruang (jika tidak, akan diselesaikan sebagai baris kode serial sebelumnya, yang ditentukan sebagai konten lanjutan dari baris kode sebelumnya), dan setiap blok lokal mendefinisikan ruang lingkup lokal yang berbeda.
  • Beberapa kalimat baris tunggal dapat disambung dalam satu baris dengan menggunakan koma ((,) sebagai tanda pemisah.
  • Satu baris dapat berisi komentar atau hanya komentar.
  • Garis juga bisa dibungkus (berlanjut di beberapa baris).

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

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

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

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

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

Pergantian kode

Baris panjang dapat dibagi menjadi beberapa baris, atau "dibungkus". Baris yang dibungkus harus menyusut ke dalam jumlah ruang apa pun, asalkan tidak merupakan kelipatan dari 4 (batas ini digunakan untuk menyusut bagian).

a = open + high + low + close

Ini dapat dibungkus sebagai (perhatikan bahwa jumlah ruang yang disempurnakan per baris tidak merupakan kelipatan dari 4):

a = open +
      high +
          low +
             close

Sebuah panggilan plot panjang dapat dibungkus menjadi.

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

Pernyataan dalam deklarasi fungsi yang didefinisikan pengguna juga dapat dibungkus. Namun, karena blok lokal secara sintetis harus dimulai dengan penyusutan ((4 ruang atau 1 karakter), ketika membaginya ke baris berikutnya, bagian lanjutan dari pernyataan harus dimulai dengan lebih dari satu penyusutan ((tidak sama dengan kelipatan 4 ruang); misalnya:

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

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

Urutan waktu

Serial waktu bukanlah jenis data atau format, tetapi merupakan konsep struktur dasar dalam bahasa PINE. Serial waktu digunakan untuk menyimpan nilai yang berubah secara berurutan dalam waktu, masing-masing nilai sesuai dengan titik waktu. Serial waktu memiliki struktur yang sangat cocok untuk digunakan untuk memproses, merekam, dan merekam serangkaian data yang berubah seiring waktu. Variabel internalopenMisalnya,openVariabel built-in mencatat harga buka untuk setiap garis K BAR, jika iniopenJadi ini adalah data dari siklus garis K selama 5 menit.openYang tercatat dalam variabel adalah harga awal dari setiap 5 menit K baris BAR (kolom); ketika program strategi Anda sedang dijalankan, referensi dalam kodeopenDengan kata lain, kita menggunakan harga awal dari garis BAR di mana kita berada saat ini. Untuk mengacu pada nilai sebelumnya dalam urutan waktu (nilai masa lalu), kita menggunakan[]Operator sejarah, ketika kebijakan dijalankan pada garis K BAR tertentu.open[1]Ini berarti bahwa harga awal dari garis K BAR sebelumnya adalah garis K BAR saat ini.

MeskipunUrutan waktuSangat mudah untuk mengingat struktur data yang disebut "array", meskipun bahasa PINE juga memiliki jenis arryx. Namun, mereka adalah konsep yang sama sekali berbeda dari urutan waktu.

Perancangan deret waktu seperti ini dapat dengan mudah dihitung dalam kode strategi dan tidak memerlukan struktur loop seperti for, hanya menggunakan fungsi built-in yang menggunakan bahasa PINE.ta.cum(close)Sebagai contoh lain, kita perlu menghitung rata-rata perbedaan antara harga tertinggi dan harga terendah dari 14 baris K terakhir BAR (yaitu 14 baris K BAR terdekat pada saat kode dijalankan) yang dapat ditulis sebagai:ta.sma(high - low, 14)

Hasil panggilan fungsi pada urutan waktu juga akan meninggalkan jejak pada urutan waktu.[]Operator sejarah mengacu pada nilai sebelumnya. Sebagai contoh, untuk menguji apakah harga penutupan baris K BAR saat ini melebihi nilai maksimum dari harga tertinggi dari 10 baris K BAR terakhir (tidak termasuk baris K BAR saat ini), kita dapat menulis sebagaibreach = close > ta.highest(close, 10)[1]Anda bisa menulisnya sebagai:breach = close > ta.highest(close[1], 10)Jadi.ta.highest(close, 10)[1]danta.highest(close[1], 10)Saya tidak tahu apa yang akan terjadi.

Anda dapat memverifikasi dengan kode berikut:

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

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

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

Kode pengujian di atas akan mengekspresikan nilai a dan b pada setiap BAR pada urutan waktu yang sesuai, dan Anda dapat melihat bahwa nilai a dan b selalu sama, jadi kedua metode penggambaran ini sama.

Parameter templat dari Pine Language Exchange Library

Peraturan parameter untuk template built-in dari kebijakan PINE "Pine Language Exchange Library".

img

Pengaturan transaksi

  • Cara pelaksanaannya Model harga penutupan: Model ini dijalankan sebelum BAR saat ini berakhir, dan transaksi dilakukan pada awal BAR akar bawah. Model harga real-time: setiap perubahan harga yang dilakukan model, dengan sinyal untuk segera melakukan transaksi.
  • Nomor Default: Jika instruksi trading tidak menentukan jumlah transaksi, maka transaksi akan dilakukan sesuai dengan jumlah yang ditetapkan.
  • Jumlah pesanan maksimum per transaksi: Berdasarkan transaksi yang sebenarnya, dengan pengaturan parameter ini, menentukan jumlah pesanan maksimum per transaksi, menghindari benturan dengan transaksi tersebut.
  • Jumlah titik harga: berdasarkan定价货币精度Parameter dan parameter ini menentukan harga geser pada saat pesanan dilakukan. Misalnya, penentuan harga dengan akurasi mata uang ditetapkan menjadi 2, yaitu tepat ke tempat kedua dari bilangan kecil, tepat ke 0.01; maka nilai titik geser masing-masing mewakili 0.01 unit harga. Pada saat ini, nilai titik geser ditetapkan menjadi 5, dan harga geser pada saat pesanan adalah 0.05 ((Harga geser menunjukkan harga geser pada saat pesanan untuk lebih baik dan untuk memperhitungkan bagian harga yang lebih tinggi dari transaksi pesanan)).
  • Nomor siklus terpanjang dari variabel: mempengaruhi jumlah garis BAR dari grafik K, denganjavascriptPanggilan dalam kebijakanSetMaxBarLenFungsi yang sama.

Opsi berjangka

  • Kode varietas: Kode kontrak, yang harus disetel jika objek bursa bukan objek bursa langsung.
  • Jumlah minimum tawaran kontrak: jumlah minimum transaksi kontrak saat dipesan.

Opsi disk nyata

  • Memperbaiki kemajuan secara otomatis: Memperbaiki status sebelum kebijakan terakhir berhenti.
  • Jumlah percobaan ulang pesanan: pesanan tidak ditransfer akan membatalkan pesanan dan mencoba melakukan transaksi lagi, parameter ini digunakan untuk membatasi jumlah percobaan ulang maksimum.
  • Interval pertanyaan jaringan (millisecond): hanya berlaku untuk protokol REST, untuk mengontrol interval permintaan jaringan, menghindari permintaan yang terlalu sering dan melampaui batas bursa.
  • Waktu sinkronisasi akun (second): Periode waktu sinkronisasi data akun.
  • Waktu sinkronisasi Posisi Setelah Pendaftaran (milliseconds): Hanya untuk beberapa transaksi yang terjadi karena keterlambatan data, pengaturan waktu sinkronisasi yang lebih besar dapat mengurangi masalah ini.
  • Penggandaan Leverage: Mengatur Penggandaan Leverage.

Perdagangan langsung, pengaturan lainnya

  • Volume transaksi satu tangan: Volume transaksi satu tangan secara default, hanya berlaku untuk transaksi langsung.
  • Jumlah transaksi minimum: Jumlah transaksi minimum.
  • Keakuratan mata uang: Keakuratan harga, yaitu angka-angka kecil harga.
  • Akurasi varietas transaksi: Akurasi unit berikutnya, yaitu bilangan kecil unit berikutnya.
  • Biaya: Untuk menghitung beberapa data berdasarkan pengaturan ini, 0.002 berarti 2 per seribu.
  • Interval statistik laba rugi: hanya digunakan untuk menunjukkan statistik laba rugi pada piringan nyata.
  • Percobaan ulang gagal (millisecond): Interval percobaan ulang ketika permintaan jaringan gagal.
  • Penggunaan agen: hanya berlaku untuk protokol REST.
  • Hide Common Network Errors: Hide Common Error Logs in the Log Area (Menyembunyikan kesalahan log yang sering terjadi di area log).
  • Mengganti alamat basis: hanya berlaku untuk protokol REST.
  • Push notifications: Push notifications: Push notifications to email boxes, dll. Push notifications: Push notifications: Push notifications: Push notifications to email boxes, dll.

Perdagangan

Pemasaran

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

Perkebunan

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 transaksi

PINE memiliki mekanisme pemegang yang mirip dengan pemegang satu arah. Sebagai contoh, ketika memegang posisi multi-headed ("multi-headed holding"), jika ada pesanan untuk menjual operasi, daftar rencana, dll. (dibalik arah pemegang), maka pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang pemegang).

Daftar jadwal

Saat menggunakan perintah order, jika tidak ditentukan harga apapun, default adalah order dengan harga pasar. Selain harga pasar, Anda juga dapat melakukan order dengan order rencana, yang tidak langsung dioperasikan.Disk nyata / retestingInformasi status waktu (misalnya status saat kebijakan berjalan) terlihat pada tab "Peraturan yang direncanakan" pada halaman pemisah. Sistem hanya akan benar-benar membuat pesanan ketika harga pasar real-time memenuhi kondisi untuk memicu pesanan tersebut. Jadi pesanan ini memiliki sedikit kesesuaian pada harga transaksi.strategy.entryJadi kita bisa menentukan fungsi yang akan kita atur.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    
  • Perintah limit

    Menetapkan batas harga untuk pesanan, yaitu ketika pesanan adalah pembayaran.directionParameternya adalahstrategy.longJika harga pasar saat ini lebih rendah dari harga tersebut, maka order akan dipicu. Bila pesanan adalah pesanan jual (yaitudirectionParameternya adalahstrategy.shortJika harga pasar saat ini lebih tinggi dari harga tersebut, maka order akan dipicu.

  • stop order

    Menetapkan harga stop loss untuk pesanan, ketika pesanan adalah pembayaran, pesanan hanya akan dipicu ketika harga pasar saat ini lebih tinggi dari harga tersebut. Saat pesanan adalah pesanan jual beli, pesanan hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.

  • Stop-limit Perintah

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

Persentase Hak dan Keuntungan

//@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_equitySetelah itu, aturdefault_qty_valueUntuk jumlah persentase ((0-100), 1 atau 1%;; jumlah unit dihitung berdasarkan jumlah mata uang yang ditagih di akun;; misalnya: akun saat ini memiliki 10000 USDT, atur untuk melakukan pemesanan 1%, yaitu menggunakan pemesanan unit skala 100 USDT (dihitung berdasarkan harga saat penjualan).

Pernyataan, kata kunci struktur logis

VAR

var adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel sekaligus. Biasanya, sintaksis pembagian variabel tanpa kata kunci var akan menyebabkan nilai variabel tertutup setiap kali data diperbarui. Sebaliknya, ketika menggunakan kata kunci var untuk mendistribusikan variabel, meskipun data diperbarui, mereka masih dapat mempertahankan statusnya, hanya mengubahnya ketika kondisi dalam if-expressions terpenuhi.

var variable_name = expression

Penjelasan:

  • variable_name- Sebarang nama variabel pengguna yang diizinkan di Pine Script (bisa berisi huruf besar dan kecil, angka, dan tanda tipis, tetapi tidak dapat dimulai dengan angka)
  • expression- Setiap ekspresi aritmatika, seperti mendefinisikan variabel biasa. Menghitung ekspresi dan mengalihkannya ke variabel sekali.

Contoh

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

Variabel a mempertahankan harga penutupan dari baris pertama dari setiap baris baris dalam seri. Variabel aluminium b mempertahankan harga penutupan bar harga aluminium hijau pertama dalam seri. Variabel berwarna c berwarna c mempertahankan harga penutupan dari berwarna hijau berwarna c yang merupakan yang kesepuluh dalam seri tersebut.

Di FMZ, model harga real-time, model harga penutupan, dan model harga akhir dibagi menjadi dua, yaitu model harga real-time dan model harga penutupan.varvaripVariabel yang dinyatakan kami uji dengan kode berikut.

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

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

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

// 每轮逻辑执行都给i、ii递增1
if true
    i := i + 1
    ii := ii + 1
  • Model harga real-time Kode pengujian di atas dibagi menjadi dua tahap saat dijalankan: 1, K-line sejarah; 2, K-line real-time.varvaripVariabel i, ii yang dinyatakan akan melakukan operasi inkremental setiap kali kode kebijakan dijalankan karenaif trueJadi tentu saja menjalankan blok kode kondisi yang sesuai). Jadi kita dapat melihat bahwa angka-angka yang ditampilkan pada hasil retrieval K-line BAR masing-masing meningkat menjadi 1. Ketika fase K-line sejarah berakhir, fase K-line real-time dimulai.varvaripVariabel yang diproklamasikan mulai berubah. Karena model harga real-time, setiap perubahan harga dalam garis KBAR akan mengeksekusi kode strategi berulang kali.i := i + 1danii := ii + 1Perbedaan adalah bahwa ii setiap kali dimodifikasi. Meskipun setiap kali dimodifikasi, i akan kembali ke nilai sebelumnya saat menjalankan logika strategi pada putaran berikutnya, dan tidak akan diperbarui sampai garis K saat ini BAR habis (yaitu tidak kembali ke nilai sebelumnya saat menjalankan logika strategi pada putaran berikutnya).

  • Model Harga Penutupan Karena model harga penutupan hanya menjalankan satu strategi logis setiap kali garis K BAR berakhir. Jadi dalam model harga penutupan, tahap garis K historis dan fase garis K real-time,varvaripVariabel yang dinyatakan dalam contoh di atas secara inkremental menunjukkan konsistensi yang sempurna, yaitu setiap garis K BAR bertambah 1 {\displaystyle 1}.

bermacam-macam

varip (var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel sekaligus. Ini mirip dengan kata kunci var, tetapi variabel yang menggunakan deklarasi varip mempertahankan nilainya di antara pembaruan baris K secara real-time.

varip variable_name = expression

Penjelasan:

  • variable_name- Sebarang nama variabel pengguna yang diizinkan dalam skrip Pine (bisa berisi huruf besar dan kecil, angka, dan garis tipis, tetapi tidak dapat dimulai dengan angka).
  • expression- Setiap ekspresi aritmatika, seperti ketika mendefinisikan variabel biasa. Pada baris K pertama, ekspresi hanya dihitung sekali dan diberikan kepada variabel sekali.

Contoh

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

Saat menggunakan var, grafik akan mengembalikan nilai bar_index. Menggunakan varip, perilaku yang sama akan terjadi pada garis K sejarah, tetapi pada garis K real-time, grafik akan mengembalikan satu nilai, yang meningkat satu untuk setiap tik.

PenjelasanHanya dapat digunakan dengan tipe sederhana, seperti float, int, boolean, string, dan array dari jenis tersebut.

benar

Menunjukkan nilai dari variabel tipe Boolean, atau ketika ekspresi digunakanPerbandinganatauLogikaNilai yang dapat dihitung pada operator.

PenjelasanLihat juga:PerbandinganOperator danLogikaDeskripsi operator.

Sampai jumpa lagi bool

palsu

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

PenjelasanLihat juga:PerbandinganOperator danLogikaDeskripsi operator.

Sampai jumpa lagi bool

Jika

If statement mendefinisikan blok kalimat yang harus dieksekusi ketika memenuhi kondisi ekspresi. Bahasa skrip Pine versi 4 memungkinkan Anda menggunakan tata bahasa 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

Penjelasan var_declarationX- Variabel ini mengambil nilai dari pernyataan ifcondition- Jika kondisi adalah benar, gunakan blok kalimatthenLogika dalam (((var_decl_then0var_decl_then1Jika kondisi false, gunakan blok kalimat.else ifAtauelseLogika dalam (((var_decl_else0var_decl_else1Dan sebagainya).return_expression_then , return_expression_else- Ekspresi terakhir dalam modul atau ekspresi dari blokelse akan mengembalikan nilai akhir dari pernyataan tersebut. Jika variabel dinyatakan pada akhir, nilainya akan menjadi nilai hasil.

Jenis nilai yang dikembalikan untuk pernyataan if tergantung padareturn_expression_thendanreturn_expression_elseJenis. Pada saat berjalan pada TradingView, jenis mereka harus cocok: tidak mungkin untuk mengembalikan nilai bulat dari then statement block ketika Anda memiliki nilai string pada blokelse. Pada saat berjalan pada FMZ, contoh berikut tidak akan memberikan kesalahan, ketika nilai y diambil sebagai "open", nilai ketika plot digambar adalah n/a.

Contoh

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

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

Bisa dihilangkanelseBlok. Dalam hal ini, jika kondisinya false, variabel var_declarationX akan diberikan ambang kosong ((na, false atau ):

Contoh

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

Anda dapat menggunakan beberapa else if block atau tidak menggunakannya sama sekali. then , else if , else if , else if , else if , else if , else if , else if , else if .

Contoh

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

Tidak bisa diabaikanifNilai hasil dari pernyataan ((var_declarationX= dapat diabaikan) ). Jika Anda membutuhkan efek samping dari ekspresi, itu mungkin berguna, misalnya dalam perdagangan strategi:

Contoh

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

Jika kalimat dapat saling memuat:

Contoh

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

untuk

Struktur 'for' memungkinkan untuk mengulangi beberapa kalimat:

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

var_declaration- Variabel opsional yang dinyatakan, yang akan ditugaskan sebagai nilai return_expression pada loop back.counter- Menyimpan variabel dari nilai penghitung loopback, meningkat/kurang 1 atau step_num nilai pada setiap iterasi loopback;from_num- Nilai awal dari counter. Mengizinkan penggunaan int/float threshold/ekspresi.to_num- Nilai akhir dari counter; loop terputus ketika counter lebih besar dari to_num (atau lebih kecil dari to_num dalam kasus from_num > to_num); penggunaan int/float thresholds/ekspresi yang diizinkan, tetapi mereka hanya dinilai pada iterasi pertama loop;step_num- Nilai meningkat/mengurangi dari kalkulator. Itu adalah opsional. Nilai default adalah +1 atau-1, tergantung pada yang terbesar dari from_num atau to_num. Ketika digunakan, kalkulator juga meningkat/mengurangi berdasarkan yang terbesar dari from_num atau to_num, sehingga simbol +/- untuk step_num adalah opsional.statements | continue | break- Jumlah kalimat yang diinginkan, atau kata kunci "continue" atau "break" yang dapat dikunci menjadi 4 ruang atau tab;return_expression- Nilai balik dari loop, jika ada, diberikan kepada variabel dalam var_declaration. Jika loop keluar karena kata kunci "continue loop" atau "break loop", nilai balik dari loop adalah nilai balik dari variabel terakhir yang diberikan nilai sebelum loop keluar.continue- Kata kunci yang hanya dapat digunakan dalam lingkaran kembali. Itu menyebabkan pengulangan lingkaran kembali berikutnya dijalankan.break- Kata kunci untuk keluar dari lingkaran kembali.

Contoh

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

Sampai jumpa lagi for...in while

untuk... dalam

for...inStruktur memungkinkan beberapa pernyataan untuk dilakukan berulang untuk setiap elemen dalam suatu array. Ia dapat digunakan bersama dengan parameter manapun:array_element, atau digunakan bersama dengan dua parameter:[index, array_element]❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Ini melacak indeks iterasi saat ini pada variabel pertama dari modul. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop. ❏ Bentuk kedua tidak mempengaruhi fungsi loop.

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

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

var_declaration- Deklarasi variabel opsional yang akan diberikan pada loopreturn_expressionNilai tersebut adalah:index- Mengikuti variabel opsional dari indeks iterasi saat ini. Index dimulai dari 0. Variabel tidak dapat diubah dalam lingkaran.array_elementPada dasarnya, ini adalah bagian dari sebuah kelompok.array_element- berisi variabel dari setiap elemen array berturut-turut yang akan diproses dalam loop. Variabel ini tidak dapat diubah dalam loop.array_id- Array ID yang diulang kembali.statements | continue | break- Jumlah kalimat yang diinginkan, atau kata kunci "continue" atau "break" yang dapat dikunci menjadi 4 ruang atau tab;return_expression- Nilai balik dari siklus diberikan kepadavar_declarationVariabel di dalamnya, jika ada. Jika loop keluar karena kata kunci "continue loop" atau "break loop", maka nilai yang dikembalikan oleh loop adalah variabel yang diberi nilai terakhir sebelum loop keluar.continue- Kata kunci yang hanya dapat digunakan dalam lingkaran kembali. Itu menyebabkan pengulangan lingkaran kembali berikutnya dijalankan.break- Kata kunci untuk keluar dari lingkaran kembali.

Hal ini memungkinkan untuk memodifikasi elemen array atau ukurannya dalam loop. Di sini, kita menggunakanfor...inBentuk parameter tunggal untuk menentukan berapa banyak baris K yang memiliki nilai OHLC yang lebih besar dari SMA dari ambang dekat:

Contoh

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

Di sini, kita menggunakan dua bentuk parameter for...in untuk membuat kitaisPosNilai dari array diatur sebagaitrueSaat mereka berada di tempat kami,valuesArrayNilai yang sesuai dalam arithmetic adalah:

Contoh

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

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

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

Sampai jumpa lagi for while array.sum array.min array.max

sementara

whilePernyataan memungkinkan pengulangan kondisi pada blok kode lokal.

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

Penjelasan:variable_declaration- Deklarasi variabel opsional.return expressionAnda dapat memberikan nilai initialization untuk variabel ini.boolean_expression- Jika benar, lakukanwhileBlok lokal dari kalimat tersebut. Jika false, diwhileSetelah kalimat, lanjutkan dengan mengeksekusi skrip.continue - continueKata kunci menyebabkan cabang berputar ke iterasi berikutnya.break - breakKata kunci yang menyebabkan penghentian loop.whileSetelah kalimat, lanjutkan.return_expression- DisediakanwhileKata-kata yang dikembalikan adalah baris opsional.

Contoh

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

plot(factorial)

PenjelasanAwalnyawhileBlok kode lokal setelah baris harus dikompres menjadi empat ruang atau satu karakter.whileAnda bisa melihat gambarnya di bawah ini.whileEkspresi Boolean berikutnya harus akhirnya berubah menjadi false, atau harus dijalankanbreak

Pindah

Operator switch memindahkan kontrol ke salah satu dari beberapa kalimat berdasarkan nilai kondisi dan ekspresi.

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

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

Di sini, Anda dapat melihat beberapa gambar yang menarik.

Contoh

// Switch using an expression

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

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

plot(ma)

"Switch tanpa ekspresi:

Contoh

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

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

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

Kembali nilaiNilai dari ungkapan terakhir dalam blok kalimat lokal yang dijalankan.

PenjelasanHanya bisa dilakukanlocal_blockContoh ataudefault_local_blockSalah satunya.default_local_blockHanya dengan=>Tanda-tanda digabungkan, dan hanya dieksekusi jika blok sebelumnya tidak dijalankan.switchHasil pernyataan diberikan kepada variabel dan tidak ditentukandefault_local_blockJika tidak dilaksanakan,local_blockJika tidak, maka kalimat itu akan kembali.naAkan.switchHasil dari pernyataan diberikan kepada variabel, semualocal_blockContoh harus mengembalikan nilai dengan tipe yang sama.

Sampai jumpa lagi if ?:

seri

series adalah kata kunci yang menunjukkan jenis seri data.seriesKata kunci biasanya tidak diperlukan.

Operator

=

Digunakan untuk memberi nilai pada variabel, tetapi hanya ketika variabel dinyatakan (untuk pertama kalinya).

:=

Operator penugasan, memberikan penugasan pada variabel di sebelah kiri.

!=

Tidak sama dengan. berlaku untuk semua jenis ekspresi.

expr1 != expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

%

Modul ((bilangan bilangan bulat) ⇒ digunakan untuk ungkapan angka ⇒

expr1 % expr2

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

PenjelasanDalam skrip Pine, ketika menghitung sisa bilangan bulat, pedagang akan terpotong; yaitu, menempatkannya ke dalam angka absolut terendah; nilai yang diperoleh akan memiliki simbol yang sama dengan dividen.

Contoh: -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1.

%=

Nomor modular. Untuk ekspresi numerik.

expr1 %= expr2

Contoh

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

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

*

Perkalian.. Untuk ekspresi numerik..

expr1 * expr2

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

*=

Penggambaran perkalian.

expr1 *= expr2

Contoh

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

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

+

Tambahkan atau satuan nomor asli.

expr1 + expr2
+ expr

Kembali nilaiSistem biner dari string+Mengembalikan gabungan dari express1 dan express2 Nomor mengembalikan bilangan bulat atau nilai titik didih, atau rentang nilai: Bilal +'kembali express1 plus express2. Satu kata + satu kata kembali express (tidak menambahkan apa pun pada simetri operator satu kata).

PenjelasanAnda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.

+=

Penggambaran kata ganti.

expr1 += expr2

Contoh

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

Kembali nilaiUntuk string, kembalikan serangkaian expres1 dan expres2. Untuk angka, kembalikan bilangan bulat atau nilai floating point, atau rangkaian nilai.

PenjelasanAnda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.

-

Hukum pengurangan atau satuan negatif.

expr1 - expr2
- expr

Kembali nilaiMengembalikan bilangan bulat atau nilai floating point, atau rentang nilai: Benzene binomial +'kembali express1 dikurangi express2. Satu Yuan-Mengembalikan negasi dari express.

PenjelasanAnda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.

-=

Pengurangan fungsi......

expr1 -= expr2

Contoh

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

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

/

Pengecualian. ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

expr1 / expr2

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

/=

Selain penunjukan. ⇒ digunakan untuk ekspresi numerik.

expr1 /= expr2

Contoh

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

Kembali nilaiAngka bulat atau nilai fluktuasi, atau rentang nilai.

<

Lebih kecil dari. Berlaku untuk ekspresi numerik.

expr1 < expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

<=

Lebih kecil dari atau sama dengan.

expr1 <= expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

==

Ini sama dengan. yang dapat digunakan untuk semua jenis ekspresi.

expr1 == expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

=>

Operator '=>' digunakan untuk deklarasi fungsi yang didefinisikan pengguna danswitchSaya tidak tahu apa yang terjadi.

Fungsi yang dinyatakan dalam bahasa Inggris adalah:

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

Satu<local_block>Kata-kata ini memiliki angka nol atau lebih dari kata Pine.<function_result>Sebuah variabel, sebuah ekspresi, atau sebuah elemen.

Contoh

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

PenjelasanAnda dapat mempelajari lebih lanjut tentang fungsi yang didefinisikan pengguna di halaman deklarasi dan skrip di manual pengguna.

>

Lebih besar dari. Untuk ekspresi numerik.

expr1 > expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

>=

Lebih besar dari atau sama dengan.

expr1 >= expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

?:

Operator kondisi tiga kata.

expr1 ? expr2 : expr3

Contoh

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

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

Kembali nilaiJika expres1 dinilai benar, expres2 akan dinilai benar, jika tidak, expres3 akan dinilai benar. Nilai nol ((0 dan NaN+, Infinity,-Infinity) dianggap salah, dan semua nilai lainnya adalah benar.

PenjelasanJika Anda tidak membutuhkannya, gunakan na sebagai cabang dari else. Anda dapat menggunakan dua atau lebih operator: untuk mencapai kalimat yang mirip dengan kata sandi (lihat contoh di atas). Anda dapat menggunakan operator aritmatika dengan angka serta baris variabel. Operator diterapkan pada elemen jika baris bilangan digunakan.

Sampai jumpa lagi na

[]

Serial subtitle↑ memberikan akses ke nilai sebelumnya dari seri expr1↑ expr2 adalah jumlah k baris yang lalu, yang harus menjadi nilai↑ float akan disampingkan↑

expr1[expr2]

Contoh

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

Kembali nilaiSebuah seri nilai.

Sampai jumpa lagi math.floor

dan

Logika AND‬ digunakan untuk ekspresi Boolean‬.

expr1 and expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

atau

Logika OR↑ berlaku untuk ekspresi Boolean↑

expr1 or expr2

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

Tidak

Permintaan logis sebaliknya ((NOT) ⇒ berlaku untuk ekspresi Boolean ⇒

not expr1

Kembali nilaiNilai Boolean, atau serangkaian nilai Boolean.

Kata kunci tipe data

bool

Kata kunci yang digunakan untuk menyatakan variabel atau parameter secara eksplisit. Variabel "Bool" dapat memiliki nilai true, false atau na.

Contoh

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

PenjelasanMengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.

Sampai jumpa lagi var varip int float color string true false

int

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

Contoh

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

PenjelasanMengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.

Sampai jumpa lagi var varip float bool color string

mengambang

Kata kunci tipe float float (float point) yang digunakan untuk menyatakan variabel atau parameter secara eksplisit.

Contoh

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

PenjelasanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na.

Sampai jumpa lagi var varip int bool color string

string

Kata kunci untuk tipe "string" yang secara eksplisit menyatakan variabel atau parameter.

Contoh

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

PenjelasanMengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.

Sampai jumpa lagi var varip int float bool str.tostring str.format

warna

Kata kunci untuk tipe "color" yang secara eksplisit menyatakan variabel atau parameter.

Contoh

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

PenjelasanAksara warna memiliki format berikut: #RRGGBB atau #RRGGBBAA. Huruf mewakili nilai enam belas digit dari 00 hingga FF (dari 0 hingga 255 dalam sistem desimal), di mana RR, GG dan BB adalah nilai dari red, green, dan blue component warna. AA adalah opsional untuk transparansi warna (atau alpha component), di mana 00 tidak terlihat, FF tidak transparan. Ketika AA tidak disediakan, menggunakan FF. Huruf enam belas digit dapat ditulis besar atau kecil. Mengutip tipe secara jelas dalam deklarasi variabel adalah opsional, kecuali jika ini initialized dengan na. Baca lebih lanjut tentang tipe Pine di halaman manual pengguna sistem tipe.

Sampai jumpa lagi var varip int float string color.rgb color.new

Array

Kata kunci dari tipe array 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))

PenjelasanObjek array selalu dalam bentuk array berurutan.

Sampai jumpa lagi var array.new array.from

Objek

Objek dalam bahasa PINE adalah contoh dari tipe yang didefinisikan pengguna (UDT), yang dapat dipahami sebagai kelas tanpa metode, yang memungkinkan pengguna untuk membuat jenis kustom dalam kebijakan yang mengatur nilai yang berbeda dalam satu entitas.

Definisi tipe

Mari kita definisikan jenis order untuk menyimpan informasi order:

type order
    float price
    float amount
    string symbol
  • PenggunaantypeJenis pernyataan kata kunci.
  • Kata kunci type diikuti oleh nama tipe.
  • Baris pertama type mendefinisikan nama tipe, kemudian menyempitkan empat ruang untuk mendefinisikan bidang yang berisi tipe tersebut.
  • Setiap bidang harus menyatakan jenis datanya, seperti int, float, string.

Membuat objek

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

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

Anda juga dapat membuat obyek kosong:

order order1 = na

Di bawah ini adalah contoh nyata:

type order
    float price
    float amount
    string symbol

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

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

Contoh kalimat ini:

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

Anda juga dapat menulisnya dengan cara berikut:

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

Penggunaan tipe objek untuk kata kunci var

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

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

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

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

Ketika menggunakan pernyataan kata kunci var untuk menugaskan variabel ke objek dengan tipe yang didefinisikan pengguna, kata kunci tersebut akan secara otomatis diterapkan ke semua bidang dari objek tersebut. Ini berarti bahwa objek yang dinyatakan dengan kata kunci var akan mempertahankan keadaannya di antara setiap iterasi, tanpa perlu menginisialisasi kembali nilai bidangnya di setiap iterasi.

  • Objek firstBar dinyatakan dengan kata kunci var, sehingga bidangnya (index, price, vol) akan mempertahankan nilainya di setiap iterasi, mulai dari entri pertama sampai akhir entri terakhir.
  • Objek currentBar tidak menggunakan pernyataan kata kunci var, sehingga bidangnya akan diinisialisasi kembali pada setiap entri, dan akan ada objek baru di setiap iterasi.

Dengan menggambar bidang indeks dari dua objek, Anda dapat membandingkan perbedaan antara keduanya. firstBar.index akan mempertahankan nilai yang sebelumnya ditetapkan di setiap iterasi, sementara currentBar.index akan diinisialisasi kembali ke nilai bar_index untuk entri saat ini di setiap iterasi.

Jenis objek untuk kata kunci varip

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

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

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

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

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

Di Pine, menggunakan kata kunci varip dapat menunjukkan bahwa bidang objek terus ada sepanjang eksekusi skrip, tanpa bergulir kembali ke kolom yang belum dipastikan. Dalam pernyataan tipe Counter, bidang bars tidak menggunakan kata kunci varip, sehingga akan bergulir di setiap kolom yang tidak terkonfirmasi; sedangkan bidang ticks menggunakan kata kunci varip, sehingga tidak akan bergulir di setiap kolom yang tidak terkonfirmasi. Objek counter dinyatakan dengan kata kunci var, sehingga akan terus ada sepanjang eksekusi skrip. Dalam setiap iterasi, bars field dan ticks field akan ditambahkan 1; bars field akan bergulir di setiap kolom yang belum dipastikan, sedangkan ticks field tidak bergulir. Akhirnya, dengan menggambar bidang counter.bars dan counter.ticks, perbedaan antara keduanya dapat dibandingkan. Nilai counter.bars akan bergulir kembali di setiap kolom yang tidak terkonfirmasi, sementara nilai counter.ticks akan terus meningkat sampai skrip selesai dijalankan.

Mengubah nilai kolom

type order
    float price
    float amount
    string symbol

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

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

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

Koleksi objek

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

type order
    float price
    float amount
    string symbol

arrOrder = array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

Atau

type order
    float price
    float amount
    string symbol

var array<order> arrOrder = na
arrOrder := array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

Objek yang disalin

Dalam Pine, objek ditugaskan dengan referensi. Ketika objek yang ada ditugaskan ke variabel baru, keduanya menunjuk ke objek yang sama.

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)

Dalam contoh di bawah ini, kita membuat sebuah objek pivot1 dan mengatur bidang x-nya menjadi 1000. Kemudian, kita menyatakan sebuah pivot2 berisi variabel yang merujuk pada objek pivot1, sehingga keduanya menunjuk pada contoh yang sama. Oleh karena itu, mengubah pivot2.x juga akan mengubah pivot1.x, karena keduanya merujuk pada bidang x-nya.

Untuk membuat salinan yang independen dari objek asli, dalam hal ini kita dapat menggunakan metode copy ((() built-in. Dalam contoh ini, kita menyatakan pivot2 mengacu pada variabel dari contoh salinan dari objek pivot1. Sekarang, mengubah pivot2.x tidak mengubah pivot1.x karena ia mengacu pada bidang x dari objek yang terpisah:

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)

Perlu dicatat bahwa metode salinan TradingView adalah shorthand. Jika objek memiliki jenis khusus dari bidang (seperti array), bidang-bidang dalam salinan shorthand dari objek tersebut akan mengarah ke contoh yang sama dengan objek tersebut. FMZ platform secara langsung mengimplementasikan deep copy tanpa perlu prosesor tambahan, contohnya:

Salinan dalam

//@version=5

indicator("test deepCopy")

type orderInfo
    float price
    float amount

type labelInfo
    orderInfo order
    string labelMsg

labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)

labelInfo1.labelMsg := "labelInfo1->2"    // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999             // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2

runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")

Hasil tes, labelInfo.copy ((labelInfo1) saat dijalankan sebagai deep copy, modifikasi labelInfo1 tidak akan mempengaruhi labelInfo2.

Metode

Metode dalam bahasa Pine adalah fungsi khusus yang terkait dengan jenis built-in atau user-defined dari suatu contoh tertentu. Dalam banyak hal, mereka mirip dengan fungsi biasa, tetapi menawarkan tata bahasa yang lebih singkat dan lebih mudah. Pengguna dapat menggunakan simbol titik untuk mengakses metode pada variabel secara langsung, seperti mengakses bidang pada objek Pine.

Metode internal

Contoh kode skrip seperti ini:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    array.push(sourceArray, sourceInput)
    array.shift(sourceArray)
    // Update the mean and standard deviaiton values.
    sampleMean := array.avg(sourceArray)
    sampleDev  := array.stdev(sourceArray) * multiplier

// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

"Siapa yang tidak tahu?"

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Anda dapat melihat dukungan dari PINE.MethodsSetelah itu, kodearray.avg(sourceArray)Dengan menggunakan metode ini, pengguna dapat menuliskan:sourceArray.avg()Saya tidak tahu. Perhatian: FMZ tidak didukung saat iniarray.avgDia juga mengatakan bahwa dia tidak akan pernah bisa melakukan hal itu.

Metode yang didefinisikan pengguna

Pine memungkinkan pengguna untuk mendefinisikan metode kustom yang dapat digunakan bersama dengan objek dari jenis built-in atau user-defined. Metode definisi pada dasarnya sama dengan fungsi definisi, tetapi dengan dua perbedaan utama:

1, kata kunci method harus dimasukkan sebelum nama fungsi. 2, parameter dari metode, di mana tipe parameter pertama harus dinyatakan secara eksplisit karena menunjukkan jenis objek yang akan dikaitkan dengan metode tersebut.

Misalnya, dalam kode berikut, kode untuk menghitung indikator Brin dibungkus dengan metode yang disesuaikan pengguna:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Perubahan menjadi:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sour

Lebih banyak

WuhuanBagaimana cara menjalankan beberapa transaksi pada saat yang sama untuk kontrak bitcoin?

Awan ringanApakah pine dapat melakukan banyak transaksi seperti JS? Terima kasih.

Lisa20231Terima kasih atas informasinya.

seniWow! Bagaimana bisa script pine ini menggunakan simulasi okex di platform ini?

seniIni berarti bahwa strategi tradingview dapat disalin langsung ke platform penemu dan digunakan!

Penemu Kuantitas - Mimpi KecilBahasa PINE hanya dapat melakukan strategi varietas tunggal, strategi multi-varietas adalah yang terbaik atau menulis desain dengan python, javascript, c++.

Penemu Kuantitas - Mimpi KecilOh, ya, OKX agak istimewa, mereka memiliki alamat yang sama di lingkungan analog dan lingkungan nyata, hanya berbeda di tempat lain. Jadi tidak ada cara untuk beralih ke analog dengan mengubah alamat basis.

Awan ringanTidak bisa menggunakan okx analog...

Penemu Kuantitas - Mimpi KecilMasalah arsitektur yang beragam ini tidak dapat diselesaikan dengan baik, karena setiap pertukaran memiliki antarmuka yang berbeda dan batas frekuensi antarmuka yang tidak sama, yang akan menimbulkan banyak masalah.

Penemu Kuantitas - Mimpi KecilBaiklah, terima kasih atas saranmu, dan laporkan permintaan ini di sini.

Awan ringanPerasaan lebih baik untuk mengintegrasikan dengan JS, JS dapat lebih baik beradaptasi dengan berbagai cara transaksi.

Pemangsa TrendingApakah Anda akan mempertimbangkan lebih banyak varietas di masa depan?

Penemu Kuantitas - Mimpi KecilTidak sopan.

Awan ringanBaiklah, terima kasih banyak.

Penemu Kuantitas - Mimpi KecilHalo, sementara, strategi bahasa PINE hanya bisa menggunakan satu varietas.

Penemu Kuantitas - Mimpi KecilTidak sopan, terima kasih atas dukungannya. Dokumen akan terus disempurnakan.

Penemu Kuantitas - Mimpi KecilSaya tidak tahu.

Penemu Kuantitas - Mimpi KecilPINE template library, dimana parameter dapat diatur untuk mengubah alamat basis pertukaran.