Sumber daya yang dimuat... Pemuatan...

Penemu Kuantitatif Tutorial Pengantar Bahasa Pine

Penulis:Penemu Kuantitas - Mimpi Kecil, Dibuat: 2022-05-30 16:23:43, Diperbarui: 2022-09-28 17:10:21

[TOC]

Penemu Kuantitatif Tutorial Pengantar Bahasa Pine

Video tutorial yang didampingi:Terlalu sulit untuk memulai perdagangan kuantitatif? Menggunakan trading view Bahasa Pine mulai dari kecil sampai besar - Quant dewa - Penjelajah awal bahasa Pine

Inventor Quantified Trading Platform mendukung strategi penulisan bahasa Pine, mendukung retargeting, menjalankan kebijakan bahasa Pine pada hard disk, kompatibel dengan versi yang lebih rendah dari bahasa Pine.FMZ.COM(dalam bahasa Inggris)Praja StrategiDi dalamnya terdapat berbagai strategi Pine untuk mencari, memindahkan, dan meng-script.

FMZ tidak hanya mendukung bahasa Pine, tetapi juga mendukung fitur gambar yang kuat dari bahasa Pine. Fitur-fitur, alat-alat praktis yang kaya, manajemen yang efisien dan mudah di platform FMZ juga meningkatkan fungsionalitas kebijakan (script) Pine. FMZ didasarkan pada kompatibilitas dengan bahasa Pine, dan juga beberapa ekstensi, pengoptimalan, dan pemotongan bahasa Pine.

Perbedaan-perbedaan yang lebih mencolok di sini dapat diuraikan secara sederhana:

  • 1, kebijakan Pine di FMZ, versi yang dikenal dengan kode awal//@versiondan mulai dengan kodestrategyindicatorKata-kata tidak diwajibkan, FMZ tidak mendukung sementaraimportMengimporlibraryFungsinya.

    Anda mungkin 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 mungkin tulisan 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, ini bisa disederhanakan menjadi:

    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, Kebijakan (script) Beberapa pengaturan yang terkait dengan transaksi diatur oleh parameter "Pine Language Transaction Library" pada antarmuka kebijakan FMZ.

    • Model harga akhir dan model harga real-time Di trading view, kita bisa menggunakanstrategyFungsicalc_on_every_tickParameter untuk mengatur skrip strategi untuk menjalankan logika strategi secara real-time setiap kali harga berubah.calc_on_every_tickParameter harus disetel ketruePerhatikanlah.calc_on_every_tickParameternya adalahfalseDengan kata lain, strategi ini akan berjalan sampai garis K BAR selesai. Pada FMZ, hal ini diatur melalui parameter template "Pine Language Exchange Library".

      img

    • Pengendalian presisi numerik seperti harga, jumlah unit saat menjalankan strategi diperlukan untuk ditentukan di FMZ Dalam trading view, karena hanya dapat melakukan pengujian simulasi, maka tidak ada masalah dengan akurasi saat melakukan order secara real time. Pada FMZ, Anda dapat menjalankan strategi Pine secara real time. Maka Anda memerlukan strategi yang dapat secara fleksibel menentukan akurasi harga untuk jenis perdagangan, akurasi jumlah pesanan. Pengaturan akurasi ini adalah untuk mengontrol bilangan kecil data yang relevan, untuk menghindari data yang tidak sesuai dengan persyaratan penerbitan bursa sehingga tidak dapat memesan.

    • Kode kontrak berjangka Di FMZ, varietas perdagangan memiliki dua sifat jika itu adalah kontrak. Mereka disebut "pasangan perdagangan" dan "kode kontrak". Selain harus menetapkan pasangan perdagangan secara jelas pada saat disk dan retargeting, mereka juga perlu menetapkan kode kontrak khusus dalam parameter "kode varietas" pada template "Pine Language Trade Library". Misalnya kontrak permanen.swap, kode kontrak tergantung pada apakah bursa yang beroperasi memiliki kontrak tersebut. Misalnya, beberapa transaksi kontrak semua kuartal, di sini dapat diisiquarterKode kontrak ini sesuai dengan kode kontrak berjangka yang didefinisikan pada dokumentasi API bahasa FMZ Javascript/python/c++.

    Pengaturan lainnya, misalnya, jumlah subset minimal, jumlah subset default, dan lain-lain dapat dilihat di dokumen bahasa Pine tentang"Pine Language Exchange Library" (Lembaga Pertukaran Bahasa Pine)Perkenalan parameter.

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

    Di platform FMZ, ada tiga fitur tambahan untuk debugging.

    • runtime.debugFungsi ini biasanya tidak digunakan untuk mencetak informasi variabel di console.

    • runtime.logFungsi khusus bahasa FMZ PINE.

      runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
      
    • runtime.error: ketika dipanggil, akan menyebabkan kesalahan saat dijalankan dan membawa pesan kesalahan yang ditentukan dalam parameter pesan.

      runtime.error(message)
      
  • 4, diperluas dalam fungsi gambar sebagianoverlayParameter

    Bahasa Pine di FMZ, fungsi gambarplotplotshapeplotchardan meningkat.overlayDukungan parameter untuk memungkinkan penentuan gambar pada gambar utama atau gambar sampingan.overlayPengaturantrueGambar di gambar utama, disetel kefalseMenggambar pada gambar sampingan. Menggunakan kebijakan Pine pada FMZ untuk membuat gambar sampingan dan gambar sampingan pada saat yang sama.

  • 5、syminfo.mintickMengambil nilai dari variabel internal

    syminfo.mintickVariabel built-in didefinisikan sebagai nilai minimum yang ditandai pada varietas saat ini.Perangkat nyata/PengamatanPada antarmuka, parameter templat dalam "Pine Language Trading Library" dapat mengontrol akurasi mata uang harga; akurasi mata uang harga diatur menjadi 2 yaitu harga akurat hingga dua digit desimal saat transaksi, di mana satuan pergerakan minimum harga adalah 0.01;syminfo.mintickNilai ini adalah 0.01.

  • Harga rata-rata dalam FMZ PINE Script adalah harga yang termasuk biaya

    Misalnya: harga pesanan adalah 8000, arah penjualan, jumlah 1 orang, harga rata-rata setelah transaksi tidak 8000, kurang dari 8000 (biaya termasuk biaya prosedur).

Dasar Bahasa Pine

Ketika mulai mempelajari dasar-dasar bahasa Pine, mungkin ada beberapa contoh instruksi, tata bahasa kode yang tidak kita kenal. Tidak masalah, kita dapat terlebih dahulu mengenal konsep, memahami tujuan pengujian, atau kita dapat mencari dokumentasi bahasa Pine FMZ untuk melihat petunjuk. Kemudian ikuti tutorial langkah demi langkah untuk semakin akrab dengan berbagai tata bahasa, instruksi, fungsi, variabel bawaan.

Pelaksanaan model

Pada awal belajar bahasa Pine sangat penting untuk memahami konsep-konsep terkait seperti proses pelaksanaan skrip bahasa Pine. Strategi bahasa Pine adalah operasi berbasis grafik yang dapat dipahami sebagai serangkaian perhitungan dan operasi yang dilakukan pada grafik dengan urutan urutan waktu yang dimulai dari data paling awal yang telah dimuat. Jumlah data yang dimuat awal grafik terbatas.bar_indexReferensi ke nilai indeks dari K-lineBar saat skrip Pine dijalankan.

plot(bar_index, "bar_index")

img

plotFungsi adalah salah satu fungsi yang akan kita gunakan lebih banyak di masa depan. Penggunaannya sangat sederhana, yaitu menggambar garis pada grafik berdasarkan parameter yang ditransfer, data yang ditransfer adalahbar_indexLalu, garis ini diberi namabar_indexAnda dapat melihat bahwa pada baris pertama Bar yang disebut bar_index, nilai bar adalah 0, dan bar bertambah ke kanan dengan bertambahnya 1.

Strategi yang berbeda-beda tergantung pada pengaturan dan model pelaksanaan strategi yang berbeda-beda, dibagi menjadi:收盘价模型dan实时价模型◎ Konsep model harga close, model harga real time, telah kami jelaskan sebelumnya.

  • Model Harga Penutupan

    Ketika kode strategi dijalankan, siklus K-line Bar saat ini telah selesai, dan siklus K-line telah berakhir saat K-line ditutup. Saat ini, logika kebijakan Pine dijalankan lagi, dan sinyal perdagangan yang dipicu akan dijalankan pada awal Bar-line K berikutnya.

  • Model harga real-time

    Ketika kode strategi dijalankan, K-line Bar saat ini akan dieksekusi secara otomatis, dengan setiap perubahan pasar akan dieksekusi dengan logika strategi Pine.

Ketika kebijakan bahasa Pine dijalankan dari kiri ke kanan pada grafik, K-lineBar pada grafik dibagi menjadi历史Bardan实时BarDi bawah ini:

  • Sejarah Bar

    Ketika kebijakan yang diatur untuk "Model Harga Nyata" dimulai, semua K-line Bar di grafik kecuali yang paling kanan adalah K-line Bar.历史Bar◎ Logika strategis di setiap akar历史BarAnda bisa melakukan ini hanya sekali saja. Saat kebijakan yang diatur sebagai "model harga penutupan" dimulai, semua Bar di grafik akan历史Bar◎ Logika strategis di setiap akar历史BarAnda bisa melakukan ini hanya sekali saja.

    Perhitungan berdasarkan sejarah Bar: Kode kebijakan dijalankan sekali pada status penutupan History Bar, dan kemudian kode kebijakan dilanjutkan pada waktu penutupan History Bar berikutnya, sampai semua History Bar dijalankan sekali.

  • Bar secara langsung

    Ketika kebijakan dijalankan ke garis K terakhir di sebelah kanan, Bar berubah menjadi Real-Time Bar. Setelah Real-Time Bar ditutup, Bar ini berubah menjadi Real-Time Bar yang telah berlalu (menjadi Bar Sejarah).

    Ketika strategi yang diatur sebagai "model harga real-time" mulai dijalankan, setiap perubahan pasar di real-time Bar akan melakukan satu logika strategi. Strategi yang diatur sebagai "Model Harga Penutupan" tidak menampilkan real-time Bar pada grafik saat dijalankan.

    Perhitungan berdasarkan waktu nyata Bar: Jika Anda menetapkan kebijakan untuk "Model Harga Penutupan" dan grafik tidak menunjukkan Bar secara real-time, kode kebijakan hanya akan dijalankan sekali pada saat penutupan Bar saat ini. Jika Anda mengatur kebijakan sebagai "Model Harga Nyata" pada real-time Bar, maka perhitungan dan sejarah Bar akan berbeda, dan pada real-time Bar, setiap perubahan pasar akan dieksekusi dengan kode kebijakan; misalnya, variabel bawaan.highlowclosePada Bar riil, nilai-nilai ini berubah setiap kali pasar mungkin berubah. Jadi data seperti indikator yang dihitung berdasarkan nilai-nilai ini juga akan berubah secara real time.close"Selama ini, saya tidak bisa melihat apa yang terjadi", katanya.highdanlowSelalu mewakili titik tertinggi dan terendah tertinggi yang dicapai sejak awal Realtime Bar saat ini. Variabel built-in ini mewakili nilai akhir saat Realtime Bar terakhir diperbarui.

    Mekanisme rollback saat menjalankan strategi di Real-time Bar (model harga real-time): Dalam implementasi Bar secara real-time, variabel yang didefinisikan pengguna yang di-reset sebelum setiap iterasi baru dari kebijakan dijalankan disebut rollback. Untuk memahami mekanisme rollback, kita akan menggunakan contoh di bawah ini untuk menguji kode.

    Perhatikan:

    /*backtest 
    ...
    ..
    .
    */
    

    Konten paket adalah informasi konfigurasi retest yang disimpan dalam bentuk kode 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

    Kita hanya melihat adegan yang dilakukan dalam waktu nyata, jadi kita menggunakannot barstate.ishistoryPembatasan ekspresi hanya digunakan untuk penjumlahan pada variabel n pada waktu nyata Bar, dan digunakan sebelum dan sesudah melakukan operasi penjumlahanruntime.logFungsi output informasi di log kebijakan.plotKurva n yang digambar dapat dilihat bahwa n selalu 0 ketika kebijakan berjalan di Bar sejarah. Operasi n ditambah 1 dipicu ketika dijalankan ke Real Bar, dan operasi n ditambah 1 dilakukan setiap putaran kebijakan yang dijalankan di Real Bar. Dari informasi log dapat dilihat bahwa n disetel kembali ke nilai yang akhirnya dikirimkan oleh kebijakan yang dijalankan sebelumnya setiap putaran baru. Saat kode kebijakan yang dijalankan di Real Bar terakhir kali dikirimkan, nilai n diperbarui, sehingga dapat dilihat bahwa grafik dimulai dari Real Bar di atas, kurva n meningkat dengan nilai 1 setiap kali Bar menambahkan kurva waktu n.

    Di sini, saya akan membahas beberapa hal. 1, Ketika kebijakan mulai dijalankan di real-time Bar, satu kode kebijakan akan dieksekusi untuk setiap pembaruan. 2, saat dieksekusi pada real-time Bar, variabel akan dibalik sebelum setiap kali kode kebijakan dijalankan. 3, ketika dijalankan pada real-time Bar, variabel dikirimkan satu kali pada saat pembaruan penutupan.

    Operasi gambar seperti kurva pada grafik juga mungkin menyebabkan penulisan ulang karena data bergulir kembali, misalnya kita mengubah kode tes yang baru saja kita lakukan, tes real-time:

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

    Gambar saat Aimg

    Gambar saat Bimg

    Kami hanya mengubah kalimat ini:n := open > close ? n + 1 : n, saat ini real-time Bar adalah garis kemiringan (misalnya, harga buka lebih tinggi dari harga tutup) hanya memberikan n plus 1; dapat dilihat pada grafik pertama (misalnya, saat A) karena saat itu harga buka lebih tinggi dari harga tutup (misalnya, garis kemiringan) maka n ditambah 1, nilai yang ditampilkan pada kurva grafik n adalah 5; kemudian perubahan tren, pembaruan harga seperti yang ditampilkan pada grafik kedua (misalnya, saat B); saat ini harga buka lebih rendah dari harga tutup (misalnya, garis kemiringan), nilai n bergulir kembali dan tidak ada tambahan 1; kurva n juga segera digambar ulang dalam grafik, saat n pada kurva adalah 4; sehingga sinyal yang ditampilkan pada grafik real-time Bar adalah tidak pasti, mungkin berubah.

  • Konten variabel dalam fungsi

    Di bawah ini kita akan mempelajari variabel dalam fungsi bahasa Pine. Menurut beberapa tutorial Pine, variabel dalam fungsi berbeda dengan variabel di luar fungsi:

    Sejarah variabel deret yang digunakan dalam fungsi Pine dibuat oleh setiap panggilan berturut-turut terhadap fungsi tersebut. Jika tidak ada panggilan fungsi pada setiap kolom yang dijalankan oleh skrip, ini akan menyebabkan perbedaan antara nilai sejarah dalam dan seri eksternal dari fungsi lokal. Oleh karena itu, jika tidak ada panggilan fungsi pada setiap kolom, maka seri yang menggunakan nilai indeks yang sama dalam fungsi dan referensi eksternal tidak akan merujuk pada titik sejarah yang sama.

    Tidak apa-apa, kita akan mencari tahu dengan menggunakan kode uji coba yang berjalan 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)
    

    Penjelasan layar berjalan

    img

    Kode pengujian relatif sederhana, terutama untuk memeriksa data yang dikutip dalam dua cara, yaitu:f(a) => a[1]danf2() => close[1]

    • f(a) => a[1]Cara Menggunakan Parameter Pass: Fungsi Kembali Akhira[1]

    • f2() => close[1]: Menggunakan Variabel Terbentuk LangsungcloseDan fungsi ini akan kembali pada akhirnya.close[1]

    []Simbol digunakan untuk operasi referensi terhadap nilai historis dari variabel seri data, close[1] yang mengacu pada data harga penutupan pada satu Bar sebelum harga penutupan saat ini. Secara total, kode pengujian kami menggambar 4 data pada grafik:

    • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")Menggambar sebuah karakter A A, berwarna merah, yang digambar ketika oneBarInTwo benar, dan posisi yang digambar (di 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")Menggambar sebuah karakter B yang berwarna hijau, dan menggambarnya hanya jika oneBarInTwo benar, dan posisi yang digambarkannya (di sumbu Y) adalah:f2()Nilai yang dikembalikan.

    • plot(close[2], title = "close[2]", color = color.red, overlay = true)Garis gambar, berwarna merah, dan letaknya (di sumbu Y) adalah:close[2]Itu adalah harga penutupan pada Bar pada garis kedua sebelum Bar saat ini (dengan garis dua ke kiri).

    • plot(close[1], title = "close[1]", color = color.green, overlay = true)Garis, berwarna hijau, dan letaknya (di sumbu Y) adalah:close[1]Itu adalah harga penutupan pada Bar pada garis depan Bar saat ini (satu garis ke kiri).

    Gambar dapat dilihat saat menjalankan retargeting dengan strategi, meskipun gambar A menandai fungsi yang digunakanf(a) => a[1]Fungsi yang digunakan untuk menandai gambar Bf2() => close[1]Semua digunakan[1] untuk mengacu pada data historis pada seri data, tetapi posisi tanda "A" dan "B" pada grafik sama sekali berbeda. Posisi tanda "A" selalu jatuh pada garis merah, yaitu kode dalam strategi.plot(close[2], title = "close[2]", color = color.red, overlay = true)Di garis yang digambar, data yang digunakan adalahclose[2]

    img

    Itu karena kita menggunakan indeks K-lineBar, yaitu variabel built-in.bar_indexPerhitungan apakah menggambar tanda "A" dan "B". Tanda "A" dan "B" tidak menggambar grafik pada setiap garis KBar.f(a) => a[1]Nilai yang dirujuk dengan cara ini, jika fungsi tidak dipanggil pada setiap bar, akan dihubungkan dengan fungsi.f2() => close[1]Cara ini merujuk pada nilai yang berbeda (meskipun menggunakan indeks yang sama seperti [1]).

  • Beberapa fungsi built-in perlu dihitung pada setiap Bar untuk menghitung hasilnya dengan benar

    Di sini, saya akan menjelaskan beberapa contoh sederhana:

    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 memanggilnya dengan kode.ta.barssince(close < close[1])Ditulis dalam sebuah operator 3D.condition ? value1 : value2"Saya tidak tahu apa yang akan terjadi", katanya.close > close[1]时去调用ta.barssince函数。可偏偏ta.barssinceFungsi ini dihitung dari terakhir kali.close < close[1]Jumlah baris K pada saat pembentukan; jika ta.barssince dipanggil, maka close > close[1], yaitu harga penutupan saat ini lebih besar dari harga penutupan Bar sebelumnya, dan bila ta.barssince dipanggil, maka kondisinya close < close[1] tidak berlaku, dan tidak ada posisi pembentukan terakhir.

    Ta.barssince: Pada saat dipanggil, fungsi ini akan mengembalikan na jika kondisinya tidak pernah terpenuhi sebelum baris K saat ini.

    Gambar di bawah:

    img

    Jadi ketika menggambar, kita hanya menggambar data ketika variabel res memiliki nilai ((-1) ).

    Untuk menghindari masalah ini, kita hanya bisa menggunakanta.barssince(close < close[1])Panggilan fungsi diambil dari operator triad dan ditulis di luar cabang kondisi mana pun yang mungkin; sehingga ia melakukan perhitungan 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 waktu

Konsep urutan waktu sangat penting dalam bahasa Pine, dan merupakan konsep yang harus kita pahami ketika kita belajar bahasa Pine. Urutan waktu bukan jenis tetapi merupakan struktur dasar dari nilai kontinu variabel yang disimpan seiring waktu. Kita tahu bahwa skrip Pine didasarkan pada grafik, dan yang paling mendasar yang ditunjukkan dalam grafik adalah grafik K-bar.openadalah variabel built-in dari bahasa Pine, yang memiliki struktur untuk menyimpan urutan waktu untuk harga pembukaan setiap baris KBar.openStruktur deret waktu ini mewakili harga awal dari semua K-string Bar pada saat K-string Bar dimulai dari Bar pertama di mana K-string dimulai hingga saat skrip saat ini dijalankan. Jika K-string saat ini adalah siklus 5 menit, maka kita mengutip (atau menggunakan) kode dalam kode strategi Pine.openWaktu adalah harga awal dari K-lineBar saat kode strategi sedang dijalankan. Jika nilai sejarah dalam urutan waktu harus digunakan.[]Operator. Penggunaan ketika kebijakan Pine dijalankan pada garis K Bar.open[1]Menunjukkan referensiopenHarga awal dari K-line Bar sebelumnya (yaitu harga awal dari siklus K-line sebelumnya) yang dijalankan oleh skrip K-line Bar saat ini pada urutan waktu.

  • Variabel dalam urutan waktu sangat mudah untuk dihitung. Jadi kita bisa menggunakan fungsi built-in.ta.cumContoh:

    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 tes:

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

    Ada banyak yang serupa.ta.cumFungsi built-in seperti ini dapat langsung memproses data pada urutan waktu, sepertita.cumIni adalah menambahkan nilai yang sesuai dengan variabel yang dikirimkan pada setiap garis KBar, dan kemudian kita menggunakan grafik untuk memudahkan pemahaman.

    Proses Operasi Strategi Variabel bawaan bar_index v1 v2
    Strategi berjalan pada root 1 K line Bar 0 1 1
    Strategi ini berjalan pada root 2 K line Bar 1 1 2
    Strategi berjalan pada garis K baris ke-3 Bar 2 1 3
    Strategi ini berjalan pada garis N + 1 K Bar N 1 N+1

    Seperti yang dapat dilihat, sebenarnya v1, v2 atau bahkan bar_index adalah struktur urutan waktu, dengan data yang sesuai pada setiap Bar. Kode pengujian ini membedakan apakah "model harga real time" atau "model harga penutupan" hanya dengan menampilkan real time Bar pada grafik. Untuk mengukur kecepatan, kami menggunakan "model harga penutupan" untuk menguji kembali.

    img

    Karena variabel v1 adalah 1, pada setiap bar.ta.cum(v1)Fungsi ini dieksekusi pada baris pertama K Bar, dan karena hanya ada baris pertama Bar, hasilnya adalah 1, yang diberikan pada variabel v2. Ketikata.cum(v1)Pada saat dilakukan pada baris K kedua Bar, sudah ada 2 baris K Bar (bar_index pada baris pertama adalah 0, bar_index pada baris kedua adalah 1), sehingga hasil perhitungan adalah 2, memberikan nilai pada variabel v2, dan sebagainya.bar_indexJadi jika kita mulai dari 0 dan bertambah,bar_index + 1Pada dasarnya jumlah garis K Bar. Anda juga bisa melihat garis di grafik pengamatan.v2danbar_indexSaya tidak tahu apa yang terjadi di sana.

    img

    Dan saya juga bisa menggunakannya.ta.cumFungsi built-in menghitung jumlah harga penutupan dari semua Bar pada grafik saat ini, maka hanya bisa ditulis sebagai berikut:ta.cum(close), ketika kebijakan berjalan ke kanan real-time Barta.cum(close)Hasil yang dihitung adalah jumlah harga penutupan dari semua Bar di grafik (tidak berjalan ke kanan, hanya ditambahkan ke Bar saat ini).

    Variabel pada urutan waktu juga dapat dioperasikan dengan operator, seperti kode:ta.sma(high - low, 14)Menggunakan variabel built-inhigh(K-line Bar tertinggi) dikurangilow(K-line Bar harga terendah), digunakan terakhirta.smaFungsi mencari rata-rata.

  • Hasil panggilan fungsi juga meninggalkan jejak nilai dalam urutan waktu.

    v1 = ta.highest(high, 10)[1]
    v2 = ta.highest(high[1], 10)
    plot(v1, title="v1", overlay=true)
    plot(v2, title="v2", overlay=true)
    

    Kode uji ini berjalan saat uji ulang, dan dapat diamati bahwav1danv2Nilai yang sama, garis yang digambar pada grafik juga benar-benar tumpang tindih. Hasil dari panggilan fungsi yang dihitung akan meninggalkan jejak nilai dalam urutan waktu, misalnya kodeta.highest(high, 10)[1]Salah satunyata.highest(high, 10)Hasil yang dihitung oleh panggilan fungsi juga dapat digunakan[1] untuk mengutip nilai historisnya. Berdasarkan Bar sebelumnya pada Bar saat inita.highest(high, 10)Dan hasilnya adalah:ta.highest(high[1], 10)Jadi.ta.highest(high[1], 10)danta.highest(high, 10)[1]Saya tidak tahu apa yang akan terjadi.

    Menggunakan fungsi gambar lain untuk mengekspor informasi validasi:

    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 bahwa nilai variabel a dan variabel b dalam urutan waktu ditampilkan di atas dan di bawah Bar yang sesuai. Anda dapat menyimpan kode gambar ini selama belajar, karena dalam tes, percobaan mungkin seringkali perlu mengekspor informasi pada grafik untuk observasi.

    img

Struktur skrip

Struktur umum

Pada bagian awal tutorial, kami meringkas beberapa perbedaan antara penggunaan bahasa Pine di FMZ dan penggunaan bahasa Pine di Trading View.indicator()strategy()"Saya tidak akan mendukungnya", katanya.library()◦ Tentu saja, untuk kompatibilitas dengan skrip Pine versi sebelumnya, strategi yang ditulis saat menulis seperti://@version=5indicator()strategy()Jika Anda tidak memiliki akun Facebook, Anda tidak akan dapat mengakses situs web ini.strategy()Fungsi ini memiliki parameter yang berbeda-beda.

<version>
<declaration_statement>
<code>

<version>Informasi kontrol versi dapat dihilangkan.

Komentar

Bahasa Pine//Sebagai komentar satu baris, karena bahasa Pine tidak memiliki komentar multi baris. FMZ memperluas komentar/**/Untuk mengomentari beberapa baris.

Kode

Baris dalam skrip yang bukan komentar atau instruksi kompilasi adalah kalimat yang mengimplementasikan algoritma skrip. Sebuah kalimat bisa menjadi salah satu dari mereka.

  • Deklarasi Variabel
  • Penetapan ulang variabel
  • Deklarasi fungsi
  • Panggilan fungsi built-in, panggilan fungsi yang didefinisikan pengguna
  • ifforwhileatauswitchStruktur e.g.

Kalimat dapat disusun dengan berbagai cara

  • Beberapa pernyataan dapat diekspresikan dengan satu baris, seperti sebagian besar pernyataan variabel, yang hanya berisi satu baris panggilan fungsi atau pernyataan fungsi satu baris; yang lain, seperti struktur, selalu membutuhkan lebih dari satu baris karena mereka membutuhkan satu blok lokal.
  • Pernyataan dalam ruang lingkup global dari skrip (yaitu bagian yang tidak termasuk dalam bagian) tidak dapat digunakan untuk空格atau制表符(tab) dimulai. Karakter pertama mereka juga harus menjadi karakter pertama baris tersebut. Baris yang dimulai dari posisi pertama baris, oleh definisi, menjadi bagian dari ruang lingkup global skrip.
  • Struktur atau multi-baris pernyataan fungsi selalu membutuhkanlocal blockSebuah blok lokal harus terkuras menjadi satu karakter atau empat ruang (jika tidak, akan diselesaikan sebagai baris kode serial sebelumnya, yang ditentukan sebagai konten lanjutan dari baris kode sebelumnya), dan setiap blok lokal mendefinisikan ruang lingkup lokal yang berbeda.
  • Beberapa kalimat baris tunggal dapat disambung dalam satu baris dengan menggunakan koma ((,) sebagai tanda pemisah.
  • Satu baris dapat berisi komentar atau hanya komentar.
  • Garis juga bisa dibungkus (berlanjut di beberapa baris).

Misalnya, termasuk tiga blok lokal, satu dalam deklarasi fungsi kustom, dua dalam deklarasi variabel menggunakan struktur if, dengan kode sebagai berikut:

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

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

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

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

Pergantian kode

Baris panjang dapat dibagi menjadi beberapa baris, atau "dibungkus". Baris yang dibungkus harus menyusut ke dalam jumlah ruang apa pun, asalkan tidak merupakan kelipatan dari 4 (batas ini digunakan untuk menyusut bagian).

a = open + high + low + close

Ini dapat dibungkus sebagai (perhatikan bahwa jumlah ruang yang disempurnakan per baris tidak merupakan kelipatan dari 4):

a = open +
      high +
          low +
             close

Sebuah panggilan plot panjang dapat 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)

Pernyataan dalam deklarasi fungsi yang didefinisikan pengguna juga dapat dibungkus. Namun, karena blok lokal secara sintetis harus dimulai dengan penyusutan ((4 ruang atau 1 karakter), ketika membaginya ke baris berikutnya, bagian lanjutan dari pernyataan harus dimulai dengan lebih dari satu penyusutan ((tidak sama dengan kelipatan 4 ruang); misalnya:

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

Identifier dan operator

Pengidentifikasi

Sebelum memahami variabel, kita harus terlebih dahulu memahami konsep tanda baca. Kata baca yang umum digunakan adalah tanda baca.FungsidanVariabelNama dari (untuk menamai variabel, fungsi) ⇒FungsiSeperti yang akan kita pelajari di tutorial selanjutnya, kita mulailah dengan mempelajari simbol-simbol yang digunakan.

  • 1, identifier harus ditulis besar.(A-Z)atau huruf kecil(a-z)Huruf atau garis bawah(_)Awalnya, sebagai karakter pertama dari identifier.
  • 2, karakter berikutnya setelah karakter pertama identifier bisa menjadiHurufGaris bawahatauAngka
  • 3, nama-nama identifier ditulis dengan huruf besar dan kecil.

Misalnya, identifier dengan nama berikut:

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

Seperti kebanyakan bahasa pemrograman, bahasa Pine juga memiliki saran penulisan.

  • 1, semua huruf besar digunakan untuk menamai konstanta.
  • 2, PenggunaanAturan Gunung Merapi KecilNama yang digunakan untuk identifier lainnya.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

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

Operator

Operator adalah beberapa simbol operasi yang digunakan dalam bahasa pemrograman untuk membangun ekspresi, dan ekspresi adalah aturan perhitungan yang dirancang untuk tujuan perhitungan tertentu ketika kita menulis kebijakan. Operator dalam bahasa Pine diklasifikasikan berdasarkan fungsi sebagai:

Operator penentuan nilai, operator hitung, operator perbandingan, operator logis,? :Operator tiga digit,[]Operator referensi sejarah.

Operator dengan aritmatika*Sebagai contoh, untuk membedakan jenis masalah yang disebabkan oleh operator bahasa Pine pada Trading View yang mengembalikan hasil, ada kode pengujian 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)

Ketika Anda menjalankan skrip ini di Trading View, Anda akan mendapatkan laporan kesalahan karena:adjustedLength = lenInput * factorJadi hasilnya adalah:series intJenis (serial), namunta.emaParameter kedua fungsi tidak mendukung tipe ini. Namun pada FMZ tidak ada batasan ketat seperti itu, dan kode di atas dapat berjalan dengan baik.

Di bawah ini kita akan melihat penggunaan berbagai operator.


Operator pemberian nilai

Ada dua jenis operator pemberian nilai:=:=Kami telah melihat beberapa contoh di bagian awal tutorial ini.

=Operator digunakan untuk memberi nilai pada variabel pada saat initialization atau deklarasi.=Variabel setelah initialization, declaration assignment akan dimulai dengan nilai ini pada setiap Bar berikutnya. Ini adalah pernyataan variabel yang valid:

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)

Hati-hatia = closePernyataan pemberian, pada setiap Bar variabel a adalah harga penutupan Bar saat ini (close); variabel lainnyabcdPada saat yang sama, sistem ini juga dapat digunakan untuk mengontrol suhu udara.

:=Digunakan untuk menugaskan kembali nilai ke variabel yang ada, yang dapat dipahami secara sederhana sebagai penggunaan:=Operator digunakan untuk memodifikasi nilai variabel yang telah dinyatakan, initialized. Jika digunakan:=Operator akan memberikan kesalahan pada pemesanan variabel yang tidak initialized atau dinyatakan, misalnya:

a := 0

Jadi, apa yang terjadi?:=Operator penugasan umumnya digunakan untuk penugasan ulang variabel yang sudah ada, misalnya:

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

plot(b)

Pertimbangkan apakahclose > open(yaitu BAR saat ini adalah garis lintang), variabel a adalah benar (true); akan mengeksekusi kode di blok lokal dari pernyataan ifb := b + 1, menggunakan operator penugasan:=Atur kembali nilai untuk b, tambah 1; lalu gunakan fungsi plot untuk menggambar nilai variabel b pada setiap BAR dalam grafik, disambungkan menjadi baris.

Apakah kita berpikir bahwa munculnya garis lintang BAR, b akan terus ditambahkan ke 1? Tentu saja tidak, di sini kita memberikan pernyataan untuk variabel b, tidak menggunakan kata kunci apa pun untuk menentukan ketika initialized menjadi 0.b=0Jadi Anda dapat melihat bahwa hasil dari menjalankan kode ini adalah setiap kali variabel b disetel kembali ke 0, jika variabel a adalah benar, maka itu sesuai.close > openJadi b akan ditambahkan ke 1 saat menjalankan kode pada putaran ini, dan b akan ditugaskan ke 0 pada putaran berikutnya. Ini juga merupakan tempat yang mudah untuk pemula bahasa Pine.

Jika kita berbicara tentang operator pemberian, maka kita harus memperluas penjelasan tentang dua kata kunci:varvarip

  • VAR

    Kata kunci ini sebenarnya telah kita lihat dan gunakan di tutorial sebelumnya, hanya saja tidak dibahas secara detail saat itu. Mari kita lihat deskripsi kata kunci ini:

    var adalah kata kunci yang digunakan untuk mendistribusikan dan menginisialisasi variabel sekaligus. Biasanya, sintaksis pembagian variabel tanpa kata kunci var akan menyebabkan nilai variabel tertutup setiap kali data diperbarui. Sebaliknya, ketika menggunakan kata kunci var untuk mendistribusikan variabel, mereka masih dapat mempertahankan status yang tidak stabil meskipun data diperbarui.

    Kita masih menggunakan contoh ini, hanya saja kita menggunakannya ketika kita memberi b nilai.varKata Kunci:

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

    varKata kunci yang memungkinkan variabel b hanya melakukan penentuan pertama yang awalnya, dan tidak akan menetapkan kembali b ke 0 setiap kali menjalankan logika strategi, sehingga garis yang ditarik dari saat dijalankan dapat diamati bahwa b adalah pengukuran kembali jumlah sinar matahari BAR yang muncul pada saat garis K BAR saat ini.

    Variabel yang dinyatakan var tidak hanya dapat ditulis secara global, tetapi juga dapat ditulis dalam blok kode, 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 mempertahankan harga penutupan dari baris tiang pertama dalam seri. Variabel aluminium b mempertahankan harga penutupan bar harga aluminium hijau pertama dalam seri. Variabel berwarna c berwarna c mempertahankan harga penutupan dari berwarna hijau berwarna c yang merupakan yang kesepuluh dalam seri tersebut.

  • bermacam-macam

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

    varip (var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel sekaligus. Ini mirip dengan kata kunci var, tetapi variabel yang menggunakan deklarasi varip mempertahankan nilainya di antara pembaruan baris K secara real-time.

    Tidak apa-apa, kita akan menjelaskan dengan contoh, dan itu mudah dimengerti.

    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
    

    Kode uji ini tampil berbeda pada "Model Harga Penutupan" atau "Model Harga Nyata":

    Model harga secara real time: Ingat strategi yang kita bahas sebelumnya, ketika menjalankan, ada dua tahap, yaitu tahap BAR historis, dan tahap BAR real-time?varvaripVariabel yang dinyatakaniiiOperasi inkremental dilakukan pada setiap putaran pelaksanaan kode strategi. Jadi kita dapat melihat bahwa setiap angka yang ditampilkan pada garis K BAR pada hasil retrospeksi berinkremental satu per satu.i := i + 1danii := ii + 1Perbedaan adalah bahwa ii setiap kali diubah. Meskipun setiap kali diubah, i akan kembali ke nilai sebelumnya saat menjalankan logika kebijakan berikutnya. (Ingat mekanisme mundur yang kita jelaskan di bagian "Eksekusi Model" sebelumnya?), Nilai i tidak ditentukan sampai pembaruan garis K saat ini BAR selesai.

    Model harga penutupan: Karena model harga penutupan adalah logika strategi yang dijalankan satu kali setiap garis K BAR habis. Jadi dalam model harga penutupan, variabel deklarasi var,varip pada tahap garis K sejarah dan fase garis K real-time secara inkremental menunjukkan kesamaan dalam contoh di atas, yaitu setiap garis K BAR inkremental 1.


Operator aritmatika
Operator Penjelasan
+ Bahasa Prancis
- Undang-undang Pengurangan
* Perkalian
/ Kecuali
% Mencari model

+-Operator dapat digunakan sebagai operator biner atau sebagai operator prima. Operator aritmatika lainnya hanya dapat digunakan sebagai operator biner dan akan memberikan kesalahan jika digunakan sebagai operator prima.

1, operator aritmatika kedua sisi adalah tipe angka, hasilnya adalah tipe angka, integer atau floating point, tergantung pada hasil operasi. Jika salah satu dari operator adalah string, maka operator adalah+, maka hasil perhitungan akan menjadi string, nilai akan dikonversi menjadi bentuk string, dan kemudian string akan digabungkan. Jika operator aritmatika lainnya, maka akan mencoba untuk mengkonversi string menjadi nilai, dan kemudian dioperasikan. 3, jika salah satu operator adalah na, maka hasil perhitungan adalah null na, yang akan ditampilkan pada NaN saat dicetak di 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 berbeda dengan bahasa Pine di Trading View, karena bahasa Pine di FMZ tidak terlalu ketat dalam hal persyaratan tipe variabel.

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

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

Operasi ini dapat dilakukan pada FMZ, tetapi akan memberikan kesalahan tipe pada trading view. Untuk operator aritmatika, sistem akan menghitung setelah mengubah string menjadi nilai. Jika string non-nomer tidak dapat dihitung, hasil operasi sistem adalah null na.


Operator perbandingan

Operator perbandingan adalah operator biner.

Operator Penjelasan
< kurang dari
> Lebih besar dari
<= kurang dari sama dengan
>= Lebih besar dari
== sama
!= Perbedaan

Contoh uji coba:

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 sederhana untuk digunakan, tetapi ini juga merupakan operator yang paling banyak kita gunakan saat menulis kebijakan. Anda dapat membandingkan nilai-nilai maupun variabel built-in, misalnya.closeopenDan seterusnya. Seperti operator operasi, pada FMZ berbeda dengan Pine di Trading View, FMZ tidak memiliki tipe persyaratan yang sangat ketat, jadi pernyataan seperti inid = "1" >= 2Pada FMZ tidak ada kesalahan yang dikembalikan. Pada saat menjalankan, string dikonversi menjadi nilai sebelum perbandingan dilakukan. Pada Trading View, kesalahan dikembalikan.


Operator logis
Operator Simbol kode Penjelasan
Tidak Tidak Operator unik, tidak dioperasikan
dengan dan Operator biner, yang bekerja dengan () dan ()
atau atau Operator biner, atau operasi

Jika kita berbicara tentang operator logis, maka kita harus berbicara tentang tabel nilai sebenarnya. Seperti yang kita pelajari di sekolah tinggi, hanya saja di sini kita melakukan pengujian di sistem retrospektif, 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 mencegah sistem retrospektif yang terus menerus mencetak informasi mempengaruhi pengamatan, kami menggunakanruntime.error("stop")Setelah melakukan pencetakan, kesalahan yang luar biasa membuat pencetakan berhenti, kemudian informasi yang keluar dapat dilihat, dan dapat ditemukan bahwa isi yang dicetak dan tabel nilai sebenarnya sama.


Operator 3

Menggunakan operator 3? :Ekspresi tiga dimensi yang dibuat dari kombinasi operatorcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseKita sudah terbiasa dalam pelajaran sebelumnya. Istilah ekspresi tiga dimensi, operator tiga dimensi, berarti ada tiga operasi.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseDi sini,conditionJika benar, maka nilai dari ekspresi adalah:valueWhenConditionIsTrueJikaconditionJadi nilai dari ekspresi hipotesis adalahvalueWhenConditionIsFalse

Meskipun tidak ada gunanya secara praktis, namun contoh yang 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 masalah! Ekspresi tiga dimensi juga dapat disematkan, seperti yang telah kita lakukan di 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 sama saja dengancondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseDi dalamvalueWhenConditionIsTruevalueWhenConditionIsFalse, juga menggunakan ekspresi tiga kata lain sebagai gantinya.


Operator sejarah

Menggunakan operator sejarah[], nilai historis pada urutan waktu referensi. Nilai historis ini adalah nilai pada variabel pada baris K sebelum baris K BAR saat skrip berjalan.[]Operator digunakan setelah panggilan variabel, ekspresi, atau fungsi.[]Nilai dalam tanda kurung ini adalah jumlah pergeseran data sejarah yang ingin kita kutip dari jarak BAR garis K saat ini. Misalnya, jika saya ingin kutip harga penutupan dari garis K BAR sebelumnya, saya menuliskan:close[1]

Kami telah melihat tulisan seperti ini di kelas sebelumnya:

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

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

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

Anda mungkin melihat di sini, beberapa teman saya akan mengatakan, operator.[]Ini adalah struktur seri, yang terlihat seperti seri dan array. Di bawah ini kita akan menggunakan contoh untuk menunjukkan perbedaan antara seri 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")

Meskipuna = close[1][2]Dia mengatakan, "Saya tidak tahu apa yang akan terjadi.

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

Jika kita membaca secara terpisah, maka tidak akan ada kesalahan, jika kita memahami secara normal, maka kita akan melihat bahwa dalam bentuk yang berbeda.b = close[1]Setelah penyesuaian, b seharusnya menjadi nilai, namunc = b[1], b masih dapat digunakan lagi untuk merujuk nilai sejarah menggunakan operator sejarah. Konsep seri dalam bahasa Pine terlihat tidak sesederhana sebuah aritmatika. Hal ini dapat dipahami sebagai nilai sejarah pada Bar sebelumnya yang dekat, dan b juga merupakan struktur deret waktu, yang dapat terus merujuk nilai sejarahnya. Jadi kita melihat bahwa dalam tiga garis a, b, dan c yang digambarkan, garis b lebih lambat dari garis a dengan satu BAR, garis c lebih lambat dari garis b dengan satu BAR. C lebih lambat dari a dengan dua BAR.

Kita dapat menarik grafik ke kiri dan melihat bahwa pada baris K pertama, nilai b dan c sama-sama null. Ini karena ketika skrip dijalankan pada baris K pertama BAR, referensi ke depan adalah satu, nilai sejarah dua siklus tidak ada, tidak ada. Jadi kita harus sering memperhatikan ketika menulis kebijakan, apakah referensi data sejarah akan mengacu pada null, jika tidak hati-hati menggunakan null akan menyebabkan berbagai perbedaan perhitungan, bahkan mungkin mempengaruhi real-time BAR.nanzJika kita menggunakan fungsi built-in untuk menilai (pada kenyataannya kita pernah melakukan hal ini dalam pelajaran sebelumnya)nznaFungsi, ingat di bagian mana?) secara khusus menangani situasi dengan nilai kosong, misalnya:

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

Ini adalah pengolahan untuk kemungkinan referensi ke nilai kosong ((na)).


Prioritas operator

Kita telah mempelajari banyak operator bahasa Pine yang membentuk ekspresi dengan berbagai kombinasi dari operator dan bilangan operasi. Jadi bagaimana prioritas operasi ini ketika menghitung dalam ekspresi? Seperti operasi keempat yang kita pelajari di sekolah, ada perkalian, perkalian, perkalian, perkalian, dan perkalian ditambah pengurangan.

Prioritas Operator
9 []
8 Operator yang digunakan pada saat+-dannot
7 */%
6 Operator biner saat+-
5 ><>=<=
4 ==!=
3 and
2 or
1 ?:

Bagian ekspresi yang memiliki prioritas tinggi dioperasikan terlebih dahulu, dan jika prioritasnya sama, dioperasikan dari kiri ke kanan.()Dengan demikian, Anda tidak akan dapat menghemat banyak uang.

Variabel

Deklarasi Variabel

Kita telah mempelajari konsep tanda tanda acak sebelumnya, yaitu tanda acak yang digunakan sebagai nama variabel untuk memberi nama variabel. Jadi, variabel adalah tanda yang menyimpan nilai. Jadi bagaimana cara menyatakan variabel?

  • Model pernyataan: Pada saat menyatakan variabel, yang pertama ditulis adalah "Mode Deklarasi". Ada tiga mode deklarasi variabel: 1. Gunakan kata kuncivarAku tidak tahu. 2. Gunakan kata kuncivaripAku tidak tahu. Tidak ada yang ditulis.

    varvaripKata kunci sebenarnya telah kita pelajari di bagian sebelumnya "Operator Assignment" dan tidak akan dibahas lagi di sini. Jika pola deklarasi variabel tidak menulis apa pun, misalnya kalimat:i = 1, sebenarnya kita telah berbicara sebelumnya bahwa variabel yang dinyatakan seperti itu dan penugasan, dilakukan pada setiap baris KBAR.

  • Jenis Bahasa Pine pada FMZ tidak terlalu ketat pada persyaratan tipe, dan umumnya dapat diabaikan. Namun untuk kompatibilitas dengan kebijakan skrip pada Trading View, variabel juga dapat dinyatakan dengan tipe. Misalnya:

    int i = 0 
    float f = 1.1
    

    Tipe pada Trading View lebih ketat, dan akan memberikan kesalahan jika menggunakan kode berikut di Trading View:

    baseLine0 = na          // compile time error!
    
  • Pengidentifikasi Identifier adalah nama variabel, nama identifier telah dibahas di bab sebelumnya, dan dapat dilihat kembali:https://www.fmz.com/bbs-topic/9390#标识符

Jadi, untuk menyimpulkan, menyatakan suatu variabel dapat ditulis sebagai:

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

Di sini, operator pemberian nilai digunakan:=Variabel diberi nilai ketika dinyatakan. Nilai dapat berupa string, angka, ekspresi, panggilan fungsi, atau kata kunci.ifforwhileatauswitchStruktur lain (kata kunci struktural, penggunaan kalimat, dan lain-lain akan dijelaskan lebih lanjut dalam pelajaran selanjutnya, sebenarnya kita telah belajar tentang pemberian kalimat if sederhana di kelas sebelumnya, kita bisa melihat kembali).

Di sini kita fokus pada fungsi input, yang merupakan fungsi yang sering kita gunakan dalam merancang kebijakan.

Fungsi input:

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

Fungsi input pada FMZ sedikit berbeda dari pada Trading View, meskipun fungsi ini digunakan sebagai input penugasan parameter strategi. Di bawah ini kita akan menjelaskan secara rinci penggunaan fungsi input pada FMZ dengan sebuah contoh:

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 pada FMZ akan secara otomatis menggambarkan kontrol yang digunakan untuk mengatur parameter kebijakan di antarmuka kebijakan FMZ. Kontrol yang didukung pada FMZ saat ini memiliki kotak input angka, kotak input teks, dropbox, bullet check.

img

Kita akan membahas beberapa parameter utama dari fungsi input:

  • defval: sebagai default dari opsi parameter kebijakan yang ditetapkan untuk fungsi input, mendukung variabel, angka, dan string built-in dari bahasa Pine
  • title: nama parameter yang ditampilkan pada interface kebijakan pada cakram nyata / retested.
  • tooltip: Tip dari parameter kebijakan, yang menampilkan informasi teks tentang pengaturan parameter ini ketika mouse Anda berhenti di atas parameter kebijakan.
  • group: nama pengelompokan parameter kebijakan yang dapat diberikan kepada parameter pengelompokan.

Selain pernyataan variabel yang terpisah, pembagian, bahasa Pine juga memiliki tulisan yang menyatakan sekelompok variabel dan pembagian:

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

Yang paling umum adalah kita menggunakanta.macdKetika fungsi menghitung indikator MACD, karena indikator MACD adalah indikator multi-baris, tiga set data dihitung. Jadi dapat 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 kode di atas, kita dapat dengan mudah menggambar grafik MACD. Selain fungsi built-in yang dapat mengembalikan beberapa variabel, fungsi kustom yang ditulis juga dapat mengembalikan beberapa 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 pemberian beberapa variabel juga mirip dengan cara menulis 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 kondisional

Beberapa fungsi tidak dapat ditulis di blok kode lokal yang memiliki cabang kondisional, terutama beberapa fungsi berikut:

barcolor ((), fill ((), hline ((), indicator ((), plot ((), plotcandle ((), plotchar ((), plotshape (()

Trading View akan mengkompilasi laporan kesalahan. Perbatasan FMZ tidak terlalu ketat, tetapi juga disarankan untuk mengikuti peraturan penulisan di Trading View. Misalnya, meskipun tidak melaporkan kesalahan di FMZ, tetapi tidak disarankan untuk menulisnya.

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

Bahasa if


Lebih banyak