Sumber dimuat naik... memuat...

Pencipta Kuantitatif Tutorial Pengenalan Bahasa PINE

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta: 2022-05-30 16:23:43, Dikemas kini: 2022-09-28 17:10:21

[TOC]

Pencipta Kuantitatif Tutorial Pengenalan Bahasa PINE

Video tutorial yang disertakan:Perdagangan kuantitatif terlalu sukar untuk dimulakan? menggunakan pandangan perdagangan Bahasa Pine dari putih kecil hingga Tuhan Kuantum - Penjelajah awal bahasa Pine

Inventor Quantitative Trading Platform menyokong strategi penulisan bahasa Pine, menyokong retargeting, menjalankan dasar bahasa Pine pada cakera sebenar, dan serasi dengan versi yang lebih rendah dari bahasa Pine.FMZ.COM(dalam bahasa Inggeris)Dataran StrategyTerdapat banyak strategi Pine untuk mencari, memindahkan (script).

FMZ tidak hanya menyokong bahasa Pine, tetapi juga menyokong fungsi gambar yang kuat dalam bahasa Pine. Semua ciri, alat yang berguna, pengurusan yang cekap dan mudah di platform FMZ juga meningkatkan lagi kegunaan dasar (skrip) Pine. FMZ berdasarkan keserasian dengan bahasa Pine, tetapi juga beberapa pengembangan, pengoptimuman dan pemotongan bahasa Pine.

Perbezaan yang lebih ketara di sini adalah ringkasan ringkas:

  • 1. Dasar Pine pada FMZ, tanda versi pada permulaan kod//@versionIa bermula dengan kodstrategyindicatorPerkataan tidak wajib ditulis, FMZ tidak menyokong sementaraimportPengimportanlibraryFungsi ini adalah sebagai berikut:

    Mungkin anda akan melihat beberapa strategi seperti ini:

    //@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 ia menulis:

    //@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 disederhanakan kepada:

    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, Dasar (script) Beberapa tetapan berkaitan transaksi ditetapkan oleh parameter "Pine Language Transaction Library" di antara muka dasar FMZ.

    • Model harga tutup dan model harga masa nyata Dalam trading view, kita boleh menggunakanstrategyFungsicalc_on_every_tickParameter untuk menetapkan skrip strategi untuk menjalankan logik strategi secara langsung setiap kali harga berubah, di manacalc_on_every_tickParameter harus ditetapkan sebagaitrue❖ Secara lalaicalc_on_every_tickParameter ialahfalse, iaitu untuk menjalankan logik strategi hanya apabila bar baris K semasa telah selesai sepenuhnya. Pada FMZ, ia ditetapkan melalui parameter templat "Pine Language Exchange Library".

      img

    • Pengendalian ketepatan kuantitatif seperti harga, kuantiti turun semasa pelaksanaan strategi perlu ditentukan di FMZ Dalam pandangan dagangan, tidak ada masalah ketepatan semasa pesanan sebenar kerana hanya ujian simulasi yang boleh dilakukan. Pada FMZ, strategi Pine boleh dijalankan secara sebenar. Maka, anda memerlukan strategi yang boleh menentukan dengan fleksibel jenis dagangan, ketepatan harga, ketepatan jumlah pesanan. Tetapan ketepatan ini adalah mengawal bilangan kecil data yang berkaitan, mengelakkan data tidak memenuhi keperluan penerbitan bursa sehingga tidak dapat memesan.

    • Kod kontrak niaga hadapan Dalam FMZ, jenis urus niaga jika kontrak, mempunyai dua sifat. Mereka dikenali sebagai "pasangan urus niaga" dan "kode kontrak", dan selain perlu menetapkan pasangan urus niaga secara jelas pada masa nyata dan diulas semula, kod kontrak tertentu juga perlu ditetapkan dalam parameter "kode jenis" dalam templat Perpustakaan Perdagangan Bahasa Pine. Sebagai contoh, kontrak kekal akan diisi.swap, kod kontrak untuk melihat sama ada bursa yang beroperasi mempunyai kontrak tersebut. Sebagai contoh, beberapa kontrak semua suku perdagangan, boleh diisi di siniquarter.. Kod kontrak ini adalah sama dengan kod kontrak niaga hadapan yang ditakrifkan dalam dokumentasi API bahasa Javascript/python/c++ FMZ..

    Tetapan lain, seperti jumlah terendah, jumlah terendah lalai dan lain-lain boleh dilihat dalam dokumentasi bahasa Pine mengenaiPerpustakaan Pertukaran Bahasa PinePerkenalkan parameter.

  • 3、runtime.debugruntime.logruntime.errorFungsi yang diperluaskan FMZ, digunakan untuk debugging.

    FMZ telah menambah tiga fungsi untuk debugging.

    • runtime.debugFungsi ini biasanya tidak digunakan untuk mencetak maklumat pembolehubah di papan kawalan.

    • runtime.log: Mengeksport isi dalam jurnal.. FMZ PINE mempunyai fungsi khas bahasa..

      runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
      
    • runtime.error: apabila dipanggil, akan menyebabkan kesilapan semasa berjalan dan membawa mesej ralat yang dinyatakan dalam parameter mesej.

      runtime.error(message)
      
  • 4, diperluaskan dalam fungsi gambar.overlayParameter

    Bahasa Pine di FMZ, fungsi gambarplotplotshapeplotchardan seterusnya.overlaySokongan parameter untuk membenarkan penentuan gambar pada gambar utama atau gambar sampingan.overlayTetapantrueGambar dalam tema, seting untukfalseLukisan pada gambar sampingan. Untuk membolehkan dasar Pine pada FMZ berjalan, gambar sampingan boleh dicatatkan pada masa yang sama.

  • 5、syminfo.mintickMengambil nilai pembolehubah terbina dalam

    syminfo.mintickVariabel terbina dalam ditakrifkan sebagai nilai tertakluk terendah untuk varieti semasa; di FMZPeranti sebenar/Ujian semulaParameter templat dalam "Pine Language Trading Library" pada antara muka boleh mengawal ketepatan mata wang harga; ketepatan mata wang harga ditetapkan pada 2 iaitu harga adalah tepat kepada tempat kedua pada titik desimal semasa dagangan, di mana unit pergerakan harga minimum adalah 0.01;syminfo.mintickNilai ini ialah 0.01 ∞.

  • 6. Harga purata dalam FMZ PINE Script adalah harga yang termasuk bayaran

    Sebagai contoh: harga pesanan adalah 8000, arah penjualan, jumlah 1 tangan (satu, dua), harga purata selepas transaksi bukan 8000, kurang daripada 8000 (biaya termasuk yuran prosedur).

Dasar Bahasa Pine

Apabila kita mula mempelajari asas bahasa Pine, kita mungkin tidak biasa dengan arahan, tatabahasa kod dalam beberapa contoh. Tidak mengapa, kita boleh mula-mula mengetahui konsep, memahami tujuan ujian, atau anda boleh mendapatkan dokumentasi bahasa Pine FMZ untuk melihat panduan. Kemudian ikuti tutorial ini secara beransur-ansur untuk mengetahui tatabahasa, arahan, fungsi, dan pembolehubah terbina dalam.

Pelaksanaan model

Pada permulaan pembelajaran bahasa Pine, adalah sangat penting untuk mengetahui konsep yang berkaitan seperti proses pelaksanaan skrip bahasa Pine. Strategi bahasa Pine adalah operasi berasaskan grafik, yang dapat difahami sebagai satu siri pengiraan dan operasi yang dijalankan pada grafik dengan urutan urutan masa yang telah dimuat naik. Jumlah data yang dimuat naik secara awal grafik adalah terhad.bar_indexMerujuk kepada nilai indeks K-LineBar semasa skrip Pine dijalankan.

plot(bar_index, "bar_index")

img

plotFungsi adalah salah satu fungsi yang akan kita gunakan lebih banyak pada masa akan datang. Penggunaannya sangat mudah, iaitu menggambar garis pada carta berdasarkan parameter yang diteruskan, data yang diteruskan adalahbar_indexIa dipanggilbar_index│ Kita dapat melihat bahawa baris yang disebut bar_index di atas nama Bar pertama mempunyai nilai 0, dengan peningkatan Bar ke kanan, peningkatan 1 akan berlaku.

Model pelaksanaan strategi juga berbeza, bergantung pada tetapan strategi, yang dibahagikan kepada:收盘价模型dan实时价模型◎ Model harga penutupan, konsep model harga masa nyata telah kami terangkan secara ringkas sebelum ini.

  • Model harga penutupan

    Apabila kod strategi dijalankan, kitaran Bar baris K semasa telah dilaksanakan sepenuhnya, dan kitaran K baris telah selesai apabila baris K ditutup. Pada masa ini, logik dasar Pine dijalankan sekali lagi, dan isyarat dagangan yang dicetuskan akan dilaksanakan pada permulaan Bar baris K seterusnya.

  • Model harga masa nyata

    Apabila kod strategi dilaksanakan, bar K baris semasa akan dilaksanakan sekali lagi pada setiap perubahan pasaran, sama ada ditutup atau tidak, dan isyarat dagangan yang dicetuskan akan dilaksanakan dengan segera.

Apabila strategi bahasa Pine dijalankan dari kiri ke kanan pada carta, baris KBar pada carta dibahagikan kepada历史Bardan实时BarDi bawah:

  • Bar Sejarah

    Apabila strategi yang ditetapkan sebagai "Model Harga Nyata" mula dijalankan, semua Bar K di carta kecuali satu Bar K di sebelah kanan adalah历史Bar◎ Logika taktikal dalam setiap akar历史BarHanya boleh dilakukan sekali sahaja. Apabila strategi yang ditetapkan sebagai "model harga penutupan" mula dijalankan, semua Bar pada carta adalah历史Bar◎ Logika taktikal dalam setiap akar历史BarHanya boleh dilakukan sekali sahaja.

    Perkiraan berdasarkan Bar Sejarah: Kod strategi dijalankan sekali dalam keadaan penutupan Bar Sejarah, dan kemudian kod strategi diteruskan pada Bar Sejarah seterusnya sehingga semua Bar Sejarah dijalankan sekali.

  • Bar Masa Langsung

    Apabila strategi dijalankan ke baris K terakhir di sebelah kanan bar, bar itu berubah menjadi bar masa nyata; apabila bar masa nyata ditutup, bar ini menjadi bar masa nyata yang telah berlalu (menjadi bar sejarah); bar masa nyata baru dihasilkan di sebelah kanan carta.

    Apabila strategi yang ditetapkan sebagai "Model Harga Masa Nyata" mula dijalankan, logik strategi akan dilaksanakan pada setiap perubahan pasaran pada Bar Masa Nyata. Pada permulaan pelaksanaan, Bar tidak muncul secara langsung pada carta apabila dasar yang ditetapkan sebagai "Model Harga Penutupan".

    Perkiraan berdasarkan Bar masa nyata: Jika jadual yang ditetapkan sebagai "Model Harga Penutupan" tidak menunjukkan Bar masa nyata, kod dasar hanya akan dijalankan sekali pada saat penutupan Bar semasa. Jika anda menetapkan dasar sebagai "Model Harga Nyata", pengiraan pada Bar masa nyata dan Bar sejarah adalah sama sekali berbeza, di mana setiap perubahan pasaran pada Bar nyata akan dijalankan dengan kod dasar; contohnya, pembolehubah terbina dalam.highlowclosePada bar sejarah, nilai-nilai ini akan berubah setiap kali pasaran mungkin berubah pada bar masa nyata. Oleh itu, data seperti penunjuk yang dihitung berdasarkan nilai-nilai ini juga akan berubah dalam masa nyata.closeDi sini, anda boleh melihat gambar yang menunjukkan harga terkini.highdanlowSelalunya mewakili titik tertinggi dan terendah tertinggi yang dicapai sejak permulaan Realtime Bar semasa. Variabel terbina dalam ini mewakili nilai akhir ketika Realtime Bar terakhir diperbaharui.

    Mekanisme pusingan balik semasa menjalankan strategi pada Bar masa nyata (model harga masa nyata): Dalam pelaksanaan Bar masa nyata, setiap kali strategi diulang semula, pemisahan semula pembolehubah yang ditakrifkan pengguna sebelum pelaksanaan dipanggil rollback. Untuk memahami mekanisme rollback, mari kita gunakan contoh dalam kod ujian berikut.

    Perhatikan:

    /*backtest 
    ...
    ..
    .
    */
    

    Kandungan bungkusan adalah maklumat konfigurasi retest 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")
    

    img

    img

    Kami hanya melihat adegan yang dijalankan dalam masa nyata Bar, jadi kami menggunakannot barstate.ishistoryPerbatasan ungkapan hanya digunakan untuk penjumlahan pada n pembolehubah pada masa nyata Bar dan digunakan sebelum dan selepas menjalankan operasi penjumlahanruntime.logFungsi mengeluarkan maklumat dalam log dasar.plotCurve n yang digambar dapat dilihat bahawa n sentiasa 0 semasa strategi berjalan pada Bar sejarah; n telah mencetuskan n tambah 1 semasa menjalankan Bar secara langsung, dan n tambah 1 semasa menjalankan setiap pusingan strategi pada Bar secara langsung. Dari maklumat log dapat dilihat bahawa n telah disetel semula ke nilai yang dikemukakan oleh Bar semasa setiap pusingan menjalankan semula kod polisi sebelumnya. Pada masa yang sama, Bar memaparkan pembaruan nilai n semasa menjalankan kod dasar terakhir pada Bar secara langsung, jadi grafik dapat dilihat bermula dari Bar secara langsung, dengan nilai n meningkat setiap kali Bar menambah nilai n pada kurva waktu Bar.

    Cuba rujuk: 1. Apabila dasar mula dilaksanakan pada masa nyata, Bar akan menjalankan satu kod dasar setiap kali ia diperbaharui. 2. Apabila dijalankan pada Bar masa nyata, ia akan menggulirkan semula pembolehubah sebelum setiap kali menjalankan kod dasar. 3. Apabila dijalankan pada Bar masa nyata, pemboleh ubah dihantar sekali pada pembaruan penutupan.

    Oleh kerana data bergolak, operasi grafik seperti kurva pada carta juga mungkin menyebabkan lukisan semula, contohnya kita mengubah kod ujian yang baru saja kita buat, ujian rak:

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

    Lukisan saat Aimg

    Gambar saat Bimg

    Kami hanya mengubah ayat ini:n := open > close ? n + 1 : n, Bar pada masa ini adalah garis sinkron (iaitu harga pembukaan lebih tinggi daripada harga penutupan) untuk n ditambah 1; seperti yang dapat dilihat pada grafik pertama (saat A) kerana harga pembukaan pada masa itu lebih tinggi daripada harga penutupan (gambar sinkron) maka n ditambah 1, nilai yang ditunjukkan oleh kurva grafik n adalah 5; kemudian perubahan keadaan, kemas kini harga seperti yang ditunjukkan pada grafik kedua (saat B); pada masa ini harga pembukaan adalah lebih rendah daripada harga penutupan (gambar sunrise), n bergolak dan tidak menambah 1; kurva n dalam grafik juga dengan serta-merta ditarik semula, ketika n pada kurva adalah 4; jadi tanda-tanda garpu emas, garpu mati dan lain-lain yang ditunjukkan pada grafik Bar pada masa nyata tidak pasti dan mungkin berubah.

  • Konteks pembolehubah dalam fungsi

    Di bawah ini kita akan melihat bersama-sama pemboleh ubah dalam fungsi bahasa Pine. Menurut beberapa tutorial Pine, pemboleh ubah dalam fungsi berbeza dengan pemboleh ubah di luar fungsi:

    Sejarah pembolehubah siri yang digunakan dalam fungsi Pine dicipta oleh setiap panggilan berturut-turut terhadap fungsi tersebut. Jika fungsi tidak dipanggil pada setiap tiang yang dijalankan skrip, ini akan menyebabkan perbezaan antara nilai sejarah dalaman dan luar siri fungsi pada bloknya. Oleh itu, jika fungsi tidak dipanggil pada setiap tiang, siri yang menggunakan nilai indeks yang sama dalam fungsi dan rujukan luar tidak akan merujuk kepada titik sejarah yang sama.

    Adakah ia agak sukar untuk dibaca? Tidak mengapa, kita akan mencari tahu 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)
    

    Uji semula skrin berjalan

    img

    Kod ujian adalah agak mudah, terutamanya untuk mengkaji data yang dirujuk dalam dua cara:f(a) => a[1]danf2() => close[1]

    • f(a) => a[1]: cara menggunakan parameter yang dihantar, fungsi akhirnya dikembalikana[1]

    • f2() => close[1]Menggunakan pembolehubah terbina dalam secara langsung:closeFungsi ini akan kembali pada akhir.close[1]

    []Simbol ini digunakan untuk mengutip nilai sejarah pemboleh ubah dalam siri data, close[1] yang merujuk kepada harga penutupan pada satu Bar sebelum harga penutupan semasa. Kod ujian kami melukis 4 jenis data di atas carta:

    • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")Menggambar satu aksara A, warna merah, hanya digambar apabila oneBarInTwo benar, dan kedudukan yang digambar (di y-axis) 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")Menggambar satu aksara B, berwarna hijau, hanya digambar apabila oneBarInTwo adalah benar, dan kedudukan yang digambar (di y-axis) adalah:f2()Nilai yang dikembalikan.

    • plot(close[2], title = "close[2]", color = color.red, overlay = true)Garis, berwarna merah, diletakkan (di atas paksi Y):close[2]Iaitu harga penutupan pada bar bar kedua sebelum bar bar semasa.

    • plot(close[1], title = "close[1]", color = color.green, overlay = true)Garis, berwarna hijau, diletakkan (di atas paksi Y):close[1]Iaitu harga penutupan pada Bar pada baris pertama bar (satu baris ke kiri) bar semasa.

    Skrin yang dijalankan dengan strategi retargeting dapat dilihat, walaupun gambar A menandai fungsi yang digunakanf(a) => a[1]Fungsi yang digunakan untuk menandakan gambar Bf2() => close[1]Kedua-duanya digunakan[1] untuk merujuk kepada data sejarah dalam siri data, tetapi kedudukan penanda "A" dan "B" pada carta adalah sama sekali berbeza.plot(close[2], title = "close[2]", color = color.red, overlay = true)Dalam garis yang digambar, data yang digunakan adalahclose[2]

    img

    Sebabnya ialah melalui indeks baris KBar, iaitu pembolehubah terbina dalam.bar_indexMengira sama ada menggambar tanda "A" dan "B"; tanda "A" dan "B" tidak menggambar pada setiap garis KBar (mengira fungsi ketika menggambar); fungsif(a) => a[1]Nilai yang dirujuk dengan cara ini, jika fungsi tidak dipanggil pada setiap bar, ia akan disamakan dengan fungsi.f2() => close[1]Cara ini merujuk kepada nilai yang berbeza (walaupun menggunakan indeks yang sama seperti [1]).

  • Beberapa fungsi terbina dalam memerlukan pengiraan pada setiap Bar untuk mengira hasilnya dengan betul

    Contoh mudahnya ialah:

    res = close > close[1] ? ta.barssince(close < close[1]) : -1
    plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
    

    Kita akan panggil fungsi dalam kod.ta.barssince(close < close[1])Ditulis dalam pengendali tiga matacondition ? value1 : value2Dalam kes ini, ia menyebabkan hanyaclose > close[1]时去调用ta.barssince函数。可偏偏ta.barssinceFungsi ini adalah pengiraan dari kali terakhir.close < close[1]Bilangan baris K pada masa penubuhan; apabila dipanggil fungsi ta.barssince adalah close > close[1], iaitu harga penutupan semasa lebih besar daripada harga penutupan Bar sebelumnya, fungsi ta.barssince tidak berlaku apabila ia dipanggil dengan syarat close < close[1] dan tidak mempunyai kedudukan yang paling baru dibuat.

    ta.barssince: Apabila dipanggil, fungsi ini akan mengembalikan na jika syarat ini tidak pernah dipenuhi sebelum baris K semasa.

    Gambar berikut:

    img

    Oleh itu, ketika menggambar, hanya data yang digambarkan apabila pembolehubah res mempunyai nilai ((-1) ⇒.

    Untuk mengelakkan masalah ini, kita hanya perlu menggunakanta.barssince(close < close[1])Panggilan fungsi diambil daripada pengendali triad dan ditulis di luar cawangan mana-mana syarat yang mungkin; sehingga ia menjalankan pengiraan pada setiap baris KBar.

    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)
    

    img

Urutan masa

Konsep urutan masa ini sangat penting dalam bahasa Pine, dan merupakan konsep yang mesti kita fahami apabila kita belajar bahasa Pine. Urutan masa bukan jenis tetapi struktur asas untuk nilai kesinambungan pemboleh ubah yang disimpan dari masa ke masa. Kita tahu skrip Pine adalah berasaskan grafik, dan yang paling asas yang ditunjukkan dalam grafik adalah grafik K bar.openadalah pembolehubah terbina dalam bahasa Pine, yang dibina untuk menyimpan urutan masa harga pembukaan setiap baris KBar. Ia boleh difahami sebagai:openStruktur urutan masa ini mewakili harga pembukaan semua K-stringBar pada masa Bar ini dijalankan. Jika K-string semasa adalah kitaran 5 minit, maka kita menggunakan rujukan dalam kod strategi Pine.openWaktu adalah harga pembukaan baris KBar pada saat pelaksanaan semasa menggunakan kod strategi. Jika nilai sejarah dalam urutan masa diperlukan untuk digunakan.[]Operator... digunakan apabila dasar Pine dijalankan pada bar baris K.open[1]Menunjukkan rujukanopenHarga pembukaan K-LineBar sebelum skrip K-LineBar yang dijalankan pada urutan masa ini (iaitu harga pembukaan untuk kitaran K-Line terakhir).

  • Variabel dalam urutan masa sangat mudah untuk dikira. Jadi kita boleh gunakan fungsi terbina dalam.ta.cumContohnya:

    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
    

    Kode ujian:

    v1 = 1
    v2 = ta.cum(v1)
    plot(v1, title="v1")
    plot(v2, title="v2")
    plot(bar_index+1, title="bar_index")
    

    Banyak yang serupa.ta.cumFungsi terbina dalam seperti ini boleh memproses data secara langsung pada urutan masa, sepertita.cumIni adalah untuk menambah nilai yang sepadan pada setiap baris KBar, dan kemudian kita menggunakan grafik untuk memudahkan pemahaman.

    Proses pelaksanaan strategi Variabel terbina dalam bar_index v1 v2
    Strategi berjalan pada bar baris K root 1. 0 1 1
    Strategi berjalan pada bar baris K yang kedua. 1 1 2
    Strategi berjalan pada bar baris K ketiga 2 1 3
    Strategi berjalan pada baris N + 1 K Bar N 1 N+1

    Seperti yang dapat dilihat, sebenarnya v1, v2 dan bahkan bar_index adalah struktur siri masa, dengan data yang sepadan pada setiap Bar. Kod ujian ini membezakan sama ada "model harga masa nyata" atau "model harga penutupan" hanya dengan menunjukkan Bar masa nyata pada carta. Untuk mengukur kelajuan, kami menggunakan ujian penutupan "model harga penutupan".

    img

    Kerana v1 adalah 1, untuk setiap bar.ta.cum(v1)Apabila fungsi dijalankan pada baris Bar K pertama, hasil pengiraan adalah 1, yang diberikan kepada pembolehubah v2 ─ kerana hanya Bar pertama. Apabilata.cum(v1)Apabila dijalankan pada baris K kedua Bar, terdapat 2 baris K Bar (bar_index pada baris pertama adalah 0, bar_index pada baris kedua adalah 1), jadi hasil pengiraan adalah 2, memberi nilai kepada variabel v2, dan sebagainya.bar_indexJika kita mulakan dari 0 dan bertambah,bar_index + 1Ini sebenarnya adalah bilangan bar garis K. Anda juga boleh melihat garis di dalam grafik.v2danbar_indexSaya tidak tahu apa yang akan berlaku.

    img

    Saya juga boleh menggunakanta.cumFungsi terbina dalam mengira jumlah harga penutupan untuk semua Bar pada carta semasa, maka ia hanya boleh ditulis sebagai berikut:ta.cum(close)Apabila strategi berjalan ke bar masa nyata di sebelah kanan,ta.cum(close)Hasil yang dikira ialah jumlah harga penutupan untuk semua Bar pada carta (tidak berjalan ke sebelah kanan, hanya ditambahkan ke Bar semasa).

    Variabel dalam urutan masa juga boleh digunakan untuk operasi dengan pengendali, seperti kod:ta.sma(high - low, 14)Mengubah pembolehubah yang terbina dalamhigh(K Bar tertinggi) dikurangkanlow(K Bar Bar minimum), digunakan untuk terakhir kalita.smaFungsi mencari purata.

  • Hasil panggilan fungsi juga akan meninggalkan jejak nilai dalam urutan masa.

    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 ujian semula, dan dapat dilihatv1danv2Nilai yang sama, garis yang digambar pada grafik juga bertumpu sepenuhnya. Hasil yang dihitung oleh panggilan fungsi akan meninggalkan jejak nilai dalam urutan masa, seperti kodta.highest(high, 10)[1]Antarata.highest(high, 10)Hasil yang dikira oleh panggilan fungsi juga boleh digunakan[1] untuk merujuk kepada nilai sejarahnya. Berdasarkan Bar yang sepadan dengan Bar sebelumnya.ta.highest(high, 10)Hasilnya ialah:ta.highest(high[1], 10)Oleh itu.ta.highest(high[1], 10)danta.highest(high, 10)[1]Saya tidak tahu apa yang akan berlaku.

    Menghasilkan maklumat pengesahan menggunakan 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 boleh melihat nilai pembolehubah a dan pembolehubah b dalam urutan masa yang dipaparkan di atas dan di bawah Bar yang sepadan. Anda boleh menyimpan kod gambar ini semasa belajar, kerana dalam ujian, percubaan mungkin sering memerlukan output maklumat pada carta untuk pemerhatian.

    img

Struktur skrip

Struktur umum

Pada bahagian awal tutorial, kami meringkaskan beberapa perbezaan penggunaan bahasa Pine pada FMZ dan penggunaan bahasa Pine pada Trading View.indicator()strategy()"Saya tidak mahu mengkritiknya.library()◦ Sudah tentu, untuk mengkompatibiliti skrip Pine versi awal, strategi yang ditulis adalah seperti://@version=5indicator()strategy()Jika anda ingin membuat perisian yang lebih baik, anda boleh membuat perisian yang lebih baik.strategy()Tetapan parameter dalam fungsi.

<version>
<declaration_statement>
<code>

<version>Maklumat kawalan versi boleh dilepaskan.

Catatan

Bahasa Pine//Sebagai notaris satu baris, kerana bahasa Pine tidak mempunyai notaris berbilang baris. FMZ memperluaskan notaris/**/Ia boleh digunakan untuk nota berbilang baris.

Kod

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

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

Perkataan boleh disusun dalam pelbagai cara

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

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

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

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

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

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

Ganti kod barisan

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

a = open + high + low + close

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

a = open +
      high +
          low +
             close

Satu panggilan plot panjang (() boleh dibungkus menjadi.

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

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

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)
           
                   
a = test(close, open)
plot(a, title="a")

Pengiktirafan dan operator

Pengiktirafan

Sebelum memahami pembolehubah, kita perlu memahami konsep tanda tanda acuan; tanda tanda acuan biasa digunakan sebagai tanda acuan.FungsidanVariabelNama (untuk menamakan pembolehubah, fungsi)FungsiSeperti yang akan kita lihat dalam tutorial seterusnya, kita mulakan dengan mempelajari tanda-tanda tanda.

  • 1, tanda pengenal mesti ditulis besar(A-Z)atau tulisan kecil(a-z)Huruf atau garis bawah(_)Permulaan, sebagai aksara pertama tanda pengenal.
  • 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 2 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3 = 3hurufGaris bawahatauAngka
  • 3. Nama-nama pengiktirafan ditulis dengan huruf besar dan kecil.

Contohnya, tanda pengenal yang dinamakan:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

Seperti kebanyakan bahasa pengaturcaraan, bahasa Pine juga mempunyai cadangan penulisan.

  • 1, semua huruf besar digunakan untuk menamakan pemalar.
  • 2, kegunaanPeraturan Little HumpNama yang digunakan untuk pengenal lain.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0

Operator

Operator adalah beberapa simbol operasi yang digunakan dalam bahasa pengaturcaraan untuk membina ungkapan, dan ungkapan adalah peraturan pengiraan yang dirancang untuk tujuan pengiraan tertentu ketika kita menulis dasar. Operator dalam bahasa Pine dikategorikan mengikut fungsi sebagai:

Operator penyampaian, operator hitung, operator perbandingan, operator logik,? :Operator tiga mata.[]Operator rujukan sejarah.

Operator dengan bilangan*Sebagai contoh, terdapat kod ujian berikut untuk membezakan jenis masalah yang disebabkan oleh pengoperasi bahasa Pine pada Trading View yang mengembalikan hasil:

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

Apabila skrip ini dijalankan dalam Trading View, ia akan mengumpul laporan ralat keranaadjustedLength = lenInput * factorSelepas perkalian, hasilnya ialahseries intJenis (seri), bagaimanapunta.emaParameter kedua fungsi tidak menyokong jenis ini. Tetapi pada FMZ tidak ada batasan yang ketat seperti itu, kod di atas boleh berjalan dengan normal.

Di bawah ini kita akan melihat penggunaan pelbagai pengendali.


Operator pemberian nilai

Terdapat dua jenis pengendali pemberian nilai:=:=Kami telah melihat beberapa contoh di bahagian awal tutorial ini.

=Operator digunakan untuk memberi nilai kepada pemboleh ubah apabila mereka dimulakan atau diisytiharkan.=Inisialisasi, menyatakan bahawa setiap variabel selepas penugasan akan bermula dengan nilai ini pada setiap Bar selepas itu. Ini adalah pengisytiharan pembolehubah 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)

Perhatikana = closePerkataan penugasan, pada setiap Bar, pembolehubah a adalah harga penutupan Bar semasa (close); pembolehubah lainbcdIa adalah tidak berubah, boleh diuji dalam sistem pengukuran semula di FMZ, dan hasilnya dapat dilihat dari grafik.

:=Digunakan untuk menetapkan semula nilai kepada pembolehubah sedia ada, yang boleh difahami dengan mudah sebagai:=Operator digunakan untuk mengubah nilai pembolehubah yang telah diisytiharkan, dimulakan. Jika digunakan:=Operator yang diberikan kepada pemesanan pembolehubah yang tidak dimulakan atau diisytiharkan akan menimbulkan kesilapan, contohnya:

a := 0

Jadi, apa yang anda fikirkan?:=Operator penugasan biasanya digunakan untuk penugasan semula pembolehubah yang sudah ada, contohnya:

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

menilai jikaclose > open(iaitu BAR semasa adalah garis lintang), a ialah nilai benar (true); akan menjalankan kod dalam blok tempatan pernyataan ifb := b + 1, menggunakan pengendali penugasan:=Beri b semula nilai, tambah satu 1; dan kemudian gunakan fungsi plot untuk melukis nilai pembolehubah b pada setiap BAR dalam jadual, dihubungkan secara berbaris.

Adakah kita menganggap bahawa apabila terdapat garis lintang BAR, b akan terus menambah 1? Sudah tentu tidak, di sini kita menyatakan kepada pembolehubah b, tidak menggunakan kata kunci apa pun ketika dimulakan sebagai 0.b=0Jadi anda boleh lihat bahawa hasil daripada menjalankan kod ini ialah setiap kali anda menetapkan semula b kepada 0, jika a adalah nilai yang benar, maka ia akan sesuai.close > openJadi b akan menambah 1, apabila b menjalankan kod pada pusingan ini, tetapi b akan diberi semula nilai 0 pada pusingan seterusnya. Ini juga merupakan tempat yang mudah dijumpai oleh pemula bahasa Pine.

Apabila kita bercakap mengenai pengaturcaraan, kita perlu memperluaskan penjelasan dua perkataan utama:varvarip

  • var

    Sebenarnya, kata kunci ini telah kita lihat dan gunakan dalam tutorial sebelum ini, tetapi tidak dibincangkan secara terperinci pada masa itu. Mari kita lihat deskripsi kata kunci ini:

    var adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi pembolehubah sekali sahaja. Biasanya, sintaks penyampaian pembolehubah yang tidak mengandungi kata kunci var akan menyebabkan nilai pembolehubah ditutup setiap kali data diperbaharui. Sebaliknya, apabila menggunakan kata kunci var, pembolehubah pembolehubah masih boleh kekal dalam keadaan kosong walaupun data diperbaharui.

    Kita masih menggunakan contoh ini, tetapi kita gunakan untuk memberi nilai kepada b.varKata Kunci:

    a = close > open 
    var b = 0 
    if a
        b := b + 1
    
    plot(b)
    

    varKata kunci yang membolehkan b hanya melaksanakan penganugerahan pertama, dan tidak akan menetapkan semula b kepada 0 setiap kali menjalankan logik strategi, jadi garis yang digambar dari semasa dijalankan dapat dilihat b adalah pengukuran semula bilangan sinar matahari BAR yang muncul pada garis K BAR semasa.

    Variabel yang diisytiharkan var boleh ditulis bukan sahaja secara global, tetapi juga dalam blok kod, 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 baris tiang pertama dalam siri. Variabel aluminium b mengekalkan harga penutupan bar harga aluminium hijau pertama dalam siri ini. Variabel ketumbar c ketumbar mengekalkan harga penutupan ketumbar hijau ketumbar kesepuluh dalam siri.

  • berlainan

    varipKata kunci ini pertama kali kita lihat, dan kita boleh lihat deskripsi kata kunci ini:

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

    Adakah lebih sukar untuk difahami? Tidak mengapa, kita menerangkannya dengan contoh, mudah untuk 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 berbeza dalam Model Harga Penutupan atau Model Harga Masa Nyata:

    Model Harga Masa Nyata: Adakah anda ingat strategi yang telah kita bincangkan sebelum ini, apabila ia dijalankan, ia dibahagikan kepada tahap BAR sejarah, tahap BAR masa nyata?varvaripVariabel pengisytiharaniiiOperasi inkrimensi akan dijalankan setiap kali kod strategi dijalankan. Oleh itu, anda dapat melihat bahawa setiap nombor yang ditunjukkan pada garis K BAR hasil ulangan adalah berinkrimensi 1. Apabila fasa garis K sejarah berakhir, perubahan yang berbeza bermula pada tahap K baris nyata.i := i + 1danii := ii + 1Ia akan dilaksanakan sekali sahaja. Perbezaan adalah bahawa ia akan diubah setiap kali. Walaupun ia akan diubah setiap kali, ia akan kembali ke nilai sebelumnya apabila logik dasar dijalankan pada pusingan seterusnya. (Ingat mekanisme kemunduran yang kita bincangkan dalam bab "Pembekalan Model" sebelum ini?), Ia tidak akan ditetapkan sehingga garis K BAR semasa selesai untuk mengemas kini nilai i.

    Model harga penutupan: Oleh kerana model harga penutupan adalah logik strategi yang dijalankan hanya sekali setiap garis K BAR habis. Oleh itu, dalam model harga penutupan, peringkat garis K sejarah dan peringkat garis K masa nyata, pembolehubah pernyataan var, varip menunjukkan prestasi yang sama dalam contoh di atas, dengan setiap garis K BAR meningkat sebanyak 1.


Operator aritmatika
Operator Pencerahan
+ Gafah
- Pengurangan undang-undang
* Perkalian
/ Kecuali
% Perancangan

+-Operator boleh digunakan sebagai operator binari atau sebagai operator primari. Operator aritmatika lain hanya boleh digunakan sebagai operator binari dan akan memberikan error jika digunakan sebagai operator primari.

1, kedua-dua belah operator aritmatika adalah jenis nilai, hasilnya adalah jenis nilai, bulat atau floppoint bergantung kepada hasil operasi. 2. Jika mana-mana nombor operasi adalah strings, operator adalah+, maka hasil pengiraan akan menjadi strings, nilai akan ditukar kepada bentuk strings, dan strings akan disatukan. Jika pengendali aritmatika lain, strings akan cuba ditukar kepada nilai, dan operasi akan dilakukan. 3. Jika mana-mana nombor operasi adalah na, maka hasil pengiraan adalah nilai kosong na, yang akan dipaparkan pada NaN apabila 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 begitu ketat mengenai keperluan jenis pembolehubah; contohnya:

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

Ia boleh dijalankan di FMZ, tetapi akan melaporkan kesalahan jenis dalam pandangan perdagangan. Untuk operator aritmatika, sistem akan mengira selepas mengubah nombor ke nombor. Jika string bukan nombor tidak boleh dihitung, sistem akan mengira nilai kosong na.


Operator perbandingan

Operator perbandingan adalah operator binari.

Operator Pencerahan
< kurang daripada
> Lebih besar daripada
<= kurang daripada sama dengan
>= Lebih besar daripada sama dengan
== sama
!= Perbezaan

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, operator perbandingan sangat mudah digunakan, tetapi ini juga merupakan operator yang paling banyak kita gunakan ketika menulis dasar.closeopenDan seterusnya. Sama seperti pengendali operasi, pada FMZ terdapat perbezaan dengan Pine dalam Trading View, FMZ tidak mempunyai jenis keperluan yang sangat ketat, jadi pernyataan seperti inid = "1" >= 2Dalam FMZ, tidak ada laporan kesalahan, dan string ditukar kepada nilai nombor semasa pelaksanaan, dan operasi perbandingan dilakukan. Dalam Trading View, laporan kesalahan dibuat.


Operator logik
Operator Simbol kod Pencerahan
Tidak Tidak Pengendali yang tidak dikendalikan
dengan dan Operator binari, beroperasi dengan ((dan)
atau atau Operator binari, atau operasi

Jika kita bercakap tentang operator logik, maka kita mesti bercakap tentang jadual nilai sebenar. Seperti yang kita pelajari di sekolah menengah, tetapi di sini kita menguji dalam sistem pengukuran semula, belajar:

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 maklumat cetak yang terus menerus dari sistem retrospektif menjejaskan pengamatan, kami menggunakanruntime.error("stop")Perkataan yang dijalankan selepas cetak sekali, membuang kesilapan luar biasa untuk menghentikan pengesanan semula, kemudian anda boleh melihat maklumat yang dikeluarkan, dan dapat melihat bahawa kandungan yang dicetak dan jadual nilai sebenar sebenarnya sama.


Operator tiga mata wang

Menggunakan pengendali tiga.? :Perkataan tiga dimensi yang digabungkan dengan bilangan operasicondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseKita sudah terbiasa dalam kursus sebelumnya. Istilah ungkapan tiga dimensi, pengendali tiga dimensi bermaksud jumlah pengendali yang ada adalah tiga.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseDalam,conditionJika ia adalah benar, maka nilai ungkapan adalah:valueWhenConditionIsTrue❖ JikaconditionNilai bagi ungkapan hipotesis ialahvalueWhenConditionIsFalse

Walaupun tidak mempunyai kegunaan praktikal, contoh mudah 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)

Jika anda bertemu dengan bintang silang, tidak mengapa! ungkapan tiga dimensi juga boleh diselipkan, 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)

Ini adalah sama dengancondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseDalamvalueWhenConditionIsTruevalueWhenConditionIsFalse, juga menggunakan ungkapan tiga kata lain sebagai pengganti.


Operator sejarah

Menggunakan pengendali sejarah[], merujuk kepada nilai sejarah pada urutan masa. Nilai sejarah ini adalah nilai pada bar K sebelum bar K semasa skrip dijalankan.[]Operator digunakan selepas panggilan kepada pembolehubah, ungkapan, fungsi.[]Nilai dalam kurung ini adalah jumlah pergeseran data sejarah yang ingin kita rujuk dari jarak BAR pada garis K semasa. Sebagai contoh, jika saya akan rujuk harga penutupan BAR pada garis K sebelumnya, ia ditulis sebagai:close[1]

Kami telah melihat tulisan seperti ini dalam kursus sebelumnya:

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

[]Operator hanya boleh digunakan sekali pada nilai yang sama, jadi ini adalah salah dan akan mengembalikan kesalahan:

a = close[1][2]   // 错误

Mungkin anda lihat di sini, ada yang akan berkata, pengendali.[]Ini adalah untuk struktur siri, yang kelihatan seperti struktur siri (series) dan aritmatika! Di bawah ini kita akan menggunakan satu contoh untuk menunjukkan perbezaan antara siri (series) dan array dalam bahasa Pine.

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

Walaupuna = close[1][2]Saya tidak tahu apa yang berlaku di sini.

b = close[1]
c = b[1]

Jika kita baca dalam bentuk yang biasa, kita akan dapat melihat bahawa jika kita membaca dalam bentuk yang biasa, kita akan dapat melihat bahawa jika kita membaca dalam bentuk yang biasa, kita akan dapat melihat bahawa jika kita membaca dalam bentuk yang biasa, kita akan dapat melihat bahawa jika kita membaca dalam bentuk yang biasa, kita akan dapat melihat bahawa jika kita membaca dalam bentuk yang biasa, kita tidak akan dapat melihat.b = close[1]Selepas penyampaian, b sepatutnya menjadi nilai, namunc = b[1], b masih boleh digunakan untuk merujuk kepada nilai sejarah semula dengan menggunakan pengendali sejarah. Seperti yang dapat dilihat, konsep siri dalam bahasa Pine tidak semudah aritmatika. B boleh difahami sebagai nilai sejarah pada Bar sebelumnya yang berdekatan, b juga merupakan struktur siri masa, yang boleh terus merujuk kepada nilai sejarahnya. Jadi kita melihat bahawa dalam tiga baris a, b, dan c yang digambar, baris b adalah lebih lambat daripada baris a dengan satu BAR, baris c lebih lambat daripada baris b dengan satu BAR.

Kita boleh menyeret grafik ke kiri dan melihat bahawa pada baris K pertama, nilai b dan c sama-sama kosong. Ini kerana ketika skrip dijalankan pada baris K pertama BAR, satu atau dua nilai sejarah tidak ada ketika rujukan ke hadapan. Oleh itu, kita perlu berhati-hati ketika menulis strategi untuk melihat sama ada rujukan ke nilai kosong ketika merujuk data sejarah, jika tidak berhati-hati menggunakan nilai kosong akan menyebabkan pelbagai perbezaan pengiraan, bahkan mungkin mempengaruhi BAR masa nyata.nanzFungsi terbina dalam (yang sebenarnya kita pernah lihat dalam kajian sebelum ini)nznaFungsi, adakah anda ingat di mana bab?) menangani keadaan kosong secara khusus, contohnya:

close > nz(close[1], open)    // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量

Ini adalah penanganan untuk kemungkinan merujuk kepada nilai kosong ((na)).


Keutamaan operator

Kita telah mempelajari banyak operator bahasa Pine yang membentuk ungkapan melalui pelbagai kombinasi dengan bilangan operasi. Jadi, bagaimana keutamaan operasi ini ketika mengira dalam ungkapan? Seperti operasi keempat yang kita pelajari di sekolah, terdapat penggandaan, penggandaan dan pengurangan.

Keutamaan Operator
9 []
8 Operator pada masa yang sama+-dannot
7 */%
6 Operator binari apabila+-
5 ><>=<=
4 ==!=
3 and
2 or
1 ?:

Bahagian ekspresi yang mempunyai keutamaan tinggi dioperasikan terlebih dahulu, jika keutamaan sama, dioperasikan dari kiri ke kanan.()Dalam kes ini, anda perlu menggunakan formula yang sama untuk mengumpul dan mengumpul data.

Variabel

Pernyataan pembolehubah

Kita telah mempelajari konsep tanda tanda yang digunakan untuk menamakan variabel. Jadi, kita juga boleh mengatakan: variabel adalah tanda yang menyimpan nilai. Jadi bagaimana untuk mengisytiharkan satu variabel?

  • Model pengumuman: Apabila menyatakan pembolehubah, yang pertama ditulis ialah "Pengumuman Mode". 1. Gunakan kata kuncivarSaya tidak tahu. 2. Gunakan kata kuncivaripSaya tidak tahu. 3. Tiada apa-apa ditulis.

    varvaripKata kunci sebenarnya telah kita pelajari dalam bab "Operator Penugasan" sebelum ini, dan tidak akan diulas lagi di sini. Jika pola pengisytiharan pembolehubah tidak menulis apa-apa, contohnya kalimat:i = 1, sebenarnya kita telah bercakap sebelum ini bahawa pemerubah yang diisytiharkan seperti itu dan pembagian, dilaksanakan pada setiap baris KBAR.

  • Jenis Bahasa Pine pada FMZ tidak ketat mengenai keperluan jenis, dan biasanya boleh diabaikan. Walau bagaimanapun, untuk mengintegrasikan dasar skrip pada Trading View, ia juga boleh membawa jenis apabila menyatakan pembolehubah. Contohnya:

    int i = 0 
    float f = 1.1
    

    Jenis dalam Trading View adalah lebih ketat, dan jika anda menggunakan kod berikut dalam Trading View, anda akan mendapat ralat:

    baseLine0 = na          // compile time error!
    
  • Pengiktirafan Pengiktirafan adalah nama pembolehubah, nama pengiktirafan telah dibincangkan dalam bab sebelumnya, dan boleh dilihat kembali:https://www.fmz.com/bbs-topic/9390#标识符

Untuk mengumpul, menyatakan satu pembolehubah boleh ditulis sebagai:

// [<declaration_mode>] [<type>] <identifier> = value 
   声明模式             类型     标识符       = 值

Di sini, operator pemberian nilai digunakan:=Nilai boleh berupa strings, angka, ungkapan, panggilan fungsi, dan lain-lain.ifforwhileatauswitchStruktur if (kata kunci struktural, penggunaan frasa akan dijelaskan secara terperinci dalam pelajaran seterusnya, sebenarnya kita telah belajar dalam pelajaran sebelumnya tentang pemberian frasa if yang mudah, boleh dilihat kembali).

Di sini kita memberi tumpuan kepada fungsi input, yang merupakan fungsi yang sering kita gunakan ketika merancang strategi. Ia juga merupakan fungsi yang sangat penting ketika merancang strategi.

Fungsi input:

input函数,参数defval、title、tooltip、inline、group

Fungsi input pada FMZ sedikit berbeza daripada pada Trading View, walaupun fungsi ini digunakan sebagai input penugasan parameter strategi. Berikut adalah contoh yang menunjukkan penggunaan fungsi input pada FMZ:

param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")

ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)

Fungsi input sering digunakan untuk menetapkan parameter apabila menyatakan pembolehubah. Dalam FMZ, fungsi input akan secara automatik melukis kawalan yang digunakan untuk menetapkan parameter dasar di antara antara antara muka dasar FMZ. Kawalan yang disokong pada FMZ kini mempunyai kotak input nombor, kotak input teks, kotak tarik turun, tanda centang nilai.

img

Kami memperkenalkan beberapa parameter utama fungsi input:

  • defval: nilai lalai pilihan parameter dasar yang ditetapkan untuk fungsi input, menyokong pembolehubah terbina dalam, nilai, dan rentetan dalam bahasa Pine
  • title: nama parameter yang dipaparkan oleh dasar pada antara muka dasar pada cakera sebenar / diulang semula.
  • Tooltip: Petua parameter dasar, apabila tetikus berhenti di atas parameter dasar akan menunjukkan maklumat teks yang ditetapkan parameter ini.
  • group: nama kumpulan parameter dasar, boleh diberikan kepada kumpulan parameter.

Sebagai tambahan kepada pengisytiharan pembolehubah berasingan, pembolehubah, bahasa Pine juga menyatakan sekumpulan pembolehubah dan memberi nilai:

[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构

Yang paling biasa ialah kita gunakanta.macdApabila fungsi mengira penunjuk MACD, kerana penunjuk MACD adalah penunjuk berbilang baris, tiga set data akan dikira. Oleh itu, ia boleh ditulis sebagai:

[dif,dea,column] = ta.macd(close, 12, 26, 9)

plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)

Dengan menggunakan kod di atas, kita dapat dengan mudah melukis carta MACD, bukan sahaja fungsi terbina dalam yang boleh mengembalikan pelbagai pembolehubah, tetapi fungsi tersuai yang ditulis juga boleh mengembalikan pelbagai data.

twoEMA(data, fastPeriod, slowPeriod) =>
    fast = ta.ema(data, fastPeriod)
    slow = ta.ema(data, slowPeriod)
    [fast, slow]

[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)

Menggunakan struktur seperti if sebagai penyerahan pelbagai pembolehubah juga serupa dengan cara fungsi kustom di atas.

[ema10, ema20] = if true
    fast = ta.ema(close, 10)
    slow = ta.ema(close, 20)
    [fast, slow]

plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)

Struktur Syarat

Beberapa fungsi tidak dapat ditulis di blok kod tempatan yang mempunyai cawangan bersyarat, terutamanya beberapa fungsi berikut:

barcolor ((), isi ((), hline ((), penunjuk ((), plot ((), plotcandle ((), plotchar ((), plotshape (()

Penghantaran kesalahan akan disusun di Trading View. Di FMZ, batasan tidak begitu ketat, tetapi juga disyorkan untuk mengikuti peraturan penulisan di Trading View. Sebagai contoh, walaupun tidak melaporkan kesalahan di FMZ, tetapi tidak disyorkan untuk menulis seperti ini.

strategy("test", overlay=true)
if close > open 
    plot(close, title="close")
else 
    plot(open, title="open")

Bahasa if


Lebih lanjut