Sumber daya yang dimuat... Pemuatan...

FMZ PINE Script Doc

Penulis:Penemu Kuantitas - Mimpi Kecil, Dibuat: 2022-04-28 16:05:05, Diperbarui: 2024-10-12 17:25:27

[TOC]

img

Pengantar kata kunci, tata bahasa, pengaturan

Struktur kode

Struktur umum kode di Pine adalah sebagai berikut:

<version>
<declaration_statement>
<code>

Catatan

Catatan simbol yang didukung oleh bahasa Pine FMZ: catatan satu baris//, catatan multi-baris/* */, seperti metode catatan dalam contoh berikut:

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // calculate the MACD indicator

/*
The plot function draws the indicator line on the chart
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')

Versi

Instruksi compiler dari bentuk berikut memberi tahu compiler versi Pine mana yang ditulis dengan skrip:

//@version=5

Standar adalah versi V5, yang dapat dihilangkan dari kode//@version=5.

Pernyataan deklarasi

  • indicator()
  • strategy()

Pernyataan deklarasi menentukan jenis skrip, yang pada gilirannya menentukan apa yang diizinkan di dalamnya, dan bagaimana itu digunakan dan dijalankan. Tetapkan properti kunci skrip, seperti namanya, di mana itu akan muncul ketika ditambahkan ke grafik, presisi dan format nilai numerik yang ditampilkan, dan nilai numerik tertentu yang mengatur perilaku runtime, misalnya, jumlah maksimum objek gambar untuk ditampilkan di grafik. Untuk strategi, atribut termasuk argumen yang mengontrol backtesting, seperti modal awal, komisi, geser, dll.indicator()ataustrategy()pernyataan deklarasi harus disertakan dalam kode strategi di Pine of FMZ.

Kode

Baris dalam skrip yang bukan komentar atau instruksi compiler, yang merupakan pernyataan, yang mengimplementasikan algoritma skrip.

  • Deklarasi variabel
  • Penugasan kembali variabel
  • Deklarasi fungsi
  • Panggilan fungsi bawaan, panggilan fungsi yang ditentukan pengguna
  • if, for, whileatauswitchdan konstruksi lainnya

Laporan dapat diatur dengan berbagai cara

  • Beberapa pernyataan dapat diekspresikan dalam satu baris, seperti sebagian besar deklarasi variabel, baris yang hanya berisi satu panggilan fungsi, atau deklarasi fungsi satu baris.
  • Pernyataan dalam ruang lingkup global skrip (yaitu bagian yang bukan bagian dari blok lokal) tidak dapat dimulai denganspaceatautab(tombol tab). karakter pertama mereka juga harus karakter pertama baris. baris yang dimulai di posisi pertama baris adalah oleh definisi bagian dari ruang lingkup global skrip.
  • Alocal blockselalu diperlukan untuk struktur atau deklarasi fungsi multi-baris. Blok lokal harus ditarik dengan satu tab atau empat spasi (jika tidak, itu akan dianalisis sebagai kode terkonkaden dari baris sebelumnya, yang ditentukan sebagai konten berkelanjutan dari baris kode sebelumnya), dan setiap blok lokal mendefinisikan ruang lingkup lokal yang berbeda.
  • Beberapa pernyataan satu baris dapat dikonkatenkan pada satu baris dengan menggunakan koma (,) sebagai delimiter.
  • Sebuah baris dapat berisi komentar atau hanya komentar.
  • Garis juga dapat dibungkus (diteruskan pada beberapa garis).

Misalnya, sertakan tiga blok lokal, satu di deklarasi fungsi kustom, dan dua di deklarasi variabel menggunakan struktur if, sebagai berikut:

indicator("", "", true)             // Declaration statement (global scope), can be omitted

barIsUp() =>                        // Function declaration (global scope)
    close > open                    // Local block (local scope)

plotColor = if barIsUp()            // Variable declaration (global scope)
    color.green                     // Local block (local scope)
else
    color.red                       // Local block (local scope)

runtime.log("color", color = plotColor)  // Call a built-in function to output the log (global scope)

Kode baris baru

Garis panjang dapat dibagi menjadi beberapa baris, atau bungkus. Garis yang dibungkus harus diindentasi dengan jumlah ruang kosong apa pun, selama tidak kelipatan dari 4 (batas ini digunakan untuk mengindentasi blok lokal).

a = open + high + low + close

Hal ini dapat dibungkus sebagai (perhatikan bahwa jumlah spasi yang terindikasi per baris tidak merupakan kelipatan dari 4):

a = open +
      high +
          low +
             close

Sebuah panggilan plot panjang dapat dibungkus sebagai:

close1 = request.security(syminfo.tickerid, "D", close)      // closing price data series of syminfo.tickerid daily level of the current trading pair
close2 = request.security(syminfo.tickerid, "240", close)    // closing price data series of syminfo.tickerid 240-minute level of the current trading pair
plot(ta.correlation(close, open, 100),                       // Line-long plot() calls can be wrapped
   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 sintaksis harus dimulai dengan tiruan (4 spasi atau 1 tab), ketika membaginya ke baris berikutnya, kelanjutan pernyataan harus dimulai dengan lebih dari satu tiruan (tidak sama dengan 4 kali lipat ruang).

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

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

Seri Waktu

Seri waktu bukanlah jenis atau format data, melainkan merupakan konsep struktur dasar dalam bahasa PINE. Digunakan untuk menyimpan nilai yang berubah terus menerus dalam waktu, setiap nilai sesuai dengan titik waktu. Struktur konsep seri waktu cocok untuk memproses dan merekam serangkaian data yang berubah dari waktu ke waktu.

Ambil variabel bawaanopensebagai contoh,openvariabel built-in mencatat harga pembukaan dari setiap representasi int BAR, jika iniopenadalah data periode representasi int 5 menit. Kemudian iniopenvariabel mencatat harga pembukaan dari setiap 5 menit int representasi BAR (bar).openUntuk merujuk pada nilai sebelumnya (nilai masa lalu) dalam deret waktu, kita menggunakan[]Ketika strategi dijalankan pada representasi int BAR tertentu,open[1]Artinya adalah untuk merujuk pada harga pembukaan dari representasi int sebelumnya BAR dari representasi int saat ini BAR.

Meskipunderet waktusangat mengingatkan pada struktur data array, meskipun bahasa PINE juga memiliki jenis array. tetapi mereka dan deret waktu adalah konsep yang sama sekali berbeda.

Deret waktu yang dirancang dalam bahasa pinus dapat dengan mudah menghitung nilai kumulatif dari harga penutupan dalam kode strategi, dan tidak perlu menggunakan struktur loop seperti untuk, hanya fungsi built-inta.cum(close)Untuk contoh lain, kita perlu menghitung nilai rata-rata perbedaan antara harga tertinggi dan harga terendah dari 14 int representasi BARs terakhir (yaitu, 14 int representasi BARs terdekat dengan saat ini ketika kode dijalankan), yang dapat ditulis sebagai:ta.sma(high - low, 14)

Hasil panggilan fungsi pada seri waktu juga akan meninggalkan jejak pada seri waktu, lagi kita menggunakan[]contohnya ketika menguji apakah harga penutupan dari representasi int BAR saat ini melebihi nilai maksimum dari harga tertinggi dalam 10 representasi int BAR terakhir (tidak termasuk representasi int BAR saat ini).breach = close > ta.highest(close, 10)[1], dan kita juga bisa menulisbreach = close > ta.highest(close[1], 10)Jadi.ta.highest(close, 10)[1]danta.highest(close[1], 10)adalah setara.

Hal ini dapat diverifikasi 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 tes di atas akan menghasilkan nilai a dan b pada setiap BAR dalam deret waktu yang sesuai.

Argumen template dari perpustakaan kelas perdagangan bahasa pinus

Instruksi untuk mengatur argumen template terintegrasi Pine Language Trade Class Library dari strategi PINE.

img

Pengaturan perdagangan

  • Mode pelaksanaan Model harga penutupan: Model dieksekusi hanya setelah BAR saat ini selesai, dan perdagangan dieksekusi ketika BAR berikutnya dimulai. Model harga real-time: Model ini dieksekusi setiap kali harga bergerak, dan ada sinyal untuk mengeksekusi perdagangan segera.
  • Ukuran lot terbuka default: Jika pesanan perdagangan tidak menentukan jumlah perdagangan, perdagangan akan dieksekusi sesuai dengan jumlah yang ditetapkan.
  • Jumlah pesanan maksimum untuk satu perdagangan: Tentukan jumlah maksimum dari setiap pesanan untuk menghindari dampak pasar sesuai dengan pasar aktual dan pengaturan argumen ini.
  • Titik Slippage: Menentukan slippage ketika menempatkan pesanan sesuai denganPricing Currency PrecisionPada saat ini, titik slippage ditetapkan menjadi 5, dan slippage saat menempatkan order adalah 0.05 (slipage mengacu pada bagian dari harga yang meluap saat menempatkan order untuk trading order yang lebih baik dan handicap).
  • Nomor periode variabel terpanjang: mempengaruhi jumlah K-line BAR dalam grafik.SetMaxBarLendalamjavascript srategy.

Opsi berjangka

  • Kode varietas: kode kontrak, hanya perlu ditetapkan ketika objek pertukaran adalah objek pertukaran non-spot.
  • Ukuran kontrak minimum: Volume perdagangan minimum kontrak saat menempatkan pesanan.

Opsi perdagangan langsung

  • Kemajuan pemulihan otomatis: Memulihkan keadaan secara otomatis sebelum strategi terakhir berhenti.
  • Waktu percobaan ulang order: Jika order tidak dipenuhi, order akan dibatalkan, dan order akan ditempatkan kembali untuk mencoba perdagangan.
  • Interval jajak pendapat jaringan (milisekund): Hanya berlaku untuk protokol REST, ini mengontrol interval permintaan jaringan untuk mencegah permintaan terlalu sering dan melebihi batas pertukaran.
  • Waktu sinkronisasi akun (detik): periode waktu untuk sinkronisasi data akun.
  • Waktu sinkronisasi posisi setelah membuka posisi (milisekund): Hanya untuk posisi berulang yang disebabkan oleh keterlambatan data di beberapa bursa, pengaturan waktu sinkronisasi yang lebih besar dapat meringankan masalah tersebut.
  • Multiple leverage: menetapkan multipel leverage.

Perdagangan spot, pengaturan lainnya

  • Volume perdagangan satu lot: volume perdagangan default satu lot, yang hanya berlaku untuk spot.
  • Volume perdagangan minimum: Volume perdagangan minimum.
  • Keakuratan Mata Uang Harga: Keakuratan harga, yaitu jumlah tempat desimal dalam harga.
  • Keakuratan varietas perdagangan: keakuratan jumlah pesanan, yaitu jumlah tempat desimal jumlah pesanan.
  • Biaya penanganan: Hitung beberapa data sesuai dengan pengaturan ini, 0,002 berarti 2/1000.
  • Interval statistik laba rugi: Hanya digunakan untuk menampilkan statistik laba rugi di pasar nyata.
  • Re-try gagal (ms): Interval re-try ketika permintaan jaringan gagal.
  • Gunakan proxy: Hanya berlaku untuk protokol REST.
  • Sembunyikan kesalahan jaringan umum: Sembunyikan log kesalahan umum di area log.
  • Alamat basis switch: hanya berlaku untuk protokol REST.
  • Push notifikasi: Push pesan ke kotak surat, dll

Perdagangan pesanan

Posisi terbuka

strategy(title = "open long example", pyramiding = 3)                                // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.01)                                         // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10))       // The condition is triggered, the order is executed, and the market price opens a long position
strategy.entry("long3", strategy.long, 0.03, limit = 30000)                          // Specify the (lower) price, plan to place a buy order, wait for a deal to open a position, and open a position at a limit price

Posisi dekat

strategy(title = "close long example", pyramiding = 2)                              // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.1)                                         // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.1)                                         // Open a long position at the market price, specify the group label as long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%")   // To close a position, specify to close 50% of the positions whose group label is long1
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%")   // To close a position, specify to close 80% of the positions whose group label is long2

Mekanisme perdagangan

Mekanisme posisi bahasa PINE mirip dengan posisi satu arah. Misalnya, ketika memegang posisi dalam arah panjang (posisi panjang), jika ada pesanan untuk operasi jual, pesanan yang direncanakan, dll. (dalam arah yang berlawanan dengan posisi), eksekusi akan dipicu, dan posisi dalam arah panjang akan ditutup terlebih dahulu. (Tutup semua posisi panjang), dan kemudian eksekusi pesanan yang dipicu (dalam arah yang berlawanan relatif dengan posisi sebelum penutupan).

Perencanaan urutan

Saat menempatkan order menggunakan perintah penempatan order, jika tidak ada harga yang ditentukan, default adalah order pasar. Selain order pasar, Anda juga dapat menempatkan order melalui order terencana, yang tidak beroperasi segera untuk menempatkan order.pesanan nyata/pengujian latar belakang. Sistem hanya akan menempatkan pesanan ketika harga pasar real-time memenuhi kondisi untuk memicu pesanan yang direncanakan ini. Oleh karena itu adalah normal bagi pesanan ini untuk memiliki sedikit penyimpangan dalam harga perdagangan.strategy.entryfungsi untuk menempatkan pesanan, kita dapat menentukanlimit, stop arguments.

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    
  • urutan batas

    Tentukan harga batas order.directionArgumen adalahstrategy.long), order hanya akan dipicu ketika harga pasar saat ini lebih rendah dari harga ini. Ketika pesanan adalah pesanan jual (yaitu,directionArgumen adalahstrategy.short), pesanan hanya akan dipicu jika harga pasar saat ini lebih tinggi dari harga ini.

  • perintah berhenti

    Tentukan harga stop loss dari order. Ketika order adalah order beli, order hanya akan dipicu ketika harga pasar saat ini lebih tinggi dari harga ini. Ketika sebuah order adalah order jual, order hanya akan dipicu jika harga pasar saat ini lebih rendah dari harga tersebut.

  • perintah stop-limit

    Peraturanlimitdanstopargument dapat ditetapkan pada saat yang sama, dan order akan dipicu pada harga yang memenuhi kondisi pertama.

Urutan persentase ekuitas

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

// Simple moving average crossover strategy
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// If the moving average crossover condition is met, buy or sell
if (longCondition)
    strategy.entry("Long", strategy.long)  

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

Setelah menentukandefault_qty_type=strategy.percent_of_equity, setdefault_qty_valueuntuk jumlah persentase (0~100), 1 berarti 1%. jumlah pesanan dihitung sesuai dengan jumlah mata uang denominasi di rekening. misalnya: jika rekening arus memiliki 10.000 USDT, menetapkan pesanan 1% berarti menempatkan pesanan dengan skala 100 USDT (dihitung berdasarkan harga saat ini saat penjualan).

Deklarasi, kata kunci struktur logis

VAR

var adalah kata kunci yang digunakan untuk mengalokasikan dan satu kali inisialisasi variabel. Secara umum, grammar penugasan variabel yang tidak mengandung kata kunci var menyebabkan nilai variabels ditimpa setiap kali data diperbarui. Sebaliknya, ketika variabel ditugaskan menggunakan kata kunci var, mereka dapat menjaga keadaan meskipun pembaruan data, mengubahnya hanya ketika kondisi dalam if-ekspresi terpenuhi.

var variable_name = expression

Penjelasan:

  • variable_name- Sebarang nama variabel pengguna yang diizinkan dalam Pine Script (itu dapat berisi huruf besar dan kecil huruf Latin, angka dan tanda bawah (_), tetapi tidak dapat dimulai dengan angka).
  • expression- Setiap ekspresi aritmatika, seperti mendefinisikan variabel reguler.

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 menyimpan harga penutupan bar pertama dari setiap bar dalam seri. Variabel b memegang harga penutupan dari bar harga green pertama dalam seri. Variabel c memegang harga penutupan bar green kesepuluh dalam seri.

Pada FMZ, dibagi menjadi model harga real-time dan model harga penutupan.vardanvarip.

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

// Test var varip
var i = 0
varip ii = 0

// Print the i and ii changed in each round of the strategy logic on the graph
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)

// Each round of logic execution increments i and ii by 1
if true
    i := i + 1
    ii := ii + 1
  • Model harga real-time Kode tes di atas dijalankan dalam dua fase: 1. fase representasi int historis. 2. fase representasi int real-time. Dalam model harga real-time, fase representasi int historis, variabel i dan ii yang dinyatakan olehvar, varipdieksekusi secara bertahap pada setiap putaran pelaksanaan kode strategi (karenaif trueJadi, dapat dilihat bahwa angka yang ditampilkan pada representasi int BAR dari hasil backtest ditingkatkan 1 satu per satu. Ketika fase representasi int historis berakhir, fase representasi int real-time dimulai.var, varipkarena ini adalah model harga real-time, kode strategi akan dijalankan sekali untuk setiap perubahan harga dalam representasi int BAR,i := i + 1danii := ii + 1Perbedaannya adalah bahwa ii dimodifikasi setiap kali. Meskipun i juga dimodifikasi setiap kali, nilai sebelumnya akan dipulihkan ketika logika strategi dieksekusi pada putaran berikutnya, dan nilai i tidak akan diperbarui sampai representasi int saat ini BAR selesai (yaitu, nilai sebelumnya tidak akan dipulihkan ketika logika strategi dieksekusi pada putaran berikutnya). Jadi dapat dilihat bahwa variabel i masih meningkat 1 untuk setiap BAR. Tetapi variabel ii dikumpulkan beberapa kali untuk setiap BAR.

  • Model harga penutupan Karena model harga penutupan menjalankan logika strategi hanya sekali per representasi int BAR pergi.vardanvaripdalam contoh di atas berperilaku persis sama secara bertahap pada model harga penutupan, baik dalam fase representasi int historis dan fase representasi int real-time, meningkat sebesar 1 per representasi int BAR.

bermacam-macam

varip (var intrabar persist) adalah kata kunci yang digunakan untuk menetapkan dan satu kali inisialisasi variabel.

varip variable_name = expression

Penjelasan:

  • variable_name- Sebarang nama variabel pengguna yang diizinkan dalam skrip Pine (itu dapat berisi huruf besar dan kecil huruf Latin, angka, dan tanda tipis (_), tetapi tidak dapat dimulai dengan angka).
  • expression- Setiap ekspresi aritmatika, seperti waktu yang mendefinisikan variabel reguler. pada garis K pertama, ungkapan dievaluasi dan ditugaskan ke variabel hanya sekali.

Contoh

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

Saat menggunakan var, plot akan mengembalikan nilai bar_index. Dengan varip, perilaku yang sama terjadi pada bilah historis, tetapi pada bilah hidup, grafik mengembalikan nilai yang meningkat satu untuk setiap tik.

PengamatanIni hanya dapat digunakan dengan tipe sederhana seperti float, int, bool, string, dan array dari jenis ini.

benar

Ini mewakili nilai variabel bool, atau nilai yang dapat dihitung ketika ekspresi menggunakanperbandinganataulogis operator.

PengamatanSilakan lihat deskripsiPerbandinganOperator danLogis Operators.

Lihat juga bool

palsu

Ini mewakili nilai variabel bool dan hasil operasi perbandingan dan operasi logis.

PengamatanSilakan lihat deskripsiPerbandinganOperator danLogis Operators.

Lihat juga bool

Jika

Sebuah pernyataan If mendefinisikan blok pernyataan yang harus dieksekusi ketika kondisi ekspresi terpenuhi.

Kode universal 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

Pengamatan var_declarationX- Variabel ini mendapatkan nilai dari pernyataan ifcondition- Jika kondisi adalah benar, logika dalam blok pernyataanthendigunakan (var_decl_then0, var_decl_then1, dll.). Jika kondisi adalah false, logika dalam blok pernyataanelse ifatauelsedigunakan (var_decl_else0, var_decl_else1, dll.).return_expression_thendanreturn_expression_elseJika variabel dinyatakan terakhir, nilainya akan menjadi nilai hasil.

Jenis nilai yang dikembalikan dari pernyataan if tergantung pada jenisreturn_expression_thendanreturn_expression_else. Saat berjalan di TradingView, jenisnya harus cocok: ketika Anda memiliki nilai string di blok else, tidak mungkin untuk mengembalikan nilai bulat dari blok tersebut. Saat berjalan di FMZ, contoh berikut tidak akan melaporkan kesalahan. Ketika nilai y adalah open, nilai plot saat menggambar 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)

Peraturanelseblock dapat dihilangkan. Dalam hal ini, jika kondisi adalah false, variabel var_declarationX diberikan nilai empty (na, false, atau ):

Contoh

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

Beberapa blok else if dapat digunakan atau tidak ada sama sekali.

Contoh

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

Nilai hasil dariifpernyataan dapat diabaikan (var_declarationX= dapat dihilangkan). Ini bisa berguna jika Anda membutuhkan efek samping dari ekspresi, misalnya dalam perdagangan strategi:

Contoh

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

Jika pernyataan dapat berisi 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

Konstruksi for memungkinkan beberapa pernyataan untuk dieksekusi berulang kali:

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

var_declaration- Deklarasi variabel opsional yang akan ditugaskan sebagai nilai dari loops return_expression.counter- Variabel yang memegang nilai konter loop, meningkatkan / mengurangi dengan 1 atau nilai step_num pada setiap iterasi loop.from_num- Nilai awal dari counter. series int/float nilai/ekspresi diizinkan.to_num- Nilai akhir dari counter. loop putus ketika counter lebih besar dari to_num (atau kurang dari to_num dalam kasus dari_num > to_num). series int/float nilai/ekspresi diizinkan, tetapi mereka hanya dievaluasi pada iterasi pertama loop.step_num- Increment/decrement value of the counter. Ini opsional. Default adalah +1 atau -1, tergantung pada yang terbesar dari from_num atau to_num. Saat menggunakan nilai, counter juga increment/decremented sesuai dengan yang terbesar dari from_num atau to_num, jadi tanda +/- dari step_num opsional.statements | continue | break- Sebarang jumlah pernyataan, atau kata kunci continue atau break, yang ditarik oleh 4 spasi atau tab tunggal.return_expressionJika loop keluar karena kata kunci continue atau break, nilai kembali loop adalah nilai kembali dari variabel terakhir yang diberikan nilai sebelum loop keluar.continue- Kata kunci yang hanya bisa digunakan dalam loop.break- Kata kunci untuk keluar dari lingkaran.

Contoh

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

Lihat juga for...in while

untuk... dalam

Peraturanfor...inconstruct memungkinkan beberapa pernyataan untuk diulang untuk setiap elemen dalam array.array_element, atau dengan dua argumen:[index, array_element]. Bentuk kedua tidak mempengaruhi fungsi loop. Ini melacak indeks iterasi saat ini dalam variabel pertama dari tuple.

[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 nilai loopsreturn_expression. index- Variabel opsional yang melacak indeks iterasi saat ini. Indeks dimulai pada 0. Variabel tidak berubah dalam tubuh loop. Ketika digunakan, ia harus terkandung dalam tuple yang juga berisiarray_element. array_element- Variabel yang berisi setiap elemen array berturut-turut yang akan diproses dalam loop.array_id- ID array dari iterasi loop.statements | continue | break- Sebarang jumlah pernyataan, atau kata kunci continue atau break, yang ditarik oleh 4 spasi atau tab tunggal.return_expression- Nilai pengembalian loop ditugaskan untuk variabel divar_declarationJika loop keluar karena kata kunci continue atau break, nilai kembali loop adalah variabel yang terakhir ditugaskan sebelum loop keluar.continue- Kata kunci yang hanya bisa digunakan dalam loop.break- Kata kunci untuk keluar dari lingkaran.

Memungkinkan untuk memodifikasi elemen array atau ukuran mereka dalam loop. Di sini, kita menggunakan bentuk satu argumen darifor...inUntuk menentukan, untuk setiap bar, berapa banyak bar yang memiliki nilai OHLC yang lebih besar dari SMA dari nilai close:

Contoh

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

Di sini, kita menggunakan bentuk dua argumen untuk... dalam untuk menetapkan nilai dari kitaisPosarray ketrueketika nilai yang sesuai di kitavaluesArrayarray adalah positif:

Contoh

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

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

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

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

sementara

PeraturanwhilePernyataan memungkinkan iterasi bersyarat dari blok kode asli.

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

Penjelasan:variable_declaration- Deklarasi variabel opsional.return expressiondapat memberikan nilai inisialisasi untuk variabel ini.boolean_expression- Jika benar, eksekusi blok lokal dariwhileJika salah, eksekusi skrip terus setelahwhile statement. continue- Thecontinuekata kunci menyebabkan loop untuk cabang ke iterasi berikutnya.break- ThebreakKeyword menyebabkan loop untuk mengakhiri. Eksekusi skrip dilanjutkan setelahwhile statement. return_expression- Baris opsional yang memberikan nilai pengembalianwhile statement.

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)

PengamatanBlok kode asli setelah awalwhilegaris harus ditarik dengan empat spasi atau tab.whileloop, ungkapan boolean berikutwhileharus akhirnya menjadi palsu, ataubreakharus dilaksanakan.

Pindah

Operator switch mentransfer kontrol ke salah satu dari beberapa pernyataan berdasarkan kondisi dan nilai ekspresi.

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

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

beralih 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)

beralih 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)

PengembalianNilai dari ekspresi terakhir dalam blok perintah lokal yang dijalankan.

PengamatanHanya satu darilocal_blockkasus ataudefault_local_blockdapat dieksekusi.default_local_blockhanya diperkenalkan dengan=>tag, dan hanya dieksekusi jika blok sebelumnya tidak dijalankan.switchpernyataan ditugaskan untuk variabel dandefault_local_blocktidak ditentukan, pernyataan kembalinaJikalocal_blockKetika menetapkan hasil dari aswitchpernyataan untuk variabel, semualocal_blockcontoh harus mengembalikan nilai dari tipe yang sama.

Lihat juga if ?:

seri

seri adalah kata kunci yang menunjukkan jenis seri data.series keyword.

Operator

=

Digunakan untuk menetapkan nilai untuk variabel, tetapi hanya ketika variabel dinyatakan (pertama kali digunakan).

:=

Operator penugasan menugaskan nilai ke variabel di sebelah kiri. Digunakan untuk menugaskan nilai ke variabel yang dinyatakan sebelumnya.

!=

Tidak sama dengan. berlaku untuk ekspresi dari semua jenis.

expr1 != expr2

PengembalianNilai boolean, atau urutan nilai boolean.

%

Modulo (sisa bilangan bulat) berlaku untuk ekspresi numerik.

expr1 % expr2

PengembalianNilai integer atau float, atau deret nilai.

PengamatanDalam Pine Script, ketika sisa bilangan bulat dihitung, kuozien dipotong, yaitu dibulatkan ke arah nilai absolut terendah. Nilai yang dihasilkan akan memiliki tanda yang sama dengan dividen.

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

%=

Modulo penugasan. berlaku untuk ekspresi numerik.

expr1 %= expr2

Contoh

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

PengembalianNilai integer atau float, atau deret nilai.

*

Penugasan perkalian, berlaku untuk ekspresi numerik.

expr1 * expr2

PengembalianNilai integer atau float, atau deret nilai.

*=

Penugasan perkalian, berlaku untuk ekspresi numerik.

expr1 *= expr2

Contoh

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

PengembalianNilai integer atau float, atau deret nilai.

+

Penjumlahan atau unary plus. berlaku untuk ekspresi numerik atau string.

expr1 + expr2
+ expr

PengembalianBinary+dari string mengembalikan kombinasi dari expr1 dan expr2 Nomor mengembalikan bilangan bulat atau nilai tanda koma mengapung, atau urutan nilai: Biner + mengembalikan expr1 ditambah expr2. Unary + mengembalikan expr (tidak ada yang ditambahkan ke simetri operator unary).

PengamatanAnda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.

+=

Assignment aditif. berlaku untuk ekspresi numerik atau string.

expr1 += expr2

Contoh

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

PengembalianUntuk string, mengembalikan konkatenasi dari expr1 dan expr2. Untuk angka, mengembalikan bilangan bulat atau nilai float, atau deret nilai.

PengamatanAnda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.

-

Pengurangan atau unary dikurangi.

expr1 - expr2
- expr

PengembalianMengembalikan bilangan bulat atau nilai tanda gerak, atau deret nilai: Biner + mengembalikan expr1 dikurangi expr2. Unary-mengembalikan negasi dari expr.

PengamatanAnda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.

-=

Penugasan pengurangan, dapat diterapkan pada ekspresi numerik.

expr1 -= expr2

Contoh

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

PengembalianNilai integer atau float, atau deret nilai.

/

Penugasan pembagian. berlaku untuk ekspresi numerik.

expr1 / expr2

PengembalianNilai integer atau float, atau deret nilai.

/=

Penugasan pembagian. berlaku untuk ekspresi numerik.

expr1 /= expr2

Contoh

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

PengembalianNilai integer atau float, atau deret nilai.

<

Kurang dari. berlaku untuk ekspresi numerik.

expr1 < expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

<=

Kurang dari atau sama dengan.

expr1 <= expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

==

Sama dengan. berlaku untuk ekspresi dari jenis apapun.

expr1 == expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

=>

Operator => digunakan dalam deklarasi fungsi yang didefinisikan pengguna dan dalamswitch statements.

Grammar deklarasi fungsi adalah:

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

A<local_block>adalah nol atau lebih pernyataan Pine Script.<function_result>adalah variabel, ekspresi, atau tuple.

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))

PengamatanAnda dapat mempelajari lebih lanjut tentang fungsi yang didefinisikan pengguna di halaman Manual Pengguna pada Deklarasi fungsi dan pustaka skrip.

>

Lebih besar dari. berlaku untuk ekspresi numerik.

expr1 > expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

>=

Lebih besar dari atau sama dengan.

expr1 >= expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

?:

Operator ternary bersyarat.

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)

Pengembaliannilai nol (0 dan juga NaN, +Infinity, -Infinity) dianggap salah, nilai lain adalah benar.

PengamatanGunakan na untuk else cabang jika Anda tidak membutuhkannya. Anda dapat menggabungkan dua atau lebih operator?: untuk mencapai setara dengan pernyataan seperti switch (lihat contoh di atas). Anda dapat menggunakan operator aritmatika dengan angka serta dengan variabel seri.

Lihat juga na

[]

Subscript seri. Memberi akses ke nilai sebelumnya dari seri expr1. expr2 adalah jumlah bar di masa lalu, dan harus berangka.

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)

PengembalianSerangkaian nilai.

Lihat juga math.floor

dan

Logical AND, dapat diterapkan pada ekspresi boolean.

expr1 and expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

atau

Logical OR. Terapkan pada ekspresi boolean.

expr1 or expr2

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

Tidak

Negasi logis (BUKAN). Terapkan pada ekspresi boolean.

not expr1

PengembalianNilai Boolean, atau serangkaian nilai Boolean.

Kata kunci jenis data

bool

Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe bool (boolean) dari variabel atau argumen. Variabel Bool dapat memiliki nilai: true, false atau na.

Contoh

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

PengamatanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.

Lihat juga var varip int float color string true false

int

Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe int (bilangan bulat) dari variabel atau argumen.

Contoh

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

PengamatanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.

Lihat juga var varip float bool color string

mengambang

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

Contoh

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

PengamatanMengutip secara eksplisit tipe dalam deklarasi variabel adalah opsional, kecuali ketika ini diinitialisasi dengan na.

Lihat juga var varip int bool color string

string

Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe string dari variabel atau argumen.

Contoh

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

PengamatanMengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.

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

warna

Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe color dari variabel atau argumen.

Contoh

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

PengamatanColor literals memiliki format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili nilai heksadesimal 00 hingga FF (0 sampai 255 dalam desimal) di mana pasangan RR, GG dan BB adalah nilai untuk komponen warna s merah, hijau dan biru. AA adalah nilai opsional untuk transparansi warna s (atau komponen alfa) di mana 00 tidak terlihat dan FF tidak transparan. Ketika tidak ada pasangan AA yang disediakan, FF digunakan.

Mengutip tipe secara eksplisit dalam deklarasi variabel adalah opsional, kecuali ketika diinitialisasi dengan na. Pelajari lebih lanjut tentang tipe Pine Script di halaman Manual Pengguna pada Sistem Tipe.

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

Array

Kata kunci yang digunakan untuk secara eksplisit menyatakan tipe array dari variabel atau argumen.array.new<type>, array.from function.

Contoh

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

PengamatanObjek array selalu berupa seri.

Lihat juga 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 tipe kustom dalam strategi untuk mengatur nilai yang berbeda dalam entitas.

Definisi jenis

Mari kita tentukan jenis order untuk menyimpan informasi order:

type order
    float price
    float amount
    string symbol
  • Tipe dinyatakan dengan menggunakantype keyword.
  • Kata kunci tipe diikuti oleh nama tipe.
  • Tipe baris pertama mendefinisikan nama tipe, menyisipkan empat spasi, dan mendefinisikan bidang yang terkandung dalam tipe.
  • Setiap bidang harus menyatakan jenis datanya, seperti int, float, string.

Membuat objek

Menggunakan tipe yang dinyatakan, memanggilnew()fungsi untuk membuat objek:

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

Anda juga dapat membuat objek kosong:

order order1 = na

Mari kita lihat contoh praktis:

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)   // Output {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}

Dalam contoh ini:

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

Hal ini juga dapat ditulis sebagai:

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

Jenis objek untuk penggunaan kata kunci var

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

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

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

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

Ketika Anda menggunakan kata kunci var untuk mendeklarasikan variabel yang ditugaskan ke objek tipe yang didefinisikan pengguna, kata kunci secara otomatis berlaku untuk semua bidang objek.

  • Objek firstBar dinyatakan menggunakan kata kunci var, sehingga bidangnya (indeks, harga, volume) akan mempertahankan nilainya di setiap iterasi, dimulai dari entri pertama dan berakhir dengan entri terakhir.
  • Objek currentBar tidak dinyatakan dengan kata kunci var, sehingga bidangnya akan di-initialize kembali pada setiap entri dan Anda akan memiliki objek baru pada setiap iterasi.

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

Jenis objek untuk penggunaan kata kunci varip

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

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

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

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

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

Di Pine, kata kunci varip digunakan untuk menunjukkan bahwa bidang objects bertahan sepanjang eksekusi skrip dan tidak kembali pada bar yang belum dikonfirmasi. Dalam deklarasi jenis Counter, bidang bar tidak menggunakan kata kunci varip, sehingga bergulir kembali pada setiap bar yang belum dikonfirmasi. Objek counter dinyatakan menggunakan kata kunci var, sehingga tetap ada sepanjang eksekusi skrip. Dalam setiap iterasi, baik bidang batang dan bidang kutu ditingkatkan dengan 1. Bidang batang bergulir kembali pada setiap batang yang tidak dikonfirmasi, sementara bidang kutu tidak bergulir kembali. Akhirnya, dengan memetakan bidang counter.bars dan counter.ticks, Anda dapat membandingkan perbedaan antara keduanya. Nilai counter.bars bergulir kembali pada setiap bar yang tidak dikonfirmasi, sementara nilai counter.ticks terus meningkat sampai akhir eksekusi skrip.


Lebih banyak

PengemisMengapa Strategi Square Duplikat Strategi Pine Tidak Bisa Terwujud

Penemu Kuantitas - Mimpi KecilBaiklah, mari kita periksa.

PengemisOptimized Trend Tracker dari Zhang Jianhui

Penemu Kuantitas - Mimpi KecilHalo, apakah Anda ingin tahu strategi apa yang sebenarnya?