Sumber dimuat naik... memuat...

FMZ PINE Script Doc

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta: 2022-04-28 16:05:05, Dikemas kini: 2024-10-12 17:25:27

[TOC]

img

Pengenalan kata kunci, tatabahasa, tetapan

Struktur kod

Struktur umum yang kod dalam Pine berikut:

<version>
<declaration_statement>
<code>

Nota

Nota simbol yang disokong oleh bahasa Pine FMZ: nota satu baris//, nota berbilang baris/* */, seperti kaedah nota 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

Arahan kompilator dari bentuk berikut memberitahu kompilator versi Pine yang skrip ditulis dengan:

//@version=5

Secara lalai adalah versi V5, yang boleh dihilangkan dari kod//@version=5.

Pernyataan pengisytiharan

  • indicator()
  • strategy()

Perintah pengisytiharan menentukan jenis skrip, yang seterusnya menentukan apa yang dibenarkan di dalamnya, dan bagaimana ia digunakan dan dilaksanakan. Tetapkan sifat utama skrip, seperti namanya, di mana ia akan muncul apabila ditambah ke carta, ketepatan dan format nilai berangka yang dipaparkan, dan nilai berangka tertentu yang mengawal tingkah laku runtime, contohnya, bilangan maksimum objek lukisan untuk dipaparkan dalam carta.indicator()ataustrategy()pernyataan pengisytiharan mesti dimasukkan dalam kod strategi di Pine of FMZ.

Kod

Baris dalam skrip yang bukan komen atau arahan kompilator, yang merupakan pernyataan, yang melaksanakan algoritma skrip. Perintah boleh menjadi salah satu kandungan ini.

  • Pengisytiharan yang berubah
  • Penetapan semula pembolehubah
  • Deklarasi fungsi
  • Panggilan fungsi terbina dalam, panggilan fungsi yang ditakrifkan pengguna
  • if, for, whileatauswitchdan pembinaan lain

Pengumuman boleh disusun dengan pelbagai cara

  • Sesetengah pernyataan boleh dinyatakan dalam satu baris, seperti kebanyakan pengisytiharan pembolehubah, baris yang mengandungi hanya satu panggilan fungsi, atau pengisytiharan fungsi satu baris.
  • Perintah dalam skop global skrip (iaitu bahagian yang bukan sebahagian daripada blok tempatan) tidak boleh bermula denganspaceatautab(kunci tab). Karakter pertama mereka juga mesti menjadi watak pertama baris. Baris yang bermula di kedudukan pertama baris adalah oleh definisi sebahagian daripada skop global skrip.
  • Alocal blockadalah sentiasa diperlukan untuk struktur atau multi-baris fungsi pengisytiharan. Blok tempatan mesti ditarik dengan satu tab atau empat ruang (kalau tidak, ia akan dianalisis sebagai kod yang disambung baris sebelumnya, yang ditentukan sebagai kandungan berterusan baris sebelumnya kod), dan setiap blok tempatan mentakrifkan skop tempatan yang berbeza.
  • Pelbagai pernyataan satu baris boleh disambung pada satu baris dengan menggunakan koma (,) sebagai pembatas.
  • Satu baris boleh mengandungi komen atau hanya komen.
  • Garis juga boleh dibungkus (diteruskan pada beberapa baris).

Sebagai contoh, sertakan tiga blok tempatan, satu dalam pengisytiharan fungsi tersuai, dan dua dalam pengisytiharan pembolehubah menggunakan struktur jika, seperti 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)

Kod barisan baru

Garis panjang boleh dibahagikan kepada beberapa baris, atau bungkus. Garis yang dibungkus mesti diletakkan dengan jumlah ruang kosong, selagi ia bukan kelipatan 4 (batas-batas ini digunakan untuk mengetuk blok tempatan).

a = open + high + low + close

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

a = open +
      high +
          low +
             close

Satu panggilan plot panjang boleh 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)

Perkataan dalam pengisytiharan fungsi yang ditakrifkan oleh pengguna juga boleh dibungkus. Walau bagaimanapun, kerana blok tempatan mesti bermula secara sintaksis dengan tiruan (4 ruang atau 1 tab), apabila membahagikannya ke baris seterusnya, kesinambungan pernyataan mesti bermula dengan lebih daripada satu tiruan (tidak sama dengan 4 kelipatan 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")

Siri Masa

Siri masa bukan jenis atau format data, sebaliknya, ia adalah konsep struktur asas dalam bahasa PINE. Digunakan untuk menyimpan nilai yang berubah secara berterusan dalam masa, setiap nilai sepadan dengan satu titik dalam masa. Struktur konsep siri masa sesuai untuk memproses dan merakam satu siri data yang berubah dari masa ke masa.

Ambil pembolehubah terbina dalamopenSebagai contoh,openpembolehubah terbina dalam mencatat harga pembukaan setiap perwakilan int BAR, jika iniopenadalah data tempoh perwakilan int 5 minit. Kemudian iniopenpembolehubah merakam harga pembukaan setiap 5 minit int perwakilan BAR (bar).openUntuk merujuk kepada nilai terdahulu (nilai masa lalu) dalam siri masa, kita menggunakan[]Apabila strategi dijalankan pada perwakilan int BAR tertentu,open[1]Maknanya adalah merujuk kepada harga pembukaan perwakilan int sebelumnya BAR daripada perwakilan int semasa BAR.

WalaupunSiri masaadalah sangat mengingatkan struktur data array, walaupun bahasa PINE juga mempunyai jenis array. tetapi mereka dan siri masa adalah konsep yang sama sekali berbeza.

Siri masa yang direka dalam bahasa pine boleh dengan mudah mengira nilai kumulatif harga penutupan dalam kod strategi, dan tidak perlu menggunakan struktur gelung seperti untuk, hanya fungsi terbina dalamta.cum(close)Untuk contoh lain, kita perlu mengira nilai purata perbezaan antara harga tertinggi dan harga terendah 14 bar perwakilan int terakhir (iaitu, 14 bar perwakilan int yang paling dekat dengan masa semasa apabila kod dijalankan), yang boleh ditulis sebagai:ta.sma(high - low, 14)

Hasil panggilan fungsi pada siri masa juga akan meninggalkan jejak pada siri masa, sekali lagi kita menggunakan[]Sebagai contoh, apabila menguji sama ada harga penutupan perwakilan int BAR semasa melebihi nilai maksimum harga tertinggi dalam 10 perwakilan int BAR terakhir (tidak termasuk perwakilan int BAR semasa).breach = close > ta.highest(close, 10)[1], dan kita juga boleh menulisbreach = close > ta.highest(close[1], 10)Jadi.ta.highest(close, 10)[1]danta.highest(close[1], 10)adalah sama.

Ini boleh disahkan dengan kod berikut:

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

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

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

Kod ujian di atas akan mengeluarkan nilai a dan b pada setiap BAR dalam siri masa yang sepadan.

Argumen templat perpustakaan kelas perdagangan bahasa pain

Arahan untuk menetapkan argumen templat terbina dalam Pine Language Trade Class Library strategi PINE.

img

Tetapan Perdagangan

  • Mod pelaksanaan Model harga penutupan: Model dijalankan hanya selepas BAR semasa diselesaikan, dan perdagangan dilaksanakan apabila BAR seterusnya bermula. Model harga masa nyata: Model ini dilaksanakan setiap kali harga bergerak, dan terdapat isyarat untuk melaksanakan perdagangan dengan segera.
  • Saiz lot terbuka lalai: Jika pesanan dagangan tidak menentukan jumlah dagangan, dagangan akan dilaksanakan mengikut jumlah yang ditetapkan.
  • Jumlah pesanan maksimum untuk satu perdagangan: Tentukan jumlah maksimum setiap pesanan untuk mengelakkan kesan pasaran mengikut pasaran sebenar dan tetapan argumen ini.
  • Titik Slippage: Tentukan slippage apabila meletakkan pesanan mengikutPricing Currency Precisioncontohnya, ketepatan mata wang harga ditetapkan kepada 2, yang tepat kepada titik perpuluhan kedua, tepat kepada 0.01. Kemudian setiap titik titik seluncur mewakili 0.01 unit harga. pada masa ini, titik seluncur ditetapkan kepada 5, dan seluncur apabila meletakkan pesanan adalah 0.05 (seluncur merujuk kepada bahagian harga yang melimpah apabila meletakkan pesanan untuk perdagangan pesanan yang lebih baik dan cacat).
  • Nombor tempoh paling panjang pembolehubah: mempengaruhi bilangan K-garis BAR dalam carta. Ia sama dengan memanggil fungsiSetMaxBarLendalamjavascript srategy.

Pilihan niaga hadapan

  • Kod varieti: kod kontrak, ia hanya perlu ditetapkan apabila objek pertukaran adalah objek pertukaran bukan spot.
  • Ukuran kontrak minimum: Volume dagangan minimum kontrak apabila meletakkan pesanan.

Pilihan dagangan langsung

  • Kemajuan pemulihan automatik: Memulihkan keadaan automatik sebelum berhenti strategi terakhir.
  • Waktu percubaan semula pesanan: Jika pesanan tidak dipenuhi, pesanan akan dibatalkan, dan pesanan akan diletakkan semula untuk mencuba perdagangan.
  • Jangkaan pengundian rangkaian (milisaat): Hanya sah untuk protokol REST, ia mengawal jangkaan permintaan rangkaian untuk mengelakkan permintaan menjadi terlalu kerap dan melebihi had pertukaran.
  • Masa penyegerakan akaun (detik): tempoh masa untuk menyegerakan data akaun.
  • Masa penyegerakan kedudukan selepas membuka kedudukan (milisaat): Hanya untuk kedudukan berulang yang disebabkan oleh kelewatan data di beberapa pertukaran, menetapkan masa penyegerakan yang lebih besar dapat meringankan masalah tersebut.
  • Kali ganda leverage: menetapkan kali ganda leverage.

Dagangan spot, tetapan lain

  • Volume dagangan satu lot: jumlah dagangan lalai satu lot, yang hanya sah untuk spot.
  • Jumlah perdagangan minimum: Jumlah perdagangan minimum.
  • Kecekapan Mata Wang Harga: Kecekapan harga, iaitu bilangan tempat perpuluhan dalam harga.
  • Ketepatan pelbagai perdagangan: ketepatan kuantiti pesanan, iaitu bilangan tempat perpuluhan kuantiti pesanan.
  • Bayaran pengendalian: Hitung beberapa data mengikut tetapan ini, 0,002 bermaksud 2/1000.
  • Julat statistik keuntungan dan kerugian: Ia hanya digunakan untuk memaparkan statistik keuntungan dan kerugian di pasaran sebenar.
  • Gagal Uji semula (ms): Jangkaan uji semula apabila permintaan rangkaian gagal.
  • Gunakan proksi: Hanya sah untuk protokol REST.
  • sembunyikan kesilapan rangkaian biasa: sembunyikan log kesilapan biasa di kawasan log.
  • Alamat pangkalan suis: hanya sah untuk protokol REST.
  • Push pemberitahuan: Push mesej ke peti mel, 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

Kedudukan 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 kedudukan bahasa PINE adalah sama dengan kedudukan satu hala. Sebagai contoh, apabila memegang kedudukan dalam arah panjang (posisi panjang), jika terdapat pesanan untuk operasi jual, pesanan yang dirancang, dan lain-lain (dalam arah yang bertentangan dengan kedudukan), pelaksanaan akan dicetuskan, dan kedudukan dalam arah panjang akan ditutup terlebih dahulu. (Tutup semua kedudukan panjang), dan kemudian pelaksanaan pesanan yang dicetuskan (dalam arah yang bertentangan berbanding dengan kedudukan sebelum penutupan).

Perancangan

Apabila meletakkan pesanan menggunakan perintah penempatan pesanan, jika tidak ada harga yang ditentukan, lalai adalah pesanan pasaran. Sebagai tambahan kepada pesanan pasaran, anda juga boleh meletakkan pesanan melalui pesanan yang dirancang, yang tidak beroperasi dengan segera untuk meletakkan pesanan. Perintah yang dirancang wujud dalam antrian pesanan yang dirancang program apabila ia tidak dicetuskan, dan boleh dilihat di tab Perancanaan Perintah maklumat status (iaitu bar status apabila strategi berjalan) semasaPerintah sebenar / pengujian belakang. Sistem hanya akan meletakkan pesanan apabila harga pasaran masa nyata memenuhi syarat untuk mencetuskan pesanan yang dirancang ini. Oleh itu, adalah normal bagi pesanan ini untuk mempunyai penyimpangan kecil dalam harga perdagangan.strategy.entryfungsi untuk meletakkan pesanan, kita boleh 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    
  • Perintah had

    Tetapkan harga had pesanan. Apabila pesanan adalah pesanan beli (iaitu,directionhujah adalahstrategy.long), pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih rendah daripada harga ini. Apabila pesanan adalah pesanan jual (iaitu,directionhujah adalahstrategy.short), pesanan hanya akan dicetuskan jika harga pasaran semasa lebih tinggi daripada harga ini.

  • Perintah berhenti

    Tetapkan harga stop loss pesanan. Apabila pesanan adalah pesanan beli, pesanan hanya akan dicetuskan apabila harga pasaran semasa lebih tinggi daripada harga ini. Apabila pesanan adalah pesanan jual, pesanan hanya akan dicetuskan jika harga semasa pasaran lebih rendah daripada harga itu.

  • Perintah stop-limit

    Peraturanlimitdanstopargument boleh ditetapkan pada masa yang sama, dan pesanan akan dicetuskan pada harga yang memenuhi syarat terlebih dahulu.

Peratusan order ekuiti

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

Selepas menentukandefault_qty_type=strategy.percent_of_equity, setdefault_qty_valuekepada jumlah peratusan (0~100), 1 bermaksud 1%. kuantiti pesanan dikira mengikut jumlah mata wang yang diisytiharkan dalam akaun. Sebagai contoh: jika akaun semasa mempunyai 10,000 USDT, menetapkan pesanan 1% bermakna meletakkan pesanan dengan skala 100 USDT (dikira berdasarkan harga semasa semasa penjualan).

Pengisytiharan, struktur logik kata kunci

var

var adalah kata kunci yang digunakan untuk memperuntukkan dan satu kali inisialisasi pembolehubah. Secara umum, tatabahasa penugasan pembolehubah yang tidak mengandungi kata kunci var menyebabkan nilai pembolehubahs ditimpa setiap kali data dikemas kini. Sebaliknya, apabila pembolehubah ditugaskan menggunakan kata kunci var, mereka boleh menjaga keadaan walaupun kemas kini data, mengubahnya hanya apabila syarat dalam if-ekspresi dipenuhi.

var variable_name = expression

Penjelasan:

  • variable_name- Sebarang nama pembolehubah pengguna yang dibenarkan dalam Pine Script (ia boleh mengandungi aksara besar dan kecil Latin, nombor dan tanda bawah (_), tetapi ia tidak boleh bermula dengan nombor).
  • expression- Sebarang ungkapan aritmatika, seperti menentukan pembolehubah biasa. ungkapan akan dinilai dan diberikan kepada pembolehubah untuk satu kali.

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

Peralihan a memegang harga penutupan bar pertama dari setiap bar dalam siri. Peralihan b memegang harga penutupan bar harga green pertama dalam siri. Peralihan c memegang harga penutupan bar green kesepuluh dalam siri.

Pada FMZ, ia dibahagikan kepada model harga masa nyata 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 masa nyata Kod ujian di atas dijalankan dalam dua fasa: 1. fasa perwakilan int sejarah. 2. fasa perwakilan int masa nyata. Dalam model harga masa nyata, fasa perwakilan int sejarah, pembolehubah i dan ii yang dinyatakan olehvar, varipdilaksanakan secara tambahan pada setiap pusingan pelaksanaan kod strategi (keranaif truemaka blok kod bersyarat yang sesuai pasti dilaksanakan). Oleh itu, dapat dilihat bahawa nombor yang dipaparkan pada perwakilan int BAR hasil backtest ditingkatkan dengan 1 satu demi satu. Apabila fasa perwakilan int sejarah berakhir, fasa perwakilan int masa nyata bermula.var, varipkerana ia adalah model harga masa nyata, kod strategi akan dilaksanakan sekali untuk setiap perubahan harga dalam perwakilan int BAR,i := i + 1danii := ii + 1Perbezaan adalah bahawa ii dimodifikasi setiap kali. Walaupun i juga dimodifikasi setiap kali, nilai sebelumnya akan dipulihkan apabila logik strategi dilaksanakan pada pusingan seterusnya, dan nilai i tidak akan dikemas kini sehingga perwakilan int semasa BAR selesai (iaitu, nilai sebelumnya tidak akan dipulihkan apabila logik strategi dilaksanakan pada pusingan seterusnya). Jadi dapat dilihat bahawa pembolehubah i masih meningkat sebanyak 1 untuk setiap BAR. Tetapi pembolehubah ii dikumpulkan beberapa kali untuk setiap BAR.

  • Model harga penutupan Oleh kerana model harga penutupan melaksanakan logik strategi hanya sekali per perwakilan int BAR hilang.vardanvaripdalam contoh di atas bertindak sama secara tambahan pada model harga penutupan, kedua-dua dalam fasa perwakilan int sejarah dan fasa perwakilan int masa nyata, meningkat sebanyak 1 setiap perwakilan int BAR.

berlainan

varp (var intrabar persist) adalah kata kunci yang digunakan untuk menetapkan dan satu kali inisialisasi pembolehubah. Ia serupa dengan kata kunci var, tetapi pembolehubah yang diisytiharkan dengan varip mengekalkan nilainya antara kemas kini lilin langsung.

varip variable_name = expression

Penjelasan:

  • variable_name- Mana-mana nama pembolehubah pengguna yang dibenarkan dalam skrip Pine (ia boleh mengandungi aksara Latin huruf besar dan kecil, nombor, dan tanda bawah (_), tetapi ia tidak boleh bermula dengan nombor).
  • expression- Sebarang ungkapan aritmetik, seperti masa yang menentukan pembolehubah biasa. pada bar K-garis pertama, ungkapan dinilai dan diberikan kepada pembolehubah hanya sekali.

Contoh

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

Apabila menggunakan var, plot akan mengembalikan nilai bar_index. Dengan varip, tingkah laku yang sama berlaku pada bar sejarah, tetapi pada bar hidup, carta mengembalikan nilai yang meningkat satu untuk setiap tanda.

CatatanIa hanya boleh digunakan dengan jenis mudah seperti float, int, bool, string, dan array jenis ini.

betul

Ia mewakili nilai pembolehubah bool, atau nilai yang boleh dikira apabila ungkapan menggunakanperbandinganataulogik operator.

CatatanSila lihat peneranganPerbandinganPengendali danLogik Operators.

Lihat juga bool

palsu

Ia mewakili nilai pembolehubah bool dan hasil operasi perbandingan dan operasi logik.

CatatanSila lihat peneranganPerbandinganPengendali danLogik Operators.

Lihat juga bool

jika

Perintah If menentukan blok pernyataan yang mesti dilaksanakan apabila syarat ungkapan dipenuhi. Versi 4 bahasa skrip Pine membolehkan anda menggunakan tatabahasa else if.

Kod sejagat dari:

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

Catatan var_declarationX- Variabel ini mendapat nilai if statementcondition- Jika keadaan adalah benar, logik dalam blok pernyataanthendigunakan (var_decl_then0, var_decl_then1Jika keadaan adalah salah, logik dalam blok pernyataanelse ifatauelsedigunakan (var_decl_else0, var_decl_else1, dll.).return_expression_thendanreturn_expression_else- Ungkapan terakhir dalam modul atau ungkapan dari blok lain-lain mengembalikan nilai akhir pernyataan.

Jenis nilai pulangan if pernyataan bergantung kepada jenisreturn_expression_thendanreturn_expression_else. Apabila berjalan pada TradingView, jenis mereka mesti sepadan: apabila anda mempunyai nilai rentetan dalam blok else, tidak mungkin untuk mengembalikan nilai bulat dari blok tersebut. Apabila berjalan pada FMZ, contoh berikut tidak akan melaporkan ralat. Apabila nilai y adalah open, nilai plot ketika 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)

Peraturanelseblok boleh dihilangkan. Dalam kes ini, jika keadaan itu salah, pembolehubah var_declarationX diberikan nilai kosong (na, salah, 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 boleh digunakan atau tidak ada sama sekali.

Contoh

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

Nilai hasil daripadaifpernyataan boleh diabaikan (var_declarationX= boleh dihilangkan). Ia boleh berguna jika anda memerlukan kesan sampingan ungkapan, contohnya dalam perdagangan strategi:

Contoh

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

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

Konstruksi for membolehkan beberapa pernyataan dijalankan berulang kali:

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

var_declaration- Deklarasi pembolehubah pilihan yang akan diberikan sebagai nilai loops return_expression.counter- Peubah yang memegang nilai kiraan gelung, meningkatkan / mengurangkan dengan 1 atau nilai step_num pada setiap pengulangan gelung.from_num- Nilai permulaan kaunter. series int/float nilai/ekspresi dibenarkan.to_num- Nilai akhir kaunter. gelung pecah apabila kaunter lebih besar daripada to_num (atau kurang daripada to_num dalam kes dari_num > to_num). series int / float nilai / ungkapan dibenarkan, tetapi mereka hanya dinilai pada pengulangan pertama gelung.step_num- Nilai peningkatan/pengurangan kaunter. Ia adalah pilihan. lalai adalah +1 atau -1, bergantung kepada yang terbesar dari_num atau to_num. Apabila menggunakan nilai, kaunter juga meningkat/dikurangkan mengikut yang terbesar dari_num atau to_num, jadi tanda +/- langkah_num adalah pilihan.statements | continue | break- Sebarang bilangan pernyataan, atau kata kunci lanjutkan atau break, yang ditarik oleh 4 ruang atau tab tunggal.return_expression- Nilai pulangan gelung, jika terdapat, diberikan kepada pembolehubah dalam var_declaration. Jika gelung keluar kerana kata kunci continue atau break, nilai pulangan gelung adalah nilai pulangan pembolehubah terakhir yang diberikan nilai sebelum gelung keluar.continue- Kata kunci yang hanya boleh digunakan dalam gelung.break- Kata kunci untuk keluar dari gelung.

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 membolehkan beberapa pernyataan diulang untuk setiap elemen dalam array. Ia boleh digunakan dengan mana-mana argumen:array_element, atau dengan dua hujah:[index, array_element]. Bentuk kedua tidak mempengaruhi fungsi gelung. Ia menjejaki indeks pengulangan semasa dalam pembolehubah pertama 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 pembolehubah pilihan yang akan diberikan nilai gelungreturn_expression. index- Peubah pilihan yang menjejaki indeks pengulangan semasa. Indeks bermula pada 0. Peubah tidak berubah dalam badan gelung. Apabila digunakan, ia mesti terkandung dalam tuple yang juga mengandungiarray_element. array_element- Peubah yang mengandungi setiap unsur array berturut-turut untuk diproses dalam gelung.array_id- ID array untuk pengulangan gelung.statements | continue | break- Sebarang bilangan pernyataan, atau kata kunci lanjutkan atau break, yang ditarik oleh 4 ruang atau tab tunggal.return_expression- Nilai pulangan gelung diberikan kepada pembolehubah dalamvar_declarationJika gelung keluar kerana kata kunci continue atau break, nilai pulangan gelung adalah pembolehubah yang terakhir diberikan sebelum gelung keluar.continue- Kata kunci yang hanya boleh digunakan dalam gelung.break- Kata kunci untuk keluar dari gelung.

Membolehkan untuk mengubah suai elemen array atau saiz mereka dalam gelung. Di sini, kita menggunakan bentuk satu argumen darifor...inuntuk menentukan, untuk setiap bar, berapa bar mempunyai nilai OHLC yang lebih besar daripada SMA 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-nilai kitaisPosarray kepadatrueapabila nilai yang sepadan dalam 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 membolehkan pengulangan bersyarat blok kod asli.

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

Penjelasan:variable_declaration- Pengisytiharan pembolehubah pilihan.return expressionboleh memberikan nilai inisialisasi untuk pembolehubah ini.boolean_expression- Jika benar, jalankan blok tempatanwhileJika salah, pelaksanaan skrip diteruskan selepaswhile statement. continue- ThecontinueKata kunci menyebabkan gelung untuk cabang ke pengulangan seterusnya.break- ThebreakPengeluaran skrip diteruskan selepaswhile statement. return_expression- Baris pilihan yang memberikan nilai pulanganwhile 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)

CatatanBlok kod asli selepas awalwhilegaris mesti diletakkan dengan empat ruang atau tab. Untuk menamatkanwhilegelung, ungkapan Boolean berikutwhilemesti akhirnya menjadi palsu, ataubreakmesti dieksekusi.

menukar

Operator suis memindahkan kawalan ke salah satu daripada beberapa pernyataan berdasarkan keadaan dan nilai ungkapan.

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

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

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

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

KembaliNilai ungkapan terakhir dalam blok arahan tempatan yang dilaksanakan.

CatatanHanya satu daripadalocal_blockkes ataudefault_local_blockboleh dilaksanakan.default_local_blockhanya diperkenalkan dengan=>tag, dan hanya dilaksanakan jika blok sebelumnya tidak dilaksanakan.switchpernyataan ditetapkan kepada pembolehubah dandefault_local_blocktidak ditentukan, pernyataan kembalinajikalocal_blockApabila menetapkan hasil daripadaswitchpernyataan kepada pembolehubah, semualocal_blockcontoh mesti mengembalikan nilai jenis yang sama.

Lihat juga if ?:

siri

Series adalah kata kunci yang menunjukkan jenis siri data.series keyword.

Pengendali

=

Digunakan untuk menetapkan nilai kepada pembolehubah, tetapi hanya apabila pembolehubah diisytiharkan (pertama digunakan).

:=

Operator penugasan menetapkan nilai kepada pembolehubah di sebelah kiri. Digunakan untuk menetapkan nilai kepada pembolehubah yang telah diisytiharkan sebelumnya.

!=

Tidak sama dengan. boleh digunakan untuk ungkapan jenis apa pun.

expr1 != expr2

KembaliNilai Boolean, atau urutan nilai Boolean.

%

Modulo (sisa bilangan bulat). boleh digunakan untuk ungkapan nombor.

expr1 % expr2

KembaliNilai integer atau float, atau siri nilai.

CatatanDalam Pine Script, apabila baki bilangan bulat dikira, perbandingan dipotong, iaitu dibulatkan ke arah nilai mutlak terendah.

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

%=

Tugas Modulo. boleh digunakan untuk ungkapan nombor.

expr1 %= expr2

Contoh

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

KembaliNilai integer atau float, atau siri nilai.

*

Tugas perkalian. boleh digunakan untuk ungkapan nombor.

expr1 * expr2

KembaliNilai integer atau float, atau siri nilai.

*=

Tugas perkalian. boleh digunakan untuk ungkapan nombor.

expr1 *= expr2

Contoh

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

KembaliNilai integer atau float, atau siri nilai.

+

Penjumlahan atau unari tambah. boleh digunakan untuk ungkapan nombor atau rentetan.

expr1 + expr2
+ expr

KembaliBinari+daripada rentetan mengembalikan gabungan expr1 dan expr2 Nombor mengembalikan bilangan bulat atau nilai koma terapung, atau urutan nilai: Binari + mengembalikan expr1 ditambah expr2. Unari + mengembalikan expr (tidak ada yang ditambahkan kepada simetri pengendali unari).

CatatanAnda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.

+=

Peruntukan penambahan. Berlaku untuk ungkapan nombor atau rentetan.

expr1 += expr2

Contoh

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

KembaliUntuk rentetan, mengembalikan konketen expr1 dan expr2. Untuk nombor, mengembalikan bilangan bulat atau nilai terapung, atau siri nilai.

CatatanAnda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.

-

Pengurangan atau unary tolak. boleh digunakan untuk ungkapan nombor.

expr1 - expr2
- expr

KembaliMengembalikan bilangan bulat atau nilai koma terapung, atau siri nilai: Binari + mengembalikan expr1 tolak expr2. Unary-Mengembalikan penolakan expr.

CatatanAnda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.

-=

Tugas pengurangan. boleh digunakan untuk ungkapan nombor.

expr1 -= expr2

Contoh

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

KembaliNilai integer atau float, atau siri nilai.

/

Tugas pembahagian. boleh digunakan untuk ungkapan nombor.

expr1 / expr2

KembaliNilai integer atau float, atau siri nilai.

/=

Tugas pembahagian. boleh digunakan untuk ungkapan nombor.

expr1 /= expr2

Contoh

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

KembaliNilai integer atau float, atau siri nilai.

<

Kurang daripada. boleh digunakan untuk ungkapan nombor.

expr1 < expr2

KembaliNilai boolean, atau siri nilai boolean.

<=

Kurang daripada atau sama dengan.

expr1 <= expr2

KembaliNilai boolean, atau siri nilai boolean.

==

Sama dengan. boleh digunakan untuk ungkapan jenis apa pun.

expr1 == expr2

KembaliNilai boolean, atau siri nilai boolean.

=>

Operator => digunakan dalam pengisytiharan fungsi yang ditakrifkan pengguna dan dalamswitch statements.

Grammar pengisytiharan fungsi adalah:

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

A<local_block>adalah sifar atau lebih perintah Pine Script.<function_result>adalah pembolehubah, ungkapan, 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))

PerkataanAnda boleh belajar lebih lanjut mengenai fungsi yang ditakrifkan pengguna di halaman Manual Pengguna pada Mengisytiharkan fungsi dan perpustakaan skrip.

>

Lebih besar daripada. boleh digunakan untuk ungkapan nombor.

expr1 > expr2

KembaliNilai boolean, atau siri nilai boolean.

>=

Lebih besar daripada atau sama dengan.

expr1 >= expr2

KembaliNilai boolean, atau siri nilai boolean.

?:

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

Kembaliexpr2 jika expr1 dinilai benar, expr3 sebaliknya. Nilai sifar (0 dan juga NaN, +Infinity, -Infinity) dianggap salah, mana-mana nilai lain adalah benar.

CatatanGunakan na untuk else cawangan jika anda tidak memerlukannya. Anda boleh menggabungkan dua atau lebih?: pengendali untuk mencapai setara dengan pernyataan seperti switch (lihat contoh di atas). Anda boleh menggunakan operator aritmatika dengan nombor dan juga dengan pembolehubah siri.

Lihat juga na

[]

Subscript siri. Memberi akses kepada nilai sebelumnya siri expr1. expr2 adalah bilangan bar pada masa lalu, dan ia mesti berangka. Float akan dibulatkan ke bawah.

expr1[expr2]

Contoh

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

KembaliSatu siri nilai.

Lihat juga math.floor

dan

Logical AND. Boleh digunakan untuk ungkapan boolean.

expr1 and expr2

KembaliNilai boolean, atau siri nilai boolean.

atau

OR logik. boleh digunakan untuk ungkapan boolean.

expr1 or expr2

KembaliNilai boolean, atau siri nilai boolean.

Tidak

Penolakan logik (BUKAN). Boleh digunakan untuk ungkapan boolean.

not expr1

KembaliNilai boolean, atau siri nilai boolean.

Kata kunci jenis data

bool

Kata kunci digunakan untuk menyatakan secara eksplisit jenis bool (boolean) pembolehubah atau argumen. Bool pembolehubah boleh mempunyai nilai: benar, salah atau na.

Contoh

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

CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.

Lihat juga var varip int float color string true false

int

Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis int (jumlah bulat) pembolehubah atau argumen.

Contoh

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

CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.

Lihat juga var varip float bool color string

mengambang

Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis float (floating point) pembolehubah atau argumen.

Contoh

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

CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.

Lihat juga var varip int bool color string

senar

Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis string pembolehubah atau argumen.

Contoh

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

CatatanMengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.

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

warna

Kata kunci yang digunakan untuk menyatakan secara eksplisit jenis color pembolehubah atau argumen.

Contoh

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

CatatanWarna literal mempunyai format berikut: #RRGGBB atau #RRGGBBAA. Pasangan huruf mewakili nilai heksadesimal 00 hingga FF (0 hingga 255 dalam desimal) di mana pasangan RR, GG dan BB adalah nilai untuk komponen warna merah, hijau dan biru. AA adalah nilai pilihan untuk ketelusan warna (atau komponen alpha) di mana 00 tidak kelihatan dan FF tidak telus. Apabila tiada pasangan AA disediakan, FF digunakan. Heksadesimal huruf boleh huruf besar atau kecil.

Mengisytiharkan secara eksplisit jenis dalam pengisytiharan pembolehubah adalah pilihan, kecuali apabila ia dimulakan dengan na.

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

Array

Kata kunci digunakan untuk menyatakan secara eksplisit jenis array pembolehubah 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))

CatatanObjek array sentiasa berupa seri.

Lihat juga 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 tersuai dalam strategi untuk mengatur nilai yang berbeza dalam entiti.

Menentukan jenis

Mari kita tentukan jenis pesanan untuk menyimpan maklumat pesanan:

type order
    float price
    float amount
    string symbol
  • Jenis dinyatakan menggunakantype keyword.
  • Kata kunci jenis diikuti oleh nama jenis.
  • Jenis baris pertama mentakrifkan nama jenis, empat ruang yang ditarik masuk, dan mentakrifkan medan yang terkandung dalam jenis.
  • Setiap medan perlu mengisytiharkan jenis datanya, seperti int, float, string.

Mencipta objek

Menggunakan jenis yang diisytiharkan, memanggilnew()fungsi untuk mencipta 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 boleh mencipta objek kosong:

order order1 = na

Mari kita lihat contoh praktikal:

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)

Ia juga boleh 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")

Apabila anda menggunakan kata kunci var untuk mengisytiharkan pembolehubah yang diberikan kepada objek jenis yang ditakrifkan pengguna, kata kunci secara automatik terpakai kepada semua medan objek. Ini bermakna objek yang diisytiharkan melalui kata kunci var akan mengekalkan keadaannya antara setiap pengulangan tanpa perlu menghidupkan semula nilai medan di setiap pengulangan.

  • Objek firstBar diisytiharkan menggunakan kata kunci var, jadi bidangnya (indeks, harga, vol) akan mengekalkan nilai mereka dalam setiap pengulangan, bermula dari entri pertama dan berakhir dengan entri terakhir.
  • Objek currentBar tidak diisytiharkan dengan kata kunci var, jadi bidangnya akan dimulakan semula pada setiap entri dan anda akan mempunyai objek baru pada setiap pengulangan.

Dengan merangka bidang indeks kedua-dua objek, anda boleh membandingkan perbezaan di antara mereka. firstBar.index akan mengekalkan nilai yang ditetapkan sebelum ini dalam setiap pengulangan, sementara currentBar.index akan dimulakan semula dalam setiap pengulangan ke nilai bar_index entri semasa.

Jenis objek untuk menggunakan 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, kata kunci varip digunakan untuk menunjukkan bahawa medan objek kekal sepanjang pelaksanaan skrip dan tidak kembali pada bar yang tidak disahkan. Dalam pengisytiharan jenis Counter, medan bar tidak menggunakan kata kunci varip, jadi ia kembali pada setiap bar yang tidak disahkan. medan kutu menggunakan kata kunci varip, jadi ia tidak kembali pada bar yang tidak disahkan. Objek counter diisytiharkan menggunakan kata kunci var, jadi ia berterusan sepanjang pelaksanaan skrip. Dalam setiap pengulangan, kedua-dua medan bar dan medan tik meningkat sebanyak 1. medan bar bergulir kembali pada setiap bar yang tidak disahkan, sementara medan tik tidak bergulir kembali. Akhirnya, dengan memetakan medan counter.bars dan counter.ticks, anda boleh membandingkan perbezaan di antara mereka. Nilai counter.bars kembali pada setiap bar yang tidak disahkan, sementara nilai counter.ticks terus meningkat sehingga akhir pelaksanaan skrip.


Lebih lanjut

PengemisMengapa strategi Square Duplicate tidak boleh menjadi strategi Pine?

Pencipta Kuantiti - Impian KecilBaiklah, mari kita lihat.

PengemisPengesan Trend yang Dioptimumkan

Pencipta Kuantiti - Impian KecilHalo, boleh saya tanya strategi apa sebenarnya?