Sumber daya yang dimuat... Pemuatan...

Penemu Kuantitatif Tutorial Pengantar Bahasa Pine

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

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

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 ekspresiswitchDi 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.stringinput.intFungsi tersebut.input.stringAnda dapat menggunakan aplikasi ini untuk mengunduh gambar dari situs web Anda.input.intFungsi ini digunakan untuk mengembalikan nilai integer.optionsAnda dapat menggunakan parameter ini untuk mencari informasi yang lebih lengkap.optionsParameter 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.switchCara 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 < openUbah 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.switchDalam contoh ini, cabang pelaksanaan ditentukan dan tidak akan diubah dalam operasi strategi).

Struktur lingkaran

kalimat for

返回值 = 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 siklusbreakKata Kunci: Ketika dilakukanbreakSetelah kalimat, siklus berhenti. untuk digunakan dalam sikluscontinueKata Kunci: Ketika dilakukancontinueSetelah kalimat selesai, loop akan diabaikan.continueSetelah 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 kalimat

for ... inAda 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 testArraySaya 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.smaUntuk 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.sumSaya 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.

kalimat while

whileStatement 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

Arsitektur

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

Array deklarasi

Penggunaanarray<int> afloat[] bArray 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.newdanarray.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.islastSaat mencetak secara real-time, hanya ada satu elemen yang tetap, yaitu nilai 0.

Membaca dan menulis elemen dalam array

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.

Memeriksa elemen array

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

Referensi data sejarah

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)

Tambahkan Array, Hapus Fungsi Operasi

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│

Aritmatika yang umum digunakan, fungsi operasi

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

Fungsi

Fungsi khusus

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 internal

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

Fungsi transaksi

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.entryFungsi ini adalah fungsi sub-sistem yang lebih penting ketika kita menulis strategi, dan fungsi ini lebih penting dalam beberapa parameter:id, direction, qty, whenDan seterusnya.

Parameter:

  • id: dapat dipahami sebagai nama yang digunakan untuk sebuah posisi perdagangan.
  • direction: jika arah pesanan adalah melakukan lebih (membeli) parameter ini diteruskanstrategy.longVariabel built-in ini, jika ingin kosongkan (menjual) akan diteruskan.strategy.shortVariabel 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.
  • stopHarga Stop Loss:

strategy.entryRincian pelaksanaan fungsi yang spesifikstrategyAnda 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.strategyJadi, kita bisa menggunakan fungsi ini.pyramidingdefault_qty_valueParameter. 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 mengidentifikasipyramidingJika 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.entryOperasi di bawah ini tidak dijalankan sekali. Karena kita juga telah menentukandefault_qty_valueParameternya adalah 0.1, jadi ID akan menjadi 1 ton kali ini.strategy.entryJumlah submenu yang digunakan untuk operasi submenu adalah 0.1 ∞.strategy.entryKita bisa menggunakan fungsi yang kita pilih saat kita memanggilnya.directionsama denganstrategy.longKarena itu, Anda harus membayar untuk mengikuti tes ulang.

Perhatikan kodestrategy.entry("long3", ...Operasi di bawah ini dipanggil dua kali, untuk ID yang sama: long3.strategy.entryOperasi di bawah tidak berhasil, panggilan keduastrategy.entryFungsi 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.entryFungsi ini akan mengaktifkan fungsi ini untuk mengaktifkan fungsi ini.


2、strategy.close

strategy.closeFungsi ini digunakan untuk menentukan posisi pegangan masuk yang memiliki ID identifikasi. Parameter utama adalah:idwhenqtyqty_percent

Parameter:

  • id: ID login yang dibutuhkan untuk bermain, yaitu yang kita gunakanstrategy.entryID yang ditunjuk saat membuka posisi pada fungsi yang masuk.
  • whenPernyataan 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 1long, lalu menggunakanstrategy.closeHasil yang berbeda yang dihitung kembali ketika parameter yang berbeda dari fungsi ditetapkan pada leveling.strategy.closeFungsi 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_allFungsi 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_allSaat dipanggil, semua posisi di arah saat ini akan dipadatkan.strategy.close_allParameter utama fungsi adalah:when

Parameter:

  • whenPernyataan 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==0Jadi, ketika parameter set when sesuai dengan kondisi, hanya melakukan ID sebagai yang benar.strategy.entryFungsi masuk. Setelah memegang banyak posisistrategy.position_sizeFungsi 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 < 0Jika 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_allFungsi 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.exitFungsi ini digunakan untuk operasi perdagangan saham yang berbeda dengan fungsi ini.strategy.closedanstrategy.close_allFungsi ini langsung disepakati pada harga pasar saat ini.strategy.exitFungsi 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.
  • profitTujuan keuntungan, diukur dengan titik.
  • lossTujuan Stop Loss, dihitung dengan titik.
  • limitTujuan keuntungan, ditentukan dengan harga.
  • stopTarget Stop Loss, dengan harga yang ditentukan.
  • whenPernyataan 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.entryFungsi), yang disetel secara sengajalimitParameter, 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.exitFungsi ini juga memiliki parameter stop loss yang lebih rumit:trail_pricetrail_pointstrail_offsetAnda juga dapat menguji cara menggunakannya dalam contoh ini.


5、strategy.cancel

strategy.cancelFungsi yang digunakan untuk membatalkan / menghentikan semua perintah yang di-pending.strategy.order, strategy.entry , strategy.exitFungsi ini dapat menghasilkan ID login.idwhen

Parameter:

  • idDi sini Anda dapat melihat beberapa foto yang menarik.
  • whenPernyataan 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_allFungsi danstrategy.cancelFungsi serupa ⇒ membatalkan/menghentikan semua perintah daftar prasyarat ⇒ dapat ditentukanwhenParameter.

Parameter:

  • whenPernyataan 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.orderFungsi, pengaturan parameter, dan lain-lain hampir sama denganstrategy.entryPersamaan, perbedaan antarastrategy.orderFungsi tidak dapatstrategyFungsipyramidingPengaturan 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.longVariabel built-in ini, jika ingin kosongkan (menjual) akan diteruskan.strategy.shortVariabel 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.
  • stopHarga Stop Loss:

Kita gunakan.strategy.orderTidak ada batasan pada sifat ini.strategy.exitFungsi 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

Contoh strategi dalam tutorial ini hanya digunakan untuk mengajarkan strategi, membimbing ide-ide desain strategi, dan tidak melakukan instruksi atau saran transaksi apapun.

Strategi Indikator Supertrend

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.strategyFungsi ini melakukan beberapa pengaturan sederhana:strategy("supertrend", overlay=true), hanya dengan mengatur sebuah header strategi yang disebut supertrend header.overlayParameternya adalahtrueUntuk 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.inputFungsi

[supertrend, arah] = ta.supertrend(input(5, faktor),input.int(10, trPeriode))

inputPanggilan fungsi digunakan secara langsung sebagaita.supertrendParameter fungsi indikator digunakan untuk menghitung indikator supertrend. Di antaranya:

  • input ((5, faktor)
  • input.int(10, trPeriode)

Fungsi secara default akan mengatur dua kontrol parameter pada interface kebijakan bahasa Pine, seperti berikut:

img

Jadi Anda bisa lihat bahwa nilai default pada kontrol adalahinputFungsi daninputFungsi deret (() di sini adalahinput.intFungsi ini dapat digunakan untuk mengatur pada antarmuka strategi. Fungsi ini dapat digunakan untuk mengatur pada antarmuka strategi.ta.supertrendFungsi parameter. Fungsi indikator supertrend menghitung data harga.supertrenddan data satu arah.directionKemudian gunakan.plotGambar fungsi, perhatikan bahwa ketika menggambar gambar berdasarkan arah indikator supertrend, hanya menggambar arah saat ini.directionSaat ini, tren pasar adalah naik, ketikadirectionSaat ini, pasar saat ini adalah tren menurun.plotMemutuskan ketika menggambar fungsidirectionLebih besar, lebih kecil dari 0.

Berikutnyaif ... else ifLogika adalah penilaian sinyal transaksi, ketika ekspresidirection < 0Saat ini pasar sedang berada di tahap uptrend, jika data harga dalam indikator supertrendsupertrendLebih 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 < 0Jika Anda memiliki posisi kepala kosong, itu akan memicu serangan.strategy.close_all()Fungsi yang dijalankan, melakukan semua leveling.

direction > 0Sama 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.supertrendApakah 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.supertrendAlgorithm yang sama, tentu saja data indikator yang dihitung sama. Dari algoritma fungsi kustom ini, kita bisa melihat bahwa indikator supertrend yang dibangun oleh Pine menggunakanhl2Variabel 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 kodelowerBanddanupperBand

    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.closeLebih dariupperBandPada saat ini, harga telah mengalami pergeseran dan berubah menjadi tren yang lebih tinggi.directionVariabel arah disetel ke -1 (tren naik); jika tidak tetap disetel ke 1 (tren turun); jadi Anda akan melihat di strategi supertrenif direction < 0Saat itu, lebih banyak dilakukan setelah kondisi sinyal dipicu.direction > 0Saat kondisi sinyal dipicu, kosongkan.

    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]

Akhirnya, berdasarkan arah yang dipilih, data harga dan arah indikator supertrend tertentu dikembalikan.

Strategi keseimbangan dinamis

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

img

img

Kita terus belajar beberapa contoh desain strategi bahasa Pine, kali ini kita melihat strategi keseimbangan dinamis.BaseCurrencyJumlah (jenis dagang) danQuoteCurrencyJumlah (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) danstocksInformasi 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.BaseCurrencydanQuoteCurrencyPerbedaan Lebih BesarmaxDiffValueSaat 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,balanceNilai lebih daristocksMembeli saat nilai dilakukan. Menjual sebaliknya dilakukan. Pembaruan setelah pernyataan transaksi dilakukan.balancedanstocksJika 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.balanceSetel parameter untuk: 4374 ((1458*3)stocksUntuk: 3. Pastikan aset berada dalam keadaan seimbang pada awal.

Strategi Trending Super dengan Pelacakan Stop Loss dan Stop Curve

Kita sudah belajar di kelas sebelumnya.strategy.exitFungsi exit posisi, yang memiliki fungsi stop loss tracking stop loss tidak ada contohnya. Dalam contoh desain strategi di bagian ini, kita akan menggunakanstrategy.exitFungsi stop loss tracking untuk mengoptimalkan strategi supertrend.

Pertama, mari kita lihat.strategy.exitParameter stop loss tracking untuk fungsi:

1、trail_priceParameter: Trigger menempatkan pelacakan stop loss pada posisi transaksi yang logis (dengan harga yang ditentukan)


Lebih banyak