Contoh:
var lineColor = na
n = if bar_index > 10 and bar_index <= 20
lineColor := color.green
else if bar_index > 20 and bar_index <= 30
lineColor := color.blue
else if bar_index > 30 and bar_index <= 40
lineColor := color.orange
else if bar_index > 40
lineColor := color.black
else
lineColor := color.red
plot(close, title="close", color=n, linewidth=5, overlay=true)
plotchar(true, title="bar_index", char=str.tostring(bar_index), location=location.abovebar, color=color.red, overlay=true)
Poin penting: Ekspresi yang digunakan untuk menilai, mengembalikan nilai Boolean. Perhatikan penyusutan. Paling banyak hanya ada satu cabangelse. Semua ekspresi cabang tidak benar, dan tidak ada cabangelse, maka akan mengembalikan na.
x = if close > open
close
plot(x, title="x")
Karena ketika garis K BAR adalah garis lintang, yaitu ketika close < open, ekspresi setelah pernyataan if adalah false, maka blok kode lokal if tidak dilaksanakan. Pada saat ini juga tidak ada cabangelse, pernyataan if akan mengembalikan na. x diberi nilai sebagai na.
Kata ganti juga merupakan kata yang memiliki struktur cabang yang digunakan untuk merancang jalan yang berbeda berdasarkan kondisi tertentu. Kata ganti umumnya memiliki beberapa poin pengetahuan utama berikut ini.
1, kata ganti, seperti kata if, juga dapat mengembalikan nilai. 2, tidak seperti kata ganti dalam bahasa lain, ketika menjalankan struktur switch, hanya satu blok lokal dalam kode yang dijalankan, sehingga pernyataan break tidak diperlukan (yaitu tidak perlu menulis kata kunci seperti break). Setiap cabang dari switch dapat menulis sebuah blok kode lokal, baris terakhir dari blok kode lokal ini adalah nilai yang dikembalikan (itu bisa menjadi elemen dari nilai). Jika tidak ada blok kode lokal yang dipisahkan yang dijalankan, maka kembali na. 4. Mengidentifikasi posisi ekspresi dalam struktur switch, menulis string, variabel, ekspresi, atau panggilan fungsi. 5. Switch memungkinkan untuk menentukan nilai balik yang digunakan sebagai nilai default ketika tidak ada situasi lain dalam struktur yang dijalankan.
Kita akan melihat contoh-contohnya satu per satu untuk memahami penggunaannya.
1 dengan ekspresiswitch
Di sini, saya akan menjelaskan beberapa contoh:
// input.string: defval, title, options, tooltip
func = input.string("EMA", title="指标名称", tooltip="选择要使用的指标函数名称", options=["EMA", "SMA", "RMA", "WMA"])
// input.int: defval, title, options, tooltip
// param1 = input.int(10, title="周期参数")
fastPeriod = input.int(10, title="快线周期参数", options=[5, 10, 20])
slowPeriod = input.int(20, title="慢线周期参数", options=[20, 25, 30])
data = input(close, title="数据", tooltip="选择使用收盘价、开盘价、最高价...")
fastColor = color.red
slowColor = color.red
[fast, slow] = switch func
"EMA" =>
fastLine = ta.ema(data, fastPeriod)
slowLine = ta.ema(data, slowPeriod)
fastColor := color.red
slowColor := color.red
[fastLine, slowLine]
"SMA" =>
fastLine = ta.sma(data, fastPeriod)
slowLine = ta.sma(data, slowPeriod)
fastColor := color.green
slowColor := color.green
[fastLine, slowLine]
"RMA" =>
fastLine = ta.rma(data, fastPeriod)
slowLine = ta.rma(data, slowPeriod)
fastColor := color.blue
slowColor := color.blue
[fastLine, slowLine]
=>
runtime.error("error")
plot(fast, title="fast" + fastPeriod, color=fastColor, overlay=true)
plot(slow, title="slow" + slowPeriod, color=slowColor, overlay=true)
Sebelumnya kita belajar tentang fungsi input, dan di sini kita terus belajar tentang dua fungsi yang mirip dengan input:input.string
、input.int
Fungsi tersebut.input.string
Anda dapat menggunakan aplikasi ini untuk mengunduh gambar dari situs web Anda.input.int
Fungsi ini digunakan untuk mengembalikan nilai integer.options
Anda dapat menggunakan parameter ini untuk mencari informasi yang lebih lengkap.options
Parameter dapat ditransmisikan ke dalam suatu array yang terdiri dari nilai pilihan.options=["EMA", "SMA", "RMA", "WMA"]
danoptions=[5, 10, 20]
(Perhatikan bahwa salah satu adalah tipe string, dan yang lainnya adalah tipe angka). Dengan cara ini, kontrol pada antarmuka kebijakan tidak perlu memasukkan nilai tertentu, tetapi kontrol menjadi drop-down box untuk memilih opsi yang disediakan dalam parameter opsi.
Nilai dari variabel func adalah sebuah string, variabel func digunakan sebagai ekspresi dari switch (bisa variabel, panggilan fungsi, ekspresi), untuk menentukan cabang mana di dalam switch yang akan dijalankan. Jika variabel func tidak dapat mencocokkan ekspresi pada cabang mana pun di dalam switch (yaitu sama), maka block kode cabang default akan dijalankan, yang akan dijalankan.runtime.error("error")
Fungsi ini menyebabkan kebijakan untuk memunculkan berhenti yang tidak normal.
Dalam kode pengujian kami di atas, setelah baris terakhir runtime.error dari blok kode cabang default Switch, kami tidak menambahkan kode seperti [na, na] untuk mengembalikan nilai yang kompatibel, dan dalam tampilan perdagangan perlu mempertimbangkan masalah ini, jika jenisnya tidak konsisten, maka kesalahan akan dikembalikan. Tetapi pada FMZ, karena tidak ada persyaratan tipe yang ketat, kode kompatibel ini dapat diabaikan.
strategy("test", overlay=true)
x = if close > open
close
else
"open"
plotchar(true, title="x", char=str.tostring(x), location=location.abovebar, color=color.red)
Tidak ada kesalahan pada FMZ, tetapi pada trading view. Karena if branch yang dikembalikan tidak sesuai tipe.
2, tidak ada ekspresiswitch
Mari kita lihat.switch
Cara lain yang digunakan adalah dengan menulis tanpa ekspresi.
up = close > open // up = close < open
down = close < open
var upOfCount = 0
var downOfCount = 0
msgColor = switch
up =>
upOfCount += 1
color.green
down =>
downOfCount += 1
color.red
plotchar(up, title="up", char=str.tostring(upOfCount), location=location.abovebar, color=msgColor, overlay=true)
plotchar(down, title="down", char=str.tostring(downOfCount), location=location.belowbar, color=msgColor, overlay=true)
Contoh kode uji dapat dilihat bahwa switch akan mencocokkan blok kode lokal yang benar pada kondisi cabang pelaksanaan. Secara umum, persyaratan cabang setelah pernyataan switch harus saling menolak. Artinya, contoh up dan down tidak dapat benar pada saat yang sama. Karena switch hanya dapat menjalankan satu blok kode lokal yang bercabang, ada minat untuk memasukkan kalimat ini dalam kode:up = close > open // up = close < open
Ubah isi dari komentar, uji kembali hasil observasi. Anda akan menemukan bahwa switch branch hanya dapat menjalankan branch pertama. Selain itu, Anda juga perlu berhati-hati untuk tidak menulis panggilan fungsi di branch switch, fungsi tidak dapat dipanggil di setiap BAR yang dapat menyebabkan beberapa masalah perhitungan data.switch
Dalam contoh ini, cabang pelaksanaan ditentukan dan tidak akan diubah dalam operasi strategi).
返回值 = for 计数 = 起始计数 to 最终计数 by 步长
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Penggunaan pernyataan for sangat sederhana, karena loop for dapat mengembalikan satu nilai akhir ((atau mengembalikan beberapa nilai, dalam bentuk seperti [a, b, c]); seperti pada pseudo-kode di atas, variabel yang diberikan ke posisi "nilai kembali". Setelah pernyataan for diikuti oleh variabel "penghitungan" untuk mengendalikan jumlah siklus, mengutip nilai lain, dll. Variabel "penghitungan" diberi nilai "penghitungan awal" sebelum siklus dimulai, dan kemudian diteruskan sesuai dengan pengaturan "pertumbuhan", dan siklus berhenti ketika jumlah "penghitungan" lebih besar dari "variabel akhir".
untuk digunakan dalam siklusbreak
Kata Kunci: Ketika dilakukanbreak
Setelah kalimat, siklus berhenti.
untuk digunakan dalam sikluscontinue
Kata Kunci: Ketika dilakukancontinue
Setelah kalimat selesai, loop akan diabaikan.continue
Setelah itu, kode akan langsung melakukan loop berikutnya. Kata for akan mengembalikan nilai yang dikembalikan pada saat loop terakhir dijalankan. Jika tidak ada kode yang dijalankan, maka akan mengembalikan nilai kosong.
Di bawah ini kami akan menunjukkan dengan contoh sederhana:
ret = for i = 0 to 10 // 可以增加by关键字修改步长,暂时FMZ不支持 i = 10 to 0 这样的反向循环
// 可以增加条件设置,使用continue跳过,break跳出
runtime.log("i:", i)
i // 如果这行不写,就返回空值,因为没有可返回的变量
runtime.log("ret:", ret)
runtime.error("stop")
for ... in
Ada dua bentuk kalimat, yang dijelaskan dengan kode palsu di bawah ini.
返回值 = for 数组元素 in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Perbedaan utama antara kedua bentuk ini adalah apa yang diikuti setelah kata kunci for, salah satunya adalah menggunakan variabel sebagai variabel yang merujuk pada elemen array. Yang lain adalah menggunakan struktur yang berisi variabel indeks, elemen array untuk referensi variabel. Yang lainnya adalah aturan nilai kembali, menggunakan aturan seperti break, continue dan for loop. Kami juga menunjukkan penggunaannya dengan contoh sederhana.
testArray = array.from(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
for ele in testArray // 修改成 [i, ele]的形式:for [i, ele] in testArray , runtime.log("ele:", ele, ", i:", i)
runtime.log("ele:", ele)
runtime.error("stop")
Jika Anda ingin menggunakan indeks, gunakan.for [i, ele] in testArray
Saya tidak tahu apa yang terjadi.
for aplikasi berputar
Ketika beberapa perhitungan logika loop dapat dilakukan dengan fungsi built-in yang disediakan oleh bahasa Pine, struktur loop dapat ditulis langsung, atau pemrosesan fungsi built-in dapat digunakan. Kami memberikan dua contoh.
1 adalah rata-rata yang dihitung
Desain struktur daur ulang digunakan untuk:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
Dalam contoh ini digunakan untuk melakukan penghitungan berputar, lalu menghitung rata-rata.
Menghitung rata-rata secara langsung menggunakan fungsi built-in:
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Menggunakan fungsi built-in secara langsungta.sma
Untuk menghitung indikator rata-rata, jelas lebih mudah untuk menghitung rata-rata menggunakan fungsi built-in. Di grafik, perbandingan dapat melihat hasil yang dihitung sangat konsisten.
2 dan
Atau gunakan contoh di atas untuk menjelaskan.
Desain struktur daur ulang digunakan untuk:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Untuk menghitung semua elemen array yang dapat diproses dengan loop, fungsi built-in juga dapat digunakan.array.sum
Saya tidak tahu apa yang terjadi.
Menghitung penjumlahan langsung dengan menggunakan fungsi built-in:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
plot(array.sum(a) / length, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Anda dapat melihat data yang dihitung, menggunakan gambar plot untuk menunjukkan kesesuaian penuh pada grafik.
Jadi, jika semua ini dapat dilakukan dengan fungsi built-in, mengapa kita harus merancang loop? 1, beberapa operasi untuk array, perhitungan. 2, melihat kembali sejarah, misalnya mencari tahu berapa banyak puncak masa lalu yang lebih tinggi dari puncak BAR saat ini. Karena puncak BAR saat ini hanya diketahui pada BAR yang dijalankan oleh skrip, maka diperlukan loop untuk kembali ke masa lalu dan menganalisis BAR masa lalu. 3. Fungsi built-in yang menggunakan bahasa Pine tidak dapat menyelesaikan perhitungan BAR masa lalu.
while
Statement membuat kode bagian loop terus dijalankan sampai kondisi penilaian dalam while structure adalah false.
返回值 = while 判断条件
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Aturan lain untuk while mirip dengan loop for, dimana baris terakhir dari blok kode lokal loop adalah nilai yang dikembalikan, dan dapat mengembalikan beberapa nilai. Ketika "kondisi loop" adalah untuk menjalankan loop pada waktu yang benar, kondisi stop loop pada saat yang salah.
Saya masih menggunakan contoh garis lurus untuk menunjukkannya:
length = 10
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Anda dapat melihat bahwa penggunaan loop sementara juga sangat sederhana, dan Anda dapat merancang beberapa logika perhitungan yang tidak dapat diganti dengan fungsi built-in, seperti perkalian perhitungan:
counter = 5
fact = 1
ret = while counter > 0
fact := fact * counter
counter := counter - 1
fact
plot(ret, title="ret") // ret = 5 * 4 * 3 * 2 * 1
Array dalam bahasa Pine memiliki definisi yang mirip dengan Array dalam bahasa pemrograman lainnya. Array dalam bahasa Pine adalah array berdimensi tunggal. Array biasanya digunakan untuk menyimpan serangkaian data berturut-turut. Array yang menyimpan data tunggal disebut elemen array. Jenis elemen ini dapat berupa: bulat, titik lebur, string, nilai warna, nilai Boolean.[]
Tapi kita harus menggunakannya.array.get()
danarray.set()
Fungsi...............
Kami akan menjelaskan dengan kode sederhana:
var a = array.from(0)
if bar_index == 0
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 1
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 2
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2])
else if bar_index == 3
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2], ", 向前数3根BAR上的a,即a[3]值:", a[3])
else if bar_index == 4
// 使用array.get 按索引获取元素,使用array.set按索引修改元素
runtime.log("数组修改前:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
array.set(a, 1, 999)
runtime.log("数组修改后:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
Penggunaanarray<int> a
、float[] b
Array yang dinyatakan atau hanya menyatakan satu variabel dapat diberi nilai sebagai Array, misalnya:
array<int> a = array.new(3, bar_index)
float[] b = array.new(3, close)
c = array.from("hello", "fmz", "!")
runtime.log("a:", a)
runtime.log("b:", b)
runtime.log("c:", c)
runtime.error("stop")
Penggunaan umum untuk inisialisasi variabel matriksarray.new
danarray.from
函数。Pine语言中还有很多和类型相关的与array.new类似的函数:array.new_int()
、array.new_bool()
、array.new_color()
、array.new_string()
Dan seterusnya.
Kata kunci var juga dapat bekerja dengan pola deklarasi dari suatu array, dimana array yang menggunakan pernyataan kata kunci var hanya diinisialisasi pada bar pertama.
var a = array.from(0)
b = array.from(0)
if bar_index == 1
array.push(a, bar_index)
array.push(b, bar_index)
else if bar_index == 2
array.push(a, bar_index)
array.push(b, bar_index)
else if barstate.islast
runtime.log("a:", a)
runtime.log("b:", b)
runtime.error("stop")
Anda dapat melihat bahwa perubahan array a terus ditentukan dan tidak ditempatkan kembali. Array b diinisialisasi pada setiap BAR.barstate.islast
Saat mencetak secara real-time, hanya ada satu elemen yang tetap, yaitu nilai 0.
Menggunakan array.get untuk mendapatkan elemen yang menentukan posisi indeks dalam suatu array, menggunakan array.set untuk memodifikasi elemen yang menentukan posisi indeks dalam suatu array.
Parameter pertama array.get adalah array yang akan diproses, dan parameter kedua adalah indeks yang ditentukan. Parameter pertama array.set adalah array yang akan diproses, parameter kedua adalah indeks yang ditentukan, dan parameter ketiga adalah elemen yang akan ditulis.
Contoh sederhana yang bisa kita gunakan adalah:
lookbackInput = input.int(100)
FILL_COLOR = color.green
var fillColors = array.new(5)
if barstate.isfirst
array.set(fillColors, 0, color.new(FILL_COLOR, 70))
array.set(fillColors, 1, color.new(FILL_COLOR, 75))
array.set(fillColors, 2, color.new(FILL_COLOR, 80))
array.set(fillColors, 3, color.new(FILL_COLOR, 85))
array.set(fillColors, 4, color.new(FILL_COLOR, 90))
lastHiBar = - ta.highestbars(high, lookbackInput)
fillNo = math.min(lastHiBar / (lookbackInput / 5), 4)
bgcolor(array.get(fillColors, int(fillNo)), overlay=true)
plot(lastHiBar, title="lastHiBar")
plot(fillNo, title="fillNo")
Contoh ini menginisialisasi warna dasar hijau, menyatakan dan menginisialisasi suatu array untuk menyimpan warna, dan kemudian memberikan transparansi yang berbeda pada nilai warna (menggunakan fungsi color.new); menghitung tingkat warna dengan menghitung jarak maksimum dari nilai high dalam 100 siklus review saat ini BAR; menghitung tingkat warna dengan menghitung jarak tertinggi dari nilai high dalam 100 siklus review terakhir; semakin dekat nilai tertinggi dalam 100 siklus review terakhir, semakin tinggi peringkatnya, semakin dalam nilai warna yang sesuai (kurang transparansi); banyak strategi serupa yang digunakan dengan cara ini untuk menunjukkan tingkat harga dalam N siklus review saat ini.
Bagaimana untuk melintasi suatu array, kita bisa melakukannya dengan kalimat for/for in/while yang kita pelajari sebelumnya.
a = array.from(1, 2, 3, 4, 5, 6)
for i = 0 to (array.size(a) == 0 ? na : array.size(a) - 1)
array.set(a, i, i)
runtime.log(a)
runtime.error("stop")
a = array.from(1, 2, 3, 4, 5, 6)
i = 0
while i < array.size(a)
array.set(a, i, i)
i += 1
runtime.log(a)
runtime.error("stop")
a = array.from(1, 2, 3, 4, 5, 6)
for [i, ele] in a
array.set(a, i, i)
runtime.log(a)
runtime.error("stop")
Semua tiga metode ini memiliki hasil yang sama.
Array dapat dinyatakan dalam ruang lingkup global skrip, atau dalam ruang lingkup lokal fungsi atau cabang if
Untuk penggunaan elemen dalam array, cara berikut ini adalah sama, kita dapat melihat dengan contoh berikut bahwa dua kelompok baris digambar pada grafik, dua baris di setiap kelompok, dan dua baris di setiap kelompok memiliki nilai yang sama persis.
a = array.new_float(1)
array.set(a, 0, close)
closeA1 = array.get(a, 0)[1]
closeB1 = close[1]
plot(closeA1, "closeA1", color.red, 6)
plot(closeB1, "closeB1", color.black, 2)
ma1 = ta.sma(array.get(a, 0), 20)
ma2 = ta.sma(close, 20)
plot(ma1, "ma1", color.aqua, 6)
plot(ma2, "ma2", color.black, 2)
Fungsi yang terkait dengan operasi peningkatan arithmetic adalah:
array.unshift()
、array.insert()
、array.push()
。
Fungsi yang terkait dengan operasi penghapusan dari array:
array.remove()
、array.shift()
、array.pop()
、array.clear()
。
Kami menggunakan contoh berikut untuk menguji fungsi operasi penambahan, penghapusan dari array ini.
a = array.from("A", "B", "C")
ret = array.unshift(a, "X")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.insert(a, 1, "Y")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.push(a, "D")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.remove(a, 2)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.shift(a)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.pop(a)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.clear(a)
runtime.log("数组a:", a, ", ret:", ret)
runtime.error("stop")
Aplikasi untuk menambahkan dan menghapus: Array sebagai queue
Dengan menggunakan array, dan beberapa fungsi penambahan dan penghapusan array, kita dapat membangun struktur data "baris". Baris dapat digunakan untuk menghitung rata-rata bergerak harga tik. Beberapa teman mungkin bertanya: Mengapa membangun struktur array?
Queue adalah struktur yang sering digunakan dalam bidang pemrograman.
Elemen yang masuk ke queue dulu, keluar dari queue dulu.
Dengan cara ini, Anda dapat memastikan bahwa data yang ada dalam queue adalah data terbaru, dan panjang queue tidak akan mengembang tanpa batas (kode yang mengembang tanpa batas hanya dapat ditulis pada tengah hari, karena terburu-buru atau terlambat akan menimbulkan masalah).
Dalam contoh berikut, kita menggunakan struktur queue untuk mencatat harga setiap tik, menghitung harga rata-rata bergerak di tingkat tik, dan kemudian membandingkan dengan rata-rata bergerak yang diamati di tingkat garis K selama 1 menit.
strategy("test", overlay=true)
varip a = array.new_float(0)
var length = 10
if not barstate.ishistory
array.push(a, close)
if array.size(a) > length
array.shift(a)
sum = 0.0
for [index, ele] in a
sum += ele
avgPrice = array.size(a) == length ? sum / length : na
plot(avgPrice, title="avgPrice")
plot(ta.sma(close, length), title="ta.sma")
Perhatikan, ketika kita menyatakan array a, kita menentukan mode deklarasi, menggunakan kata kunci.varip
│ Dengan demikian setiap perubahan harga akan dicatat dalam matriks a│
Menghitung fungsi terkait:
array.avg()
Dengan menggunakan metode ini, kita bisa mencari nilai rata-rata dari semua elemen dalam suatu himpunan.array.min()
Ini adalah elemen terkecil dalam suatu himpunan.array.max()
Ini adalah elemen terbesar dalam suatu himpunan.array.stdev()
Dengan demikian, semua elemen dalam suatu himpunan memiliki nilai deviasi standar.array.sum()
Jumlah semua elemen dalam suatu himpunan.
Fungsi terkait operasi:array.concat()
Menggabungkan atau menghubungkan dua aritmatika.array.copy()
Array yang disalin.array.join
Menghubungkan semua elemen dalam array menjadi satu string.array.sort()
Di sini Anda dapat melihat beberapa gambar yang menarik dari situs ini.array.reverse()
Arsitektur terbalik.array.slice()
Untuk mengiris suatu matriks.array.includes()
Mengetahui unsur-unsur.array.indexof()
Kembali ke indeks di mana nilai yang dikirimkan pertama kali muncul. Jika nilai tidak ditemukan, kembali -1.array.lastindexof()
Cari nilai yang terakhir muncul.
Contoh tes untuk menghitung fungsi yang terkait dengan aritmatika:
a = array.from(3, 2, 1, 4, 5, 6, 7, 8, 9)
runtime.log("数组a的算数平均:", array.avg(a))
runtime.log("数组a中的最小元素:", array.min(a))
runtime.log("数组a中的最大元素:", array.max(a))
runtime.log("数组a中的标准差:", array.stdev(a))
runtime.log("数组a的所有元素总和:", array.sum(a))
runtime.error("stop")
Ini adalah fungsi aritmatika yang paling umum digunakan.
Contoh operasi fungsi terkait:
a = array.from(1, 2, 3, 4, 5, 6)
b = array.from(11, 2, 13, 4, 15, 6)
runtime.log("数组a:", a, ", 数组b:", b)
runtime.log("数组a,数组b连接在一起:", array.concat(a, b))
c = array.copy(b)
runtime.log("复制一个数组b,赋值给变量c,变量c:", c)
runtime.log("使用array.join处理数组c,给每个元素中间增加符号+,连接所有元素结果为字符串:", array.join(c, "+"))
runtime.log("排序数组b,按从小到大顺序,使用参数order.ascending:", array.sort(b, order.ascending)) // array.sort函数修改原数组
runtime.log("排序数组b,按从大到小顺序,使用参数order.descending:", array.sort(b, order.descending)) // array.sort函数修改原数组
runtime.log("数组a:", a, ", 数组b:", b)
array.reverse(a) // 此函数修改原数组
runtime.log("反转数组a中的所有元素顺序,反转之后数组a为:", a)
runtime.log("截取数组a,索引0 ~ 索引3,遵循左闭右开区间规则:", array.slice(a, 0, 3))
runtime.log("在数组b中搜索元素11:", array.includes(b, 11))
runtime.log("在数组a中搜索元素100:", array.includes(a, 100))
runtime.log("将数组a和数组b连接,搜索其中第一次出现元素2的索引位置:", array.indexof(array.concat(a, b), 2), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.log("将数组a和数组b连接,搜索其中最后一次出现元素6的索引位置:", array.lastindexof(array.concat(a, b), 6), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.error("stop")
Bahasa Pine dapat merancang fungsi kustom. Secara umum, fungsi kustom dalam bahasa Pine memiliki aturan berikut:
1, semua fungsi didefinisikan dalam ruang lingkup global skrip. Tidak dapat menyatakan fungsi dalam fungsi lain.
2. Tidak mengizinkan fungsi untuk memanggil dirinya sendiri dalam kode sendiri.
3. Pada prinsipnya semua bahasa PINE memiliki fungsi gambar built-inbarcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()
) tidak dapat dipanggil dalam fungsi kustom.
4, fungsi dapat ditulis sebagai baris tunggal, baris ganda. Nilai yang dikembalikan pada kalimat terakhir adalah nilai yang dikembalikan oleh fungsi saat ini, nilai yang dikembalikan dapat dikembalikan dalam bentuk elemen.
Dalam tutorial sebelumnya, kita juga telah menggunakan fungsi kustom beberapa kali, seperti desain fungsi kustom dalam satu baris:
barIsUp() => close > open
Fungsi ini mengembalikan apakah BAR saat ini adalah sinar matahari.
Fungsi khusus yang dirancang dalam beberapa baris:
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Fungsi yang diimplementasikan sendiri dengan fungsi kustom adalah fungsi yang diimplementasikan sendiri dengan fungsi kustom. Fungsi yang diimplementasikan sendiri adalah fungsi yang diimplementasikan dengan fungsi kustom.
Selain itu, contoh fungsi kustom yang dapat dikembalikan dengan dua variabel:
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)
Fungsi ini dapat menghitung garis cepat, garis lambat, dan dua indikator EMA.
Fungsi built-in dapat digunakan dengan mudah diFMZ PINE Script dokumentasiPeriksa di bawah ini.
Fungsi terintegrasi dalam bahasa Pine:
1, fungsi pengolahan stringstr.
Serial tersebut.
2, fungsi pengolahan nilai warnacolor.
Serial tersebut.
3, fungsi input parameterinput.
Serial tersebut.
4, fungsi penghitungan indikatorta.
Serial tersebut.
5, fungsi gambarplot.
Serial tersebut.
6, fungsi pengolahan aritmatikaarray.
Serial tersebut.
7 Fungsi terkait transaksistrategy.
Serial tersebut.
Fungsi terkait operasi matematika 8.math.
Serial tersebut.
9, Fungsi lain ((pengolahan waktu, fungsi gambar seri non-plot,request.
Fungsi seri, fungsi pengolahan tipe, dll.)
strategy.
Fungsi deret adalah fungsi yang sering kita gunakan dalam strategi desain, yang sangat terkait dengan fungsi dan strategi untuk melakukan operasi transaksi saat dijalankan secara spesifik.
1、strategy.entry
strategy.entry
Fungsi ini adalah fungsi sub-sistem yang lebih penting ketika kita menulis strategi, dan fungsi ini lebih penting dalam beberapa parameter:id
, direction
, qty
, when
Dan seterusnya.
Parameter:
id
: dapat dipahami sebagai nama yang digunakan untuk sebuah posisi perdagangan.direction
: jika arah pesanan adalah melakukan lebih (membeli) parameter ini diteruskanstrategy.long
Variabel built-in ini, jika ingin kosongkan (menjual) akan diteruskan.strategy.short
Variabel ini.qty
: menentukan jumlah yang akan dipesan, jika parameter ini tidak diteruskan, maka jumlah yang akan dipesan secara default akan digunakan.when
: kondisi pelaksanaan, parameter ini dapat ditentukan untuk mengontrol apakah operasi di bawah perintah saat ini dipicu.limit
: Menentukan harga batas pesanan.stop
Harga Stop Loss:strategy.entry
Rincian pelaksanaan fungsi yang spesifikstrategy
Anda juga dapat mengontrol pengaturan parameter saat fungsi dipanggil."Parameter Templat Perpustakaan Pertukaran Bahasa Pine"Setel kontrol, Parameter template perpustakaan transaksi bahasa Pine Untuk lebih detail tentang kontrol transaksi, Anda dapat melihat dokumentasi yang terkait.
Di sini kita akan membahas beberapa hal penting.strategy
Jadi, kita bisa menggunakan fungsi ini.pyramiding
、default_qty_value
Parameter. Menggunakan kode berikut untuk menguji:
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
ema10 = ta.ema(close, 10)
findOrderIdx(idx) =>
if strategy.opentrades == 0
false
else
ret = false
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := true
break
ret
if not findOrderIdx("long1")
strategy.entry("long1", strategy.long)
if not findOrderIdx("long2")
strategy.entry("long2", strategy.long, 0.2, when = close > ema10)
if not findOrderIdx("long3")
strategy.entry("long3", strategy.long, 0.2, limit = low[1])
strategy.entry("long3", strategy.long, 0.3, limit = low[1])
if not findOrderIdx("long4")
strategy.entry("long4", strategy.long, 0.2)
plot(ema10, title="ema10", color=color.red)
Kode dimulai/*backtest ... */
Bagian paket yang disetel untuk retesting, untuk mencatat informasi seperti waktu retesting saat itu, untuk memudahkan debugging, bukan kode kebijakan.
Di dalam kode:strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
Jika kita mengidentifikasipyramiding
Jika parameternya adalah 3, maka kita akan mengatur untuk melakukan trading di arah yang sama paling banyak tiga kali. Jadi empat kali dalam contoh ini.strategy.entry
Operasi di bawah ini tidak dijalankan sekali. Karena kita juga telah menentukandefault_qty_value
Parameternya adalah 0.1, jadi ID akan menjadi 1 ton kali ini.strategy.entry
Jumlah submenu yang digunakan untuk operasi submenu adalah 0.1 ∞.strategy.entry
Kita bisa menggunakan fungsi yang kita pilih saat kita memanggilnya.direction
sama denganstrategy.long
Karena itu, Anda harus membayar untuk mengikuti tes ulang.
Perhatikan kodestrategy.entry("long3", ...
Operasi di bawah ini dipanggil dua kali, untuk ID yang sama: strategy.entry
Operasi di bawah tidak berhasil, panggilan keduastrategy.entry
Fungsi untuk memodifikasi ID ini (data yang ditampilkan saat pengujian ulang juga dapat melihat bahwa jumlah pesanan di bawah pesanan batas ini telah diubah menjadi 0.3); contoh lain, jika saat pertama kali ID untuk order yang dibuat untuk 3 ton, terus digunakan sesuai dengan ID yang dibuat untuk 3 ton.strategy.entry
Fungsi ini akan mengaktifkan fungsi ini untuk mengaktifkan fungsi ini.
2、strategy.close
strategy.close
Fungsi ini digunakan untuk menentukan posisi pegangan masuk yang memiliki ID identifikasi. Parameter utama adalah:id
,when
,qty
,qty_percent
。
Parameter:
id
: ID login yang dibutuhkan untuk bermain, yaitu yang kita gunakanstrategy.entry
ID yang ditunjuk saat membuka posisi pada fungsi yang masuk.when
Pernyataan ini juga ditandatangani oleh beberapa pejabat pemerintah.qty
: Jumlah saham.qty_percent
: Persentase saham yang rata-rata.Fungsi ini dapat digunakan dalam bentuk gambar, gambar, dan gambar.
Dalam kode/*backtest ... */
是FMZ.COM国际站回测时的配置信息,可以删掉,设置自己需要测试的市场、品种、时间范围等信息。
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("close Demo", pyramiding=3)
var enableStop = false
if enableStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.2)
if strategy.opentrades >= 3
strategy.close("long1") // 多个入场订单,不指定qty参数,全部平仓
// strategy.close() // 不指定id参数,会平掉当前的持仓
// strategy.close("long2") // 如果指定一个不存在的id则什么都不操作
// strategy.close("long1", qty=0.15) // 指定qty参数平仓
// strategy.close("long1", qty_percent=50) // qty_percent设置50即为平掉long1标识仓位的50%持仓
// strategy.close("long1", qty_percent=80, when=close<open) // 指定when参数,修改为close>open就不触发了
enableStop := true
Strategi pengujian menunjukkan memulai tiga kali berturut-turut melakukan multi-input dengan ID input masing-masing 1strategy.close
Hasil yang berbeda yang dihitung kembali ketika parameter yang berbeda dari fungsi ditetapkan pada leveling.strategy.close
Fungsi ini tidak memiliki parameter yang dapat menentukan harga untuk melakukan transaksi, dan fungsi ini digunakan untuk melakukan transaksi langsung dengan harga pasar saat ini.
3、strategy.close_all
strategy.close_all
Fungsi ini digunakan untuk meratakan semua posisi saat ini, karena skrip bahasa Pine hanya dapat meratakan posisi dalam satu arah, yaitu jika ada sinyal yang memicu yang bertentangan dengan arah posisi saat ini, maka posisi akan dipadatkan dan dipicu berdasarkan sinyal tersebut.strategy.close_all
Saat dipanggil, semua posisi di arah saat ini akan dipadatkan.strategy.close_all
Parameter utama fungsi adalah:when
。
Parameter:
when
Pernyataan ini juga ditandatangani oleh beberapa pejabat pemerintah.Kami menggunakan contoh untuk mengamati:
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("closeAll Demo")
var enableStop = false
if enableStop
runtime.error("stop")
strategy.entry("long", strategy.long, 0.2, when=strategy.position_size==0 and close>open)
strategy.entry("short", strategy.short, 0.3, when=strategy.position_size>0 and close<open)
if strategy.position_size < 0
strategy.close_all()
enableStop := true
Pada saat kode uji dimulai, jumlah penyimpanan adalah 0 (yaitustrategy.position_size==0
Jadi, ketika parameter set when sesuai dengan kondisi, hanya melakukan ID sebagai yang benar.strategy.entry
Fungsi masuk. Setelah memegang banyak posisistrategy.position_size
Fungsi masuk yang digunakan untuk pencetak pendek ID lebih besar dari 0, maka ID mungkin saja akan dieksekusi, karena saat ini memegang posisi multi-head. Sinyal reversal kosong yang muncul pada saat ini akan menyebabkan posisi multi-head dipadatkan dan kembali terbuka.strategy.position_size < 0
Jika Anda memiliki posisi kosong, maka Anda dapat menyamakan semua posisi yang Anda miliki dengan posisi yang Anda miliki saat ini.enableStop := true
◦ Menghentikan kebijakan untuk membuat log lebih mudah untuk dilihat.
Anda dapat menemukanstrategy.close_all
Fungsi ini tidak memiliki parameter yang dapat menentukan harga untuk melakukan transaksi, dan fungsi ini digunakan untuk melakukan transaksi langsung dengan harga pasar saat ini.
4、strategy.exit
strategy.exit
Fungsi ini digunakan untuk operasi perdagangan saham yang berbeda dengan fungsi ini.strategy.close
danstrategy.close_all
Fungsi ini langsung disepakati pada harga pasar saat ini.strategy.exit
Fungsi ini akan melakukan perencanaan perimbangan berdasarkan pengaturan parameter.
Parameter:
id
: ID ID pesanan dari daftar kondisi transaksi saat ini.from_entry
: Digunakan untuk menentukan ID masuk untuk melakukan operasi penyebaran.qty
: Jumlah saham.qty_percent
: Persentase saham, kisaran: 0 ~ 100.profit
Tujuan keuntungan, diukur dengan titik.loss
Tujuan Stop Loss, dihitung dengan titik.limit
Tujuan keuntungan, ditentukan dengan harga.stop
Target Stop Loss, dengan harga yang ditentukan.when
Pernyataan ini juga ditandatangani oleh beberapa pejabat pemerintah.Menggunakan strategi pengujian untuk memahami penggunaan parameter.
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/
strategy("strategy.exit Demo", pyramiding=3)
varip isExit = false
findOrderIdx(idx) =>
ret = -1
if strategy.opentrades == 0
ret
else
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := i
break
ret
strategy.entry("long1", strategy.long, 0.1, limit=1, when=findOrderIdx("long1") < 0)
strategy.entry("long2", strategy.long, 0.2, when=findOrderIdx("long2") < 0)
strategy.entry("long3", strategy.long, 0.3, when=findOrderIdx("long3") < 0)
if not isExit and strategy.opentrades > 0
// strategy.exit("exitAll") // 如果仅仅指定一个id参数,则该退场订单无效,参数profit, limit, loss, stop等出场条件也至少需要设置一个,否则也无效
strategy.exit("exit1", "long1", profit=50) // 由于long1入场订单没有成交,因此ID为exit1的出场订单也处于暂待状态,直到对应的入场订单成交才会放置exit1
strategy.exit("exit2", "long2", qty=0.1, profit=100) // 指定参数qty,平掉ID为long2的持仓中0.1个持仓
strategy.exit("exit3", "long3", qty_percent=50, limit=strategy.opentrades.entry_price(findOrderIdx("long3")) + 1000) // 指定参数qty_percent,平掉ID为long3的持仓中50%的持仓
isExit := true
if bar_index == 0
runtime.log("每点价格为:", syminfo.mintick) // 每点价格和Pine语言模板参数上「定价货币精度」参数设置有关
Dengan menggunakan tes retesting model harga real-time, strategi uji ini dimulai dengan melakukan tiga operasi masuk.strategy.entry
Fungsi), yang disetel secara sengajalimit
Parameter, harga order yang ditempelkan adalah 1 sehingga tidak dapat ditransfer. Kemudian uji kondisi keluar fungsistrategy.exit
⇒ Menggunakan stop loss berdasarkan titik, stop loss berdasarkan harga, menggunakan posisi berjumlah tetap, menggunakan stop loss berdasarkan persentase.strategy.exit
Fungsi ini juga memiliki parameter stop loss yang lebih rumit:trail_price
、trail_points
、trail_offset
Anda juga dapat menguji cara menggunakannya dalam contoh ini.
5、strategy.cancel
strategy.cancel
Fungsi yang digunakan untuk membatalkan / menghentikan semua perintah yang di-pending.strategy.order
, strategy.entry
, strategy.exit
Fungsi ini dapat menghasilkan ID login.id
、when
。
Parameter:
id
Di sini Anda dapat melihat beberapa foto yang menarik.when
Pernyataan ini juga ditandatangani oleh beberapa pejabat pemerintah.Fungsi ini sangat mudah dimengerti, karena digunakan untuk membatalkan perintah masuk tanpa transaksi.
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("strategy.cancel Demo", pyramiding=3)
var isStop = false
if isStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)
if not barstate.ishistory and close < open
strategy.cancel("long1")
strategy.cancel("long2")
strategy.cancel("long3")
isStop := true
6、strategy.cancel_all
strategy.cancel_all
Fungsi danstrategy.cancel
Fungsi serupa ⇒ membatalkan/menghentikan semua perintah daftar prasyarat ⇒ dapat ditentukanwhen
Parameter.
Parameter:
when
Pernyataan ini juga ditandatangani oleh beberapa pejabat pemerintah./*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("strategy.cancel Demo", pyramiding=3)
var isStop = false
if isStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)
if not barstate.ishistory and close < open
strategy.cancel_all()
isStop := true
7、strategy.order
strategy.order
Fungsi, pengaturan parameter, dan lain-lain hampir sama denganstrategy.entry
Persamaan, perbedaan antarastrategy.order
Fungsi tidak dapatstrategy
Fungsipyramiding
Pengaturan parameter mempengaruhi, tidak ada batasan jumlah kali berikutnya.
Parameter:
id
: dapat dipahami sebagai nama yang digunakan untuk sebuah posisi perdagangan.direction
: jika arah pesanan adalah melakukan lebih (membeli) parameter ini diteruskanstrategy.long
Variabel built-in ini, jika ingin kosongkan (menjual) akan diteruskan.strategy.short
Variabel ini.qty
: menentukan jumlah yang akan dipesan, jika parameter ini tidak diteruskan, maka jumlah yang akan dipesan secara default akan digunakan.when
: kondisi pelaksanaan, parameter ini dapat ditentukan untuk mengontrol apakah operasi di bawah perintah saat ini dipicu.limit
: Menentukan harga batas pesanan.stop
Harga Stop Loss:Kita gunakan.strategy.order
Tidak ada batasan pada sifat ini.strategy.exit
Fungsi keluar bersyarat ─ Membangun skrip yang mirip dengan transaksi grid ─ Contoh sangat sederhana, hanya untuk belajar:
/*backtest
start: 2021-03-01 00:00:00
end: 2022-08-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/
varip beginPrice = -1
if not barstate.ishistory
if beginPrice == -1 or (math.abs(close - beginPrice) > 1000 and strategy.opentrades == 0)
beginPrice := close
for i = 0 to 20
strategy.order("buy"+i, strategy.long, 0.01, limit=beginPrice-i*200, when=(beginPrice-i*200)<close)
strategy.exit("coverBuy"+i, "buy"+i, qty=0.01, profit=200)
strategy.order("sell"+i, strategy.short, 0.01, limit=beginPrice+i*200, when=(beginPrice+i*200)>close)
strategy.exit("coverSell"+i, "sell"+i, qty=0.01, profit=200)
Contoh strategi dalam tutorial ini hanya digunakan untuk mengajarkan strategi, membimbing ide-ide desain strategi, dan tidak melakukan instruksi atau saran transaksi apapun.
strategy("supertrend", overlay=true)
[supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod"))
plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)
if direction < 0
if supertrend > supertrend[2]
strategy.entry("entry long", strategy.long)
else if strategy.position_size < 0
strategy.close_all()
else if direction > 0
if supertrend < supertrend[3]
strategy.entry("entry short", strategy.short)
else if strategy.position_size > 0
strategy.close_all()
Untuk menulis strategi tren dengan bahasa Pine sangat sederhana, di sini kita menggunakan indikator tren super untuk merancang strategi pelacakan tren sederhana. Mari kita analisa kode sumber strategi ini.
Pertama, kode strategi mulai digunakan.strategy
Fungsi ini melakukan beberapa pengaturan sederhana:strategy("supertrend", overlay=true)
, hanya dengan mengatur sebuah header strategi yang disebut supertrend header.overlay
Parameternya adalahtrue
Untuk membuat strategi Pine atau belajar skrip strategi Pine, pertama-tama kita harus melihat desain parameter antarmuka strategi, kita melihat sumber dari "Super Trend Indicator Strategy", di mana kita telah belajar di kelas sebelumnya.input
Fungsi
[supertrend, arah] = ta.supertrend(input(5,
faktor input.int(10,), trPeriode ))
input
Panggilan fungsi digunakan secara langsung sebagaita.supertrend
Parameter fungsi indikator digunakan untuk menghitung indikator supertrend. Di antaranya:
Fungsi secara default akan mengatur dua kontrol parameter pada interface kebijakan bahasa Pine, seperti berikut:
Jadi Anda bisa lihat bahwa nilai default pada kontrol adalahinput
Fungsi daninput
Fungsi deret (() di sini adalahinput.int
Fungsi ini dapat digunakan untuk mengatur pada antarmuka strategi. Fungsi ini dapat digunakan untuk mengatur pada antarmuka strategi.ta.supertrend
Fungsi parameter. Fungsi indikator supertrend menghitung data harga.supertrend
dan data satu arah.direction
Kemudian gunakan.plot
Gambar fungsi, perhatikan bahwa ketika menggambar gambar berdasarkan arah indikator supertrend, hanya menggambar arah saat ini.direction
Saat ini, tren pasar adalah naik, ketikadirection
Saat ini, pasar saat ini adalah tren menurun.plot
Memutuskan ketika menggambar fungsidirection
Lebih besar, lebih kecil dari 0.
Berikutnyaif ... else if
Logika adalah penilaian sinyal transaksi, ketika ekspresidirection < 0
Saat ini pasar sedang berada di tahap uptrend, jika data harga dalam indikator supertrendsupertrend
Lebih tinggi dari harga indikator supertrend pada dua bar sebelumnya (yaitusupertrend[2],还记得历史操作符引用某个变量历史数据吧
Jika saat ini ada pegangan, pada saat ini melakukan panggilan mundur ke bawah fungsi tunggal yang akan pertama-tama meratakan pegangan sebelumnya dan kemudian membuka posisi sesuai dengan arah perdagangan saat ini.supertrend > supertrend[2]
"Saya tidak akan membiarkan mereka pergi", kata dia.strategy.position_size < 0
Jika Anda memiliki posisi kepala kosong, itu akan memicu serangan.strategy.close_all()
Fungsi yang dijalankan, melakukan semua leveling.
direction > 0
Sama halnya ketika berada di fase tren menurun, jika ada banyak kepemilikan maka semua akan berdamai, maka memenuhi syarat.supertrend < supertrend[3]
Jika Anda tidak bisa melakukan hal ini, maka Anda harus mengklik tombol "Do Not Track"[3]
Apa yang dimaksudkan oleh para ahli strategi, setelah semua, beberapa pasar seperti pasar perdagangan kontrak mengambil risiko sedikit lebih besar daripada mengambil risiko lebih banyak?
Untukta.supertrend
Apakah ada yang tertarik dengan indikator ini untuk mengetahui apakah tren saat ini sedang naik atau turun?
Bahkan, indikator ini juga dapat dilakukan dalam bentuk fungsi kustom dalam bahasa Pine:
pine_supertrend(factor, atrPeriod) =>
src = hl2
atr = ta.atr(atrPeriod)
upperBand = src + factor * atr
lowerBand = src - factor * atr
prevLowerBand = nz(lowerBand[1])
prevUpperBand = nz(upperBand[1])
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
int direction = na
float superTrend = na
prevSuperTrend = superTrend[1]
if na(atr[1])
direction := 1
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
Fungsi khusus ini adalah fungsi built-in.ta.supertrend
Algorithm yang sama, tentu saja data indikator yang dihitung sama.
Dari algoritma fungsi kustom ini, kita bisa melihat bahwa indikator supertrend yang dibangun oleh Pine menggunakanhl2
Variabel built-in (harga tertinggi, harga minimum ditambah dan dibagi dengan 2, yaitu rata-rata harga tertinggi dan harga minimum) kemudian menghitung indikator ATR untuk siklus tertentu (wavelength) berdasarkan parameter atrPeriod; lalu menggunakan hl2 dan ATR untuk membangun lintasan.
Pembaruan berdasarkan ekspresi tiga kata dalam kodelowerBand
danupperBand
。
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
lowerBand: garis bawah, digunakan untuk menentukan apakah tren naik berubah. upperBand: garis atas, digunakan untuk menentukan apakah tren turun berubah. lowerBand dan upperBand selalu dihitung, hanya pada akhir fungsi kustom ini yang menentukan arah tren saat ini.
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
Di sini kita dapat menentukan apakah harga dari tren super di bar sebelumnya adalahprevUpperBand
, yaitu garis naik, menunjukkan tren turun saat ini.close
Lebih dariupperBand
Pada saat ini, harga telah mengalami pergeseran dan berubah menjadi tren yang lebih tinggi.direction
Variabel arah disetel ke -1 (tren naik); jika tidak tetap disetel ke 1 (tren turun); jadi Anda akan melihat di strategi supertrenif direction < 0
Saat itu, lebih banyak dilakukan setelah kondisi sinyal dipicu.direction > 0
Saat kondisi sinyal dipicu, kosongkan.
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
Akhirnya, berdasarkan arah yang dipilih, data harga dan arah indikator supertrend tertentu dikembalikan.
/*backtest
start: 2021-03-01 00:00:00
end: 2022-09-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["v_input_1",4374],["v_input_2",3],["v_input_3",300],["ZPrecision",0,358374]]
*/
varip balance = input(50000, "balance")
varip stocks = input(0, "stocks")
maxDiffValue = input(1000, "maxDiffValue")
if balance - close * stocks > maxDiffValue and not barstate.ishistory
// more balance , open long
tradeAmount = (balance - close * stocks) / 2 / close
strategy.order("long", strategy.long, tradeAmount)
balance := balance - tradeAmount * close
stocks := stocks + tradeAmount
runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)
else if close * stocks - balance > maxDiffValue and not barstate.ishistory
// more stocks , open short
tradeAmount = (close * stocks - balance) / 2 / close
strategy.order("short", strategy.short, tradeAmount)
balance := balance + tradeAmount * close
stocks := stocks - tradeAmount
runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)
plot(balance, title="balance value(quoteCurrency)", color=color.red)
plot(stocks*close, title="stocks value(quoteCurrency)", color=color.blue)
Kita terus belajar beberapa contoh desain strategi bahasa Pine, kali ini kita melihat strategi keseimbangan dinamis.BaseCurrency
Jumlah (jenis dagang) danQuoteCurrency
Jumlah (mata uang) yang selalu melakukan penanganan neraca; aset mana yang meningkat harga relatif, nilai yang dipegang dalam akun meningkat, aset mana yang dijual. Jika harga relatif suatu aset menurun, nilai yang dipegang dalam akun menurun, maka membeli aset ini. Ini adalah apa yang disebut strategi neraca dinamis.
Kelemahan dari strategi ini adalah bahwa, seperti yang ditunjukkan pada grafik retrospeksi, strategi ini memiliki kerugian yang lebih besar pada tahap kenaikan (atau penurunan) harga besar. Jadi strategi ini baik untuk strategi spot, tetapi penggunaan futures membutuhkan pengendalian risiko.
Di sini, kita akan melihat beberapa strategi desain kode:
Kami menggunakan desain yang disederhanakan untuk mensimulasikan sebuah strategi yang sangat sederhana.balance
(yaitu jumlah aset Kuota Mata Uang) danstocks
Informasi keseimbangan. Kami tidak membaca jumlah aset yang sebenarnya dalam akun, kami hanya menggunakan jumlah simulasi untuk menghitung pembelian dan penjualan yang tepat. Lalu parameter kunci yang mempengaruhi strategi keseimbangan dinamis ini adalahmaxDiffValue
, parameter ini adalah kriteria penilaian yang dilakukan untuk menyeimbangkan.BaseCurrency
danQuoteCurrency
Perbedaan Lebih BesarmaxDiffValue
Saat ini adalah waktu untuk melakukan rebalancing, menjual aset yang mahal, membeli aset yang murah, dan menyeimbangkan kembali aset.
Trigger sinyal perdagangan strategis harus masuk akal pada tahap BAR secara real-time, jadi kondisi perdagangan strategis ditetapkan dalam penilaian if.not barstate.ishistory
◦ Bila dihitung berdasarkan harga saat ini,balance
Nilai lebih daristocks
Membeli saat nilai dilakukan. Menjual sebaliknya dilakukan. Pembaruan setelah pernyataan transaksi dilakukan.balance
danstocks
Jika Anda tidak dapat mengubahnya, maka Anda harus mengubahnya.
Informasi di atas yang berisi harga varietas di mana strategi retest dimulai, yaitu 1458, jadi saya sengaja mengatur parameter ini.balance
Setel parameter untuk: 4374 ((1458*3)stocks
Untuk: 3. Pastikan aset berada dalam keadaan seimbang pada awal.
Kita sudah belajar di kelas sebelumnya.strategy.exit
Fungsi exit posisi, yang memiliki fungsi stop loss tracking stop loss tidak ada contohnya. Dalam contoh desain strategi di bagian ini, kita akan menggunakanstrategy.exit
Fungsi stop loss tracking untuk mengoptimalkan strategi supertrend.
Pertama, mari kita lihat.strategy.exit
Parameter stop loss tracking untuk fungsi:
1、trail_price
Parameter: Trigger menempatkan pelacakan stop loss pada posisi transaksi yang logis (dengan harga yang ditentukan)