[TOC]
Inventor Quantitative Trading Platform menyokong strategi penulisan bahasa Pine, menyokong pengulangan, menjalankan strategi bahasa Pine secara langsung, dan menyokong versi rendah bahasa Pine.Dataran StrategiTerdapat banyak strategi Pine yang dikumpulkan dan dipindahkan.
FMZ bukan sahaja menyokong bahasa Pine, tetapi juga menyokong ciri-ciri gambar yang kuat dalam bahasa Pine. Pelbagai ciri di platform FMZ, alat yang banyak digunakan, pengurusan yang efisien dan mudah, juga meningkatkan kepraktisan Pine. FMZ adalah berdasarkan keserasian dengan bahasa Pine, tetapi juga dengan tahap pengembangan, pengoptimuman, dan pemotongan bahasa Pine.
Di bawah ini adalah beberapa perbezaan yang ketara:
//@version
dan bermula dengan kodstrategy
、indicator
Sentensi tidak dikehendaki ditulis, FMZ tidak menyokongnya buat masa iniimport
Imporlibrary
fungsi.Mungkin anda akan melihat beberapa strategi yang bertuliskan:
//@version=5
indicator("My Script", overlay = true)
src = close
a = ta.sma(src, 5)
b = ta.sma(src, 50)
c = ta.cross(a, b)
plot(a, color = color.blue)
plot(b, color = color.black)
plotshape(c, color = color.red)
Atau seperti ini:
//@version=5
strategy("My Strategy", overlay=true)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
Di FMZ ia boleh diringkaskan sebagai:
src = close
a = ta.sma(src, 5)
b = ta.sma(src, 50)
c = ta.cross(a, b)
plot(a, color = color.blue, overlay=true)
plot(b, color = color.black, overlay=true)
plotshape(c, color = color.red, overlay=true)
Atau:
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
2 , Strategi [script] Sesetengah tetapan yang berkaitan dengan transaksi ditetapkan oleh parameter “Pine Language Transaction Class Repository” pada antara muka FMZ Strategi.
strategy
Fungsicalc_on_every_tick
Parameter untuk menetapkan skrip strategi untuk melaksanakan logik strategi secara langsung setiap kali harga berubah, ketika inicalc_on_every_tick
Parameter hendaklah ditetapkan sebagaitrue
◦ Secara lalaicalc_on_every_tick
Parameter adalahfalse
Iaitu, logik strategi dijalankan apabila bar K semasa strategi telah habis sepenuhnya.
Di FMZ, parameter template “Pine Language Exchange Class Repository” boleh diset.Pengendalian ketepatan nilai seperti harga, kuantiti pesanan dan lain-lain semasa pelaksanaan strategi diperlukan di FMZ Dalam pandangan perdagangan kerana hanya boleh melakukan ujian simulasi, tidak ada masalah ketepatan masa pesanan di bursa nyata. Dalam FMZ, anda boleh menjalankan strategi Pin secara nyata. Maka anda memerlukan strategi yang dapat menentukan ketepatan harga jenis perdagangan, ketepatan jumlah pesanan dengan fleksibel. Tetapan ketepatan ini adalah untuk mengawal bilangan kecil data yang berkaitan, untuk mengelakkan data tidak sesuai dengan keperluan pelaporan bursa sehingga tidak dapat melakukan pesanan.
Kod kontrak jangka masa
Jenis dagangan di FMZ jika kontrak, mempunyai 2 sifat: “pasangan dagangan” dan “kod kontrak”. Selain perlu menetapkan pasangan dagangan secara jelas pada masa yang sama, anda juga perlu menetapkan kod kontrak khusus dalam parameter “kod jenis” templat “Pine Language Trading Classroom”. Sebagai contoh, kontrak kekal hanya perlu diisiswap
Kode kontrak untuk melihat sama ada pertukaran yang beroperasi mempunyai kontrak sedemikian. Sebagai contoh, semua kontrak suku tahunan untuk perdagangan boleh diisi di siniquarter
。 Kod kontrak ini sepadan dengan kod kontrak berjangka yang ditakrifkan pada dokumen API bahasa Javascript/python/c++ FMZ.。
Tetapan lain seperti jumlah minimum dan jumlah lalai boleh dilihat dalam dokumentasi bahasa Pine mengenaiPerpustakaan pertukaran bahasa PinePengenalan parameter:
runtime.debug
、runtime.log
、runtime.error
Fungsi FMZ yang diperluaskan, digunakan untuk melakukan debug.FMZ platform telah menambah 3 fungsi untuk debugging.
runtime.debug
: Fungsi ini biasanya tidak digunakan untuk mencetak maklumat pembolehubah di papan kawalan.
runtime.log
Di dalam log: output │ FMZ PINE mempunyai fungsi khusus │
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
Apabila dipanggil, ia akan menyebabkan ralat semasa operasi dan membawa mesej ralat yang dinyatakan dalam parameter pesan.
runtime.error(message)
overlay
parameterFungsi gambar dalam bahasa Pine di FMZplot
、plotshape
、plotchar
Tambah lagioverlay
Sokongan parameter yang membolehkan anda menetapkan gambar pada gambar utama atau gambar kecil.overlay
sediakantrue
Gambar di carta utama, set kefalse
Menggambar pada subgambar. Membolehkan strategi Pine di FMZ untuk menggambar pada gambar utama dan subgambar pada masa yang sama.
syminfo.mintick
Mengambil nilai pembolehubah terbina dalamsyminfo.mintick
Variabel terbina dalam ditakrifkan sebagai nilai pengukuran minimum untuk varieti semasa.Tawaran Firma/Ujian belakangKeakuratan harga mata wang adalah parameter templat dalam “Pine Language Transaction Classroom” di dalam antara muka untuk mengawal nilai tersebut. Pengaturan ketepatan harga mata wang 2 adalah harga yang tepat pada masa perdagangan ke nombor kedua yang kecil, di mana unit perubahan minimum harga adalah 0.01syminfo.mintick
Jadi, nilai 0.01 ialah
Sebagai contoh: harga pesanan adalah 8000, menjual arah, kuantiti 1 tangan ((satu, keping), harga purata selepas urus niaga bukan 8000, kurang daripada 8000 ((biaya termasuk yuran proses)
Apabila kita mula mempelajari asas bahasa Pine, mungkin kita tidak biasa dengan arahan, kod kod dalam beberapa contoh. Tidak mengapa jika kita tidak faham, kita boleh terlebih dahulu membiasakan diri dengan konsep, memahami tujuan ujian, atau kita boleh menyemak dokumentasi bahasa Pine FMZ untuk melihat arahan. Kemudian ikuti tutorial langkah demi langkah untuk membiasakan diri dengan pelbagai tatabahasa, arahan, fungsi, dan pembolehubah dalaman.
Pada permulaan pembelajaran bahasa Pine, adalah sangat penting untuk memahami konsep-konsep yang berkaitan seperti proses pelaksanaan skrip bahasa Pine. Strategi bahasa Pine dijalankan berdasarkan carta, yang boleh difahami sebagai satu siri pengiraan dan operasi, yang dijalankan pada carta mengikut urutan masa yang berturut-turut, bermula dari data terdahulu yang telah dimuat.bar_index
Mengutip nilai indeks Bar K semasa skrip Pine dijalankan.
plot(bar_index, "bar_index")
plot
Fungsi ini adalah salah satu fungsi yang akan kita gunakan pada masa akan datang. Ia mudah digunakan, ia adalah untuk melukis garis pada grafik berdasarkan parameter yang kita masukkan, dan data yang kita masukkan adalahbar_index
, baris dinamakanbar_index
Anda boleh lihat bahawa bar_index pada Bar pertama adalah 0, dan Bar bertambah 1 ke kanan.
Model pelaksanaan strategi berbeza bergantung kepada tetapan strategi, yang terbahagi kepada收盘价模型
dan实时价模型
Model harga penutupan, konsep model harga masa nyata telah kami jelaskan sebelum ini.
Apabila kod strategi dijalankan, kitaran K Bar semasa telah selesai, kitaran K Bar telah selesai apabila K Bar ditutup. Pada masa ini, logik strategi Pine dijalankan sekali lagi, dan isyarat perdagangan yang dicetuskan akan dilaksanakan pada permulaan Bar K Bar berikutnya.
Apabila kod strategi dijalankan, Bar K semasa akan melaksanakan logik strategi Pin setiap kali perubahan berlaku, sama ada ia ditutup atau tidak, dan isyarat perdagangan yang dicetuskan akan dilaksanakan serta-merta.
Apabila strategi bahasa Pine dijalankan dari kiri ke kanan pada carta, Bar K pada carta adalah历史Bar
dan实时Bar
Oleh:
Apabila strategi yang ditetapkan sebagai “Model Harga Saham Nyata” mula dijalankan, semua Bar Bar K pada carta kecuali Bar Bar K di sebelah kanan adalah历史Bar
◯ Logik strategi dalam setiap历史Bar
Hanya sekali sahaja.
Apabila strategi yang ditetapkan sebagai “model harga penutupan” bermula, semua Bar di carta akan历史Bar
◯ Logik strategi dalam setiap历史Bar
Hanya sekali sahaja.
Pengiraan berdasarkan Bar Sejarah: Kode strategi dijalankan sekali dalam keadaan tutup Bar Sejarah, kemudian kod strategi diteruskan untuk dijalankan pada Bar Sejarah seterusnya sehingga semua Bar Sejarah dijalankan sekali.
Apabila strategi dijalankan ke Bar barisan K yang paling kanan, Bar itu adalah Bar masa nyata. Apabila Bar masa nyata ditutup, Bar ini menjadi Bar masa nyata yang telah lalu (berubah menjadi Bar sejarah). Bar masa nyata baru akan dihasilkan di sebelah kanan grafik.
Apabila strategi ditetapkan sebagai “model harga masa nyata” untuk memulakan pelaksanaan, logik strategi akan dijalankan untuk setiap perubahan perdagangan di Bar Masa Nyata. Bar tidak akan muncul pada carta apabila strategi yang ditetapkan sebagai “model harga penutupan” bermula.
Berdasarkan pengiraan Bar secara langsung:
Jika strategi yang ditetapkan sebagai “model harga penutupan” tidak menunjukkan Bar dalam masa nyata, kod strategi hanya dijalankan sekali pada penutupan Bar semasa.
Jika anda menetapkan strategi sebagai “model harga saham sebenar” di Bar masa nyata, pengiraan dan sejarah Bar adalah sama sekali berbeza, setiap perubahan pergerakan di Bar sebenar akan melaksanakan kod strategi. Contohnya, pembolehubah dalamanhigh
、low
、close
Dalam sejarah Bar adalah pasti, dalam masa nyata Bar mungkin setiap kali keadaan berubah nilai-nilai ini akan berubah. Oleh itu, data seperti penunjuk yang dikira berdasarkan nilai-nilai ini juga akan berubah dalam masa nyata. Dalam masa nyata Barclose
Ia adalah harga terkini, dan ia adalah harga yang paling murah.high
danlow
Sentiasa mewakili tertinggi tertinggi dan terendah terendah yang telah dicapai sejak Bar Masa Kini bermula. Variabel terbina dalam ini mewakili nilai akhir ketika Bar Masa Kini terakhir diperbaharui.
Mekanisme rollback semasa melaksanakan strategi pada Bar Masa Nyata (model harga masa nyata): Dalam pelaksanaan Bar secara real-time, setiap iterasi baru strategi yang dijalankan, pembolehubah yang ditakrifkan oleh pengguna yang ditetapkan semula dipanggil rollback. Untuk memahami mekanisme rollback dengan contoh, berikut adalah kod ujian.
Notis:
/*backtest
...
..
.
*/
Paket itu mengandungi maklumat konfigurasi pengembalian yang disimpan dalam bentuk kod di platform FMZ.
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := n + 1
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
Kami hanya mengkaji adegan yang dilakukan di Bar Masa Nyata, jadi kami menggunakannot barstate.ishistory
Batasan ekspresi hanya digunakan untuk mengumpul n pembolehubah pada masa nyata Bar dan digunakan sebelum dan selepas melakukan operasi pengumpulanruntime.log
Fungsi output maklumat dalam log strategi.plot
Garis n yang digambar dapat dilihat ketika strategi berada di Bar Sejarah, n telah menjadi 0. Apabila ia dijalankan ke Bar Masa Nyata, ia mencetuskan operasi n + 1, dan setiap pusingan menjalankan strategi di Bar Masa Nyata, ia menjalankan operasi n + 1. Dari maklumat log, dapat dilihat bahawa setiap pusingan menjalankan semula kod strategi, n telah diset semula ke nilai yang akhirnya diserahkan oleh strategi Bar Masa Nyata sebelumnya.
Untuk meringkaskan: 1 , setiap kali anda melakukan update, anda akan menjalankan satu kod strategi. 2. Apabila dijalankan di Bar Masa Nyata, setiap kali kod dasar dijalankan, pembolehubah akan dibalikkan. 3. Apabila dijalankan pada Bar Masa Nyata, pembolehubah dihantar sekali semasa kemas kini penutupan.
Oleh kerana data berputar ke belakang, operasi lukisan seperti kurva pada carta juga boleh menyebabkan penggambaran semula, contohnya, jika kita mengubah kod ujian yang baru saja kita buat, ujian cakera:
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := open > close ? n + 1 : n
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
Skrin daripada momen A
Skrin daripada momen B
Kami hanya mengubah ayat ini:n := open > close ? n + 1 : n
, Bar sebenar semasa adalah negatif ((iaitu harga pembukaan lebih tinggi daripada harga penutupan) hanya kepada n ditambah 1 . Anda boleh melihat dalam carta pertama ((saat A) kerana harga pembukaan pada masa itu lebih tinggi daripada harga penutupan ((sinis) jadi n ditambah 1, grafik n menunjukkan nilai 5 . Kemudian perubahan tren, harga dikemas kini seperti yang ditunjukkan dalam carta kedua ((saat B). Apabila harga pembukaan adalah lebih rendah daripada harga penutupan ((sinis), n nilai berguling dan tidak ditambah 1 .
Di bawah ini kita akan mengkaji pembolehubah dalam fungsi bahasa Pine. Berdasarkan penerangan di beberapa tutorial Pine, pembolehubah dalam fungsi berbeza dengan pembolehubah di luar fungsi:
Sejarah pembolehubah siri yang digunakan dalam fungsi Pine dibuat dengan setiap panggilan berturut-turut fungsi tersebut. Jika fungsi tidak dipanggil pada setiap lajur yang dijalankan dalam skrip, ini akan menyebabkan perbezaan antara nilai sejarah dalaman dan luar siri dalam blok tempatan fungsi. Oleh itu, jika fungsi tidak dipanggil pada setiap lajur, siri yang menggunakan nilai indeks yang sama yang dirujuk di dalam dan luar fungsi tidak akan merujuk pada titik sejarah yang sama.
Tidak mengapa, kita akan faham dengan menggunakan kod ujian yang dijalankan di FMZ:
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
f(a) => a[1]
f2() => close[1]
oneBarInTwo = bar_index % 2 == 0
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
plot(close[2], title = "close[2]", color = color.red, overlay = true)
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Skrin tayangan semula
Kod ujian adalah lebih mudah, terutamanya untuk mengkaji data yang dikutip dalam dua cara, iaitu:f(a) => a[1]
danf2() => close[1]
。
f(a) => a[1]
Cara menggunakan parameter, fungsi kembali pada akhira[1]
。
f2() => close[1]
Menggunakan pembolehubah terbina dalam:close
, fungsi yang dikembalikan pada akhirclose[1]
。
[]
Simbol digunakan untuk operasi rujukan kepada nilai sejarah pembolehubah siri data, close[1] iaitu merujuk kepada data harga penutupan pada Bar sebelum harga penutupan semasa.
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
Lukis satu aksara A, warna merah, apabila oneBarInTwo adalah benar, dan letakkannya (di atas sumbu Y) adalah:f(close)
Nilai yang dikembalikan
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
Lukis satu aksara di B, warna hijau, apabila oneBarInTwo adalah benar, dan letaknya (di atas sumbu Y) adalah:f2()
Nilai yang dikembalikan
plot(close[2], title = "close[2]", color = color.red, overlay = true)
Garis yang digambar, berwarna merah, diletakkan di (atas sumbu Y) sebagai:close[2]
Iaitu harga penutupan pada Bar barisan 2 barisan depan Bar (atau 2 barisan kiri Bar).
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Garis yang digambar berwarna hijau, diletakkan di (atas sumbu Y) sebagai:close[1]
Iaitu harga penutupan pada Bar Bar nombor 1 ke kiri.
Sketsa berjalan melalui strategi pengesanan semula boleh dilihat, walaupun fungsi yang digunakan untuk tanda gambar Af(a) => a[1]
Fungsi yang digunakan untuk menandakan dan melukis Bf2() => close[1]
Semua digunakan.[1] untuk merujuk kepada data sejarah dalam siri data, tetapi kedudukan penanda “A” dan “B” dalam carta adalah sama sekali berbeza. Penanda “A” sentiasa berada di garisan merah, iaitu kod dalam strategiplot(close[2], title = "close[2]", color = color.red, overlay = true)
Pada garis yang digariskan, data yang digunakan ialahclose[2]
。
Sebabnya ialah ia diindekskan melalui Bar Bar K, iaitu pembolehubah terbina dalam.bar_index
Hitung sama ada lukisan “A” dan “B” tanda. “A” dan “B” tanda tidak dicat pada setiap Bar K (dicat apabila memanggil fungsi pengiraan) fungsif(a) => a[1]
Nilai yang dirujuk dengan cara ini akan bersesuaian dengan fungsi jika fungsi tidak dipanggil pada setiap Bar.f2() => close[1]
Nilai yang dirujuk dengan cara ini adalah berbeza walaupun kedua-dua kaedah digunakan.[1] seperti indeks yang sama)
Sebagai contoh mudah:
res = close > close[1] ? ta.barssince(close < close[1]) : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
Kami akan memanggil kod fungsi.ta.barssince(close < close[1])
Tulis dalam satu operator tigacondition ? value1 : value2
Ini membawa kepada kesesakan dalamclose > close[1]
Apabila anda memanggil fungsi ta.barssince.ta.barssince
Fungsi ini dikira dari kali terakhirclose < close[1]
Bilangan baris K semasa pembentukan. Apabila fungsi ta.barssince dipanggil, ia adalah close > close[1], iaitu harga penutupan semasa lebih besar daripada harga penutupan Bar sebelumnya, apabila fungsi ta.barssince dipanggil dengan syarat close < close[1] tidak ditubuhkan, dan tidak ada lokasi yang terakhir ditubuhkan.
ta.barssince: Apabila dipanggil, fungsi ini akan mengembalikan na。 jika ia tidak pernah memenuhi syarat sebelum baris K semasa.
Seperti yang ditunjukkan dalam rajah:
Jadi, apabila kita melukis, kita hanya melukis data apabila nilai res ialah ((-1) ).
Untuk mengelakkan masalah ini, kita hanya menggunakanta.barssince(close < close[1])
Panggilan fungsi diambil dari pengendali trivial dan ditulis di luar cawangan syarat yang mungkin. Ia membolehkan ia menjalankan pengiraan pada setiap Bar baris K.
a = ta.barssince(close < close[1])
res = close > close[1] ? a : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
Konsep urutan masa sangat penting dalam bahasa Pine, dan merupakan konsep yang perlu kita fahami ketika kita belajar bahasa Pine. Suruhan masa bukanlah jenis tetapi struktur asas untuk menyimpan nilai berturut-turut pembolehubah dari masa ke masa. Kita tahu skrip Pine adalah berdasarkan carta, dan yang paling asas yang ditunjukkan dalam carta adalah carta K. Suruhan masa di mana setiap nilai dikaitkan dengan garis masa K Bar.open
merupakan pembolehubah dalaman dalam bahasa Pine, yang mempunyai struktur untuk menyimpan setiap K-line Bar sebagai urutan masa untuk harga bukaan. Ia boleh difahami sebagaiopen
Struktur urutan masa ini mewakili harga pembukaan semua Bar Bar K semasa K semasa dari Bar pertama yang bermula hingga Bar yang dijalankan oleh skrip semasa. Jika K semasa adalah kitaran 5 minit, maka kita merujuk dalam kod strategi Pine (atau menggunakan)open
Ia adalah harga pembukaan K-bar pada masa pelaksanaan semasa menggunakan kod strategi.[]
Operator digunakan apabila strategi Pine dijalankan pada Bar baris Kopen[1]
Menunjukkan rujukanopen
Harga pembukaan Bar Bar K yang terdahulu yang dijalankan oleh skrip semasa dalam urutan masa ((iaitu harga pembukaan K Bar yang terakhir dalam kitaran K).
ta.cum
Contohnya: ta.cum
Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
ta.cum(source) → series float
RETURNS
Total sum series.
ARGUMENTS
source (series int/float)
SEE ALSO
math.sum
Kod ujian:
v1 = 1
v2 = ta.cum(v1)
plot(v1, title="v1")
plot(v2, title="v2")
plot(bar_index+1, title="bar_index")
Terdapat banyak yang serupata.cum
Fungsi terbina dalam seperti ini boleh memproses data dalam siri masa secara langsung, sepertita.cum
Ia adalah untuk menambah nilai-nilai yang sepadan pada setiap K-bar, dan kemudian kita menggunakan grafik untuk memudahkan pemahaman.
bar_index IDEV1 IDEV2 IDEV | - | - | - | - | Strategi ini berjalan pada garis K Bar 0 dan 1 dan 1 dan 1 Strategi ini berjalan pada K-bar 1, 1, 2, 3. Strategi ini berjalan pada K-bar 2 dan 1 dan 3 |…|…|…|…| Strategi berjalan pada N+1 akar K Bar dan N+1 akar dan N+1 akar
Anda dapat melihat bahawa v1, v2 dan bar_index adalah struktur urutan masa, dengan data yang sesuai di setiap Bar. Kod ujian ini tidak membezakan antara “model harga masa nyata” atau “model harga penutupan” hanya untuk menunjukkan Bar sebenar di carta. Untuk mengukur kelajuan, kami menggunakan “model harga penutupan” untuk menguji semula.
Kerana v1 adalah 1 pada setiap bar.ta.cum(v1)
Fungsi ini dijalankan pada baris pertama K Bar, dan hasilnya ialah 1, dengan nilai kepada pembolehubah v2。
Apabilata.cum(v1)
Apabila dilakukan pada Bar K baris kedua, sudah ada 2 Bar K baris ((bar_index bagi baris pertama adalah 0, bar_index bagi baris kedua adalah 1), maka hasilnya adalah 2, dan nilai diberikan kepada v2, dan seterusnya. Sebenarnya dapat dilihat bahawa v2 adalah bilangan Bar baris K dalam grafik, kerana indeks baris Kbar_index
Ia akan meningkat dari 0.bar_index + 1
Ia sebenarnya adalah bilangan bar bar K.v2
danbar_index
Ia adalah satu perjumpaan.
Saya juga boleh menggunakanta.cum
Fungsi terbina dalam mengira jumlah harga penutupan semua Bar pada carta semasa, dan ia hanya boleh ditulis sebagai berikut:ta.cum(close)
, apabila strategi dijalankan ke Bar Waktu Nyata di sebelah kananta.cum(close)
Hasil yang dikira adalah jumlah harga penutupan semua Bar di carta (jika tidak berjalan ke sebelah kanan, hanya ditambah kepada Bar semasa).
Variabel pada urutan masa juga boleh dihitung menggunakan pengendali, seperti kod:ta.sma(high - low, 14)
Menggunakan pembolehubah dalaman.high
(K Bar harga tertinggi) tolaklow
(K Line Bar Minimum Harga), penggunaan terakhirta.sma
Fungsi mencari nilai purata.
v1 = ta.highest(high, 10)[1]
v2 = ta.highest(high[1], 10)
plot(v1, title="v1", overlay=true)
plot(v2, title="v2", overlay=true)
Kod ujian ini dijalankan semasa pengukuran semula dan dapat dilihatv1
danv2
Nilai yang sama, garis yang digambar pada carta juga berlainan sepenuhnya. Hasil yang dikira oleh panggilan fungsi akan meninggalkan jejak nilai dalam urutan masa, seperti kodta.highest(high, 10)[1]
Antara mereka:ta.highest(high, 10)
Hasil yang dikira dari panggilan fungsi juga boleh digunakan[1] untuk merujuk kepada nilai sejarahnya.ta.highest(high, 10)
Hasilnya ialahta.highest(high[1], 10)
Oleh itu.ta.highest(high[1], 10)
danta.highest(high, 10)[1]
Harga yang sama.
Output maklumat yang disahkan dengan fungsi gambar lain:
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, overlay=true)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)
Anda dapat melihat nilai-nilai pembolehubah a dan pembolehubah b dalam urutan masa yang dipaparkan di atas dan di bawah Bar masing-masing. Anda boleh menyimpan kod lukisan ini semasa pembelajaran, kerana maklumat yang dikeluarkan pada carta mungkin sering diperlukan untuk diperhatikan semasa ujian dan percubaan.
Pada bahagian permulaan tutorial ini, kami telah meringkaskan beberapa perbezaan antara penggunaan bahasa Pine di FMZ dan bahasa Pine di Trading View.indicator()
、strategy()
Dan, tidak disokong buat masa inilibrary()
❚ Sudah tentu untuk bersesuaian dengan skrip Pine versi terdahulu, strategi ditulis seperti://@version=5
,indicator()
,strategy()
Ia juga boleh. Sesetengah tetapan dasar boleh diletakkan di bawahstrategy()
Tetapan parameter dalam fungsi.
<version>
<declaration_statement>
<code>
<version>
Maklumat kawalan versi boleh diabaikan.
Bahasa Pine//
Sebagai nota satu baris, kerana bahasa Pine tidak mempunyai nota berbilang baris./**/
Untuk nota berbilang baris.
Garis yang tidak memberi komen atau arahan kompilator dalam skrip adalah pernyataan, yang mewujudkan algoritma skrip. Pernyataan boleh menjadi salah satu daripada ini.
if
,for
,while
atauswitch
Struktur lainPerkataan boleh disusun dengan pelbagai cara
空格
atau制表符
(Kunci tab) bermula。 Karakter pertama mereka juga mestilah karakter pertama baris tersebut。 Baris yang bermula pada kedudukan pertama baris, menjadi sebahagian daripada skop global skrip mengikut definisi。local block
。 Satu blok tempatan mesti dikurangkan ke dalam satu tanda pengenal atau empat ruang kosong ((jika tidak, ia akan diuraikan sebagai kod berturut-turut baris sebelumnya, iaitu dihakimi sebagai kesinambungan baris sebelumnya), dan setiap blok tempatan mentakrifkan ruang lingkup tempatan yang berbeza。Sebagai contoh, termasuk tiga blok lokal, satu dalam deklarasi fungsi tersuai, dan dua menggunakan struktur if dalam deklarasi pembolehubah, seperti berikut:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Baris panjang boleh dibahagikan kepada beberapa baris, atau “dibungkus”. Baris yang dibungkus mesti menyusut ke dalam apa-apa jumlah ruang, asalkan ia bukan kelipatan 4 (perbatasan ini digunakan untuk menyusut ke dalam blok tempatan).
a = open + high + low + close
Ia boleh dibungkus sebagai (perhatikan bahawa jumlah ruang yang dikurangkan dalam setiap baris bukanlah kelipatan 4):
a = open +
high +
low +
close
Panggilan plot ((() yang panjang boleh dibungkus dalam ▽.
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 oleh pengguna juga boleh dibungkus. Namun, kerana blok tempatan secara gramatikal mesti bermula dengan pengurangan (- 4 ruang kosong atau 1 tanda kerja), apabila membahagikannya ke baris seterusnya, bahagian lanjutan perkataannya mesti bermula dengan pengurangan lebih daripada satu (- tidak sama dengan kelipatan 4 ruang kosong). 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")
Sebelum kita memahami variabel, kita perlu memahami konsep tanda pengenal tanda baca.fungsidanPembolehubahNama yang digunakan untuk menamakan pembolehubah (variabel, fungsi)fungsiSeperti yang anda akan pelajari di tutorial seterusnya, kita mulakan dengan mempelajari kod pengenalan lembu, 。
(A-Z)
atau huruf kecil(a-z)
Huruf atau garisan bawah(_)
Permulaan, sebagai aksara pertama pengiktirafan.Sebagai contoh, nama-nama berikut:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
Seperti kebanyakan bahasa pengaturcaraan, bahasa Pine juga mempunyai cadangan penulisan. Ia biasanya disyorkan untuk menamakan pengenal:
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0
Pengendali adalah beberapa simbol pengendali dalam bahasa pengaturcaraan yang digunakan untuk membina ungkapan, dan ungkapan adalah peraturan pengiraan yang dirancang untuk tujuan pengiraan tertentu ketika kita menulis strategi. Pengendali dalam bahasa Pine diklasifikasikan mengikut fungsi sebagai:
Pengendali penambahan nilai, pengendali aritmatika, pengendali perbandingan, pengendali logik,? :
Pengendali triad[]
Operator rujukan sejarah:
Pengendali algebra*
Sebagai contoh, untuk membezakan jenis soalan yang dikembalikan oleh pengendali bahasa Pine di Trading View, terdapat kod ujian berikut:
//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength) // Compilation error!
plot(ma)
Ini adalah salah satu sebab mengapa skrip ini terkompilasi semasa dijalankan di Trading View.adjustedLength = lenInput * factor
Selepas kita tambah, hasilnya ialahseries int
Jenis (seri), bagaimanapunta.ema
Parameter kedua fungsi tidak menyokong jenis ini. Tetapi tidak ada sekatan ketat seperti itu pada FMZ, kod di atas boleh berfungsi dengan baik.
Di bawah ini, kita akan melihat penggunaan pelbagai pengendali.
Terdapat dua jenis pengendali nilai:=
、:=
Kami juga melihat beberapa contoh di bahagian awal tutorial ini.
=
Operator digunakan untuk memberi nilai kepada pembolehubah apabila ia diwujudkan atau diisytiharkan.=
Initialization, deklarasi, dan penugasan akan bermula dengan nilai tersebut pada setiap Bar selepasnya. Ini adalah deklarasi yang sah:
a = close // 使用内置变量赋值给a
b = 10000 // 使用数值赋值
c = "test" // 使用字符串赋值
d = color.green // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)
Notisa = close
Pernyataan penyerahan, di mana setiap Bar mempunyai a sebagai harga penutupan Bar semasa ((close) ⋅ variabel lainb
、c
、d
Ia tidak berubah, boleh diuji dalam sistem maklum balas di FMZ, dan hasilnya boleh dilihat dari gambar.
:=
Ia digunakan untuk memberi nilai semula kepada pembolehubah yang sedia ada. Ia boleh difahami sebagai penggunaan:=
Operator digunakan untuk mengubah nilai pembolehubah yang telah diisytiharkan dan diinisialisasi.
Jika digunakan:=
Operator memberi nilai kepada pembolehubah yang tidak dimulakan atau diisytiharkan akan menyebabkan ralat, seperti:
a := 0
Oleh itu,:=
Operator penempatan biasanya digunakan untuk penempatan semula nilai kepada pembolehubah yang sedia ada, seperti:
a = close > open
b = 0
if a
b := b + 1
plot(b)
menilai jikaclose > open
(iaitu BAR semasa adalah garis bujur), dan variabel a adalah nilai sebenar ((true)) ≠ akan melaksanakan kod dalam blok tempatan pernyataan ifb := b + 1
, menggunakan pengendali nilai:=
Berikan nilai semula kepada b, tambah 1 ◦ dan kemudian gunakan fungsi plot untuk melukis nilai pembolehubah b pada setiap BAR dalam urutan masa, bersambung ke dalam garis ◦
Adakah kita berfikir bahawa jika ada bar bar, b akan terus bertambah 1? Tentu tidak, di sini kita tidak menggunakan kata kunci untuk menyatakan b, dan menginisialisasi sebagai 0.b=0
Jadi anda boleh lihat bahawa hasil dari kod ini adalah untuk menetapkan semula b kepada 0 setiap kali jika a adalah nilai sebenar, maka ia sesuai.close > open
Jadi, apabila anda menjalankan kod pada pusingan ini, b akan menambah 1, apabila anda menggambar fungsi plot, b akan menjadi 1, tetapi apabila anda menjalankan kod pada pusingan berikutnya, b akan diberi nilai semula sebagai 0.
Berkenaan dengan operator penyerahan nilai, dua kata kunci perlu diperluaskan:var
、varip
Sebenarnya, kata kunci ini telah kita lihat dan gunakan dalam tutorial sebelum ini, tetapi tidak dibincangkan secara terperinci.
var adalah kata kunci untuk pembahagian dan inisialisasi sekali-per-kali. Secara amnya, semantik pemberian nilai pembolehubah tanpa kata kunci var menyebabkan nilai pembolehubah ditutup setiap kali data dikemas kini. Sebaliknya, apabila menggunakan kata kunci var untuk pembahagian pembolehubah, mereka masih boleh menyimpan status mereka walaupun data dikemas kini
Kita masih menggunakan contoh ini, tetapi apabila kita memberi nilai kepada bvar
Kata kunci:
a = close > open
var b = 0
if a
b := b + 1
plot(b)
var
Kata kunci membolehkan pembolehubah b hanya melaksanakan penugasan pertama pada mulanya, dan tidak akan menetapkan semula b kepada 0 pada setiap kali logik dasar dijalankan, jadi garis yang digambar pada masa berjalan dapat dilihat b iaitu jumlah bar yang muncul pada garis BAR semasa K semasa.
Variabel dalam deklarasi var boleh ditulis dalam blok kod, bukan sahaja dalam skala global, seperti contoh ini:
strategy(overlay=true)
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 tiang pertama dalam siri. Peubah ‘b’ mengekalkan harga penutupan batang harga aluminium hijau pertama dalam siri. Variable ‘c’ mengekalkan harga penutupan untuk ketupat hijau ketupat kesepuluh dalam siri.
varip
Ini adalah kali pertama kita melihat kata kunci ini, dan kita boleh lihat deskripsi kata kunci ini:
varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi pembolehubah sekali gus. Ia serupa dengan kata kunci var, tetapi pembolehubah yang menggunakan varip menyatakan mengekalkan nilainya di antara kemas kini K-line dalam masa nyata.
Adakah lebih sukar untuk difahami? Tidak mengapa, kita akan menerangkannya dengan contoh, ia akan mudah difahami.
strategy(overlay=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
i := i + 1
ii := ii + 1
Kod ujian ini berlainan untuk model harga penutupan dan model harga masa nyata:
Model harga masa nyata:
Ingatkah anda bahawa kita telah memaparkan bahawa strategi yang kita jalankan sebelum ini mempunyai fasa BAR yang bersejarah dan fasa BAR yang sebenar?var
、varip
Variabel yang diisytiharkani
、ii
Pada setiap pusingan kod strategi, operasi peningkatan akan dilakukan. Oleh itu, kita dapat melihat bahawa setiap angka yang ditunjukkan pada garis KBAR hasil pengukuran kembali adalah peningkatan 1. Apabila fasa K baris sejarah berakhir, fasa K baris masa nyata bermula.i := i + 1
danii := ii + 1
Ia akan dilaksanakan sekali. Perbezaannya ialah ii akan diubah setiap kali. Walaupun ia akan diubah setiap kali, ia akan kembali kepada nilai sebelumnya pada setiap pusingan logik pelaksanaan strategi (ingatkan mekanisme penggulungan yang kami jelaskan pada bab “Pelaksanaan Model”) sehingga KBAR berjalan dan ia akan mengemas kini nilai i yang ditentukan (iaitu, ia tidak akan kembali kepada nilai sebelumnya pada setiap pusingan logik pelaksanaan strategi).
Model harga penutupan: Oleh kerana model harga penutupan adalah setiap garis K BAR berjalan, satu logik strategi dijalankan. Oleh itu, dalam model harga penutupan, fasa K-bar sejarah dan fasa K-bar masa nyata, var, varip menyatakan peningkatan prestasi yang sama dalam contoh di atas, adalah setiap garis K-BAR meningkat 1 .
Pengendali | menggambarkan |
---|---|
+ | Penambahan |
- | Pengurangan |
* | Perkalian |
/ | Penghapusan undang-undang |
% | Cari contoh |
+
、-
Operator boleh digunakan sebagai operator binari, atau sebagai operator satuan. Operator aljabar lain hanya boleh digunakan sebagai operator binari, jika digunakan sebagai operator satuan akan membuat kesalahan.
1 , pengendali aritmatika kedua-dua belah adalah jenis nilai, hasilnya adalah jenis nilai, jenis bulat atau nombor titik terapung bergantung kepada hasil operasi.
2. Operator jika nombor operasinya adalah string.+
, hasil pengiraan adalah string, nilai akan ditukarkan kepada bentuk string, dan kemudian string disusun bersama-sama. Jika ia adalah pengendali algebra lain, ia akan cuba untuk menukarkan string ke nilai dan kemudian beroperasi.
3. Jika terdapat nombor operasi na, maka hasil pengiraan adalah nilai sifar na, dan NaN akan dipaparkan apabila ia dicetak pada FMZ.
a = 1 + 1
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na
runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN
Bahasa Pine di FMZ sedikit berbeza dengan bahasa Pine di Trading View, bahasa Pine di FMZ tidak terlalu ketat untuk keperluan jenis pembolehubah. Contohnya:
a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A"
plot(a)
plot(b)
plot(c)
FMZ boleh dijalankan, tetapi pada pandangan perdagangan, ia akan melaporkan ralat jenis. Apabila operasi di kedua-dua belah pengendali aritmatika adalah string, sistem akan mengubah string menjadi nilai nombor dan kemudian dikira. Jika string bukan nilai tidak dapat dikira, hasil operasi sistem akan menjadi nilai kosong na.
Operator perbandingan adalah operator binari.
Pengendali | menggambarkan |
---|---|
< | kurang daripada |
> | Lebih besar daripada |
<= | kurang daripada sama dengan |
>= | Lebih besar daripada sama dengan |
== | Persamaan |
!= | Ketidaksamaan |
Contoh ujian:
a = 1 > 2
b = 1 < 2
c = "1" <= 2
d = "1" >= 2
e = 1 == 1
f = 2 != 1
g = open > close
h = na > 1
i = 1 > na
runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false
Seperti yang anda lihat, pengendali perbandingan sangat mudah digunakan, tetapi ia juga merupakan pengendali yang paling banyak digunakan dalam penulisan strategi. Ia boleh digunakan untuk membandingkan nilai dan juga untuk membandingkan pembolehubah dalaman, seperticlose
、open
tunggu.
Seperti pengendali operasi, pada FMZ terdapat perbezaan dengan Pin dari Trading View, FMZ tidak mempunyai jenis keperluan yang sangat ketat, jadi pernyataan seperti itud = "1" >= 2
Pada FMZ tidak akan membuat kesalahan, ia akan menukarkan rentetan ke nilai nombor sebelum perbandingan dijalankan. Pada Trading View, ia akan membuat kesilapan.
Pengendali | Nombor kod | menggambarkan |
---|---|---|
Tidak | not | Operator unit, bukan operasi |
dan | and | Operator binari, dengan (dan) operasi |
atau | or | Operator binari, atau operasi |
Bercakap tentang operator logik, kita mesti bercakap tentang jadual nilai sebenar. Seperti yang kita belajar di sekolah tinggi, hanya di sini kita menguji dan belajar dalam sistem feedback:
a = 1 == 1 // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b // 逻辑非操作符
d = not a // 逻辑非操作符
runtime.log("测试逻辑操作符:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)
runtime.log("测试逻辑操作符:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)
runtime.error("stop")
Untuk mengelakkan sistem pengesanan daripada terjejas oleh pencetakan maklumat yang berterusan, kami menggunakanruntime.error("stop")
Perkataan selepas melakukan pencetakan sekali lagi, ia akan membuang kesilapan yang luar biasa untuk menghentikan pengukuran, dan kemudian anda boleh melihat maklumat output, dan anda dapat melihat bahawa kandungan cetakan dan jadual nilai sebenar sebenarnya sama.
Menggunakan pengendali triad? :
Ekspresi trivial yang digabungkan dengan nombor operasicondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
Kita sudah biasa dengan ungkapan tiga, operator tiga, yang bermaksud bahawa terdapat tiga operasi.
condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
Antara lain:condition
Iaitu, jika nilai untuk ungkapan yang benar ialah:valueWhenConditionIsTrue
Jikacondition
Ekspresinya ialahvalueWhenConditionIsFalse
。
Walaupun tidak banyak kegunaan, contoh yang mudah untuk ditunjukkan:
a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)
Tidak mengapa jika anda terjumpa tanda salib! ungkapan tiga dimensi juga boleh disematkan, seperti yang telah kita lakukan dalam tutorial sebelumnya.
a = close > open
b = a ? math.abs(close-open) > 30 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)
Ia sama dengan meletakkancondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
DalamvalueWhenConditionIsTrue
、valueWhenConditionIsFalse
, juga menggunakan ungkapan triad lain sebagai gantinya.
Menggunakan operator sejarah[]
, merujuk kepada nilai sejarah pada urutan masa. Nilai sejarah ini adalah nilai pada baris K BAR sebelum baris K BAR semasa skrip dijalankan.[]
Operator digunakan selepas panggilan pembolehubah, ungkapan, dan fungsi.[]
Nombor dalam tanda kurung ini adalah perpindahan data sejarah dari garis BAR K semasa. Sebagai contoh, jika saya ingin merujuk harga penutupan garis BAR K yang lalu, saya akan menulis:close[1]
。
Kami telah melihat tulisan seperti ini dalam kursus-kursus sebelumnya:
high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)
[]
Operator ini hanya boleh digunakan sekali pada nilai yang sama, jadi ia adalah salah, dan ia akan melakukan kesalahan:
a = close[1][2] // 错误
Mungkin anda lihat di sini, sesetengah pelajar akan berkata, operator[]
Ia digunakan untuk struktur siri, ia kelihatan seperti struktur siri (series) dan array!
Di bawah ini, kita akan menggunakan contoh untuk menerangkan perbezaan antara siri dalam bahasa Pine (series) dan array.
strategy("test", overlay=true)
a = close
b = close[1]
c = b[1]
plot(a, title="a")
plot(b, title="b")
plot(c, title="c")
Walaupun berkataa = close[1][2]
Saya tidak tahu apa-apa tentang apa yang anda katakan, tetapi saya tidak mahu bercakap tentang apa yang anda katakan.
b = close[1]
c = b[1]
Tidak ada salahnya untuk menulisnya secara berasingan, jika anda memahaminya mengikut susun atur yang biasa.b = close[1]
Selepas nilai, b sepatutnya menjadi nilai, tetapic = b[1]
b masih boleh digunakan untuk merujuk nilai sejarah lagi dengan menggunakan pengendali sejarah. Seperti yang dapat dilihat, konsep siri dalam bahasa Pine tidak semudah arsip. Ia boleh difahami sebagai nilai sejarah pada Bar yang lebih dekat (yang diberikan kepada b), b juga merupakan struktur urutan masa (time series), yang boleh terus merujuk nilai sejarahnya.
Kita boleh menarik grafik ke kiri dan melihat bahawa pada baris pertama K, nilai b dan c adalah nilai kosong ((na) ). Itu kerana apabila skrip dijalankan pada baris pertama K BAR, tidak ada nilai sejarah yang merujuk satu atau dua kitaran ke hadapan, ia tidak wujud. Oleh itu, kita perlu sentiasa berhati-hati ketika menulis strategi, sama ada nilai kosong akan dirujuk ketika merujuk data sejarah, jika tidak berhati-hati menggunakan nilai kosong akan menyebabkan pelbagai perbezaan pengiraan, dan mungkin mempengaruhi masa nyata.na
、nz
Fungsi terbina dalam untuk menghakiminz
、na
Fungsi, ingat di bab mana?) yang menangani keadaan yang kosong, contohnya:
close > nz(close[1], open) // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量
Ini adalah rawatan yang mungkin merujuk kepada nilai sifar ((na)).
Kita telah mempelajari banyak pengendali dalam bahasa Pine, yang membentuk ungkapan melalui pelbagai kombinasi dan operasi. Jadi, bagaimana keutamaan operasi ini semasa mengira dalam ungkapan? Seperti operasi empat baris yang kita pelajari ketika kita pergi ke sekolah, ada penggandaan dengan pengurangan keutamaan penggandaan, dan kemudian pengurangan penambahan.
Keutamaan | Pengendali |
---|---|
9 | [] |
8 | Operator satuan `+ 、 - dan non |
7 | * 、/ 、% |
6 | Operator binari + 、 - |
5 | > 、< 、>= 、<= |
4 | == 、!= |
3 | and |
2 | or |
1 | ?: |
Bahagian ungkapan yang mempunyai keutamaan yang tinggi dijalankan terlebih dahulu, dan jika keutamaan yang sama, ia dijalankan dari kiri ke kanan. Jika anda ingin memaksa sebahagian daripada ungkapan untuk dijalankan terlebih dahulu, anda boleh menggunakan()
Membungkus ungkapan yang perlu dikendalikan terlebih dahulu.
Kita telah mempelajari konsep tanda pengenal tanda, tanda pengenal tanda adalah nama yang diberikan kepada suatu variabel sebagai nama bagi suatu variabel. Jadi, ia adalah tanda pengenal nilai yang disimpan. Jadi bagaimana untuk mendeklarasikan suatu variabel? Dan apa peraturan yang ada untuk mendeklarasikan variabel?
var
。varip
。var
、varip
Kata kunci sebenarnya telah kita pelajari di bab “Operator Penentuan Nilai” sebelum ini, dan tidak akan dibahaskan di sini. Jika model pengisytiharan pembolehubah tidak menulis apa-apa, contohnya:i = 1
Sebenarnya, kita telah bercakap sebelum ini, pembolehubah yang dinyatakan dan diberi nilai, dilaksanakan pada setiap baris KBAR.