jika menggunakan kode berikut di Trading View:
baseLine0 = na // compile time error!
Sebagai kesimpulan, pernyataan tentang suatu variabel dapat ditulis sebagai:
// [<declaration_mode>] [<type>] <identifier> = value
声明模式 类型 标识符 = 值
Di sini, operator penugasan digunakan:=
Variabel diberikan nilai pada saat deklarasi variabel. Nilai yang diberikan dapat berupa string, angka, ekspresi, panggilan fungsi, atau bentuk lainnya.if
、 for
、while
atauswitch
Struktur dll (( struktur kata kunci, penggunaan kalimat kami akan menjelaskan secara rinci dalam pelajaran selanjutnya, sebenarnya kami telah belajar dalam pelajaran sebelumnya tentang pemberian nilai kalimat if sederhana, Anda dapat melihat kembali)
Fungsi input adalah salah satu fungsi yang sering kita gunakan dalam merancang strategi. Fungsi ini juga sangat penting dalam merancang strategi.
Fungsi input:
input函数,参数defval、title、tooltip、inline、group
Fungsi input pada FMZ dan pada Trading View sedikit berbeda, namun fungsi ini digunakan sebagai input penugasan parameter strategi. Di bawah ini kita akan menjelaskan penggunaan fungsi input pada FMZ dengan contoh:
param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")
ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)
Pada FMZ, fungsi input akan secara otomatis menarik kontrol yang digunakan untuk mengatur parameter kebijakan di antarmuka kebijakan FMZ. Kontrol yang didukung pada FMZ saat ini memiliki kotak input angka, kotak input teks, kotak dropdown, dan penyaringan nilai bullet. Selain itu, Anda dapat mengatur grup parameter kebijakan dan informasi teks yang diminta untuk mengatur parameter.
Berikut ini adalah beberapa parameter utama dari fungsi input:
Selain deklarasi dan penugasan variabel secara terpisah, bahasa Pine juga menyatakan satu set variabel dan penugasan nilai:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
Yang paling umum adalah kita menggunakanta.macd
Fungsi menghitung indikator MACD, karena indikator MACD adalah indikator multi-linear, menghitung tiga set data. Oleh karena itu, dapat ditulis sebagai:
[dif,dea,column] = ta.macd(close, 12, 26, 9)
plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)
Fungsi MACD dapat dengan mudah digambarkan dengan menggunakan kode di atas. Tidak hanya fungsi built-in yang dapat mengembalikan beberapa variabel, fungsi kustom yang ditulis juga dapat mengembalikan beberapa data.
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)
Cara menulis struktur seperti if sebagai beberapa variabel yang diberi nilai juga mirip dengan cara fungsi kustom di atas, yang tertarik juga dapat mencoba.
[ema10, ema20] = if true
fast = ta.ema(close, 10)
slow = ta.ema(close, 20)
[fast, slow]
plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)
Beberapa fungsi yang tidak dapat ditulis dalam blok kode lokal cabang kondisional, terutama beberapa fungsi berikut:
barcolor(), fill(), hline(), indicator(), plot(), plotcandle(), plotchar(), plotshape()
Trading View akan menyusun laporan kesalahan. Di FMZ, pembatasan tidak begitu ketat, tetapi juga disarankan untuk mengikuti spesifikasi yang ditulis di Trading View. Misalnya, meskipun tidak ada laporan kesalahan di FMZ, namun tidak disarankan untuk menulis seperti itu.
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")
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)
Penting: Ekspresi yang digunakan untuk menilai, mengembalikan nilai boolean. Perhatikan bahwa hanya ada satu cabang yang dapat dikurangi. Semua cabang ekspresi tidak benar, dan jika tidak ada cabang lain, maka dikembalikan na.
x = if close > open
close
plot(x, title="x")
Karena jika garis K BAR adalah garis negatif, yaitu ketika close < open, maka if dinyatakan sebagai false, maka blok lokal dari if tidak dieksekusi. Pada saat ini tidak ada cabang else, dan if dikembalikan sebagai na. Oleh karena itu, x diberi nilai na.
Pernyataan switch juga merupakan pernyataan dengan struktur cabang, yang digunakan untuk merancang jalan yang berbeda sesuai dengan kondisi tertentu. Pernyataan switch umumnya memiliki beberapa poin pengetahuan penting sebagai berikut:
Ada dua jenis switch, dan kita akan melihat contohnya satu per satu untuk mengetahui cara penggunaannya.
1 dengan ekspresiswitch
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 telah mempelajari fungsi input, dan di sini kita melanjutkan dengan dua fungsi yang mirip dengan input:input.string
、input.int
fungsi.
input.string
Jika Anda ingin mengunduh aplikasi, Anda dapat mengunduh aplikasi dari Google Play Store.input.int
Fungsi yang digunakan untuk mengembalikan nilai integer. Dalam contoh ini sebenarnya ada tambahanoptions
Cara menggunakan parameter,options
Parameter dapat ditransfer ke dalam sebuah array yang terdiri dari nilai-nilai yang dapat dipilih.options=["EMA", "SMA", "RMA", "WMA"]
Danoptions=[5, 10, 20]
(Perhatikan bahwa satu adalah tipe string dan satu adalah tipe nilai numerik). Dengan demikian, pengendali pada antarmuka kebijakan tidak perlu memasukkan nilai numerik tertentu, tetapi pengendali berubah menjadi kotak bawah, memilih opsi yang disediakan dalam parameter options.
Variabel func diberi nilai sebagai string, dengan variabel func sebagai ekspresi switch (bisa berupa variabel, panggilan fungsi, atau ekspresi), untuk menentukan cabang mana dalam switch yang akan dijalankan. Jika variabel func tidak dapat cocok dengan ekspresi pada cabang manapun dalam switch (yaitu setara), maka blok kode cabang default yang akan dijalankanruntime.error("error")
Fungsi menyebabkan kebijakan untuk membuang pengecualian berhenti.
Dalam kode tes kami di atas, setelah runtime.error pada baris terakhir dari blok kode cabang default switch, kami tidak menambahkan[Kode seperti na, na] untuk kompatibel dengan nilai yang dikembalikan, di trading view perlu untuk mempertimbangkan masalah ini, jika jenis tidak sesuai akan mendapat kesalahan. Tetapi di FMZ karena tidak ada tipe yang sangat diperlukan, maka dapat dihilangkan kode kompatibilitas ini. Jadi di FMZ tidak perlu mempertimbangkan masalah kompatibilitas tipe if, switch cabang yang mengembalikan nilai.
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 ada kesalahan pada trading view. Karena jenis if yang dikembalikan tidak konsisten.
switch
Mari kita lihat.switch
Penggunaan lain dari kata ini adalah 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)
Dalam contoh kode tes ini, kita dapat melihat bahwa switch akan mencocokkan blok kode lokal yang benar dengan syarat pemenuhan cabang. Secara umum, syarat cabang setelah kalimat switch harus saling menolak. Artinya, dalam contoh ini, up dan down tidak dapat menjadi benar pada saat yang sama. Karena switch hanya dapat menjalankan blok kode lokal dari satu cabang, orang yang tertarik dapat menggunakan kalimat berikut dalam kode:up = close > open // up = close < open
Ubah ke dalam komentar, ulangi hasil pengamatan. Anda akan menemukan bahwa cabang switch hanya dapat melakukan cabang pertama. Selain itu, perlu diperhatikan bahwa fungsi tidak dapat dipanggil pada setiap BAR yang dapat menyebabkan beberapa masalah perhitungan data.switch
Dalam contoh ini, implementasi cabang ditentukan dan tidak akan diubah dalam operasi strategi.
返回值 = for 计数 = 起始计数 to 最终计数 by 步长
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
kalimat for sangat mudah digunakan, loop for dapat akhirnya mengembalikan satu nilai (() atau mengembalikan beberapa nilai, untuk[a, b, c] seperti) 。 Variabel yang diberi nilai pada posisi “pengembalian” seperti dalam kode palsu di atas。 for statement diikuti dengan variabel “count” yang digunakan untuk mengontrol jumlah siklus, referensi nilai lain, dan sebagainya。 Variabel “count” diberikan nilai sebagai “count awal” sebelum siklus dimulai, kemudian bertumbuh sesuai dengan pengaturan “langkah”, dan siklus berhenti ketika variabel “count” lebih besar dari “count akhir”。
digunakan dalam siklus forbreak
Kata Kunci: Ketika dilakukanbreak
Setelah kalimat, lingkaran berhenti.
digunakan dalam siklus forcontinue
Kata Kunci: Ketika dilakukancontinue
Setelah kalimat, lingkaran akan mengabaikancontinue
Kode berikutnya, langsung melakukan putaran berikutnya. For kembali nilai yang dikembalikan pada putaran terakhir. Jika tidak ada kode yang dilakukan, maka kembali nol.
Di bawah ini adalah 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, dengan kode pseudo berikut.
返回值 = for 数组元素 in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Perbedaan utama antara dua bentuk ini adalah apa yang diikuti oleh kata kunci for, yaitu menggunakan variabel sebagai referensi untuk elemen array. Yang pertama adalah menggunakan struktur yang berisi variabel indeks, variabel array untuk referensi. Yang lainnya adalah aturan nilai kembali, menggunakan break, continue, dan aturan lain yang sesuai dengan siklus for.
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 mengindeks, gunakan saja.for [i, ele] in testArray
Bahasa Indonesia
Untuk aplikasi siklus
Ketika Anda dapat menggunakan fungsi built-in yang disediakan oleh bahasa Pine untuk melakukan beberapa perhitungan logis lingkaran, Anda dapat menggunakan struktur lingkaran untuk menulisnya secara langsung, atau Anda dapat menggunakan fungsi built-in untuk memprosesnya. Mari kita ambil dua contoh.
1 , menghitung rata-rata
Ketika menggunakan desain struktur lingkaran:
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, kita menggunakan for loop addition, dan kemudian menghitung rata-rata.
Hitung garis rata-rata langsung dengan fungsi built-in:
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Menggunakan fungsi built-in secara langsungta.sma
Untuk menghitung indikator garis rata-rata, jelas lebih mudah menggunakan fungsi bawaan untuk menghitung garis rata-rata. Hasil perhitungan dapat dilihat secara konsisten dalam perbandingan pada grafik.
Atau gunakan contoh di atas untuk menjelaskan.
Ketika menggunakan desain struktur lingkaran:
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 jumlah semua elemen dari sebuah array dapat diproses dengan loop, atau dengan fungsi built-in.array.sum
Untuk menghitung.
Perhitungan penjumlahan langsung 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)
Data yang dihitung dapat dilihat dengan menggunakan gambar plot yang ditampilkan secara konsisten pada grafik.
Jika Anda dapat melakukan semua ini dengan fungsi bawaan, mengapa Anda harus membuat loop? 1. Untuk beberapa operasi, perhitungan dari array. 2. Mengingat kembali sejarah, misalnya, mencari tahu berapa banyak titik tinggi masa lalu yang lebih tinggi dari titik tinggi BAR saat ini. Karena titik tinggi BAR saat ini hanya diketahui pada BAR yang dijalankan oleh skrip, sebuah loop diperlukan untuk kembali dan menganalisis BAR masa lalu. 3. Fungsi built-in yang menggunakan bahasa Pine tidak dapat menyelesaikan perhitungan BAR yang lalu.
while
Sentensi membuat kode bagian loop terus dijalankan sampai kondisi pertimbangan dalam struktur while adalah false (false) .
返回值 = while 判断条件
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Aturan lain dari while mirip dengan loop for, di mana baris terakhir dari blok kode lokal loop adalah nilai yang dikembalikan, yang dapat mengembalikan lebih dari satu nilai. Apabila “kondisi loop” adalah waktu yang benar untuk melakukan loop, dan berhenti ketika kondisi adalah palsu. Anda juga dapat menggunakan kalimat break, continue dalam loop.
Saya akan memberikan contoh dengan menghitung garis rata-rata:
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 menggunakan while loop juga sangat sederhana, dan Anda dapat merancang beberapa logika komputasi yang tidak dapat digantikan dengan fungsi built-in, seperti menghitung perkalian pangkat:
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 mirip dengan definisi array dalam bahasa pemrograman lainnya. Array Pine adalah sebuah array berdimensi. Array ini biasanya digunakan untuk menyimpan serangkaian data yang berurutan. Array yang menyimpan data tunggal disebut elemen array, dan jenis elemen tersebut dapat berupa: integer, float, string, nilai warna, nilai bul.[]
Tapi perlu digunakan.array.get()
danarray.set()
Fungsi △ adalah urutan indeks elemen dalam array dengan indeks elemen pertama dari array adalah 0, indeks elemen berikutnya meningkat 1 △.
Kami 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))
menggunakanarray<int> a
、float[] b
Array yang diklaim atau hanya diklaim satu variabel dapat diberi nilai 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 arrayarray.new
Danarray.from
Fungsi . . Banyak fungsi lain dalam bahasa Pine yang terkait dengan tipe yang mirip dengan array.new:array.new_int()
、array.new_bool()
、array.new_color()
、array.new_string()
Tunggu.
Kata kunci var juga dapat bekerja dengan mode deklarasi array, menggunakan kata kunci var yang menyatakan bahwa array 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")
Kita dapat melihat bahwa perubahan dari array a terus-menerus ditentukan, tanpa diset ulang. Array b diinisialisasi pada setiap BAR.barstate.islast
Untuk waktu nyata, hanya ada satu elemen yang dicetak, yaitu angka 0.
Gunakan array.get untuk mendapatkan elemen yang mengindeks posisi di array, gunakan array.set untuk mengubah elemen yang mengindeks posisi di array.
Array.get dengan argumen pertama adalah array yang akan diproses, dan argumen kedua adalah indeks yang ditentukan. Argumen pertama array.set adalah array yang akan diproses, argumen kedua adalah indeks yang ditentukan, dan argumen ketiga adalah elemen yang akan ditulis.
Contoh sederhana berikut ini akan menjelaskan:
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 sebuah array untuk menyimpan warna, dan kemudian memberikan transparansi yang berbeda pada nilai warna (dengan menggunakan fungsi color.new). Dengan menghitung jarak dari BAR saat ini ke nilai tertinggi dalam 100 siklus percobaan, perhitungkan peringkat warna.
Bagaimana kita bisa menjelajahi sebuah array dengan menggunakan 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")
Ketiga metode ini memiliki hasil yang sama.
Array dapat dinyatakan dalam batas global skrip, atau dapat dinyatakan dalam batas lokal fungsi atau cabang if
Untuk penggunaan elemen dalam array, cara berikut ini adalah ekuivalen, kita dapat melihat dengan contoh di bawah ini bahwa pada diagram, dua kelompok garis digambar, 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)
array.unshift()
、array.insert()
、array.push()
。
array.remove()
、array.shift()
、array.pop()
、array.clear()
。
Kami menggunakan contoh berikut untuk menguji fungsi operasi penambahan dan penghapusan dari array tersebut.
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")
Menambahkan, menghapus aplikasi: Array sebagai Queue
Dengan menggunakan array, dan beberapa fungsi penambahan dan penghapusan dari array, kita dapat membangun sebuah struktur data “array”. Array dapat digunakan untuk menghitung nilai rata-rata bergerak dari harga tick, dan mungkin ada yang bertanya, “Kenapa kita harus membangun sebuah struktur array? Bukankah kita bisa menghitung nilai rata-rata dari array sebelumnya?”
Sebuah antrian adalah struktur yang sering digunakan dalam bidang pemrograman, dengan karakteristik sebagai berikut:
Unsur yang masuk ke antrian pertama, keluar dari antrian pertama.
Dengan cara ini, Anda dapat memastikan bahwa data yang ada dalam antrian adalah data terbaru dan tidak akan membesar sampai batas tak terbatas (kode yang membesar sampai batas tak terbatas hanya dapat ditulis pada waktu tengah hari, karena ini akan menjadi masalah di pagi hari dan malam hari).
Dalam contoh di bawah ini, kita menggunakan struktur antrian untuk mencatat harga setiap tick, menghitung moving average pada tingkat tick, dan kemudian membandingkannya dengan moving average pada tingkat K-line 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 bahwa ketika kita menyatakan array a, kita menentukan mode deklarasi, menggunakan kata kunci.varip
Dengan demikian, setiap perubahan harga akan dicatat dalam sebuah array.
Untuk menghitung fungsi yang terkait:
array.avg()
Carilah nilai rata-rata dari semua elemen dalam array.array.min()
Carilah elemen terkecil dalam array.array.max()
Carilah elemen terbesar dari array.array.stdev()
Carilah perbedaan standar dari semua elemen dalam array.array.sum()
Tentukan jumlah semua elemen dalam array.
Fungsi yang terkait:
array.concat()
Merger atau menghubungkan dua array.
array.copy()
Menyalin array.
array.join
Hubungkan semua elemen dalam array menjadi sebuah string.
array.sort()
Urutan urutan naik atau turun.
array.reverse()
Array pembalikan
array.slice()
Potong array tersebut.
array.includes()
Elemen penilaian
array.indexof()
Mengembalikan indeks yang pertama kali muncul dari nilai yang diimpor oleh parameter tersebut. Jika tidak ditemukan, maka dikembalikan -1
array.lastindexof()
Menemukan nilai yang muncul terakhir
Contoh tes untuk fungsi terkait perhitungan array:
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 penghitungan array yang lebih umum.
Contoh fungsi yang berhubungan dengan operasi:
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 mendesain fungsi kustom, dan pada umumnya fungsi kustom dalam bahasa Pine memiliki aturan berikut:
barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()
) tidak dapat dipanggil dalam fungsi kustom.Dalam tutorial sebelumnya, kita telah menggunakan fungsi kustom beberapa kali, seperti fungsi kustom yang dirancang dalam satu baris:
barIsUp() => close > open
Fungsi ini mengembalikan apakah BAR saat ini adalah garis bujur.
Desain fungsi kustom multi 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 kita lakukan sendiri dengan fungsi kustom kita adalah sebuah fungsi sma rata-rata.
Anda juga dapat mengembalikan contoh fungsi kustom dari 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)
Sebuah fungsi dapat menghitung garis cepat, garis lambat, dua indikator EMA rata-rata.
Fungsi built-in dapat dengan mudah diFMZ PINE Script DokumentasiPencarian di:
Fungsi bawaan bahasa Pine diklasifikasikan sebagai:
str.
Serialcolor.
Serial
3 , fungsi input parameterinput.
Serialta.
Serialplot.
Serialarray.
Serial
7 . Fungsi terkait transaksistrategy.
Serialmath.
Serial
9, fungsi lain ((pengolahan waktu, non-plot seri gambar fungsi,request.
Fungsi seri, fungsi pengolahan tipe, dan lain-lain).strategy.
Fungsi seri adalah fungsi yang sering kita gunakan dalam desain strategi, yang terkait dengan fungsi dan strategi yang dijalankan untuk melakukan operasi transaksi.
1、strategy.entry
strategy.entry
Fungsi adalah fungsi perintah yang sangat penting dalam penulisan kebijakan, beberapa parameter yang sangat penting adalah:id
, direction
, qty
, when
Tunggu.
parameter:
id
: dapat diartikan sebagai nama pertama yang digunakan untuk merujuk pada suatu posisi perdagangan. dapat merujuk pada id ini untuk membatalkan, memodifikasi pesanan, atau posisi kosong.direction
: Jika arah pesanan adalah melakukan lebih banyak ((beli) parameter ini diteruskanstrategy.long
Variabel internal ini akan dikirim jika Anda ingin melakukan short sale.strategy.short
Variabel iniqty
: Tentukan jumlah pesanan, jika tidak memberikan parameter ini digunakan adalah jumlah pesanan default.when
Kondisi eksekusi: Anda dapat menentukan parameter ini untuk mengontrol apakah operasi perintah saat ini dipicu atau tidak.limit
: Tentukan harga order limit.stop
Harga Stop Loss:strategy.entry
Detail pelaksanaan fungsistrategy
Pengendalian pengaturan parameter pada panggilan fungsi juga dapat dilakukan dengan“Parameter modeling perpustakaan kelas pertukaran bahasa Pine”Untuk lebih jelasnya tentang pengaturan kontrol, dan kontrol parameter modeling dari Pine Language Transaction Class Library, lihat dokumen yang tercantum di bawah ini.
Ini adalah salah satu dari beberapa hal penting yang dapat saya sampaikan.strategy
Dalam fungsi,pyramiding
、default_qty_value
Parameter ≠ Test menggunakan kode berikut:
/*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 awal/*backtest ... */
Bagian paket adalah pengaturan pengembalian, untuk mencatat informasi seperti waktu pengaturan pengembalian pada saat itu, untuk memudahkan debug, bukan kode kebijakan.
Dalam kode:strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
Ketika kita menunjukpyramiding
Jika parameternya adalah 3, maka kita bisa mengatur untuk melakukan transaksi dalam satu arah paling banyak 3 kali. Jadi dalam contoh ini 4 kali.strategy.entry
Operasi perintah di bawah ini tidak dijalankan.default_qty_value
Parameter adalah 0,1, jadi ID yang diidentifikasi sebagai long1 kali inistrategy.entry
Operasi perintah berikutnya adalah perintah yang disetel secara default 0.1.strategy.entry
Fungsi yang kita pilih saat kita memanggildirection
adalahstrategy.long
Jadi, semua pesanan harus dibayar untuk tes ulang.
Perhatikan kodestrategy.entry("long3", ...
Operasi perintah berikut dipanggil dua kali, untuk ID yang sama: long3strategy.entry
Operasi berikutnya tidak berhasil, panggilan keduastrategy.entry
Fungsi untuk memodifikasi pesanan dengan ID ini ((data yang ditampilkan pada saat pengujian pengembalian juga dapat melihat bahwa pesanan dengan harga yang dibatasi ini telah dimodifikasi untuk 0.3)). Dalam kasus lain, misalnya jika ID pertama kali melakukan transaksi dengan pesanan dengan ID yang diperdagangkan, terus menggunakan ID yang diperdagangkan dengan ID yang diperdagangkanstrategy.entry
Fungsi yang dipesan, maka posisi pesanan akan terakumulasi pada IDlong3.
2、strategy.close
strategy.close
Fungsi ini digunakan untuk posisi kosong untuk menentukan posisi masuk yang identik dengan ID. Parameter utama adalah:id
,when
,qty
,qty_percent
。
parameter:
id
Saya tidak tahu apa yang harus saya lakukan, tapi saya ingin tahu apa yang harus saya lakukan.strategy.entry
ID yang ditentukan pada saat fungsi pesanan masuk dan membuka posisi.when
Kondisi pelaksanaan:qty
Jumlah saham kosong:qty_percent
Persentase posisi kosong.Untuk lebih jelasnya, lihat contoh berikut:
Dalam kode/*backtest ... */
Ini adalah informasi konfigurasi FMZ.COM International Station Retest, yang dapat dihapus, mengatur informasi seperti pasar, varietas, dan rentang waktu yang Anda butuhkan untuk diuji.
/*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 mulai dengan tiga kali masuk berturut-turut, dengan ID masuk masing-masing adalah long1, dan kemudian menggunakanstrategy.close
Hasil yang berbeda dari fungsi yang diukur kembali saat parameter yang berbeda diatur pada posisi kosong.strategy.close
Fungsi ini tidak memiliki parameter untuk menentukan harga pelunasan, fungsi ini terutama digunakan untuk segera melakukan pelunasan 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 memegang posisi dalam satu arah, yaitu jika ada sinyal yang memicu posisi saat ini dengan arah yang berlawanan dari posisi saat ini, maka posisi akan diratakan dan kemudian dipicu oleh sinyal tersebut.strategy.close_all
Pada saat dipanggil, semua posisi di arah saat ini akan dihapus.strategy.close_all
Parameter utama dari fungsi ini adalah:when
。
parameter:
when
Kondisi pelaksanaan: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
Kode tes dimulai dengan posisi 0…strategy.position_size==0
adalah benar), sehingga hanya melakukan ID sebagai long jika memenuhi kondisi yang ditetapkan oleh whenstrategy.entry
Fungsi masuk: Setelah memegang beberapa posisistrategy.position_size
Jika ID lebih besar dari 0, maka fungsi masuk untuk short akan dieksekusi, karena ada posisi yang lebih besar, maka sinyal inversi shorting yang muncul akan menyebabkan posisi yang lebih besar dihapus dan kemudian dibalikkan.strategy.position_size < 0
Ketika, yaitu ketika memegang posisi kosong tutup semua posisi yang memegang arah saat ini.enableStop := true
│Menghentikan pelaksanaan kebijakan agar dapat melihat lognya.│
dapat ditemukanstrategy.close_all
Fungsi ini tidak memiliki parameter untuk menentukan harga pelunasan, fungsi ini terutama digunakan untuk segera melakukan pelunasan dengan harga pasar saat ini.
4、strategy.exit
strategy.exit
Fungsi ini digunakan untuk melakukan operasi posisi kosong untuk masuk dan memegang posisi, berbeda dengan fungsi ini adalahstrategy.close
Danstrategy.close_all
Fungsi ini adalah untuk segera melunasi posisi dengan harga pasar saat ini.strategy.exit
Fungsi akan melakukan perencanaan posisi kosong berdasarkan pengaturan parameter.
parameter:
id
: ID pesanan untuk setoran saat ini.from_entry
: ID entri yang digunakan untuk menentukan operasi yang akan dilakukan.qty
Jumlah saham kosong:qty_percent
: Persentase posisi kosong, kisaran: 0 ~ 100 ◦profit
Target laba, dalam poin.loss
: Stop Loss Target, dalam poin.limit
Target laba, ditentukan dengan harga.stop
: Stop loss target, dengan harga yang ditentukan.when
Kondisi pelaksanaan:Gunakan strategi tes 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 real-time model harga test feedback, strategi tes ini dimulai dengan melakukan 3 operasi masuk (strategy.entry
Fungsi), long1 sengaja disetellimit
Parameter, harga 1 membuat tidak dapat diperdagangkan. Kemudian tes kondisi keluar dari fungsistrategy.exit
❚ Menggunakan stop-loss berdasarkan jumlah poin, stop-loss berdasarkan harga, menggunakan posisi dengan jumlah tetap, menggunakan posisi dengan persentase. ❚ Hanya menunjukkan stop-loss dalam contoh perpanjangan. Operasi stop-loss juga sama.strategy.exit
Fungsi ini juga memiliki parameter tracking stop loss yang lebih kompleks:trail_price
、trail_points
、trail_offset
Anda juga dapat mencoba untuk mempelajari cara menggunakannya dalam contoh ini.
5、strategy.cancel
strategy.cancel
Fungsi yang digunakan untuk membatalkan/menunda semua perintah untuk daftar pendahuluan.strategy.order
, strategy.entry
, strategy.exit
Fungsi ini dapat menghasilkan ID masuk. Parameter utamanya adalah:id
、when
。
parameter:
id
ID yang harus dibatalkan:when
Kondisi pelaksanaan:Fungsi ini dipahami dengan baik, yaitu untuk membatalkan perintah masuk yang tidak bertransaksi.
/*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/membatalkan semua preload order order ◦ dapat ditentukanwhen
Parameter
parameter:
when
Kondisi pelaksanaan:/*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 fungsi, pengaturan parameter, dan lain-lain hampir sama denganstrategy.entry
Persamaan, perbedaan antarastrategy.order
Fungsi tidak terlindungistrategy
Fungsipyramiding
Pengaturan parameter berdampak, tidak ada batasan jumlah pesanan.
parameter:
id
: dapat diartikan sebagai nama pertama yang digunakan untuk merujuk pada suatu posisi perdagangan. dapat merujuk pada id ini untuk membatalkan, memodifikasi pesanan, atau posisi kosong.direction
: Jika arah pesanan adalah melakukan lebih banyak ((beli) parameter ini diteruskanstrategy.long
Variabel internal ini akan dikirim jika Anda ingin melakukan short sale.strategy.short
Variabel iniqty
: Tentukan jumlah pesanan, jika tidak memberikan parameter ini digunakan adalah jumlah pesanan default.when
Kondisi eksekusi: Anda dapat menentukan parameter ini untuk mengontrol apakah operasi perintah saat ini dipicu atau tidak.limit
: Tentukan harga order limit.stop
Harga Stop Loss:Kita akan menggunakanstrategy.order
Tidak ada batasan pada jumlah baris yang akan ditampilkan.strategy.exit
Fungsi Keluar Kondisi. 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 strategi pengajaran, strategi bimbingan desain ide, tidak melakukan apa-apa perdagangan bimbingan, rekomendasi. Strategi pengajaran jangan langsung.
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()
Strategi tren yang ditulis dalam bahasa Pine sangatlah sederhana, di sini kita merancang strategi pelacakan tren yang sederhana dengan indikator tren super. Mari kita analisa kode sumber strategi ini.
Pertama, mulailah menggunakan kode strategi.strategy
Fungsi melakukan beberapa pengaturan sederhana:strategy("supertrend", overlay=true)
Jadi, jika Anda ingin membuat sebuah strategi, Anda hanya perlu membuat sebuah strategi dengan judul “supertrend”.overlay
Parameternya adalahtrue
Kita membuat strategi Pine atau kita belajar sebuah skrip strategi Pine. Pertama kita lihat pada desain parameter interface strategi, kita lihat pada kode sumber dari strategi indikator super trend, di antaranya ada yang kita pelajari di kursus sebelumnya.input
fungsi
[supertrend, direction] = ta.supertrend(input(5, “factor”), input.int(10, “atrPeriod”))
input
Fungsi panggilan langsung digunakan sebagaita.supertrend
Parameter dari fungsi indikator digunakan untuk menghitung indikator supertrend. Di antaranya:
Fungsi secara default akan mengatur dua kontrol parameter pada antarmuka kebijakan bahasa Pine, seperti gambar:
Anda dapat melihat b