Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Dicipta dalam: 2022-05-30 16:23:43, dikemas kini pada: 2022-09-28 17:10:21
comments   0
hits   8860

[TOC]

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Tutorial video: Terlalu sukar untuk memasuki perdagangan kuantitatif? menggunakan pandangan perdagangan Bahasa Pine dari kecil putih ke Kuant besar - Pengembara pertama bahasa Pine

Inventor Quantitative Trading Platform menyokong strategi penulisan bahasa Pine, menyokong pengulangan, menjalankan strategi bahasa Pine secara langsung, dan menyokong versi rendah bahasa Pine.Dataran StrategiTerdapat banyak strategi Pine yang dikumpulkan dan dipindahkan.

FMZ bukan sahaja menyokong bahasa Pine, tetapi juga menyokong ciri-ciri gambar yang kuat dalam bahasa Pine. Pelbagai ciri di platform FMZ, alat yang banyak digunakan, pengurusan yang efisien dan mudah, juga meningkatkan kepraktisan Pine. FMZ adalah berdasarkan keserasian dengan bahasa Pine, tetapi juga dengan tahap pengembangan, pengoptimuman, dan pemotongan bahasa Pine.

Di bawah ini adalah beberapa perbezaan yang ketara:

  • 1 , Dasar Pin pada FMZ, pengenalan versi pada permulaan kod//@versiondan bermula dengan kodstrategyindicatorSentensi tidak dikehendaki ditulis, FMZ tidak menyokongnya buat masa iniimportImporlibraryfungsi.

Mungkin anda akan melihat beberapa strategi yang bertuliskan:

  //@version=5
  indicator("My Script", overlay = true)
  src = close
  a = ta.sma(src, 5)
  b = ta.sma(src, 50)
  c = ta.cross(a, b)
  plot(a, color = color.blue)
  plot(b, color = color.black)
  plotshape(c, color = color.red)

Atau seperti ini:

  //@version=5
  strategy("My Strategy", overlay=true)

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

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)

Di FMZ ia boleh diringkaskan sebagai:

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

Atau:

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

  shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
  if (shortCondition)
      strategy.entry("My Short Entry Id", strategy.short)
  • 2 , Strategi [script] Sesetengah tetapan yang berkaitan dengan transaksi ditetapkan oleh parameter “Pine Language Transaction Class Repository” pada antara muka FMZ Strategi.

    • Model harga akhir dan model harga masa nyata Dalam pandangan perdagangan, kita boleh melaluistrategyFungsicalc_on_every_tickParameter untuk menetapkan skrip strategi untuk melaksanakan logik strategi secara langsung setiap kali harga berubah, ketika inicalc_on_every_tickParameter hendaklah ditetapkan sebagaitrue◦ Secara lalaicalc_on_every_tickParameter adalahfalseIaitu, logik strategi dijalankan apabila bar K semasa strategi telah habis sepenuhnya. Di FMZ, parameter template “Pine Language Exchange Class Repository” boleh diset.

    Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

    • Pengendalian ketepatan nilai seperti harga, kuantiti pesanan dan lain-lain semasa pelaksanaan strategi diperlukan di FMZ Dalam pandangan perdagangan kerana hanya boleh melakukan ujian simulasi, tidak ada masalah ketepatan masa pesanan di bursa nyata. Dalam FMZ, anda boleh menjalankan strategi Pin secara nyata. Maka anda memerlukan strategi yang dapat menentukan ketepatan harga jenis perdagangan, ketepatan jumlah pesanan dengan fleksibel. Tetapan ketepatan ini adalah untuk mengawal bilangan kecil data yang berkaitan, untuk mengelakkan data tidak sesuai dengan keperluan pelaporan bursa sehingga tidak dapat melakukan pesanan.

    • Kod kontrak jangka masa Jenis dagangan di FMZ jika kontrak, mempunyai 2 sifat: “pasangan dagangan” dan “kod kontrak”. Selain perlu menetapkan pasangan dagangan secara jelas pada masa yang sama, anda juga perlu menetapkan kod kontrak khusus dalam parameter “kod jenis” templat “Pine Language Trading Classroom”. Sebagai contoh, kontrak kekal hanya perlu diisiswapKode kontrak untuk melihat sama ada pertukaran yang beroperasi mempunyai kontrak sedemikian. Sebagai contoh, semua kontrak suku tahunan untuk perdagangan boleh diisi di siniquarter。 Kod kontrak ini sepadan dengan kod kontrak berjangka yang ditakrifkan pada dokumen API bahasa Javascript/python/c++ FMZ.。

Tetapan lain seperti jumlah minimum dan jumlah lalai boleh dilihat dalam dokumentasi bahasa Pine mengenaiPerpustakaan pertukaran bahasa PinePengenalan parameter:

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

FMZ platform telah menambah 3 fungsi untuk debugging.

  • runtime.debug: Fungsi ini biasanya tidak digunakan untuk mencetak maklumat pembolehubah di papan kawalan.

  • runtime.logDi dalam log: output │ FMZ PINE mempunyai fungsi khusus │

    runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
    
  • runtime.errorApabila dipanggil, ia akan menyebabkan ralat semasa operasi dan membawa mesej ralat yang dinyatakan dalam parameter pesan.

    runtime.error(message)
    
    1. sebahagian daripada fungsi gambar yang diperluasoverlayparameter

Fungsi gambar dalam bahasa Pine di FMZplotplotshapeplotcharTambah lagioverlaySokongan parameter yang membolehkan anda menetapkan gambar pada gambar utama atau gambar kecil.overlaysediakantrueGambar di carta utama, set kefalseMenggambar pada subgambar. Membolehkan strategi Pine di FMZ untuk menggambar pada gambar utama dan subgambar pada masa yang sama.

  • 5、syminfo.mintickMengambil nilai pembolehubah terbina dalam

syminfo.mintickVariabel terbina dalam ditakrifkan sebagai nilai pengukuran minimum untuk varieti semasa.Tawaran Firma/Ujian belakangKeakuratan harga mata wang adalah parameter templat dalam “Pine Language Transaction Classroom” di dalam antara muka untuk mengawal nilai tersebut. Pengaturan ketepatan harga mata wang 2 adalah harga yang tepat pada masa perdagangan ke nombor kedua yang kecil, di mana unit perubahan minimum harga adalah 0.01syminfo.mintickJadi, nilai 0.01 ialah

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

Sebagai contoh: harga pesanan adalah 8000, menjual arah, kuantiti 1 tangan ((satu, keping), harga purata selepas urus niaga bukan 8000, kurang daripada 8000 ((biaya termasuk yuran proses)

Asas Bahasa Pine

Apabila kita mula mempelajari asas bahasa Pine, mungkin kita tidak biasa dengan arahan, kod kod dalam beberapa contoh. Tidak mengapa jika kita tidak faham, kita boleh terlebih dahulu membiasakan diri dengan konsep, memahami tujuan ujian, atau kita boleh menyemak dokumentasi bahasa Pine FMZ untuk melihat arahan. Kemudian ikuti tutorial langkah demi langkah untuk membiasakan diri dengan pelbagai tatabahasa, arahan, fungsi, dan pembolehubah dalaman.

Pelaksanaan model

Pada permulaan pembelajaran bahasa Pine, adalah sangat penting untuk memahami konsep-konsep yang berkaitan seperti proses pelaksanaan skrip bahasa Pine. Strategi bahasa Pine dijalankan berdasarkan carta, yang boleh difahami sebagai satu siri pengiraan dan operasi, yang dijalankan pada carta mengikut urutan masa yang berturut-turut, bermula dari data terdahulu yang telah dimuat.bar_indexMengutip nilai indeks Bar K semasa skrip Pine dijalankan.

plot(bar_index, "bar_index")

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

plotFungsi ini adalah salah satu fungsi yang akan kita gunakan pada masa akan datang. Ia mudah digunakan, ia adalah untuk melukis garis pada grafik berdasarkan parameter yang kita masukkan, dan data yang kita masukkan adalahbar_index, baris dinamakanbar_indexAnda boleh lihat bahawa bar_index pada Bar pertama adalah 0, dan Bar bertambah 1 ke kanan.

Model pelaksanaan strategi berbeza bergantung kepada tetapan strategi, yang terbahagi kepada收盘价模型dan实时价模型Model harga penutupan, konsep model harga masa nyata telah kami jelaskan sebelum ini.

  • Model Harga Penutupan

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

  • Model harga masa nyata

Apabila kod strategi dijalankan, Bar K semasa akan melaksanakan logik strategi Pin setiap kali perubahan berlaku, sama ada ia ditutup atau tidak, dan isyarat perdagangan yang dicetuskan akan dilaksanakan serta-merta.

Apabila strategi bahasa Pine dijalankan dari kiri ke kanan pada carta, Bar K pada carta adalah历史Bardan实时BarOleh:

  • Sejarah Bar

Apabila strategi yang ditetapkan sebagai “Model Harga Saham Nyata” mula dijalankan, semua Bar Bar K pada carta kecuali Bar Bar K di sebelah kanan adalah历史Bar◯ Logik strategi dalam setiap历史BarHanya sekali sahaja. Apabila strategi yang ditetapkan sebagai “model harga penutupan” bermula, semua Bar di carta akan历史Bar◯ Logik strategi dalam setiap历史BarHanya sekali sahaja.

Pengiraan berdasarkan Bar Sejarah: Kode strategi dijalankan sekali dalam keadaan tutup Bar Sejarah, kemudian kod strategi diteruskan untuk dijalankan pada Bar Sejarah seterusnya sehingga semua Bar Sejarah dijalankan sekali.

  • Bar masa nyata

Apabila strategi dijalankan ke Bar barisan K yang paling kanan, Bar itu adalah Bar masa nyata. Apabila Bar masa nyata ditutup, Bar ini menjadi Bar masa nyata yang telah lalu (berubah menjadi Bar sejarah). Bar masa nyata baru akan dihasilkan di sebelah kanan grafik.

Apabila strategi ditetapkan sebagai “model harga masa nyata” untuk memulakan pelaksanaan, logik strategi akan dijalankan untuk setiap perubahan perdagangan di Bar Masa Nyata. Bar tidak akan muncul pada carta apabila strategi yang ditetapkan sebagai “model harga penutupan” bermula.

Berdasarkan pengiraan Bar secara langsung: Jika strategi yang ditetapkan sebagai “model harga penutupan” tidak menunjukkan Bar dalam masa nyata, kod strategi hanya dijalankan sekali pada penutupan Bar semasa. Jika anda menetapkan strategi sebagai “model harga saham sebenar” di Bar masa nyata, pengiraan dan sejarah Bar adalah sama sekali berbeza, setiap perubahan pergerakan di Bar sebenar akan melaksanakan kod strategi. Contohnya, pembolehubah dalamanhighlowcloseDalam sejarah Bar adalah pasti, dalam masa nyata Bar mungkin setiap kali keadaan berubah nilai-nilai ini akan berubah. Oleh itu, data seperti penunjuk yang dikira berdasarkan nilai-nilai ini juga akan berubah dalam masa nyata. Dalam masa nyata BarcloseIa adalah harga terkini, dan ia adalah harga yang paling murah.highdanlowSentiasa mewakili tertinggi tertinggi dan terendah terendah yang telah dicapai sejak Bar Masa Kini bermula. Variabel terbina dalam ini mewakili nilai akhir ketika Bar Masa Kini terakhir diperbaharui.

Mekanisme rollback semasa melaksanakan strategi pada Bar Masa Nyata (model harga masa nyata): Dalam pelaksanaan Bar secara real-time, setiap iterasi baru strategi yang dijalankan, pembolehubah yang ditakrifkan oleh pengguna yang ditetapkan semula dipanggil rollback. Untuk memahami mekanisme rollback dengan contoh, berikut adalah kod ujian.

Notis:

  /*backtest 
  ...
  ..
  .
  */

Paket itu mengandungi maklumat konfigurasi pengembalian yang disimpan dalam bentuk kod di platform FMZ.

  /*backtest
  start: 2022-06-03 09:00:00
  end: 2022-06-08 15:00:00
  period: 1m
  basePeriod: 1m
  exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
  */

  var n = 0
  if not barstate.ishistory
      runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
      n := n + 1
      runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)

  plot(n, title="n")

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Kami hanya mengkaji adegan yang dilakukan di Bar Masa Nyata, jadi kami menggunakannot barstate.ishistoryBatasan ekspresi hanya digunakan untuk mengumpul n pembolehubah pada masa nyata Bar dan digunakan sebelum dan selepas melakukan operasi pengumpulanruntime.logFungsi output maklumat dalam log strategi.plotGaris n yang digambar dapat dilihat ketika strategi berada di Bar Sejarah, n telah menjadi 0. Apabila ia dijalankan ke Bar Masa Nyata, ia mencetuskan operasi n + 1, dan setiap pusingan menjalankan strategi di Bar Masa Nyata, ia menjalankan operasi n + 1. Dari maklumat log, dapat dilihat bahawa setiap pusingan menjalankan semula kod strategi, n telah diset semula ke nilai yang akhirnya diserahkan oleh strategi Bar Masa Nyata sebelumnya.

Untuk meringkaskan: 1 , setiap kali anda melakukan update, anda akan menjalankan satu kod strategi. 2. Apabila dijalankan di Bar Masa Nyata, setiap kali kod dasar dijalankan, pembolehubah akan dibalikkan. 3. Apabila dijalankan pada Bar Masa Nyata, pembolehubah dihantar sekali semasa kemas kini penutupan.

Oleh kerana data berputar ke belakang, operasi lukisan seperti kurva pada carta juga boleh menyebabkan penggambaran semula, contohnya, jika kita mengubah kod ujian yang baru saja kita buat, ujian cakera:

  var n = 0
  if not barstate.ishistory
      runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
      n := open > close ? n + 1 : n
      runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)

  plot(n, title="n")

Skrin daripada momen A Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Skrin daripada momen B Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Kami hanya mengubah ayat ini:n := open > close ? n + 1 : n, Bar sebenar semasa adalah negatif ((iaitu harga pembukaan lebih tinggi daripada harga penutupan) hanya kepada n ditambah 1 . Anda boleh melihat dalam carta pertama ((saat A) kerana harga pembukaan pada masa itu lebih tinggi daripada harga penutupan ((sinis) jadi n ditambah 1, grafik n menunjukkan nilai 5 . Kemudian perubahan tren, harga dikemas kini seperti yang ditunjukkan dalam carta kedua ((saat B). Apabila harga pembukaan adalah lebih rendah daripada harga penutupan ((sinis), n nilai berguling dan tidak ditambah 1 .

  • Konteks pembolehubah dalam fungsi

Di bawah ini kita akan mengkaji pembolehubah dalam fungsi bahasa Pine. Berdasarkan penerangan di beberapa tutorial Pine, pembolehubah dalam fungsi berbeza dengan pembolehubah di luar fungsi:

Sejarah pembolehubah siri yang digunakan dalam fungsi Pine dibuat dengan setiap panggilan berturut-turut fungsi tersebut. Jika fungsi tidak dipanggil pada setiap lajur yang dijalankan dalam skrip, ini akan menyebabkan perbezaan antara nilai sejarah dalaman dan luar siri dalam blok tempatan fungsi. Oleh itu, jika fungsi tidak dipanggil pada setiap lajur, siri yang menggunakan nilai indeks yang sama yang dirujuk di dalam dan luar fungsi tidak akan merujuk pada titik sejarah yang sama.

Tidak mengapa, kita akan faham dengan menggunakan kod ujian yang dijalankan di FMZ:

  /*backtest
  start: 2022-06-03 09:00:00
  end: 2022-06-08 15:00:00
  period: 1m
  basePeriod: 1m
  exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
  */

  f(a) => a[1]
  f2() => close[1]  

  oneBarInTwo = bar_index % 2 == 0
  plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")   
  plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")   
  plot(close[2], title = "close[2]", color = color.red, overlay = true)
  plot(close[1], title = "close[1]", color = color.green, overlay = true)

Skrin tayangan semula

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

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

  • f(a) => a[1]Cara menggunakan parameter, fungsi kembali pada akhira[1]

  • f2() => close[1]Menggunakan pembolehubah terbina dalam:close, fungsi yang dikembalikan pada akhirclose[1]

[]Simbol digunakan untuk operasi rujukan kepada nilai sejarah pembolehubah siri data, close[1] iaitu merujuk kepada data harga penutupan pada Bar sebelum harga penutupan semasa.

  • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A") Lukis satu aksara A, warna merah, apabila oneBarInTwo adalah benar, dan letakkannya (di atas sumbu Y) adalah:f(close)Nilai yang dikembalikan

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

  • plot(close[2], title = "close[2]", color = color.red, overlay = true) Garis yang digambar, berwarna merah, diletakkan di (atas sumbu Y) sebagai:close[2]Iaitu harga penutupan pada Bar barisan 2 barisan depan Bar (atau 2 barisan kiri Bar).

  • plot(close[1], title = "close[1]", color = color.green, overlay = true) Garis yang digambar berwarna hijau, diletakkan di (atas sumbu Y) sebagai:close[1]Iaitu harga penutupan pada Bar Bar nombor 1 ke kiri.

Sketsa berjalan melalui strategi pengesanan semula boleh dilihat, walaupun fungsi yang digunakan untuk tanda gambar Af(a) => a[1]Fungsi yang digunakan untuk menandakan dan melukis Bf2() => close[1]Semua digunakan.[1] untuk merujuk kepada data sejarah dalam siri data, tetapi kedudukan penanda “A” dan “B” dalam carta adalah sama sekali berbeza. Penanda “A” sentiasa berada di garisan merah, iaitu kod dalam strategiplot(close[2], title = "close[2]", color = color.red, overlay = true)Pada garis yang digariskan, data yang digunakan ialahclose[2]

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Sebabnya ialah ia diindekskan melalui Bar Bar K, iaitu pembolehubah terbina dalam.bar_indexHitung sama ada lukisan “A” dan “B” tanda. “A” dan “B” tanda tidak dicat pada setiap Bar K (dicat apabila memanggil fungsi pengiraan) fungsif(a) => a[1]Nilai yang dirujuk dengan cara ini akan bersesuaian dengan fungsi jika fungsi tidak dipanggil pada setiap Bar.f2() => close[1]Nilai yang dirujuk dengan cara ini adalah berbeza walaupun kedua-dua kaedah digunakan.[1] seperti indeks yang sama)

  • Beberapa fungsi terbina dalam perlu dikira pada setiap Bar untuk mengira hasilnya dengan betul

Sebagai contoh mudah:

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

Kami akan memanggil kod fungsi.ta.barssince(close < close[1])Tulis dalam satu operator tigacondition ? value1 : value2Ini membawa kepada kesesakan dalamclose > close[1]Apabila anda memanggil fungsi ta.barssince.ta.barssinceFungsi ini dikira dari kali terakhirclose < close[1]Bilangan baris K semasa pembentukan. Apabila fungsi ta.barssince dipanggil, ia adalah close > close[1], iaitu harga penutupan semasa lebih besar daripada harga penutupan Bar sebelumnya, apabila fungsi ta.barssince dipanggil dengan syarat close < close[1] tidak ditubuhkan, dan tidak ada lokasi yang terakhir ditubuhkan.

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

Seperti yang ditunjukkan dalam rajah:

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Jadi, apabila kita melukis, kita hanya melukis data apabila nilai res ialah ((-1) ).

Untuk mengelakkan masalah ini, kita hanya menggunakanta.barssince(close < close[1])Panggilan fungsi diambil dari pengendali trivial dan ditulis di luar cawangan syarat yang mungkin. Ia membolehkan ia menjalankan pengiraan pada setiap Bar baris K.

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

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Jadual masa

Konsep urutan masa sangat penting dalam bahasa Pine, dan merupakan konsep yang perlu kita fahami ketika kita belajar bahasa Pine. Suruhan masa bukanlah jenis tetapi struktur asas untuk menyimpan nilai berturut-turut pembolehubah dari masa ke masa. Kita tahu skrip Pine adalah berdasarkan carta, dan yang paling asas yang ditunjukkan dalam carta adalah carta K. Suruhan masa di mana setiap nilai dikaitkan dengan garis masa K Bar.openmerupakan pembolehubah dalaman dalam bahasa Pine, yang mempunyai struktur untuk menyimpan setiap K-line Bar sebagai urutan masa untuk harga bukaan. Ia boleh difahami sebagaiopenStruktur urutan masa ini mewakili harga pembukaan semua Bar Bar K semasa K semasa dari Bar pertama yang bermula hingga Bar yang dijalankan oleh skrip semasa. Jika K semasa adalah kitaran 5 minit, maka kita merujuk dalam kod strategi Pine (atau menggunakan)openIa adalah harga pembukaan K-bar pada masa pelaksanaan semasa menggunakan kod strategi.[]Operator digunakan apabila strategi Pine dijalankan pada Bar baris Kopen[1]Menunjukkan rujukanopenHarga pembukaan Bar Bar K yang terdahulu yang dijalankan oleh skrip semasa dalam urutan masa ((iaitu harga pembukaan K Bar yang terakhir dalam kitaran K).

  • Variabel dalam urutan masa sangat mudah untuk dikira Kami menggunakan fungsi terbina dalam.ta.cumContohnya:
  ta.cum

  Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
  ta.cum(source) → series float
  RETURNS
  Total sum series.
  ARGUMENTS
  source (series int/float)
  SEE ALSO
  math.sum

Kod ujian:

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

Terdapat banyak yang serupata.cumFungsi terbina dalam seperti ini boleh memproses data dalam siri masa secara langsung, sepertita.cumIa adalah untuk menambah nilai-nilai yang sepadan pada setiap K-bar, dan kemudian kita menggunakan grafik untuk memudahkan pemahaman.

bar_index IDEV1 IDEV2 IDEV | - | - | - | - | Strategi ini berjalan pada garis K Bar 0 dan 1 dan 1 dan 1 Strategi ini berjalan pada K-bar 1, 1, 2, 3. Strategi ini berjalan pada K-bar 2 dan 1 dan 3 |…|…|…|…| Strategi berjalan pada N+1 akar K Bar dan N+1 akar dan N+1 akar

Anda dapat melihat bahawa v1, v2 dan bar_index adalah struktur urutan masa, dengan data yang sesuai di setiap Bar. Kod ujian ini tidak membezakan antara “model harga masa nyata” atau “model harga penutupan” hanya untuk menunjukkan Bar sebenar di carta. Untuk mengukur kelajuan, kami menggunakan “model harga penutupan” untuk menguji semula.

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Kerana v1 adalah 1 pada setiap bar.ta.cum(v1)Fungsi ini dijalankan pada baris pertama K Bar, dan hasilnya ialah 1, dengan nilai kepada pembolehubah v2。 Apabilata.cum(v1)Apabila dilakukan pada Bar K baris kedua, sudah ada 2 Bar K baris ((bar_index bagi baris pertama adalah 0, bar_index bagi baris kedua adalah 1), maka hasilnya adalah 2, dan nilai diberikan kepada v2, dan seterusnya. Sebenarnya dapat dilihat bahawa v2 adalah bilangan Bar baris K dalam grafik, kerana indeks baris Kbar_indexIa akan meningkat dari 0.bar_index + 1Ia sebenarnya adalah bilangan bar bar K.v2danbar_indexIa adalah satu perjumpaan.

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Saya juga boleh menggunakanta.cumFungsi terbina dalam mengira jumlah harga penutupan semua Bar pada carta semasa, dan ia hanya boleh ditulis sebagai berikut:ta.cum(close), apabila strategi dijalankan ke Bar Waktu Nyata di sebelah kananta.cum(close)Hasil yang dikira adalah jumlah harga penutupan semua Bar di carta (jika tidak berjalan ke sebelah kanan, hanya ditambah kepada Bar semasa).

Variabel pada urutan masa juga boleh dihitung menggunakan pengendali, seperti kod:ta.sma(high - low, 14)Menggunakan pembolehubah dalaman.high(K Bar harga tertinggi) tolaklow(K Line Bar Minimum Harga), penggunaan terakhirta.smaFungsi mencari nilai purata.

  • Hasil panggilan fungsi akan meninggalkan kesan nilai dalam urutan masa
  v1 = ta.highest(high, 10)[1]
  v2 = ta.highest(high[1], 10)
  plot(v1, title="v1", overlay=true)
  plot(v2, title="v2", overlay=true)

Kod ujian ini dijalankan semasa pengukuran semula dan dapat dilihatv1danv2Nilai yang sama, garis yang digambar pada carta juga berlainan sepenuhnya. Hasil yang dikira oleh panggilan fungsi akan meninggalkan jejak nilai dalam urutan masa, seperti kodta.highest(high, 10)[1]Antara mereka:ta.highest(high, 10)Hasil yang dikira dari panggilan fungsi juga boleh digunakan[1] untuk merujuk kepada nilai sejarahnya.ta.highest(high, 10)Hasilnya ialahta.highest(high[1], 10)Oleh itu.ta.highest(high[1], 10)danta.highest(high, 10)[1]Harga yang sama.

Output maklumat yang disahkan dengan fungsi gambar lain:

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

Anda dapat melihat nilai-nilai pembolehubah a dan pembolehubah b dalam urutan masa yang dipaparkan di atas dan di bawah Bar masing-masing. Anda boleh menyimpan kod lukisan ini semasa pembelajaran, kerana maklumat yang dikeluarkan pada carta mungkin sering diperlukan untuk diperhatikan semasa ujian dan percubaan.

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Struktur skrip

Struktur umum

Pada bahagian permulaan tutorial ini, kami telah meringkaskan beberapa perbezaan antara penggunaan bahasa Pine di FMZ dan bahasa Pine di Trading View.indicator()strategy()Dan, tidak disokong buat masa inilibrary()❚ Sudah tentu untuk bersesuaian dengan skrip Pine versi terdahulu, strategi ditulis seperti://@version=5indicator()strategy()Ia juga boleh. Sesetengah tetapan dasar boleh diletakkan di bawahstrategy()Tetapan parameter dalam fungsi.

<version>
<declaration_statement>
<code>

<version>Maklumat kawalan versi boleh diabaikan.

Nota

Bahasa Pine//Sebagai nota satu baris, kerana bahasa Pine tidak mempunyai nota berbilang baris./**/Untuk nota berbilang baris.

Kod

Garis yang tidak memberi komen atau arahan kompilator dalam skrip adalah pernyataan, yang mewujudkan algoritma skrip. Pernyataan boleh menjadi salah satu daripada ini.

  • Pengisytiharan pemboleh ubah
  • Penjenamaan semula pemboleh ubah
  • Pengisytiharan fungsi
  • Panggilan fungsi terbina dalam, panggilan fungsi yang ditakrifkan pengguna
  • ifforwhileatauswitchStruktur lain

Perkataan boleh disusun dengan pelbagai cara

  • Sesetengah ungkapan boleh dinyatakan dengan satu baris, seperti kebanyakan deklarasi pembolehubah, yang hanya mengandungi satu baris panggilan fungsi atau deklarasi fungsi baris tunggal. Yang lain, seperti struktur, selalu memerlukan lebih banyak baris, kerana mereka memerlukan satu blok tempatan.
  • Perkataan dalam skop global skrip (iaitu, bahagian yang tidak tergolong dalam blok tempatan) tidak boleh dianggap sebagai空格atau制表符(Kunci tab) bermula。 Karakter pertama mereka juga mestilah karakter pertama baris tersebut。 Baris yang bermula pada kedudukan pertama baris, menjadi sebahagian daripada skop global skrip mengikut definisi。
  • Struktur atau pernyataan fungsi berbilang baris sentiasa memerlukanlocal block。 Satu blok tempatan mesti dikurangkan ke dalam satu tanda pengenal atau empat ruang kosong ((jika tidak, ia akan diuraikan sebagai kod berturut-turut baris sebelumnya, iaitu dihakimi sebagai kesinambungan baris sebelumnya), dan setiap blok tempatan mentakrifkan ruang lingkup tempatan yang berbeza。
  • Pelbagai ungkapan tunggal boleh disusun dalam satu baris dengan menggunakan tanda koma ((,) sebagai pemisah.
  • Satu baris boleh mengandungi komen atau hanya komen.
  • Baris juga boleh dibungkus ((terus dalam pelbagai baris) )

Sebagai contoh, termasuk tiga blok lokal, satu dalam deklarasi fungsi tersuai, dan dua menggunakan struktur if dalam deklarasi pembolehubah, seperti berikut:

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

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

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

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

Kod ganti baris

Baris panjang boleh dibahagikan kepada beberapa baris, atau “dibungkus”. Baris yang dibungkus mesti menyusut ke dalam apa-apa jumlah ruang, asalkan ia bukan kelipatan 4 (perbatasan ini digunakan untuk menyusut ke dalam blok tempatan).

a = open + high + low + close

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

a = open +
      high +
          low +
             close

Panggilan plot ((() yang panjang boleh dibungkus dalam ▽.

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

Perkataan dalam deklarasi fungsi yang ditakrifkan oleh pengguna juga boleh dibungkus. Namun, kerana blok tempatan secara gramatikal mesti bermula dengan pengurangan (- 4 ruang kosong atau 1 tanda kerja), apabila membahagikannya ke baris seterusnya, bahagian lanjutan perkataannya mesti bermula dengan pengurangan lebih daripada satu (- tidak sama dengan kelipatan 4 ruang kosong). Contohnya:

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

Pengenal dan operator

Penjenamaan

Sebelum kita memahami variabel, kita perlu memahami konsep tanda pengenal tanda baca.fungsidanPembolehubahNama yang digunakan untuk menamakan pembolehubah (variabel, fungsi)fungsiSeperti yang anda akan pelajari di tutorial seterusnya, kita mulakan dengan mempelajari kod pengenalan lembu, 。

  • 1. Penanda mesti ditulis dengan huruf besar(A-Z)atau huruf kecil(a-z)Huruf atau garisan bawah(_)Permulaan, sebagai aksara pertama pengiktirafan.
  • 2 , karakter pertama selepas pengenal bolehAksaraGaris bawahatauNombor
  • 3. Nama pengenal adalah huruf besar dan kecil.

Sebagai contoh, nama-nama berikut:

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

Seperti kebanyakan bahasa pengaturcaraan, bahasa Pine juga mempunyai cadangan penulisan. Ia biasanya disyorkan untuk menamakan pengenal:

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

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

Pengendali

Pengendali adalah beberapa simbol pengendali dalam bahasa pengaturcaraan yang digunakan untuk membina ungkapan, dan ungkapan adalah peraturan pengiraan yang dirancang untuk tujuan pengiraan tertentu ketika kita menulis strategi. Pengendali dalam bahasa Pine diklasifikasikan mengikut fungsi sebagai:

Pengendali penambahan nilai, pengendali aritmatika, pengendali perbandingan, pengendali logik,? :Pengendali triad[]Operator rujukan sejarah:

Pengendali algebra*Sebagai contoh, untuk membezakan jenis soalan yang dikembalikan oleh pengendali bahasa Pine di Trading View, terdapat kod ujian berikut:

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

Ini adalah salah satu sebab mengapa skrip ini terkompilasi semasa dijalankan di Trading View.adjustedLength = lenInput * factorSelepas kita tambah, hasilnya ialahseries intJenis (seri), bagaimanapunta.emaParameter kedua fungsi tidak menyokong jenis ini. Tetapi tidak ada sekatan ketat seperti itu pada FMZ, kod di atas boleh berfungsi dengan baik.

Di bawah ini, kita akan melihat penggunaan pelbagai pengendali.


Operator penempatan nilai

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

=Operator digunakan untuk memberi nilai kepada pembolehubah apabila ia diwujudkan atau diisytiharkan.=Initialization, deklarasi, dan penugasan akan bermula dengan nilai tersebut pada setiap Bar selepasnya. Ini adalah deklarasi yang sah:

a = close           // 使用内置变量赋值给a
b = 10000           // 使用数值赋值
c = "test"          // 使用字符串赋值
d = color.green     // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

Notisa = closePernyataan penyerahan, di mana setiap Bar mempunyai a sebagai harga penutupan Bar semasa ((close) ⋅ variabel lainbcdIa tidak berubah, boleh diuji dalam sistem maklum balas di FMZ, dan hasilnya boleh dilihat dari gambar.

:=Ia digunakan untuk memberi nilai semula kepada pembolehubah yang sedia ada. Ia boleh difahami sebagai penggunaan:=Operator digunakan untuk mengubah nilai pembolehubah yang telah diisytiharkan dan diinisialisasi. Jika digunakan:=Operator memberi nilai kepada pembolehubah yang tidak dimulakan atau diisytiharkan akan menyebabkan ralat, seperti:

a := 0

Oleh itu,:=Operator penempatan biasanya digunakan untuk penempatan semula nilai kepada pembolehubah yang sedia ada, seperti:

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

plot(b)

menilai jikaclose > open(iaitu BAR semasa adalah garis bujur), dan variabel a adalah nilai sebenar ((true)) ≠ akan melaksanakan kod dalam blok tempatan pernyataan ifb := b + 1, menggunakan pengendali nilai:=Berikan nilai semula kepada b, tambah 1 ◦ dan kemudian gunakan fungsi plot untuk melukis nilai pembolehubah b pada setiap BAR dalam urutan masa, bersambung ke dalam garis ◦

Adakah kita berfikir bahawa jika ada bar bar, b akan terus bertambah 1? Tentu tidak, di sini kita tidak menggunakan kata kunci untuk menyatakan b, dan menginisialisasi sebagai 0.b=0Jadi anda boleh lihat bahawa hasil dari kod ini adalah untuk menetapkan semula b kepada 0 setiap kali jika a adalah nilai sebenar, maka ia sesuai.close > openJadi, apabila anda menjalankan kod pada pusingan ini, b akan menambah 1, apabila anda menggambar fungsi plot, b akan menjadi 1, tetapi apabila anda menjalankan kod pada pusingan berikutnya, b akan diberi nilai semula sebagai 0.

Berkenaan dengan operator penyerahan nilai, dua kata kunci perlu diperluaskan:varvarip

  • var

Sebenarnya, kata kunci ini telah kita lihat dan gunakan dalam tutorial sebelum ini, tetapi tidak dibincangkan secara terperinci.

var adalah kata kunci untuk pembahagian dan inisialisasi sekali-per-kali. Secara amnya, semantik pemberian nilai pembolehubah tanpa kata kunci var menyebabkan nilai pembolehubah ditutup setiap kali data dikemas kini. Sebaliknya, apabila menggunakan kata kunci var untuk pembahagian pembolehubah, mereka masih boleh menyimpan status mereka walaupun data dikemas kini

Kita masih menggunakan contoh ini, tetapi apabila kita memberi nilai kepada bvarKata kunci:

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

  plot(b)

varKata kunci membolehkan pembolehubah b hanya melaksanakan penugasan pertama pada mulanya, dan tidak akan menetapkan semula b kepada 0 pada setiap kali logik dasar dijalankan, jadi garis yang digambar pada masa berjalan dapat dilihat b iaitu jumlah bar yang muncul pada garis BAR semasa K semasa.

Variabel dalam deklarasi var boleh ditulis dalam blok kod, bukan sahaja dalam skala global, seperti contoh ini:

  strategy(overlay=true)
  var a = close
  var b = 0.0
  var c = 0.0
  var green_bars_count = 0
  if close > open
      var x = close
      b := x
      green_bars_count := green_bars_count + 1
      if green_bars_count >= 10
          var y = close
          c := y
  plot(a, title = "a")
  plot(b, title = "b")
  plot(c, title = "c")

Variabel ‘a’ mengekalkan harga penutupan tiang pertama dalam siri. Peubah ‘b’ mengekalkan harga penutupan batang harga aluminium hijau pertama dalam siri. Variable ‘c’ mengekalkan harga penutupan untuk ketupat hijau ketupat kesepuluh dalam siri.

  • varip

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

varip ((var intrabar persist) adalah kata kunci yang digunakan untuk mengalokasikan dan menginisialisasi pembolehubah sekali gus. Ia serupa dengan kata kunci var, tetapi pembolehubah yang menggunakan varip menyatakan mengekalkan nilainya di antara kemas kini K-line dalam masa nyata.

Adakah lebih sukar untuk difahami? Tidak mengapa, kita akan menerangkannya dengan contoh, ia akan mudah difahami.

  strategy(overlay=true)

  // 测试 var varip
  var i = 0
  varip ii = 0  

  // 将策略逻辑每轮改变的i、ii打印在图上
  plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
  plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)  

  // 每轮逻辑执行都给i、ii递增1
  i := i + 1
  ii := ii + 1

Kod ujian ini berlainan untuk model harga penutupan dan model harga masa nyata:

Model harga masa nyata: Ingatkah anda bahawa kita telah memaparkan bahawa strategi yang kita jalankan sebelum ini mempunyai fasa BAR yang bersejarah dan fasa BAR yang sebenar?varvaripVariabel yang diisytiharkaniiiPada setiap pusingan kod strategi, operasi peningkatan akan dilakukan. Oleh itu, kita dapat melihat bahawa setiap angka yang ditunjukkan pada garis KBAR hasil pengukuran kembali adalah peningkatan 1. Apabila fasa K baris sejarah berakhir, fasa K baris masa nyata bermula.i := i + 1danii := ii + 1Ia akan dilaksanakan sekali. Perbezaannya ialah ii akan diubah setiap kali. Walaupun ia akan diubah setiap kali, ia akan kembali kepada nilai sebelumnya pada setiap pusingan logik pelaksanaan strategi (ingatkan mekanisme penggulungan yang kami jelaskan pada bab “Pelaksanaan Model”) sehingga KBAR berjalan dan ia akan mengemas kini nilai i yang ditentukan (iaitu, ia tidak akan kembali kepada nilai sebelumnya pada setiap pusingan logik pelaksanaan strategi).

Model harga penutupan: Oleh kerana model harga penutupan adalah setiap garis K BAR berjalan, satu logik strategi dijalankan. Oleh itu, dalam model harga penutupan, fasa K-bar sejarah dan fasa K-bar masa nyata, var, varip menyatakan peningkatan prestasi yang sama dalam contoh di atas, adalah setiap garis K-BAR meningkat 1 .


Operator algebra
Pengendali menggambarkan
+ Penambahan
- Pengurangan
* Perkalian
/ Penghapusan undang-undang
% Cari contoh

+-Operator boleh digunakan sebagai operator binari, atau sebagai operator satuan. Operator aljabar lain hanya boleh digunakan sebagai operator binari, jika digunakan sebagai operator satuan akan membuat kesalahan.

1 , pengendali aritmatika kedua-dua belah adalah jenis nilai, hasilnya adalah jenis nilai, jenis bulat atau nombor titik terapung bergantung kepada hasil operasi. 2. Operator jika nombor operasinya adalah string.+, hasil pengiraan adalah string, nilai akan ditukarkan kepada bentuk string, dan kemudian string disusun bersama-sama. Jika ia adalah pengendali algebra lain, ia akan cuba untuk menukarkan string ke nilai dan kemudian beroperasi. 3. Jika terdapat nombor operasi na, maka hasil pengiraan adalah nilai sifar na, dan NaN akan dipaparkan apabila ia dicetak pada FMZ.

a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

Bahasa Pine di FMZ sedikit berbeza dengan bahasa Pine di Trading View, bahasa Pine di FMZ tidak terlalu ketat untuk keperluan jenis pembolehubah. Contohnya:

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

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

FMZ boleh dijalankan, tetapi pada pandangan perdagangan, ia akan melaporkan ralat jenis. Apabila operasi di kedua-dua belah pengendali aritmatika adalah string, sistem akan mengubah string menjadi nilai nombor dan kemudian dikira. Jika string bukan nilai tidak dapat dikira, hasil operasi sistem akan menjadi nilai kosong na.


Operator perbandingan

Operator perbandingan adalah operator binari.

Pengendali menggambarkan
< kurang daripada
> Lebih besar daripada
<= kurang daripada sama dengan
>= Lebih besar daripada sama dengan
== Persamaan
!= Ketidaksamaan

Contoh ujian:

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

Seperti yang anda lihat, pengendali perbandingan sangat mudah digunakan, tetapi ia juga merupakan pengendali yang paling banyak digunakan dalam penulisan strategi. Ia boleh digunakan untuk membandingkan nilai dan juga untuk membandingkan pembolehubah dalaman, seperticloseopentunggu. Seperti pengendali operasi, pada FMZ terdapat perbezaan dengan Pin dari Trading View, FMZ tidak mempunyai jenis keperluan yang sangat ketat, jadi pernyataan seperti itud = "1" >= 2Pada FMZ tidak akan membuat kesalahan, ia akan menukarkan rentetan ke nilai nombor sebelum perbandingan dijalankan. Pada Trading View, ia akan membuat kesilapan.


Operator logik
Pengendali Nombor kod menggambarkan
Tidak not Operator unit, bukan operasi
dan and Operator binari, dengan (dan) operasi
atau or Operator binari, atau operasi

Bercakap tentang operator logik, kita mesti bercakap tentang jadual nilai sebenar. Seperti yang kita belajar di sekolah tinggi, hanya di sini kita menguji dan belajar dalam sistem feedback:

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

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

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

runtime.error("stop")

Untuk mengelakkan sistem pengesanan daripada terjejas oleh pencetakan maklumat yang berterusan, kami menggunakanruntime.error("stop")Perkataan selepas melakukan pencetakan sekali lagi, ia akan membuang kesilapan yang luar biasa untuk menghentikan pengukuran, dan kemudian anda boleh melihat maklumat output, dan anda dapat melihat bahawa kandungan cetakan dan jadual nilai sebenar sebenarnya sama.


Pengendali triad

Menggunakan pengendali triad? :Ekspresi trivial yang digabungkan dengan nombor operasicondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseKita sudah biasa dengan ungkapan tiga, operator tiga, yang bermaksud bahawa terdapat tiga operasi.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseAntara lain:conditionIaitu, jika nilai untuk ungkapan yang benar ialah:valueWhenConditionIsTrueJikaconditionEkspresinya ialahvalueWhenConditionIsFalse

Walaupun tidak banyak kegunaan, contoh yang mudah untuk ditunjukkan:

a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

Tidak mengapa jika anda terjumpa tanda salib! ungkapan tiga dimensi juga boleh disematkan, seperti yang telah kita lakukan dalam tutorial sebelumnya.

a = close > open
b = a ? math.abs(close-open) > 30 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

Ia sama dengan meletakkancondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseDalamvalueWhenConditionIsTruevalueWhenConditionIsFalse, juga menggunakan ungkapan triad lain sebagai gantinya.


Operator sejarah

Menggunakan operator sejarah[], merujuk kepada nilai sejarah pada urutan masa. Nilai sejarah ini adalah nilai pada baris K BAR sebelum baris K BAR semasa skrip dijalankan.[]Operator digunakan selepas panggilan pembolehubah, ungkapan, dan fungsi.[]Nombor dalam tanda kurung ini adalah perpindahan data sejarah dari garis BAR K semasa. Sebagai contoh, jika saya ingin merujuk harga penutupan garis BAR K yang lalu, saya akan menulis:close[1]

Kami telah melihat tulisan seperti ini dalam kursus-kursus sebelumnya:

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

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

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

Mungkin anda lihat di sini, sesetengah pelajar akan berkata, operator[]Ia digunakan untuk struktur siri, ia kelihatan seperti struktur siri (series) dan array! Di bawah ini, kita akan menggunakan contoh untuk menerangkan perbezaan antara siri dalam bahasa Pine (series) dan array.

strategy("test", overlay=true)

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

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

Walaupun berkataa = close[1][2]Saya tidak tahu apa-apa tentang apa yang anda katakan, tetapi saya tidak mahu bercakap tentang apa yang anda katakan.

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

Tidak ada salahnya untuk menulisnya secara berasingan, jika anda memahaminya mengikut susun atur yang biasa.b = close[1]Selepas nilai, b sepatutnya menjadi nilai, tetapic = b[1]b masih boleh digunakan untuk merujuk nilai sejarah lagi dengan menggunakan pengendali sejarah. Seperti yang dapat dilihat, konsep siri dalam bahasa Pine tidak semudah arsip. Ia boleh difahami sebagai nilai sejarah pada Bar yang lebih dekat (yang diberikan kepada b), b juga merupakan struktur urutan masa (time series), yang boleh terus merujuk nilai sejarahnya.

Kita boleh menarik grafik ke kiri dan melihat bahawa pada baris pertama K, nilai b dan c adalah nilai kosong ((na) ). Itu kerana apabila skrip dijalankan pada baris pertama K BAR, tidak ada nilai sejarah yang merujuk satu atau dua kitaran ke hadapan, ia tidak wujud. Oleh itu, kita perlu sentiasa berhati-hati ketika menulis strategi, sama ada nilai kosong akan dirujuk ketika merujuk data sejarah, jika tidak berhati-hati menggunakan nilai kosong akan menyebabkan pelbagai perbezaan pengiraan, dan mungkin mempengaruhi masa nyata.nanzFungsi terbina dalam untuk menghakiminznaFungsi, ingat di bab mana?) yang menangani keadaan yang kosong, contohnya:

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

Ini adalah rawatan yang mungkin merujuk kepada nilai sifar ((na)).


Keutamaan pengendali

Kita telah mempelajari banyak pengendali dalam bahasa Pine, yang membentuk ungkapan melalui pelbagai kombinasi dan operasi. Jadi, bagaimana keutamaan operasi ini semasa mengira dalam ungkapan? Seperti operasi empat baris yang kita pelajari ketika kita pergi ke sekolah, ada penggandaan dengan pengurangan keutamaan penggandaan, dan kemudian pengurangan penambahan.

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

Bahagian ungkapan yang mempunyai keutamaan yang tinggi dijalankan terlebih dahulu, dan jika keutamaan yang sama, ia dijalankan dari kiri ke kanan. Jika anda ingin memaksa sebahagian daripada ungkapan untuk dijalankan terlebih dahulu, anda boleh menggunakan()Membungkus ungkapan yang perlu dikendalikan terlebih dahulu.

Pembolehubah

Pengisytiharan pemboleh ubah

Kita telah mempelajari konsep tanda pengenal tanda, tanda pengenal tanda adalah nama yang diberikan kepada suatu variabel sebagai nama bagi suatu variabel. Jadi, ia adalah tanda pengenal nilai yang disimpan. Jadi bagaimana untuk mendeklarasikan suatu variabel? Dan apa peraturan yang ada untuk mendeklarasikan variabel?

  • Model pengisytiharan: Terdapat tiga jenis mod pengisytiharan pembolehubah iaitu:
    1. Menggunakan kata kuncivar
    2. Gunakan kata kuncivarip
    3. Tidak menulis apa-apa.

varvaripKata kunci sebenarnya telah kita pelajari di bab “Operator Penentuan Nilai” sebelum ini, dan tidak akan dibahaskan di sini. Jika model pengisytiharan pembolehubah tidak menulis apa-apa, contohnya:i = 1Sebenarnya, kita telah bercakap sebelum ini, pembolehubah yang dinyatakan dan diberi nilai, dilaksanakan pada setiap baris KBAR.

  • taip Baha