Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Dibuat di: 2022-05-30 16:23:43, diperbarui pada: 2022-09-28 17:10:21
comments   0
hits   8860

[TOC]

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Tutorial video: Apakah sulit untuk memulai trading dengan trading view? Mulai dari bahasa Pine hingga Quant - Penginapan awal bahasa Pine

Inventor Quantum Trading Platform mendukung strategi penulisan bahasa Pine, mendukung feedback, menjalankan strategi bahasa Pine secara langsung, kompatibel dengan versi bahasa Pine yang lebih rendah.Strategi PersegiAda banyak strategi Pin yang dikumpulkan dan dipindahkan.

FMZ tidak hanya mendukung bahasa Pine, tetapi juga mendukung fitur gambar yang kuat dalam bahasa Pine. Fitur-fitur yang ada di platform FMZ, alat praktis yang kaya, manajemen yang efisien dan mudah, juga meningkatkan kepraktisan strategi Pine (script). FMZ didasarkan pada kompatibilitas dengan bahasa Pine, dan pada saat yang sama melakukan beberapa perluasan, pengoptimalan, dan pemotongan pada bahasa Pine.

Perbandingan ini dapat dilihat dari beberapa perbedaan yang jelas:

  • 1 . Kebijakan Pine di FMZ, kode awal versi//@versiondimulai dengan kodestrategyindicatorPenjelasan tidak diwajibkan, sementara FMZ tidak mendukungimportImporlibraryfungsi.

Mungkin Anda melihat beberapa strategi yang ditulis 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 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 disimpulkan sebagai:

  src = close
  a = ta.sma(src, 5)
  b = ta.sma(src, 50)
  c = ta.cross(a, b)
  plot(a, color = color.blue, overlay=true)
  plot(b, color = color.black, overlay=true)
  plotshape(c, color = color.red, overlay=true)

Atau:

  longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
  if (longCondition)
      strategy.entry("My Long Entry Id", strategy.long)

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)
  • 2 , Strategi (script) Beberapa pengaturan yang terkait dengan transaksi diatur oleh parameter “Pine Language Transaction Class Library” di antarmuka kebijakan FMZ.

    • Model harga close out vs model harga real time Dalam trading view, kita bisa melihatstrategyFungsicalc_on_every_tickParameter untuk mengatur skrip kebijakan untuk melakukan logika kebijakan secara real-time setiap kali harga berubah.calc_on_every_tickParameter harus disetel ketrueSecara defaultcalc_on_every_tickParameternya adalahfalseJadi, jika kita menggunakan Kbar, maka kita akan melakukan strategi logik hanya setelah Kbar yang ada pada saat itu selesai. Pada FMZ, pengaturan dilakukan dengan menggunakan parameter dari template “Pine Language Exchange Class Repository”.

    Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

    • Akurasi pengendalian nilai-nilai seperti harga, jumlah pesanan, dan lain-lain pada saat pelaksanaan strategi perlu ditentukan di FMZ Dalam trading view karena hanya dapat melakukan tes simulasi, sehingga tidak ada masalah akurasi real-time order. Dalam FMZ adalah real-time dapat menjalankan strategi pin. Maka diperlukan strategi yang dapat fleksibel menentukan jenis perdagangan harga akurasi, pesanan jumlah akurasi.

    • Kode kontrak berjangka Varian perdagangan di FMZ jika kontrak, ada 2 sifat. “pasangan perdagangan” dan “kode kontrak”. Selain perlu mengatur pasangan perdagangan secara jelas di real time dan retrospeksi, Anda juga perlu mengatur kode kontrak tertentu dalam parameter “kode varietas” dari template “Pine Language Trading Classroom”. Misalnya, kontrak berlanjut diisiswap, Kode kontrak Untuk melihat apakah ada kontrak seperti itu di bursa yang dioperasikan. Sebagai contoh, semua kontrak kuartal dari beberapa transaksi dapat diisi di siniquarterKode kontrak ini sesuai dengan kode kontrak berjangka yang didefinisikan pada dokumen API bahasa Javascript/python/c++ FMZ.

Pengaturan lain seperti minimum order, default order, dan lain-lain dapat dilihat dalam dokumentasi bahasa Pine tentang“Pine Language Exchange”Pengantar parameter.

  • 3、runtime.debugruntime.logruntime.errorFungsi dari ekstensi FMZ untuk debug 。

Di platform FMZ, 3 fungsi baru ditambahkan untuk debugging.

  • runtime.debug: Fungsi 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: dapat menyebabkan kesalahan saat menjalankan dan membawa pesan kesalahan yang ditentukan dalam parameter message.

    runtime.error(message)
    
    1. Bagian yang diperluas dalam fungsi diagramoverlayparameter

Fungsi gambar pada bahasa Pine di FMZplotplotshapeplotcharTambah lagioverlayDukungan parameter, memungkinkan untuk menentukan gambar pada gambar utama atau gambar kecil.overlaymendirikantrueGambar di gambar utama, setel menjadifalseMenggambar pada sub-gambar. Membuat strategi Pine di FMZ dapat menggambar gambar utama dan sub-gambar secara bersamaan.

  • 5、syminfo.mintickMengambil nilai dari variabel internal

syminfo.mintickVariabel built-in didefinisikan sebagai nilai minimal dari varietas saat ini.Penawaran Tegas/Pengujian ulangPrecision Pricing Currency adalah parameter templat di Pine Language Trading Classroom yang dapat mengontrol nilai tersebut. Precision Pricing Currency set 2 adalah harga yang tepat pada saat transaksi hingga ke angka kecil kedua, saat ini unit perubahan harga minimal adalah 0.01syminfo.mintickJadi, nilai yang akan kita dapatkan adalah 0.01 .

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

Misalnya: harga pesanan adalah 8000, penjualan arah, jumlah 1 tangan ((satu, lembar), harga rata-rata setelah transaksi tidak 8000, kurang dari 8000 ((biaya termasuk biaya proses) )

Dasar-dasar bahasa Pine

Ketika kita mulai mempelajari dasar-dasar bahasa Pine, mungkin ada beberapa contoh instruksi, kode gramatika yang tidak kita kenal. Tidak masalah jika kita tidak mengerti, kita bisa terlebih dahulu membiasakan diri dengan konsep, memahami tujuan tes, atau kita dapat melihat dokumentasi bahasa Pine di FMZ untuk melihat petunjuk.

Pelaksanaan model

Pada awal belajar bahasa Pine, sangat penting untuk memahami konsep-konsep yang terkait seperti proses eksekusi skrip bahasa Pine. Strategi bahasa Pine dijalankan berdasarkan grafik, yang dapat dipahami sebagai serangkaian perhitungan dan operasi, yang dieksekusi pada grafik dengan urutan urutan waktu terdahulu yang dimulai dari data terdahulu yang telah dimuat di grafik.bar_indexMengutip indeks Bar pada K-line saat execution skrip Pine.

plot(bar_index, "bar_index")

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

plotFungsi adalah salah satu fungsi yang akan kita gunakan di masa depan. Fungsinya sangat sederhana, yaitu menggambar garis pada grafik berdasarkan parameter yang kita masukkan, dan data yang kita masukkan adalahbar_indexGaris ini diberi namabar_indexAnda dapat melihat bahwa bar_index pada Bar pertama adalah 0, dan Bar bertambah 1 ke kanan.

Berbeda-beda tergantung pada pengaturan kebijakan, dan kebijakan model yang berbeda cara pelaksanaan, terbagi menjadi收盘价模型Dan实时价模型│ konsep model harga close-out, model harga real-time sebelumnya kami juga telah menjelaskan secara singkat│

  • Model Harga Penutupan

Pada saat kode strategi dijalankan, siklus K Bar saat ini telah selesai, dan saat K Bar ditutup, siklus K Bar telah berakhir. Pada saat ini, logika strategi Pine dijalankan sekali lagi, dan sinyal transaksi yang dipicu akan dilakukan pada saat Bar K Bar berikutnya dimulai.

  • Model harga waktu nyata

Ketika kode strategi dijalankan, Bar K saat ini akan melakukan logika strategi Pine setiap kali terjadi perubahan, terlepas dari apakah ditutup atau tidak, dan sinyal perdagangan yang dipicu akan segera dilakukan.

Ketika strategi bahasa Pine dilakukan dari kiri ke kanan pada grafik, Bar K pada grafik dibagi menjadi历史BarDan实时BarDari:

  • Sejarah Bar

Ketika strategi yang ditetapkan sebagai “Model Harga Saham Nyata” mulai dijalankan, semua Bar K pada grafik kecuali Bar K yang berada di sebelah kanan adalah历史BarStrategi Logika pada setiap akar历史BarHanya dilakukan sekali. Strategi yang disetel ke “model harga closeout” dimulai saat semua Bar di grafik adalah历史BarStrategi Logika pada setiap akar历史BarHanya dilakukan sekali.

Perhitungan berdasarkan sejarah Bar: Kode kebijakan dieksekusi satu kali pada keadaan tutup Bar Sejarah, lalu kode kebijakan dieksekusi di Bar Sejarah berikutnya sampai semua Bar Sejarah dieksekusi satu kali.

  • Bar waktu nyata

Bar adalah realtime ketika strategi dijalankan pada Bar K terakhir di sebelah kanan. Bar ini akan berubah menjadi realtime bar setelah realtime bar ditutup. Setelah realtime bar ditutup, bar ini akan berubah menjadi realtime bar yang telah dilalui.

Strategi yang disetel ke “model harga real-time” akan mulai dieksekusi, dan setiap perubahan di bar real-time akan dieksekusi secara logis. Strategi yang disetel ke “model harga closeout” tidak akan menampilkan real-time Bar pada grafik saat mulai dijalankan.

Berdasarkan perhitungan Bar secara real-time: Jika strategi yang ditetapkan sebagai “model harga closeout” tidak menampilkan real-time Bar, kode kebijakan hanya akan dieksekusi sekali pada saat closeout Bar saat ini. Jika strategi yang ditetapkan sebagai “model harga saham nyata” dihitung pada Bar real-time dan sejarah Bar benar-benar berbeda, setiap perubahan di Bar real-time akan melakukan kode strategi. Misalnya, variabel built-inhighlowcloseDalam sejarah Bar adalah pasti, dalam real-time Bar mungkin setiap saat perubahan situasi akan terjadi perubahan nilai-nilai tersebut. Jadi berdasarkan nilai-nilai yang dihitung indikator data juga akan berubah secara real-time. Dalam real-time Barclose“Saya tidak tahu apa-apa, saya tidak tahu apa-apa, saya tidak tahu apa-apa”, katanya.highDanlowSelalu mewakili titik tertinggi dan terendah yang dicapai sejak awal Bar waktu nyata saat ini. Variabel-variabel ini mewakili nilai akhir saat Bar waktu nyata terakhir diperbarui.

Mekanisme rollback saat melakukan strategi di Real-Time Bar (model harga real-time): Dalam real-time Bar, setiap kali iterasi baru dari strategi dilakukan, variabel yang didefinisikan pengguna yang telah ditetapkan sebelumnya disebut rollback. Untuk memahami mekanisme rollback dengan contoh, berikut adalah kode uji.

Melihat:

  /*backtest 
  ...
  ..
  .
  */

Paket berisi informasi konfigurasi retrospektif 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")

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Kami hanya melihat adegan yang dilakukan di Real Time Bar, jadi kami menggunakannot barstate.ishistoryKeterbatasan ekspresi hanya dijumlahkan pada variabel n pada saat real-time Bar, dan digunakan sebelum dan sesudah melakukan operasi agregasiruntime.logFungsi output informasi dalam log kebijakan.plotGaris n yang digarisbawahi dapat dilihat bahwa n adalah 0 selama strategi berjalan di Bar Sejarah. Saat strategi dijalankan ke Bar Waktu Nyata, operasi n ditambah 1 dipicu, dan setiap kali strategi dijalankan di Bar Waktu Nyata, operasi n ditambah 1 dilakukan. Dari informasi log, dapat dilihat bahwa setiap kali kode strategi dieksekusi ulang, n akan disetel kembali ke nilai yang akhirnya diserahkan oleh strategi Bar Waktu Nyata sebelumnya.

Di sini, saya ingin menyimpulkan: 1 , Kode kebijakan akan dieksekusi setiap kali update situasi terjadi ketika kebijakan mulai dieksekusi di Real-Time Bar . 2. Saat dieksekusi di Real-Time Bar, setiap kali kode kebijakan dieksekusi, variabel akan dibalikkan. 3 , Variabel yang dieksekusi di Real-Time Bar dikirimkan sekali pada saat pembaruan closeout .

Operasi gambar seperti garis kurva pada grafik juga dapat menyebabkan penggambaran ulang, karena data bergulir, misalnya kita mengubah kode tes yang baru saja kita buat, tes hard disk:

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

Screenshot dari momen A Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Screenshot dari momen B Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Kami hanya mengubah kalimat ini:n := open > close ? n + 1 : n, saat ini real waktu Bar adalah negatif ((yaitu, harga buka lebih tinggi dari harga tutup) hanya untuk n terakumulasi 1 . Anda dapat melihat di gambar pertama ((saat A) karena saat itu harga buka lebih tinggi dari harga tutup ((yang negatif) sehingga n terakumulasi 1, grafik kurva n menunjukkan nilai 5 . Kemudian perubahan tren, harga update seperti yang ditunjukkan dalam gambar kedua ((saat B) menunjukkan . Saat ini harga buka lebih rendah dari harga tutup ((yang negatif), n nilai bergulir kembali dan juga tidak terakumulasi 1 .

  • Konteks variabel dalam fungsi

Di bawah ini kita akan mempelajari variabel dalam fungsi bahasa Pine. Berdasarkan deskripsi pada beberapa tutorial Pine, variabel dalam fungsi dan variabel di luar fungsi memiliki perbedaan sebagai berikut:

Sejarah variabel seri yang digunakan dalam fungsi Pine dibuat dengan setiap panggilan berturut-turut pada fungsi tersebut. Jika tidak ada fungsi yang dipanggil pada setiap kolom yang dijalankan dalam skrip, ini akan menyebabkan perbedaan antara nilai sejarah dalam blok lokal fungsi dan seri eksternal. Oleh karena itu, jika tidak ada fungsi yang dipanggil pada setiap kolom, seri yang menggunakan nilai indeks yang sama yang dirujuk di dalam dan di luar fungsi tidak akan merujuk pada titik sejarah yang sama.

Tidak masalah, kita bisa mengetahuinya dengan kode tes 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)

Pemutaran rekaman

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

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

  • f(a) => a[1]Fungsi yang dikembalikan pada akhir menggunakan parametera[1]

  • f2() => close[1]: Menggunakan variabel bawaan secara langsungcloseFungsi yang dikembalikan pada akhirclose[1]

[]Simbol digunakan untuk operasi referensi pada nilai historis dari variabel seri data, close[1] yaitu data harga tutup pada Bar sebelum harga tutup saat ini.

  • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A") Gambarkan satu karakter A , berwarna merah, jika oneBarInTwo adalah benar, dan letaknya (atas sumbu Y) adalah:f(close)Nilai yang dikembalikan

  • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B") Gambarkan satu karakter B, berwarna hijau, jika oneBarInTwo adalah benar, dan letaknya (atas sumbu Y) adalah:f2()Nilai yang dikembalikan

  • plot(close[2], title = "close[2]", color = color.red, overlay = true) Garis yang digambar berwarna merah, dan posisi yang digambar (atas sumbu Y) adalah:close[2]yaitu harga penutupan pada Bar saat ini (dibarkan ke kiri)

  • plot(close[1], title = "close[1]", color = color.green, overlay = true) Garis yang digarisbawahi berwarna hijau, digarisbawahi sebagai:close[1]yaitu harga penutupan pada Bar saat ini (di depan Bar 1 (di sebelah kiri 1 (di sebelah kiri 1))

Sketsa berjalan melalui Retrospective Strategi dapat dilihat, meskipun fungsi yang digunakan untuk menggambar Af(a) => a[1]Dan gambar fungsi yang digunakan untuk menandai Bf2() => close[1]Semua digunakan.[1] untuk merujuk data historis pada seri data, tetapi posisi penanda “A” dan “B” pada grafik sama sekali berbeda. Posisi penanda “A” selalu berada pada garis merah, yaitu kode dalam strategiplot(close[2], title = "close[2]", color = color.red, overlay = true)Garis-garis yang digambar menggunakan data adalahclose[2]

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Ini adalah karena indeksasi melalui garis bar K, yaitu variabel yang ada di dalambar_indexPerhitungan apakah menggambar tanda “A” dan “B”. “A” dan “B” tidak digambar pada setiap Bar garis K.f(a) => a[1]Nilai yang dikutip dengan cara ini, jika fungsi tidak dipanggil di setiap Bar, akan berhubungan dengan fungsif2() => close[1]Cara ini mengacu pada nilai yang berbeda, meskipun keduanya menggunakan[1] dengan indeks yang sama).

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

Contoh sederhana untuk menjelaskan hal ini:

  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 memanggil fungsi dengan kode.ta.barssince(close < close[1])Tuliskan dalam operator tiga dimensicondition ? value1 : value2Hal ini menyebabkan hanyaclose > close[1]Fungsi ta.barssince. dapat diputar.ta.barssinceFungsi yang dihitung dari terakhir kaliclose < close[1]Jumlah baris K pada saat terbentuk. Apabila fungsi ta.barssince dipanggil, maka fungsi close > close[1], yaitu saat harga close lebih besar dari harga close Bar sebelumnya, saat fungsi ta.barssince dipanggil dengan kondisi close < close[1] tidak didirikan, dan tidak ada lokasi terakhir didirikan.

ta.barssince: Ketika dipanggil, fungsi ini akan mengembalikan na。 jika kondisi tersebut tidak pernah terpenuhi sebelum baris K saat ini.

Seperti yang ditunjukkan pada gambar:

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

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

Untuk menghindari masalah ini, kita hanya menggunakanta.barssince(close < close[1])Panggilan fungsi diambil dari operator trivial dan ditulis di luar setiap cabang kondisional yang mungkin. Hal ini membuatnya melakukan perhitungan pada setiap Bar baris K.

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

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Urutan waktu

Konsep urutan waktu sangat penting dalam bahasa Pine, dan merupakan konsep yang harus kita pahami saat kita belajar bahasa Pine. Karena urutan waktu bukanlah sebuah tipe melainkan sebuah struktur dasar untuk menyimpan nilai-nilai berurutan dari variabel-variabel yang terjadi dari waktu ke waktu, kita tahu bahwa skrip Pine didasarkan pada grafik, dan yang paling mendasar yang ditampilkan dalam grafik adalah grafik garis K.openadalah sebuah variabel built-in dari bahasa Pine yang terstruktur sebagai sebuah urutan waktu untuk menyimpan harga setiap K-line Bar yang dibuka.openStruktur urutan waktu ini mewakili harga mulai dari Bar pertama dari garis K saat ini hingga Bar yang dieksekusi oleh skrip saat ini. Jika garis K saat ini adalah periode 5 menit, maka kita akan menggunakan referensi dalam kode kebijakan Pine (atau)openJika Anda ingin menggunakan nilai sejarah dalam urutan waktu, Anda harus menggunakan nilai awal dari K-bar pada saat Anda menggunakan kode strategi.[]Operator digunakan ketika kebijakan Pine dieksekusi pada Bar baris K.open[1]Menampilkan referensiopenPada urutan waktu, harga pembukaan dari Bar K baris sebelumnya yang dieksekusi oleh skrip saat ini (yaitu, harga pembukaan dari siklus K baris sebelumnya).

  • Variabel dalam urutan waktu sangat mudah untuk dihitung Kita menggunakan fungsi bawaan.ta.cumMisalnya:
  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 uji:

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

Ada banyak hal yang sama.ta.cumFungsi built-in seperti ini dapat langsung menangani data pada urutan waktu, misalnyata.cumIni adalah penjumlahan dari variabel yang masuk ke nilai yang sesuai pada setiap Bar K, dan kemudian kita menggunakan grafik untuk memudahkan pemahaman.

Bar_index adalah variabel yang ada di dalam bar_index v1 dan v2 | - | - | - | - | Strategi berjalan pada akar pertama K-bar 0 dan 1 dan 1. Strategi berjalan pada garis K-bar kedua. Strategi berjalan pada akar ketiga K-bar. |…|…|…|…| Strategi berjalan pada N + 1 akar K Bar dan N = 1 dan N + 1 dan

Anda dapat melihat bahwa v1, v2 dan bahkan bar_index adalah struktur berurutan waktu, dengan data yang sesuai pada setiap Bar. Kode tes ini tidak menggunakan “model harga real-time” atau “model harga closeout” yang berbeda hanya untuk menunjukkan Bar real-time pada grafik. Untuk mengukur kecepatan, kami menggunakan “model harga closeout” untuk menguji kembali.

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Karena variabel v1 adalah 1 pada setiap bar.ta.cum(v1)Karena hanya ada Bar pertama pada baris K pertama, fungsi tersebut dihitung sebagai 1, dan diberikan nilai pada variabel v2 . Ketikata.cum(v1)Pada saat dilakukan pada Bar K baris kedua, sudah ada 2 Bar K baris ((bar_index dari variabel bawaan pertama adalah 0, bar_index dari variabel bawaan kedua adalah 1), sehingga hasil perhitungan adalah 2, memberikan nilai pada variabel v2, dan seterusnya. Sebenarnya dapat diamati bahwa v2 adalah jumlah Bar baris K dalam grafik, karena indeks baris Kbar_indexJika kita mulai dari nol, maka kita akan mendapatkanbar_index + 1Ini adalah jumlah garis Bar. Anda juga dapat melihat garis pada grafik.v2Danbar_indexIni adalah pertemuan.

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Saya juga bisa menggunakanta.cumFungsi built-in menghitung jumlah harga close out dari semua Bar pada grafik saat ini, dan hanya bisa ditulis sebagai:ta.cum(close), ketika strategi berjalan ke Bar Waktu Nyata di sebelah kananta.cum(close)Hasil yang dihitung adalah jumlah dari semua Bar yang ada di grafik (jika tidak dioperasikan ke sisi kanan, hanya ditambahkan ke Bar saat ini).

Variabel pada urutan waktu juga dapat dihitung menggunakan operator, seperti kode:ta.sma(high - low, 14)Mengubah variabel internalhigh(K garis Bar harga tertinggi) dikurangilow(K Line Bar Minimum Harga), penggunaan terakhirta.smaFungsi mencari nilai rata-rata.

  • Hasil panggilan fungsi juga akan 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 tes ini dapat diamati saat tes berjalan pada pengukuran ulang.v1Danv2Jika nilai dari suatu fungsi adalah sama, maka garis yang digambar pada grafiknya juga benar-benar bertepatan. Hasil dari perhitungan panggilan fungsi akan meninggalkan jejak nilai dalam urutan waktu, seperti kodeta.highest(high, 10)[1]Di antaranya adalahta.highest(high, 10)Hasil yang dihitung dari panggilan fungsi juga dapat digunakan[1] untuk mengutip nilai historisnya.ta.highest(high, 10)Hasilnya adalahta.highest(high[1], 10)Karena itu.ta.highest(high[1], 10)Danta.highest(high, 10)[1]Harga yang sama.

Validasi informasi output menggunakan fungsi diagram yang berbeda:

  a = ta.highest(close, 10)[1]
  b = ta.highest(close[1], 10)
  plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red, overlay=true)
  plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)

Anda dapat melihat nilai variabel a dan variabel b dalam urutan waktu yang ditampilkan di atas dan di bawah Bar yang sesuai. Anda dapat menyimpan kode gambar ini dalam proses pembelajaran, karena mungkin sering perlu untuk mengekspor informasi pada grafik untuk pengamatan saat pengujian.

Tutorial Pengenalan Bahasa PINE Kuantitatif Penemu

Struktur naskah

Struktur umum

Pada bagian awal tutorial, kami telah menguraikan beberapa perbedaan antara penggunaan bahasa Pine di FMZ dan bahasa Pine di Trading View.indicator()strategy()Dan, sementara tidak mendukunglibrary()Tentu saja, untuk kompatibilitas dengan versi sebelumnya dari Pine script, strategi ditulis seperti://@version=5indicator()strategy()Anda juga bisa. Beberapa pengaturan kebijakan juga bisa dilakukan distrategy()Pengaturan parameter dalam fungsi.

<version>
<declaration_statement>
<code>

<version>Informasi kontrol versi dapat dihapus.

Catatan

Penggunaan bahasa Pine//Sebagai komentar satu baris, karena bahasa Pine tidak memiliki komentar multi baris./**/Untuk multi baris komentar.

Kode

Sebuah skrip tidak memiliki komentar atau perintah compiler, melainkan kalimat, yang mengimplementasikan algoritma skrip. Sebuah kalimat dapat menjadi salah satu dari hal-hal tersebut.

  • Deklarasi Variabel
  • Reassignment dari variabel
  • Deklarasi Fungsi
  • Pemanggilan fungsi built-in, pemanggilan fungsi yang didefinisikan pengguna
  • ifforwhileatauswitchStruktur lainnya

Pernyataan dapat disusun dengan berbagai cara

  • Beberapa pernyataan dapat dituliskan dalam satu baris, seperti kebanyakan deklarasi variabel, yang hanya berisi satu baris panggilan fungsi atau deklarasi fungsi baris tunggal. Yang lain, seperti struktur, selalu membutuhkan lebih dari satu baris karena mereka membutuhkan satu blok lokal.
  • Pernyataan dalam ruang lingkup global skrip (yaitu bagian yang tidak termasuk dalam blok lokal) tidak dapat dianggap sebagai空格atau制表符(Tab) dimulai。 Karakter pertama mereka juga harus menjadi karakter pertama dari baris tersebut。 Baris yang dimulai pada posisi pertama dari baris, menurut definisi menjadi bagian dari ruang lingkup global dari skrip。
  • Struktur atau deklarasi fungsi multi-baris selalu membutuhkanlocal block。 Sebuah blok lokal harus disinkronkan ke dalam satu tanda baca atau empat ruang kosong (jika tidak, akan diuraikan ke dalam baris kode serialisasi sebelumnya, yang akan dianggap sebagai konten lanjutan dari baris kode sebelumnya), dan masing-masing blok lokal mendefinisikan sebuah ruang lingkup lokal yang berbeda。
  • Beberapa kalimat tunggal dapat diurutkan dalam satu baris dengan menggunakan tanda koma ((,) sebagai pemisah.
  • Satu baris bisa berisi komentar, atau hanya komentar.
  • Baris juga bisa dibungkus (berlanjut pada beberapa baris)

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

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

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

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

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

Kode ganti baris

Baris panjang dapat dibagi dalam beberapa baris, atau “dibungkus”. Baris yang dibungkus harus menyusut ke dalam jumlah ruang kosong, asalkan bukan kelipatan 4.

a = open + high + low + close

Dapat dikemas dalam (perhatikan bahwa jumlah spasi yang dikurangi per baris bukanlah kelipatan dari 4):

a = open +
      high +
          low +
             close

Sebuah panggilan plot ((() yang panjang dapat dikemas 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 dikemas. Namun, karena blok lokal secara gramatikal harus dimulai dengan tanda kurung (((4 spasi atau 1 tanda kerja), ketika membagi-bagi ke baris berikutnya, bagian lanjutan dari pernyataan harus dimulai dengan satu atau lebih tanda kurung (((tidak sama dengan kelipatan 4 spasi) . 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

Identifikasi

Sebelum kita memahami variabel, kita harus memahami konsep dari tanda pengenal tanda baca.fungsiDanvariabelNama yang digunakan untuk menamai variabel, fungsi.fungsiDalam tutorial selanjutnya, kita akan belajar tentang pengidentifikasi lembu, yaitu ▽.

  • 1. Identifikator harus ditulis dengan huruf kapital(A-Z)atau huruf kecil(a-z)Huruf atau garis bawah(_)Awal, sebagai karakter pertama dari pengidentifikasi.
  • 2. Karakter berikutnya setelah karakter pertama identifier dapatAksaraGaris bawahatauAngka
  • 3. Nama identifier ditulis dengan huruf besar dan kecil.

Sebagai contoh, identifier dengan nama-nama berikut:

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

Seperti kebanyakan bahasa pemrograman lainnya, bahasa Pine juga memiliki rekomendasi penulisan.

  • 1. Semua huruf besar digunakan untuk menamai konstanta.
  • 2. GunakanAturan HumpbackNama yang digunakan untuk identifier lainnya.
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

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

Operator

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

Operator penentuan nilai, operator hitung, operator perbandingan, operator logika,? :Operator Triangular[]Operator referensi sejarah

Operator Aritmatika*Sebagai contoh, untuk membedakan jenis masalah yang disebabkan oleh pengembalian hasil operator bahasa Pine di Trading View, ada kode tes 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)

Jika Anda ingin mengkompilasi skrip ini di Trading View, Anda dapat mengkompilasinya dengan kesalahan karena:adjustedLength = lenInput * factorSetelah kita perkalian hasilnya adalahseries intJenis (seri), namunta.emaParameter kedua dari fungsi tidak mendukung jenis ini. Namun, tidak ada batasan ketat seperti itu pada FMZ, kode di atas dapat berjalan dengan baik.

Di bawah ini kita akan melihat berbagai operator yang digunakan.


Operator Assignment

Ada dua jenis operator penugasan:=:=Kami juga melihat beberapa contoh di bagian awal tutorial.

=Operator digunakan untuk menginisialisasi atau mendeklarasikan variabel.=Variabel yang diberikan setelah inisialisasi, deklarasi, dan penugasan akan dimulai dengan nilai tersebut pada setiap Bar berikutnya. Ini adalah deklarasi 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)

Melihata = closeAssignment statement, di mana variabel a pada setiap Bar adalah harga penutupan Bar saat ini.bcdadalah tidak berubah, dapat diuji dalam sistem umpan balik pada FMZ, hasil dapat dilihat dari gambar.

:=digunakan untuk memberikan nilai baru pada variabel yang sudah ada, dapat dipahami sebagai penggunaan:=Operator digunakan untuk memodifikasi nilai variabel yang telah dinyatakan dan diinisialisasi. Jika digunakan:=Operator memberi nilai pada variabel yang tidak diinisialisasi atau dinyatakan dapat menyebabkan kesalahan, seperti:

a := 0

Jadi,:=Operator penugasan biasanya digunakan untuk penugasan ulang variabel yang sudah ada, misalnya:

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

plot(b)

Pertimbangan jikaclose > open(yaitu BAR saat ini adalah garis bujur), variabel a adalah nilai riil ((true)) ≠ akan melaksanakan kode dalam blok lokal dari pernyataan ifb := b + 1, menggunakan operator penugasan:=Berikan nilai baru untuk b, tambahkan 1 ≠ 1 dan kemudian gunakan fungsi plot untuk menggambar nilai variabel b pada setiap BAR dalam urutan waktu, dan menghubungkannya menjadi garis ≠ 1.

Apakah kita berpikir bahwa jika ada garis bujur BAR, b akan terus bertambah 1? Tentu tidak, di sini kita tidak menggunakan kata kunci apa pun untuk menyatakan variabel b, dan menginisialisasi menjadi 0.b=0Jadi kita bisa melihat bahwa hasil dari kode ini adalah setiap kali b di set ulang menjadi 0 jika a adalah benar maka akan sesuai denganclose > openJadi, pada saat menjalankan kode pada putaran ini, b akan bertambah 1, pada saat fungsi plot digambar, b adalah 1, tetapi pada saat menjalankan kode pada putaran berikutnya, b akan diberi nilai kembali menjadi 0.

Ada dua kata kunci yang perlu diperluas untuk operator asumsi:varvarip

  • var

Sebenarnya, kata kunci ini sudah kita lihat dan gunakan di tutorial sebelumnya, tapi tidak dibahas secara rinci.

var adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel satu kali. Biasanya, sintaks pemberian nilai variabel tanpa kata kunci var akan menyebabkan nilai variabel ditutupi setiap kali data diperbarui. Sebaliknya, ketika menggunakan kata kunci var untuk mengalokasikan variabel, mereka dapat tetap berada di status yang sama meskipun data diperbarui

Kita masih menggunakan contoh ini, hanya saja ketika kita memberi nilai pada bvarKata Kunci:

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

  plot(b)

varKata kunci membuat variabel b hanya melakukan penugasan pertama awalnya, setelah itu setiap kali menjalankan logika kebijakan tidak akan mengatur ulang b menjadi 0, sehingga garis yang digambar dari saat berjalan dapat diamati b yaitu jumlah garis yang muncul pada BAR saat garis K BAR saat ini.

Variabel dalam deklarasi 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 pilar pertama dalam seri. Variabel ‘b’ mempertahankan harga penutupan dari batang harga pertama dalam seri. Variabel ‘c’ mempertahankan harga penutupan dari seri ke-10 dari kentang hijau.

  • varip

varipIni adalah kata kunci yang pertama kali kita lihat, dan kita dapat melihat deskripsi kata kunci ini:

varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi variabel satu kali. Kata kunci ini mirip dengan kata kunci var, tetapi variabel yang menggunakan deklarasi varip mempertahankan nilainya antara pembaruan K-line secara real-time.

Apakah lebih sulit untuk dimengerti? tidak apa-apa, kita akan menjelaskan dengan contoh, mudah untuk 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 tes ini bekerja secara berbeda pada model harga close out dan model harga real time:

Model harga real-time: Ingatkah Anda bahwa strategi yang telah kami jelaskan sebelumnya dibagi menjadi periode BAR historis dan periode BAR real-time?varvaripVariabel yang dinyatakaniiiPada setiap putaran kode strategi, operasi incremental dilakukan. Jadi, dapat dilihat bahwa angka yang ditampilkan pada garis KBAR dari hasil pengukuran kembali masing-masing meningkat 1. Ketika tahap K baris sejarah berakhir, tahap K baris real-time dimulai.i := i + 1Danii := ii + 1Semua akan dieksekusi sekali. Perbedaannya adalah bahwa ii akan diubah setiap kali. Meskipun i juga diubah setiap kali, tetapi pada saat menjalankan strategi logis pada putaran berikutnya, nilai sebelumnya akan dikembalikan (ingat mekanisme pemutaran kembali yang kami jelaskan pada bab “Pelaksanaan Model” sebelumnya?), sampai saat ini KBAR berjalan selesai untuk memperbarui nilai yang ditentukan i (yaitu, pada saat menjalankan strategi logis pada putaran berikutnya, nilai sebelumnya tidak akan dikembalikan lagi).

Model harga penutupan: Karena model harga closeout hanya melakukan satu logika strategi setiap kali K line BAR selesai. Jadi dalam model harga closeout, fase K line historis dan fase K line real-time, variabel deklarasi var, varip berkinerja sama dalam contoh di atas, adalah setiap K line BAR berkinerja 1 .


Operator Aritmatika
Operator menjelaskan
+ Penambahan
- Pengurangan
* Perkalian
/ Penghapusan
% Mencari Contoh

+-Operator dapat digunakan sebagai operator biner atau sebagai operator satuan. Operator aritmatika lainnya hanya dapat digunakan sebagai operator biner, jika digunakan sebagai operator satuan akan menimbulkan kesalahan.

  1. Operator aritmatika adalah kedua sisi dari tipe nilai numerik, hasilnya adalah tipe nilai numerik, integer atau floating point.
  2. Jika salah satu dari operandnya adalah string, maka operatornya adalah+, hasilnya adalah string, nilai akan dikonversi ke dalam bentuk string, dan kemudian string akan disalin bersama-sama. Jika operator aritmatika lainnya, akan mencoba untuk mengubah string menjadi nilai, dan kemudian operasi.
  3. Jika ada operasi na, maka hasil penghitungan adalah nilai nol na, yang akan ditampilkan pada saat mencetak pada FMZ NaN。
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. Bahasa Pine di FMZ tidak terlalu keras dan ketat dalam hal persyaratan tipe variabel. Misalnya:

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

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

Dalam FMZ dapat dijalankan, tetapi dalam trading view akan melaporkan kesalahan tipe. Untuk operator hitung kedua sisi operasi adalah string, sistem akan mengubah string menjadi nilai numerik dan kemudian menghitung. Jika string non-nilai tidak dapat dihitung, sistem operasi akan menghasilkan nilai kosong na.


Operator perbandingan

Operator perbandingan adalah operator biner.

Operator menjelaskan
< Kurang dari
> Lebih dari
<= Kurang dari sama dengan
>= Lebih besar dari sama dengan
== Persamaan
!= Ketidakadilan

Contoh pengujian:

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 adalah operator yang paling sering kita gunakan ketika kita menulis kebijakan. Anda dapat membandingkan nilai dan juga membandingkan variabel yang ada di dalamnya, seperticloseopenTunggu. Seperti operator operasi, pada FMZ berbeda dengan Pin dari Trading View, FMZ tidak memiliki tipe persyaratan yang sangat ketat, jadi pernyataan seperti itud = "1" >= 2Pada FMZ tidak akan ada kesalahan, string akan dikonversi menjadi nilai numerik dan kemudian dihitung. Pada Trading View akan ada kesalahan.


Operator logis
Operator Kode simbol menjelaskan
Tidak not Operator unit, non-operator
Dan and Operator biner, dengan (dan) operasi
atau or Operator biner, atau operasi

Berbicara tentang operator logis, maka kita harus berbicara tentang tabel nilai sebenarnya. Seperti yang kita pelajari di sekolah tinggi, hanya saja di sini kita menguji dan belajar dari sistem feedback:

a = 1 == 1  // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b   // 逻辑非操作符
d = not a   // 逻辑非操作符

runtime.log("测试逻辑操作符:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("测试逻辑操作符:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

Untuk menghindari dampak dari sistem yang terus menerus mencetak informasi, kami menggunakanruntime.error("stop")Pernyataan setelah melakukan pencetakan sekali lagi, maka akan ada kesalahan yang luar biasa sehingga pengetesan berhenti, setelah itu kita bisa melihat informasi yang keluar, kita dapat menemukan bahwa isi pencetakan dan tabel nilai sebenarnya sama.


Operator tiga dimensi

Menggunakan operator tiga dimensi? :Ekspresi trigonometri dengan kombinasi operasicondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseKita sudah membiasakannya di pelajaran sebelumnya. Ekspresi tiga dimensi, operator tiga dimensi berarti jumlah operasinya adalah tiga.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseDi dalamconditionKondisi penilaian adalah jika nilai dari ungkapan yang benar adalah:valueWhenConditionIsTrueJikaconditionEkspresinya adalahvalueWhenConditionIsFalse

Meskipun tidak banyak digunakan secara praktis, berikut adalah beberapa contoh yang mudah untuk didemonstrasikan:

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 menemukan tanda silang, tidak masalah! Ekspresi trigonometrik 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 trinitas lainnya sebagai gantinya.


Operator Sejarah

Menggunakan operator historis[]Referensi sejarah pada urutan waktu. Nilai sejarah adalah nilai pada baris K BAR sebelum baris K BAR saat skrip berjalan.[]Operator digunakan setelah variabel, ekspresi, dan fungsi dipanggil.[]Nilai dalam kurung persegi ini adalah jarak dari data historis yang ingin kita kutip dari garis BAR K saat ini. Sebagai contoh, jika saya ingin kutip harga penutupan garis BAR K sebelumnya, saya akan menuliskan sebagai:close[1]

Kami telah melihat tulisan seperti ini di kursus 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, sehingga ditulis dengan cara ini adalah salah, akan melakukan kesalahan:

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

Anda mungkin melihat di sini, beberapa siswa akan mengatakan bahwa operator[]Ini adalah untuk struktur seri, yang tampaknya mirip dengan struktur seri (series) dan array! Di bawah ini kita akan menggunakan sebuah contoh untuk menjelaskan bahwa seri dalam bahasa Pine tidak berbeda dengan array.

strategy("test", overlay=true)

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

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

Meskipun mengatakana = close[1][2]Saya tidak tahu apa yang harus saya lakukan, tapi saya akan menuliskannya di sini.

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

Jika Anda menulisnya secara terpisah, Anda tidak akan salah, jika Anda memahaminya dalam bentuk array yang biasa.b = close[1]Setelah diberi nilai, b seharusnya menjadi nilai numerik, namunc = b[1], b masih dapat digunakan lagi dengan operator sejarah referensi nilai sejarah. terlihat bahwa dalam bahasa Pine konsep seri tidak semudah sebuah array. dapat dipahami sebagai nilai sejarah pada Bar yang lebih dekat (diasumsikan untuk b), b juga merupakan struktur urutan waktu (time series), dapat terus referensi nilai sejarahnya. Jadi kita melihat di tiga garis a, b, c yang digambar, b lebih lambat dari garis a satu BAR, garis b lebih lambat dari garis b satu BAR.

Kita bisa menarik grafik ke kiri, dan melihat bahwa pada baris pertama K, nilai b dan c adalah nilai nol ((na) ). Itu karena ketika skrip dijalankan pada baris pertama K BAR, sejarah yang merujuk satu atau dua periode ke depan tidak ada, tidak ada. Jadi kita perlu sering memperhatikan ketika menulis kebijakan, apakah referensi sejarah data akan merujuk ke nilai nol, jika tidak hati-hati menggunakan nilai nol dapat menyebabkan serangkaian perbedaan perhitungan, bahkan dapat mempengaruhi waktu nyata.nanzFungsi built-in untuk menilainznaFungsi, ingat di bab apa?) yang secara khusus menangani nilai kosong, misalnya:

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

Ini adalah pengolahan yang mungkin mengacu pada nilai nol ((na)).


Prioritas Operator

Kita telah mempelajari banyak operator dalam bahasa Pine yang membentuk ekspresi melalui berbagai kombinasi dari bilangan dan operasi. Jadi bagaimana prioritasnya ketika menghitung dalam ekspresi? Seperti halnya operasi empat baris yang kita pelajari di sekolah, ada perkalian dan pengurangan yang diutamakan, kemudian penjumlahan dan pengurangan.

Prioritas Operator
9 []
8 Operator satuan +- dan `not
7 */%
6 Operator biner +-
5 ><>=<=
4 ==!=
3 and
2 or
1 ?:

Operasi dilakukan pada bagian ekspresi yang memiliki prioritas tinggi terlebih dahulu, dan jika prioritasnya sama, operasi dilakukan dari kiri ke kanan. Jika Anda ingin memaksakan operasi pada bagian tertentu terlebih dahulu, Anda dapat menggunakan()Membungkus ungkapan bagian yang harus dioperasikan terlebih dahulu.

variabel

Deklarasi Variabel

Kita sudah mempelajari konsep dari tanda pengenal variabel sebelumnya, tanda pengenal variabel adalah nama yang diberikan kepada variabel sebagai nama variabel. Jadi, variabel adalah tanda pengenal dari nilai yang disimpan. Lalu bagaimana mendeklarasikan sebuah variabel? Dan aturan apa yang ada pada deklarasi variabel?

  • Model pengumuman: Ada tiga jenis model deklarasi variabel, yaitu:
    1. Menggunakan kata kuncivar
    2. Gunakan kata kuncivarip
    3. Tidak menulis apa-apa.

varvaripKata kunci sebenarnya sudah kita pelajari di bab sebelumnya “Operator Assignment” dan tidak akan dibahas di sini. Jika model deklarasi variabel tidak ditulis apa-apa, misalnya kalimat:i = 1, dan kita telah mengatakan sebelumnya, bahwa variabel yang dinyatakan dan diberi nilai, akan dieksekusi pada setiap baris KBAR.

  • jenis Bahasa Pine di FMZ tidak terlalu ketat untuk tipe, dan biasanya dapat dihapus. Namun, untuk kompatibilitas dengan strategi skrip di Trading View, variabel dapat diklaim dengan tipe.
  int i = 0 
  float f = 1.1

Tipe pada Trading View lebih ketat, dan akan mengalami kesalahan