Sumber dimuat naik... memuat...

FMZ PINE Script dokumentasi

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta: 2022-05-06 14:27:06, Dikemas kini: 2024-10-12 15:27:04

[TOC]

Kata kunci, tatabahasa, seting resume

Struktur kod

Struktur umum yang diikuti oleh kod dalam Pine:

<version>
<declaration_statement>
<code>

Catatan

Simbol nota yang disokong oleh bahasa Pine FMZ: nota satu baris//Di bawah ini adalah beberapa contoh:/* */Sebagai contoh, tulisan komen dalam contoh berikut:

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

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

Versi

Perintah penyimpang dalam bentuk berikut memberitahu penyimpang versi skrip yang ditulis oleh Pine:

//@version=5

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

Pernyataan

  • indicator()
  • strategy()

Perkataan pengisytiharan menentukan jenis skrip, yang juga menentukan apa kandungan yang diizinkan di dalamnya, dan bagaimana ia digunakan dan dilaksanakan. Menetapkan sifat-sifat penting skrip, seperti namanya, di mana ia akan muncul apabila ia ditambah ke dalam carta, ketepatan dan format nilai yang dipaparkan, dan mengawal beberapa nilai tindakan semasa ia dijalankan, seperti jumlah objek lukisan maksimum yang akan dipaparkan di carta. Untuk polisi, sifat termasuk parameter yang mengawal pengulangan semula, seperti modal awal, komisen, titik slaid, dan lain-lain. FMZ tidak memerlukan Pine untuk dimasukkan dalam kod strategi.indicator()ataustrategy()Pernyataan yang dibuat.

Kod

Baris skrip yang bukan komen atau arahan penyusun adalah ayat yang melaksanakan algoritma skrip. Sebuah ayat boleh menjadi salah satu daripada mereka.

  • Pernyataan pembolehubah
  • Nilai semula pembolehubah
  • Pernyataan fungsi
  • Panggilan fungsi terbina dalam, panggilan fungsi yang ditakrifkan pengguna
  • ifforwhileatauswitchStruktur setara

Perkataan boleh disusun dalam pelbagai cara

  • Sesetengah pernyataan boleh dinyatakan dengan satu baris, seperti kebanyakan pengisytiharan pembolehubah, yang hanya mengandungi satu baris panggilan fungsi atau pengisytiharan fungsi satu baris; yang lain, seperti struktur, selalu memerlukan lebih banyak baris kerana mereka memerlukan blok tempatan.
  • Perkataan dalam ruang global skrip (iaitu bahagian yang tidak termasuk dalam bahagian) tidak boleh digunakan untuk空格atau制表符(kunci tab) bermula. Karakter pertama mereka juga mesti menjadi watak pertama baris tersebut. Baris yang bermula di kedudukan pertama baris, oleh definisi, menjadi sebahagian daripada ruang lingkup global skrip.
  • Pernyataan struktur atau fungsi berbilang baris sentiasa memerlukanlocal block│ Sebuah blok tempatan mesti dikurangkan ke dalam satu karakter tetingkap atau empat ruang (jika tidak, akan diselesaikan sebagai barisan kod bersiri sebelumnya, iaitu ditetapkan sebagai kandungan berterusan barisan kod sebelumnya), dan setiap blok tempatan mentakrifkan satu jangkauan tempatan yang berbeza.
  • Beberapa ayat tunggal boleh disambung dalam satu baris dengan menggunakan koma (,) sebagai pencacah.
  • Satu baris boleh mengandungi nota atau hanya nota.
  • Baris juga boleh dibungkus (berlanjut dalam pelbagai baris).

Sebagai contoh, termasuk tiga blok tempatan, satu dalam deklarasi fungsi kustom, dua dalam deklarasi pembolehubah menggunakan struktur if, dengan kod berikut:

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

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

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

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

Ganti kod barisan

Baris panjang boleh dibahagikan kepada beberapa baris, atau "dibungkus"; baris yang dibungkus mesti mengecilkan berapa banyak ruang, selagi ia bukan kelipatan 4 (batas-batas ini digunakan untuk mengecilkan bahagian).

a = open + high + low + close

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

a = open +
      high +
          low +
             close

Satu panggilan plot panjang (() boleh dibungkus menjadi.

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

Perkataan dalam deklarasi fungsi yang ditakrifkan pengguna juga boleh dibungkus. Walau bagaimanapun, kerana blok tempatan secara sintetik mesti bermula dengan pengurangan ((4 ruang atau 1 tanda), apabila membahagikannya ke baris seterusnya, bahagian lanjutan pernyataan mesti bermula dengan lebih daripada satu pengurangan ((tidak sama dengan kelipatan 4 ruang); contohnya:

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

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

Urutan masa

Urutan masa bukan jenis data atau format, tetapi merupakan konsep struktur asas dalam bahasa PINE. Ia digunakan untuk menyimpan nilai yang berubah secara berturut-turut dalam masa, setiap nilai yang sepadan dengan satu titik masa. Struktur urutan masa sesuai untuk digunakan untuk memproses dan merakam satu set data yang berubah dari masa ke masa. Variabel terbina dalamopenSebagai contoh,openVariabel terbina dalam merakam harga buka untuk setiap baris K BAR, jika iniopenJadi ini adalah data untuk 5 minit kitaran garis K.openYang dirakamkan dalam pembolehubah adalah harga pembukaan baris BAR (bar) K setiap 5 minit.openIni merujuk kepada harga bukaan BAR pada garis K yang kini berada. Untuk merujuk kepada nilai sebelumnya dalam urutan masa (nilai masa lalu), kita menggunakan[]Operator sejarah, apabila dasar dijalankan pada bar baris Kopen[1]Maksudnya adalah merujuk kepada harga buka bar bar K sebelum garis K semasa.

WalaupunUrutan masaIa mudah untuk memikirkan struktur data seperti "arry", walaupun bahasa PINE juga mempunyai jenis arry. Tetapi mereka adalah konsep yang sama sekali berbeza dengan urutan masa.

Perkembangan siri masa seperti ini dapat dengan mudah dikira sebagai nilai kumulatif harga penutupan dalam kod strategi tanpa menggunakan struktur berputar seperti for, hanya menggunakan fungsi terbina dalam bahasa PINE.ta.cum(close)Untuk contoh lain, kita perlu mengira purata perbezaan antara harga tertinggi dan harga terendah untuk 14 baris K terakhir BAR (iaitu 14 baris K terdekat pada saat pelaksanaan kod semasa) yang boleh ditulis sebagai:ta.sma(high - low, 14)

Hasil panggilan fungsi pada urutan masa juga akan meninggalkan jejak pada urutan masa, yang juga boleh digunakan[]Operator sejarah merujuk kepada nilai sebelum ini. Sebagai contoh, apabila harga penutupan baris K BAR semasa diuji melebihi nilai maksimum harga tertinggi dalam 10 baris K BAR terakhir (tidak termasuk baris K BAR semasa), kita boleh menulis sebagaibreach = close > ta.highest(close, 10)[1]Ia juga boleh ditulis sebagai:breach = close > ta.highest(close[1], 10)Oleh itu.ta.highest(close, 10)[1]danta.highest(close[1], 10)Saya tidak mahu mengkritiknya.

Anda boleh mengesahkan dengan menggunakan kod berikut:

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

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

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

Kod ujian di atas akan mengeluarkan a dan b pada setiap BAR dengan nilai pada urutan masa masing-masing, dan anda dapat melihat bahawa nilai a dan b sentiasa sama, jadi kedua-dua kaedah penggambaran sama.

Parameter templat perpustakaan perdagangan bahasa Pine

Panduan tetapan parameter untuk template terbina dalam dasar PINE "Pine Language Exchange Library".

img

Tetapan urus niaga

  • Cara pelaksanaan Model harga penutupan: Model ini dijalankan sebelum BAR semasa selesai, dan perdagangan dijalankan pada permulaan BAR bawah. Model harga masa nyata: Model ini dijalankan setiap kali perubahan harga, dengan isyarat untuk melaksanakan dagangan dengan segera.
  • Bilangan perdagangan lalai: Jika arahan dagangan tidak menetapkan jumlah dagangan, dagangan akan dilaksanakan mengikut jumlah yang ditetapkan.
  • Jumlah pesanan tunggal maksimum: Berdasarkan akaun sebenar, seting parameter ini digabungkan untuk menentukan jumlah pesanan maksimum setiap kali, mengelakkan kejutan pada akaun.
  • Jumlah titik harga: mengikut定价货币精度Parameter dan parameter ini menentukan harga geser semasa pesanan; sebagai contoh, penentuan ketepatan mata wang ditetapkan kepada 2, iaitu tepat ke tempat kedua bilangan kecil, tepat ke 0.01; maka nilai titik geser mewakili 0.01 unit harga; pada masa ini, nilai titik geser ditetapkan kepada 5, dan harga geser semasa pesanan adalah 0.05 ((Harga geser menunjukkan bahagian harga pemindahan pesanan untuk lebih baik dan perisian pesanan).
  • Bilangan kitaran terpanjang pembolehubah: mempengaruhi bilangan baris BAR grafik K, denganjavascriptPanggilan dalam strategiSetMaxBarLenFungsi berfungsi sama.

Pilihan niaga hadapan

  • Kod jenis: Kod kontrak, objek bursa hanya perlu ditetapkan apabila objek bursa bukan tunai.
  • Jumlah kontrak minimum: jumlah kontrak yang paling kecil ketika pesanan dibuat.

Pilihan cakera sebenar

  • Kembali ke kemajuan automatik: Kembali ke keadaan sebelum dasar terakhir dihentikan.
  • Jumlah percubaan semula pesanan: Perintah yang tidak ditandatangani akan membatalkan pesanan, memesan semula usaha transaksi, parameter ini digunakan untuk mengehadkan jumlah percubaan semula maksimum.
  • Julat pertanyaan rangkaian (millisecond): hanya berlaku untuk protokol REST, mengawal julat permintaan rangkaian, mengelakkan permintaan yang terlalu kerap dan melampaui had bursa.
  • Masa sinkronisasi akaun (second): Tempoh yang digunakan untuk menyinkronkan data akaun.
  • Masa sinkronisasi pos selepas pembukaan (milliseconds): hanya untuk beberapa pertukaran yang mengalami keterlambatan data yang disebabkan oleh pembukaan berulang, masa sinkronisasi yang lebih besar boleh mengurangkan masalah ini.
  • Pengganda Leverage: Tetapkan pengganda Leverage.

Perdagangan segera, tetapan lain

  • Jumlah dagangan satu tangan: Jumlah dagangan satu tangan lalai, hanya berlaku untuk barang tunai.
  • Jumlah urus niaga minimum: Jumlah urus niaga minimum.
  • Kecekapan mata wang: Kecekapan harga, iaitu bilangan kecil harga.
  • Kecekapan jenis urus niaga: Kecekapan unit seterusnya, iaitu bilangan digit kecil unit seterusnya.
  • Bayaran: Untuk mengira beberapa data mengikut tetapan ini, 0.002 bermaksud 2 per seribu.
  • Julat statistik keuntungan dan kerugian: hanya digunakan untuk menunjukkan statistik keuntungan dan kerugian pada cakera sebenar.
  • Percubaan semula gagal (millisecond): Jarak percubaan semula apabila permintaan rangkaian gagal.
  • Penggunaan ejen: hanya berlaku untuk protokol REST.
  • Hide Common Network Errors: Hide Common Error Logs di kawasan log.
  • Tukar alamat pangkalan: hanya berlaku untuk protokol REST.
  • Menghantar notis: Memindahkan mesej ke peti mel dan sebagainya.

Perdagangan bawah

Pembukaan

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

Perumahan

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 pemegang PINE adalah serupa dengan pemegang satu arah. Sebagai contoh, apabila memegang kedudukan berbilang arah ("multi-head holding"), jika terdapat pesanan untuk menjual operasi, senarai rancangan, dan lain-lain (berbanding arah kebalikan dari arah pemegang), perintah pemicu pelaksanaan akan dilakukan terlebih dahulu untuk meratakan kedudukan berbilang arah ("meratakan semua pemegang berbilang arah) dan kemudian melaksanakan perintah pemicu berhubung arah kebalikan dari arah pemegang sebelum kedudukan.

Senarai rancangan

Apabila menggunakan arahan order order, jika tidak menetapkan sebarang harga, anda akan memilih sebagai harga pasaran secara lalai. Selain daripada harga pasaran, anda juga boleh membuat order melalui order rancangan, yang tidak akan mengoperasikan order segera.Peranti sebenar / Ujian semulaMaklumat status masa (iaitu tetingkap status semasa pelaksanaan dasar) dilihat dalam tab penghapusan "pesanan yang dirancang"; sistem hanya akan benar-benar membuat pesanan apabila harga masa nyata pasaran memenuhi syarat untuk mencetuskan pesanan rancangan ini. Oleh itu, pesanan ini mempunyai sedikit kecacatan pada harga urus niaga adalah keadaan normal.strategy.entryApabila kita mengurutkan fungsi, kita boleh menetapkanlimitstopParameter.

var isTrade = false 
if not barstate.ishistory and not isTrade
    isTrade := true 
    strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order")                     // stop
    strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order")                    // limit
    strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order")   // stop-limit    
  • Perintah limit

    Menetapkan harga terhad untuk pesanan, apabila pesanan adalah pembayaran (iaitu)directionParameter ialahstrategy.longPerintah hanya akan dicetuskan apabila harga pasaran semasa berada di bawah harga tersebut. Apabila pesanan adalah pesanan jualan (iaitudirectionParameter ialahstrategy.shortPerintah hanya akan dicetuskan apabila harga pasaran semasa lebih tinggi daripada harga tersebut.

  • Perintah berhenti

    Tetapkan harga berhenti rugi untuk pesanan, apabila pesanan adalah untuk membeli, pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih tinggi daripada harga tersebut. Apabila pesanan adalah pesanan jual beli, pesanan hanya akan dicetuskan apabila harga pasaran semasa berada di bawah harga tersebut.

  • Perintah stop-limit

    Boleh diset pada masa yang samalimitstopParameter, pesanan dipicu pada harga yang memenuhi syarat terlebih dahulu.

Peratusan kepentingan

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

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

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

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

Tentukandefault_qty_type=strategy.percent_of_equityKemudian, tetapandefault_qty_valueUntuk jumlah peratusan ((0 ~ 100), 1 iaitu 1%;; jumlah unit dikira mengikut jumlah mata wang yang ditagih dalam akaun;; contoh: akaun semasa mempunyai 10000 USDT, atur pesanan 1% iaitu menggunakan pesanan unit yang berskala 100 USDT ((dikira mengikut harga semasa ketika dijual)).

Pernyataan, kata kunci struktur logik

var

var adalah kata kunci untuk pembahagian dan inisialisasi variabel sekali pakai. Selalunya, sintaks pemisahan pemboleh ubah yang tidak mengandungi kata kunci var akan menyebabkan nilai pemboleh ubah ditutup setiap kali data diperbaharui. Sebaliknya, apabila pemboleh ubah pemisahan menggunakan kata kunci var, walaupun data diperbaharui, mereka masih boleh mengekalkan status yang tidak stabil dan hanya mengubahnya apabila syarat dalam if-expressions dipenuhi.

var variable_name = expression

Menjelaskan:

  • variable_name- Nama mana-mana pemboleh ubah pengguna yang dibenarkan dalam Pine Script (boleh mengandungi aksara Latin besar dan kecil, nombor dan tanda bawah (_), tetapi tidak boleh dimulakan dengan nombor)
  • expression- mana-mana ungkapan aritmatika, seperti menentukan pembolehubah biasa.

Contoh

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

Variabel a mengekalkan harga penutupan untuk baris pertama setiap baris dalam siri. Variabel aluminium b mengekalkan harga penutupan bar harga aluminium hijau pertama dalam siri ini. Variabel ketumbar c ketumbar mengekalkan harga penutupan ketumbar hijau ketumbar kesepuluh dalam siri.

Pada FMZ, model harga sebenar, model harga penutupan, dan model harga penutupan digunakan untukvarvaripKami menggunakan kod berikut untuk menguji pemboleh ubah yang dinyatakan.

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

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

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

// 每轮逻辑执行都给i、ii递增1
if true
    i := i + 1
    ii := ii + 1
  • Model harga masa nyata Kod ujian di atas dibahagikan kepada dua fasa semasa pelaksanaan: 1, K-Line Sejarah; 2, K-Line Riil; dan 3, K-Line Riil.varvaripVariabel yang dinyatakan i, ii akan dijalankan pada setiap kali pelaksanaan kod dasar keranaif trueOleh itu pasti menjalankan blok kod syarat yang sepadan) ; jadi anda dapat melihat bahawa setiap nombor yang ditunjukkan pada BAR baris K hasil ulangan adalah beransur-ansur 1; apabila fasa baris K sejarah berakhir, mulakan fasa baris K masa nyata.varvaripVariabel yang diisytiharkan mula berubah. Oleh kerana model harga masa nyata, setiap perubahan harga dalam garis K BAR akan menjalankan kod strategi berulang kali.i := i + 1danii := ii + 1Ia akan dilaksanakan sekali sahaja. Perbezaan adalah bahawa ia akan diubah setiap kali. Walaupun ia akan diubah setiap kali, ia akan kembali ke nilai sebelumnya apabila logik strategi dijalankan pada pusingan seterusnya, sehingga ia tidak akan diperbaharui untuk menentukan nilai i (iaitu ia tidak akan kembali ke nilai sebelumnya apabila logik strategi dijalankan pada pusingan seterusnya). Jadi anda dapat melihat bahawa pembolehubah i masih menjadi tambahan BAR1 untuk setiap root; tetapi pembolehubah ii ditambah beberapa kali untuk setiap BAR.

  • Model harga penutupan Oleh kerana model harga penutupan adalah satu logik strategi yang dijalankan apabila setiap garis K BAR berakhir. Jadi dalam model harga penutupan, peringkat K garis sejarah dan tahap K garis masa nyata,varvaripVariabel yang diisytiharkan dalam contoh di atas adalah sama sepenuhnya dengan peningkatan, iaitu peningkatan 1 untuk setiap baris K BAR.

berlainan

varip (var intrabar persist) adalah kata kunci yang digunakan untuk mengagihkan dan menginisiatifkan pembolehubah secara serentak. Ia serupa dengan kata kunci var, tetapi pembolehubah yang menggunakan deklarasi varip menyimpan nilainya di antara kemas kini baris K masa nyata.

varip variable_name = expression

Menjelaskan:

  • variable_name- Nama mana-mana pemboleh ubah pengguna yang dibenarkan dalam skrip Pine (boleh mengandungi huruf besar dan kecil, angka dan garis bawah, tetapi tidak boleh dimulakan dengan nombor)
  • expression- mana-mana ungkapan aritmatika, seperti ketika menentukan pembolehubah biasa. Pada baris K pertama, ungkapan hanya dikira sekali dan diberikan kepada pembolehubah sekali.

Contoh

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

Apabila var digunakan, grafik akan mengembalikan nilai bar_index. Menggunakan varip, tindakan yang sama berlaku pada baris K sejarah, tetapi pada baris K masa nyata, grafik akan mengembalikan satu nilai yang meningkat satu untuk setiap tik.

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

betul

Menunjukkan nilai kepada pembolehubah jenis boolean atau apabila ungkapan digunakanPerbandinganatauLogikNilai yang boleh dikira apabila operator.

Nota:Sila lihatPerbandinganOperator danLogikPenerangan pengendali.

Sampai jumpa lagi bool

palsu

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

Nota:Sila lihatPerbandinganOperator danLogikPenerangan pengendali.

Sampai jumpa lagi bool

jika

Perkataan if mendefinisikan blok perkataan yang mesti dilaksanakan apabila memenuhi syarat ungkapan. Bahasa skrip Pine versi ke-4 membolehkan anda menggunakan sintaks else if.

Kod yang digunakan ialah:

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

Nota: var_declarationX- Variabel ini mengambil nilai daripada if statementcondition- Jika syarat adalah benar, block ayat digunakanthenLogiknyavar_decl_then0var_decl_then1dan sebagainya). Jika syarat adalah false, block ayat digunakan.else ifatauelseLogiknyavar_decl_else0var_decl_else1Dan sebagainya) ‖.return_expression_then , return_expression_else- Ungkapan terakhir dalam modul atau ungkapan dari blokelse akan mengembalikan nilai akhir pernyataan tersebut. Jika ungkapan pembolehubah pada akhir, nilainya akan menjadi nilai hasil.

Jenis nilai yang dikembalikan oleh if statement bergantung kepadareturn_expression_thendanreturn_expression_elseJenis. Apabila dijalankan pada TradingView, jenis mereka mesti sepadan: tidak mungkin untuk mengembalikan nilai bulat dari blok kalimat then apabila anda mempunyai nilai baris dalam blokelse. Apabila dijalankan pada FMZ, contoh berikut tidak akan memberikan error, apabila nilai y diambil sebagai "open", nilai ketika plot digambar adalah n/a.

Contoh

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

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

Boleh disingkirkanelseBlok. Dalam kes ini, jika syarat adalah false, nilai terhad yang kosong akan diberikan kepada pembolehubah var_declarationX:

Contoh

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

Blok yang digunakan boleh menggunakan pelbagai blok if atau tidak digunakan. Blok then, if, dan if yang dipindahkan ke empat ruang:

Contoh

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

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

Contoh

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

If-statements boleh mengandungi satu sama lain:

Contoh

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

untuk

Struktur 'for' membolehkan berulang kali menjalankan beberapa set statement:

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

var_declaration- Pengisytiharan pembolehubah pilihan yang akan ditetapkan sebagai nilai return_expression untuk putaran semula.counter- Menyimpan nilai pemegang kira-kira, meningkatkan / mengurangkan nilai 1 atau step_num pada setiap pengulangan.from_num- Nilai permulaan perhitung. Mengizinkan penggunaan int/float thresholds/expressions.to_num- Nilai akhir penghitung. Loop terputus apabila penghitung lebih besar daripada to_num ((atau kurang daripada to_num dalam kes from_num > to_num).step_num- Meningkatkan/mengurangkan nilai penghitung. Ia adalah pilihan. Nilai lalai adalah +1 atau-1, bergantung kepada yang terbesar dari_num atau to_num. Apabila menggunakan nilai, penghitung juga akan meningkat/mengurangkan mengikut yang terbesar dari_num atau to_num, jadi simbol +/- untuk step_num adalah pilihan.statements | continue | break- Bilangan ayat yang dikehendaki, atau kata kunci "continue" atau "break" yang dikehendaki, dikurangkan kepada empat ruang atau satu tab.return_expression- Nilai pulangan kitaran, jika ada, diberikan kepada pembolehubah dalam var_declaration. Jika kitaran keluar kerana kata kunci "continue" atau "break", nilai pulangan kitaran adalah nilai pulangan pembolehubah terakhir yang diberikan nilai sebelum kitaran keluar.continue- Kata kunci yang hanya boleh digunakan dalam pusingan semula.break- Kata kunci untuk keluar dari lingkaran semula.

Contoh

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

Sampai jumpa lagi for...in while

untuk... dalam

for...inStruktur ini membolehkan beberapa pernyataan untuk setiap elemen dalam array dilakukan berulang-ulang. Ia boleh digunakan bersama-sama dengan mana-mana parameter:array_element, atau digunakan bersama dengan dua parameter:[index, array_element]❏ Bentuk kedua tidak mempengaruhi fungsi putaran. ❏ Ia mengesan indeks yang sedang diulang pada pembolehubah pertama dalam kumpulan unsur. ❏ Bentuk kedua tidak mempengaruhi fungsi putaran. ❏ Bentuk kedua mengesan indeks yang sedang diulang pada pembolehubah pertama dalam kumpulan unsur.

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

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

var_declaration- Pengisytiharan pembolehubah pilihan yang akan diberikan kepada putaranreturn_expressionNilai tersebut adalah:index- Mengesan pembolehubah pilihan dalam indeks berulang semasa; indeks bermula dari 0; pembolehubah tidak berubah dalam lingkaran; apabila digunakan, ia mesti disertakan dalam satu yang juga disertakanarray_elementPerbandingan antara unsur-unsur ini adalah sebagai berikut:array_element- Mengandung pembolehubah bagi setiap unsur barisan berturut-turut yang akan diuruskan dalam pusingan; pembolehubah ini tidak berubah dalam pusingan;array_id- Array ID yang berulang-ulang berpusing.statements | continue | break- Bilangan ayat yang dikehendaki, atau kata kunci "continue" atau "break" yang dikehendaki, dikurangkan kepada empat ruang atau satu tab.return_expression- Nilai pulangan kitaran dialokasikan kepadavar_declarationVariabel dalam, jika wujud. Jika gelung keluar kerana kata kunci "continue" atau "break", nilai balik gelung adalah variabel yang diberikan nilai terakhir sebelum gelung keluar.continue- Kata kunci yang hanya boleh digunakan dalam pusingan semula.break- Kata kunci untuk keluar dari lingkaran semula.

Ianya membolehkan anda mengubah elemen atau saiz array dalam gelung. Di sini, kita gunakanfor...inBentuk parameter tunggal untuk menentukan berapa banyak baris K yang mempunyai nilai OHLC yang lebih besar daripada SMA yang mempunyai paras penutupan:

Contoh

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

Di sini, kita gunakan dua bentuk parameter for...in untuk merangkumi parameter kita.isPosNilai aritmatika ditetapkan sebagaitrueApabila mereka berada di kawasan kami,valuesArrayNilai yang sepadan dalam aritmatika adalah pada masa yang tepat:

Contoh

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

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

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

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

sementara

whilePerkataan membenarkan pengulangan syarat blok kod tempatan.

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

Menjelaskan:variable_declaration- Pengisytiharan pembolehubah pilihan.return expressionNilai initialization boleh diberikan kepada pembolehubah ini.boolean_expression- Jika benar, jalankanwhileBlok tempatan ayat. Jika false, diwhileSelepas kalimat, teruskan menjalankan skrip.continue - continueKata kunci membawa kepada cabang berputar ke iterasi seterusnya.break - breakKata kunci membawa kepada penghentian gelung.whilePerkataan itu diteruskan selepas kalimat tersebut.return_expression- DisediakanwhileBaris pilihan yang dikembalikan oleh ayat tersebut.

Contoh

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

plot(factorial)

Nota:PermulaanwhileBlok kod tempatan selepas baris mesti disempurnakan kepada empat ruang atau satu tanda jam.whilePelanconganwhileEkspresi Boolean seterusnya mesti akhirnya menjadi false, atau mesti dijalankanbreak

menukar

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

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

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

Pertukaran dengan ungkapan:

Contoh

// Switch using an expression

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

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

plot(ma)

Pertukaran tanpa ungkapan:

Contoh

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

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

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

Nilai pulanganNilai ungkapan terakhir dalam blok ayat tempatan yang dijalankan.

Nota:Hanya boleh dilaksanakanlocal_blockcontoh ataudefault_local_blockSalah seorang daripada mereka.default_local_blockHanya dengan=>Penanda masuk bersama-sama, dan hanya dijalankan apabila blok sebelumnya tidak dijalankan; jikaswitchHasil pernyataan diberikan kepada satu pembolehubah dan tidak ditentukandefault_local_blockJika tidak dilaksanakan,local_blockJika anda menggunakan kata yang sama, maka ia akan kembali kepada anda.na◄ akanswitchApabila hasil pernyataan diberikan kepada pembolehubah, semualocal_blockContoh mestilah mengembalikan nilai jenis yang sama.

Sampai jumpa lagi if ?:

siri

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

Operator

=

Digunakan untuk memberi nilai kepada pembolehubah, tetapi hanya apabila memaklumkan pembolehubah (untuk pertama kalinya).

:=

Operator pemesanan, memberi pemesanan kepada pembolehubah di sebelah kiri.

!=

Tidak sama dengan. Berlaku untuk mana-mana jenis ungkapan.

expr1 != expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

%

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

expr1 % expr2

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

Nota:Dalam skrip Pine, pedagang akan dipotong ketika mengira baki bilangan bulat; iaitu, menempatkannya kepada nilai mutlak terendah; nilai yang diperoleh akan mempunyai simbol yang sama dengan dividen.

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

%=

Tunjuk modem. ^ Untuk ekspresi nombor. ^

expr1 %= expr2

Contoh

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

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

*

Perkalian.. digunakan untuk ungkapan bilangan..

expr1 * expr2

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

*=

Tanda perkalian.. digunakan untuk ungkapan bilangan..

expr1 *= expr2

Contoh

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

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

+

Tambahan atau satuan nombor sebenar. Untuk ungkapan nombor atau tali.

expr1 + expr2
+ expr

Nilai pulanganSistem binari pada senar+Mengembalikan gabungan dari express1 dan express2 Nombor kembali bilangan bulat atau nilai titik terapung, atau satu siri nilai: Benzene biner +'kembali express1 ditambah express2. Satu unit + satu unit mengembalikan express (tidak menambah apa-apa pada simetri operator satu unit).

Nota:Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.

+=

Tanda-tanda penjumlahan. Untuk ungkapan nombor atau rentetan.

expr1 += expr2

Contoh

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

Nilai pulanganUntuk strings, kembalikan sambungan antara express1 dan express2; untuk digit, kembalikan bilangan bulat atau nilai floatpoint, atau satu siri nilai.

Nota:Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.

-

Pengurangan atau nombor negatif tunggal.

expr1 - expr2
- expr

Nilai pulanganMengembalikan bilangan bulat atau nilai float, atau satu siri nilai: Benzene biner +'kembali kepada express1 dikurangkan dari express2. Satu Yuan-Mengembalikan kata negatif dari express.

Nota:Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.

-=

Peruntukan pengurangan... digunakan untuk ungkapan bilangan...

expr1 -= expr2

Contoh

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

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

/

Pengecualian. Berlaku untuk ungkapan bilangan.

expr1 / expr2

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

/=

Kecuali penunjuk. Untuk ekspresi bilangan.

expr1 /= expr2

Contoh

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

Nilai pulanganBilangan bulat atau nilai fluktuasi, atau satu siri nilai.

<

Lebih kecil daripada. Berlaku untuk ungkapan bilangan.

expr1 < expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

<=

Lebih kecil daripada atau sama dengan.

expr1 <= expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

==

Ia sama dengan. boleh digunakan untuk mana-mana jenis ungkapan.

expr1 == expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

=>

Operator '=>' digunakan untuk pengisytiharan fungsi yang ditakrifkan pengguna danswitchDalam ayat-ayat tersebut.

Perkataan fungsi adalah:

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

Satu.<local_block>Ia adalah satu daripada dua perkataan yang digunakan dalam bahasa Inggeris.<function_result>Ia adalah satu variabel, satu ungkapan, atau satu kumpulan unsur.

Contoh

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

Nota:Anda boleh mempelajari lebih lanjut mengenai fungsi yang ditakrifkan pengguna di halaman fungsi pengisytiharan dan perpustakaan skrip dalam manual pengguna.

>

Lebih besar daripada. Berlaku untuk ungkapan bilangan.

expr1 > expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

>=

Lebih besar daripada atau sama dengan. Berlaku untuk ungkapan bilangan.

expr1 >= expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

?:

Operator tiga syarat.

expr1 ? expr2 : expr3

Contoh

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

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

Nilai pulanganJika express1 dinilai sebagai true, express2 akan dinilai sebagai true, jika tidak, express3 akan dinilai sebagai true. Nilai sifar ((0 dan NaN+, Infinity,-Infinity) dianggap sebagai false dan semua nilai lain adalah true.

Nota:Jika anda tidak memerlukan, sila gunakan na sebagai cawangan??else??. Anda boleh menggunakan dua atau lebih operator: untuk mencapai pernyataan yang serupa dengan kata ganti (lihat contoh di atas). Anda boleh menggunakan pengendali aritmatika dengan nombor serta baris bilangan pembolehubah. Dalam kes menggunakan baris bilangan, pengendali digunakan untuk elemen.

Sampai jumpa lagi na

[]

Sub-label barisan↑ menyediakan akses kepada nilai terdahulu barisan expr1↑ expr2 ialah bilangan baris k yang lalu, mestilah nilai↑ float akan disampingkan ke bawah↑

expr1[expr2]

Contoh

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

Nilai pulanganSatu siri nilai.

Sampai jumpa lagi math.floor

dan

Logik AND... digunakan untuk ungkapan Boolean...

expr1 and expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

atau

Logik OR↑ digunakan untuk ungkapan Boolean↑

expr1 or expr2

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

Tidak

Permintaan logik sebaliknya ((NOT) ⇒ digunakan untuk ungkapan Boolean.

not expr1

Nilai pulanganNilai Boolean, atau satu set nilai Boolean.

Kata kunci jenis data

bool

Kata kunci jenis "Bool" yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter. Nilai pembolehubah "Bool" boleh menjadi true, false atau na.

Contoh

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

Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Baca lebih lanjut mengenai jenis Pine di halaman manual pengguna sistem jenis.

Sampai jumpa lagi var varip int float color string true false

int

Kata kunci jenis int ((integer) yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.

Contoh

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

Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Baca lebih lanjut mengenai jenis Pine di halaman manual pengguna sistem jenis.

Sampai jumpa lagi var varip float bool color string

mengambang

Kata kunci jenis float float (float point) yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.

Contoh

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

Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na.

Sampai jumpa lagi var varip int bool color string

senar

Kata kunci jenis "string" yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.

Contoh

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

Nota:Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Baca lebih lanjut mengenai jenis Pine di halaman manual pengguna sistem jenis.

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

warna

Kata kunci jenis "color" yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter.

Contoh

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

Nota:Aksara warna mempunyai format berikut: #RRGGBB atau #RRGGBBAA. Huruf mewakili nilai enam belas digit dari 00 hingga FF (dari 0 hingga 255 dalam sistem desimal), di mana RR, GG dan BB adalah nilai red, green, dan blue untuk warna. AA adalah nilai pilihan untuk ketelusan warna (atau alpha), di mana 00 tidak kelihatan, FF tidak telus. Apabila AA tidak disediakan, menggunakan FF. Huruf enam belas digit boleh ditulis besar atau kecil. Mengisytiharkan jenis secara jelas dalam deklarasi pembolehubah adalah pilihan, kecuali ia dimulakan dengan na. Lihat halaman panduan pengguna sistem jenis untuk mengetahui lebih lanjut mengenai jenis Pine.

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

Array

Kata kunci jenis array array yang digunakan untuk menyatakan secara jelas pembolehubah atau parameter; boleh digunakanarray.new<type>,array.fromFungsi mencipta objek array ((atau ID)).

Contoh

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

Nota:Objek barisan sentiasa dalam bentuk barisan baris.

Sampai jumpa lagi var array.new array.from

Objek

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

Definisi jenis

Mari kita tentukan jenis pesanan untuk menyimpan maklumat pesanan:

type order
    float price
    float amount
    string symbol
  • PenggunaantypeJenis pengisytiharan kata kunci.
  • Type adalah nama jenis yang diikuti oleh kata kunci type.
  • Baris pertama type menentukan nama jenis, kemudian menyempitkan empat ruang untuk menentukan bidang yang mengandungi jenis tersebut.
  • Setiap medan memerlukan jenis data yang dinyatakan, seperti int, float, string.

Mencipta objek

Menggunakan jenis yang diisytiharkan, panggilannew()Fungsi mencipta objek:

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

Objek kosong juga boleh dicipta:

order order1 = na

Di bawah ini adalah contoh sebenar:

type order
    float price
    float amount
    string symbol

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

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

Contoh ayat ini:

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

Ia juga boleh ditulis dalam bentuk berikut:

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

Jenis objek digunakan untuk kata kunci var

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

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

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

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

Apabila anda menggunakan pernyataan kata kunci var untuk menugaskan pembolehubah kepada objek jenis yang ditakrifkan pengguna, kata kunci itu akan secara automatik digunakan untuk semua medan objek tersebut. Ini bermakna objek yang dinyatakan dengan kata kunci var akan mengekalkan keadaannya di antara setiap iterasi, tanpa perlu menginisialisasi semula nilai bidangnya pada setiap iterasi.

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

Dengan melukis bidang indeks dua objek, anda boleh membandingkan perbezaan antara mereka. firstBar.index akan mengekalkan nilai yang ditetapkan sebelumnya dalam setiap iterasi, sementara currentBar.index akan diisytiharkan semula dalam setiap iterasi sebagai nilai bar_index untuk entri semasa.

Jenis objek untuk kata kunci varip

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

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

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

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

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

Dalam Pine, menggunakan kata kunci varip boleh menunjukkan bahawa bidang objek akan terus wujud sepanjang pelaksanaan skrip, dan tidak akan berputar semula di dalam lajur yang tidak diiktiraf. Dalam pernyataan jenis Counter, medan bars tidak menggunakan kata kunci varip, jadi ia akan berputar di setiap lajur yang tidak disahkan; sedangkan medan ticks menggunakan kata kunci varip, jadi ia tidak akan berputar di setiap lajur yang tidak disahkan. Objek counter diisytiharkan dengan kata kunci var, jadi ia akan kekal sepanjang pelaksanaan skrip. Dalam setiap iterasi, kedua-dua medan bars dan ticks akan ditambahkan 1; medan bars akan berputar dalam setiap lajur yang tidak diiktiraf, sedangkan medan ticks tidak akan berputar. Akhirnya, perbandingan antara perbezaan antara mereka dapat dilakukan dengan melukis bidang counter.bars dan counter.ticks. Nilai counter.bars akan bergolak dalam setiap bar yang tidak disahkan, sementara nilai counter.ticks akan terus meningkat sehingga skrip selesai dijalankan.

Mengubah nilai medan

type order
    float price
    float amount
    string symbol

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

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

Boleh digunakan:=Operator penyerahan semula mengubah nilai bidang objek.

Kumpulan objek

Contoh menyatakan satu set kosong yang akan menyimpan objek dengan jenis order yang ditakrifkan oleh pengguna:

type order
    float price
    float amount
    string symbol

arrOrder = array.new<order>()

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

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

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

atau

type order
    float price
    float amount
    string symbol

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

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

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

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

Objek disalin

Dalam Pine, objek diletakkan melalui rujukan. Apabila objek sedia ada diletakkan kepada pembolehubah baru, kedua-duanya menunjuk kepada objek yang sama.

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

Dalam contoh di bawah, kita mencipta objek pivot1 dan menetapkan bidang xnya kepada 1000. Kemudian, kita menyatakan bahawa sebuah pivot2 mengandungi pembolehubah yang merujuk kepada objek pivot1 itu, jadi kedua-duanya menunjuk kepada contoh yang sama. Oleh itu, mengubah pivot2.x juga akan mengubah pivot1.x, kerana kedua-duanya merujuk kepada bidang x dari objek yang sama.

Untuk membuat salinan yang bebas daripada objek asal, dalam kes ini kita boleh menggunakan kaedah copy ((() terbina dalam. Dalam contoh ini, kita menyatakan pivot2 merujuk kepada pembolehubah contoh salinan objek pivot1. Sekarang, mengubah pivot2.x tidak akan mengubah pivot1.x kerana ia merujuk kepada medan objek x yang berasingan:

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

Perlu diperhatikan bahawa kaedah salinan TradingView adalah copy shorthand. Jika objek mempunyai jenis medan khusus (seperti array), medan dalam salinan shorthand objek itu akan menunjuk kepada contoh yang sama dengan objek tersebut. Platform FMZ secara langsung mengimplementasikan salinan mendalam tanpa memerlukan pemprosesan tambahan, contohnya:

Menyalin dalam

//@version=5

indicator("test deepCopy")

type orderInfo
    float price
    float amount

type labelInfo
    orderInfo order
    string labelMsg

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

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

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

Hasil ujian, labelInfo.copy ((labelInfo1) adalah salinan dalaman apabila dijalankan, mengubah labelInfo1 tidak akan menjejaskan labelInfo2

Kaedah

Kaedah dalam bahasa Pine adalah fungsi khusus yang berkaitan dengan jenis terbina dalam atau pengguna yang ditakrifkan dalam contoh tertentu. Dalam kebanyakan hal, mereka adalah sama seperti fungsi biasa, tetapi menyediakan senaman yang lebih pendek dan lebih mudah. Pengguna boleh menggunakan simbol titik untuk mengakses kaedah secara langsung pada pembolehubah, seperti mengakses medan objek Pine. Pine merangkumi semua jenis khusus kaedah terbina dalam, termasuk nombor kumpulan, matriks, pemetaan matriks, baris, baris pengisi, dan lain-lain. Kaedah ini memberi pengguna cara yang lebih ringkas untuk memanggil program khusus jenis ini dalam skrip.

Kaedah terbina dalam

Contohnya, kod skrip seperti ini:

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

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

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

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

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

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

Ini adalah satu-satunya cara untuk menghidupkan semula mereka.

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

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

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

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

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

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

Di sini anda boleh melihat sokongan PINE.MethodsSelepas itu, kodarray.avg(sourceArray)Dengan menggunakan kaedah ini, pengguna boleh menulis dalam bentuk:sourceArray.avg()Saya tidak tahu apa yang berlaku. Nota: FMZ tidak disokong buat masa iniarray.avgPermohonan seperti itu.

Kaedah yang ditakrifkan pengguna

Pine membenarkan pengguna untuk mentakrifkan kaedah kustom yang digunakan bersama-sama dengan mana-mana objek jenis yang dibina atau ditakrifkan oleh pengguna. Kaedah definisi adalah sama dengan fungsi definisi, tetapi dengan dua perbezaan utama:

1, kata kunci method mesti dimasukkan sebelum nama fungsi. 2, parameter kaedah, di mana jenis parameter pertama mesti dinyatakan secara eksplisit kerana ia menyatakan jenis objek yang akan dikaitkan dengan kaedah tersebut.

Sebagai contoh, dalam kod berikut, kod untuk mengira penunjuk Brin dibungkus sebagai kaedah yang disesuaikan pengguna:

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

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

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

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

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

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

Diubah menjadi:

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

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

var array<float> sour

Lebih lanjut

wuhuoyanBagaimana untuk menjalankan pelbagai transaksi pada masa yang sama untuk kontrak Bitcoin?

Awan ringanBolehkah anda beritahu saya, adakah pine boleh berdagang lebih banyak? Adakah ia boleh berdagang lebih banyak seperti JS? Terima kasih.

Lisa20231Terima kasih untuk maklumat lanjut.

seniWow! bagaimana skrip pine ini menggunakan okx simulator pada platform?

seniIni sama dengan strategi platform tradingview yang boleh disalin terus ke platform pencipta untuk digunakan!

Pencipta Kuantiti - Impian KecilBahasa PINE hanya boleh melakukan dasar varietasi tunggal, strategi pelbagai varietasi adalah yang terbaik atau menulis reka bentuk dengan python, javascript, c ++.

Pencipta Kuantiti - Impian KecilOh, ya, OKX agak istimewa, mereka mempunyai alamat yang sama di persekitaran analog dan persekitaran cakera sebenar, hanya membuat perbezaan di tempat lain.

Awan ringanTidak boleh menggunakan okx analog.

Pencipta Kuantiti - Impian KecilMasalah seni bina yang pelbagai ini tidak dapat diselesaikan dengan baik, kerana setiap pertukaran mempunyai antara muka yang berbeza, dan batasan frekuensi antara muka juga tidak sama, yang akan menimbulkan banyak masalah.

Pencipta Kuantiti - Impian KecilBaiklah, terima kasih kerana mencadangkan, dan laporkan permintaan ini di sini.

Awan ringanPerasaan yang lebih baik untuk disatukan dengan JS, JS boleh menyesuaikan diri dengan pelbagai cara berdagang.

Pemangsa trendAdakah anda akan mempertimbangkan lebih banyak varieti pada masa akan datang?

Pencipta Kuantiti - Impian KecilTidak sopan.

Awan ringanBaiklah, terima kasih banyak.

Pencipta Kuantiti - Impian KecilHalo, sementara, strategi bahasa PINE hanya boleh menggunakan satu jenis sahaja.

Pencipta Kuantiti - Impian KecilTidak sopan, terima kasih atas sokongan anda. Dokumen akan terus diperbaiki.

Pencipta Kuantiti - Impian KecilYa, saya faham.

Pencipta Kuantiti - Impian KecilPINE template library, parameter yang boleh ditetapkan untuk menukar alamat pangkalan pertukaran.