sa Pine di FMZ tidak ketat terhadap keperluan jenis, dan biasanya boleh diabaikan. Walau bagaimanapun, untuk menyesuaikan diri dengan strategi skrip di Trading View, pembolehubah boleh dinyatakan dengan jenis. Contohnya:
int i = 0
float f = 1.1
Jenis dalam Trading View adalah lebih ketat, dan anda akan mendapat kesalahan jika anda menggunakan kod berikut dalam Trading View:
baseLine0 = na // compile time error!
Untuk meringkaskan, pernyataan terhadap satu pemboleh ubah boleh ditulis sebagai:
// [<declaration_mode>] [<type>] <identifier> = value
声明模式 类型 标识符 = 值
Di sini, operator penambahan nilai digunakan:=
Berikan nilai kepada pembolehubah semasa pengisytiharan pembolehubah. Nilai yang diberikan boleh berupa senar, nilai, ungkapan, panggilan fungsi, dan sebagainya.if
、 for
、while
atauswitch
Struktur dll ((kata kunci struktur, penggunaan frasa kami akan menjelaskan secara terperinci dalam pelajaran seterusnya, sebenarnya kita telah belajar dalam pelajaran sebelumnya pemberian frasa if yang mudah, anda boleh melihat semula)
Di sini kita akan fokus pada fungsi input, fungsi yang sering kita gunakan dalam merancang dan menulis strategi. Ia juga merupakan fungsi yang sangat penting dalam merancang strategi.
Fungsi input:
input函数,参数defval、title、tooltip、inline、group
Fungsi input pada FMZ dan pada Trading View agak berbeza, tetapi fungsi ini digunakan sebagai input yang diberikan kepada parameter strategi. Di bawah ini kita akan menerangkan 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 automatik melukis kawalan yang digunakan untuk menetapkan parameter dasar. Kawalan yang disokong pada FMZ kini mempunyai kotak input angka, kotak input teks, kotak bawah, dan pilihan nilai bul. Ia juga boleh menetapkan komponen parameter dasar dan maklumat teks isyarat untuk menetapkan parameter.
Di sini, kita akan membincangkan beberapa parameter utama fungsi input:
Selain pengisytiharan dan penekanan pembolehubah individu, bahasa Pine juga menyatakan satu set pembolehubah dan penekanan nilai:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
Yang paling biasa ialah kita menggunakanta.macd
Apabila fungsi mengira penunjuk MACD, kerana penunjuk MACD adalah penunjuk berbilang baris, tiga set data dikira. Oleh itu, ia boleh 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)
Kita boleh menggunakan kod di atas untuk melukis grafik MACD dengan mudah, bukan hanya fungsi terbina dalam yang dapat mengembalikan banyak pembolehubah, fungsi tersuai yang ditulis juga dapat mengembalikan banyak 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)
Penggunaan struktur seperti if sebagai pemberian nilai kepada pelbagai pembolehubah juga serupa dengan fungsi tersuai di atas, yang berminat juga boleh cuba.
[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 tidak boleh ditulis dalam blok kod tempatan cabang bersyarat, terutamanya beberapa fungsi berikut:
barcolor(), fill(), hline(), indicator(), plot(), plotcandle(), plotchar(), plotshape()
Trading View akan mengkompilasi laporan kesalahan. Di FMZ, sekatan tidak begitu ketat, tetapi juga disyorkan untuk mengikuti peraturan yang ditulis di Trading View. Sebagai contoh, walaupun tidak melaporkan kesalahan di FMZ, tetapi tidak disyorkan untuk menulis sedemikian.
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")
Contohnya:
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)
Nota: Ekspresi yang digunakan untuk menilai, mengembalikan nilai Boolean. Perhatikan bahawa hanya boleh ada satu cabang Else. Semua cabang ekspresi tidak benar, dan jika tidak ada cabang Else, ia akan mengembalikan na.
x = if close > open
close
plot(x, title="x")
Oleh kerana apabila K bar BAR adalah negatif, iaitu apabila close < open, if ungkapan selepas pernyataan adalah false, maka blok kod tempatan untuk if tidak dilaksanakan. Pada masa ini juga tidak ada cabang else, jika pernyataan akan kembali na… … . .
Perkataan switch juga merupakan perkataan bercabang yang direka untuk melaksanakan laluan yang berbeza mengikut keadaan tertentu. Perkataan switch secara amnya mempunyai beberapa titik pengetahuan utama seperti berikut:
1 , kata ganti boleh dikembalikan nilai seperti kata if. 2. Tidak seperti kata ganti dalam bahasa lain, apabila melaksanakan struktur suis, hanya satu blok tempatan dalam kodnya yang dilaksanakan, jadi pengisytiharan putus tidak diperlukan (iaitu tidak perlu menulis kata kunci seperti break). 3. Setiap cabang switch boleh menulis satu blok kod tempatan, dan baris terakhir blok kod tempatan ini adalah nilai yang dikembalikan (ia boleh menjadi satu subset nilai). Jika tidak ada cabang yang dipotong blok kod tempatan yang dilaksanakan, ia akan dikembalikan. 4. Ekspresi dalam struktur suis, boleh menulis rentetan, pembolehubah, ungkapan atau panggilan fungsi. 5. switch membolehkan anda menentukan nilai pulangan yang digunakan sebagai nilai lalai apabila tiada keadaan lain dalam struktur.
Terdapat dua jenis switch, dan kita akan lihat contoh-contohnya dan bagaimana ia digunakan.
1 dengan ungkapanswitch
Contohnya:
// 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)
Sebelum ini kita telah belajar fungsi input, dan di sini kita akan belajar dua fungsi yang serupa dengan input:input.string
、input.int
fungsi.
input.string
Ia juga boleh digunakan untuk menghantar semula string.input.int
Fungsi ini digunakan untuk mengembalikan nilai integer.options
Cara menggunakan parameter.options
Parameter boleh dihantar ke dalam sebuah array yang terdiri daripada nilai yang boleh dipilih.options=["EMA", "SMA", "RMA", "WMA"]
danoptions=[5, 10, 20]
(Perhatikan bahawa satu adalah jenis senar dan satu adalah jenis nilai) Oleh itu, kawalan pada antara muka dasar tidak perlu memasukkan nilai tertentu, tetapi ia menjadi kotak bawah untuk memilih pilihan yang disediakan dalam parameter pilihan.
Func merupakan sebuah string yang berfungsi sebagai ungkapan switch (yang boleh berupa variabel, panggilan fungsi, atau ungkapan) untuk menentukan cabang mana dalam switch yang akan dijalankan. Jika func tidak dapat disamakan dengan ungkapan pada cabang manapun dalam switch (yang setara), maka blok kod cabang default akan dijalankan.runtime.error("error")
Fungsi menyebabkan strategi untuk membuang pengecualian berhenti.
Dalam kod ujian kami di atas, kami tidak menyertakan runtime.error selepas baris terakhir dalam blok kod cabang lalai switch[Kod seperti na, na] untuk mengkompatibelkan nilai pulangan, di trading view perlu mempertimbangkan masalah ini, jika jenis tidak sesuai akan memberi kesalahan. Tetapi di FMZ kerana tidak ada jenis yang dikehendaki secara ketat, kod keserasian ini boleh diabaikan. Oleh itu, di FMZ tidak perlu mempertimbangkan keserasian jenis nilai pulangan if, switch branch.
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 akan berlaku pada FMZ, tetapi berlaku pada pandangan perdagangan. Kerana jenis if yang dikembalikan oleh cabang tidak selaras.
switch
Mari kita lihat.switch
Penggunaan lain ialah menulis tanpa ungkapan.
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 kod ujian menunjukkan bahawa switch akan memadankan blok kod tempatan yang benar dengan syarat percabangan. Secara amnya, syarat percabangan yang diikuti oleh pernyataan switch mestilah saling bertentangan. Maksudnya, dalam contoh ini, up dan down tidak boleh sama-sama benar.up = close > open // up = close < open
Tukarkan ke dalam notis, ulangi dan lihat hasilnya. Anda akan mendapati bahawa cabang switch hanya dapat menjalankan cabang pertama. Selain itu, anda perlu berhati-hati untuk tidak menulis panggilan fungsi di dalam cabang switch, fungsi tidak dapat dipanggil pada setiap BAR yang mungkin menyebabkan beberapa masalah pengiraan data.switch
“Dalam contoh ini, cabang pelaksanaan ditetapkan dan tidak akan berubah semasa operasi strategi”.)
返回值 = for 计数 = 起始计数 to 最终计数 by 步长
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Perkataan for sangat mudah digunakan, kerana loop for akhirnya boleh mengembalikan satu nilai (() atau mengembalikan beberapa nilai untuk[a, b, c] seperti) 。 seperti yang dinyatakan di atas dalam kod palsu yang memberi nilai kepada kedudukan “nilai pulangan”. 。 untuk kata-kata yang diikuti oleh “pengiraan” pembolehubah untuk mengawal jumlah kali pusingan, merujuk nilai lain dan sebagainya. 。 “pengiraan” pembolehubah yang diberikan nilai sebagai “pengiraan awal” sebelum permulaan pusingan, dan kemudian meningkat mengikut “langkah” tetapan, apabila “pengiraan” pembolehubah lebih besar daripada “pengiraan akhir” pusingan berhenti.
digunakan dalam kitaran forbreak
Kata kunci: Apabila dilakukanbreak
Selepas itu, kitaran berhenti.
digunakan dalam kitaran forcontinue
Kata kunci: Apabila dilakukancontinue
Selepas itu, loop akan mengabaikan.continue
Kod seterusnya, menjalankan kitaran seterusnya secara langsung. Perkataan for mengembalikan nilai yang dikembalikan semasa pelaksanaan kitaran terakhir. Jika tidak ada pelaksanaan kod, mengembalikan nilai kosong.
Di bawah ini adalah contoh ringkas:
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
Perkataan ini mempunyai dua bentuk, yang ditunjukkan oleh kod palsu berikut:
返回值 = for 数组元素 in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Perbezaan utama antara kedua-dua bentuk ini adalah yang diikuti oleh kata kunci for, iaitu menggunakan satu variabel sebagai rujukan kepada unsur-unsur array. Satu lagi adalah menggunakan struktur subset yang mengandungi variabel indeks, unsur-unsur array untuk rujukan. Yang lain adalah peraturan nilai kembali, menggunakan peraturan seperti break, teruskan dan kitaran 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")
Gunakan indeks apabila ia diperlukanfor [i, ele] in testArray
Penulisan
Penggunaan kitaran
Apabila anda boleh menggunakan fungsi terbina dalam yang disediakan oleh bahasa Pine untuk melakukan beberapa pengiraan logik berputar, anda boleh menggunakan struktur berputar untuk menulisnya secara langsung, atau anda boleh menggunakan fungsi terbina dalam untuk memprosesnya. Kami akan memberikan dua contoh.
1 , mengira nilai purata
Apabila anda menggunakan reka bentuk struktur kitaran:
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, kami menggunakan for untuk menambah pusingan dan kemudian mengira nilai purata.
Hitung garis purata dengan menggunakan fungsi terbina dalam:
plot(ta.sma(close, length), title="ta.sma", overlay=true)
Fungsi terbina dalamta.sma
Untuk mengira nilai rata-rata, jelas lebih mudah untuk menggunakan fungsi terbina dalam untuk mengira rata-rata. Hasil yang dikira adalah sama sekali sama seperti yang dapat dilihat dalam perbandingan pada carta.
Atau gunakan contoh di atas.
Apabila anda menggunakan reka bentuk struktur kitaran:
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)
Anda boleh menggunakan fungsi terbina dalam untuk mengira jumlah semua elemen dalam array dengan menggunakan loop.array.sum
Untuk mengira.
Secara langsung menggunakan fungsi terbina dalam untuk mengira penjumlahan:
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 dikira dapat dilihat dengan menggunakan gambar plot yang dipaparkan dalam grafik.
Jadi, jika anda boleh menggunakan fungsi terbina dalam untuk melakukan semua ini, mengapa anda perlu merancang kitaran? 1. Untuk beberapa operasi, perhitungan. 2 , kembali ke sejarah, contohnya, cari berapa banyak titik tinggi masa lalu yang lebih tinggi daripada titik tinggi BAR semasa. Oleh kerana titik tinggi BAR semasa hanya diketahui pada BAR yang dijalankan oleh skrip, satu kitaran diperlukan untuk kembali pada masa dan menganalisis BAR masa lalu. 3. Apabila fungsi terbina dalam bahasa Pine tidak dapat menyelesaikan pengiraan BAR yang lalu.
while
Perkataan ini membolehkan kod bagi bahagian kitaran dijalankan sehingga syarat penghakiman dalam struktur while adalah false (false)
返回值 = while 判断条件
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
Peraturan lain untuk while serupa dengan kitaran for, baris terakhir blok kod tempatan kitaran adalah nilai pulangan, yang boleh mengembalikan beberapa nilai. Apabila “kondisi kitaran” menjalankan kitaran sebagai masa yang benar, dan berhenti kitaran apabila keadaan adalah palsu. Anda juga boleh menggunakan kata putus, teruskan dalam kitaran.
Saya akan tunjukkan dengan menggunakan contoh perhitungan garis 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 bahawa penggunaan while loop juga sangat mudah, dan anda juga dapat merancang beberapa logik pengiraan yang tidak dapat digantikan dengan fungsi terbina dalam, seperti pengiraan pangkat kali:
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 dan definisi array dalam bahasa pengaturcaraan yang lain adalah serupa. Array dalam bahasa Pine adalah sebuah array berdimensi. Array biasanya digunakan untuk menyimpan satu siri data yang berturut-turut. Array di mana data tunggal yang disimpan dipanggil elemen array, jenis elemen ini boleh menjadi: integer, float, string, nilai warna, nilai bul.[]
Ia perlu digunakanarray.get()
danarray.set()
Fungsi 。 elemen-elemen dalam array diindeks mengikut urutan iaitu elemen pertama dalam array diindeks 0, dan elemen seterusnya diindeks dengan peningkatan 1。
Kami menggunakan kod mudah untuk menerangkan:
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))
gunaarray<int> a
、float[] b
Array yang diisytiharkan atau hanya menyatakan satu pembolehubah boleh diberikan kepada array, contohnya:
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 pembolehubah arrayarray.new
danarray.from
Terdapat banyak fungsi lain dalam bahasa Pine yang berkaitan dengan jenis yang serupa dengan fungsi array.new:array.new_int()
、array.new_bool()
、array.new_color()
、array.new_string()
tunggu.
Kata kunci var juga boleh berfungsi dengan mod pengisytiharan array, menggunakan kata kunci var pengisytiharan array hanya diinisialisasi pada BAR pertama. Kita melihat dengan contoh:
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 bahawa perubahan dalam a terus ditetapkan, tanpa perlu ditukar semula. B pula diinisialisasi pada setiap BAR.barstate.islast
Untuk masa nyata, hanya satu elemen yang akan dicetak, iaitu nilai 0 .
Gunakan array.get untuk mendapatkan elemen yang menentukan kedudukan indeks dalam array, gunakan array.set untuk mengubah elemen yang menentukan kedudukan indeks dalam array.
Argumen pertama array.get ialah array yang akan diproses, dan argumen kedua ialah indeks yang ditetapkan. Parameter pertama array.set adalah array yang akan diuruskan, parameter kedua adalah indeks yang ditetapkan, dan parameter ketiga adalah elemen yang akan ditulis.
Sebagai contoh, perhatikan contoh mudah ini:
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 asas hijau, mengisytiharkan dan menginisialisasi satu array untuk menyimpan warna, dan kemudian memberikan nilai warna dengan ketelusan yang berbeza (menggunakan fungsi color.new). Dengan mengira jarak BAR semasa dari nilai tertinggi dalam 100 pusingan pusingan, gred warna dikira.
Bagaimana untuk mengembara melalui sebuah array, kita boleh menggunakan pernyataan for/for in/while yang telah kita pelajari sebelum ini.
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-tiga cara ini mempunyai hasil yang sama.
Array boleh diisytiharkan dalam skop global skrip, atau diisytiharkan dalam skop tempatan fungsi atau cabang if
Untuk penggunaan elemen dalam array, kaedah berikut adalah setara, kita dapat melihat dengan contoh berikut, kita dapat menggambar dua kumpulan garis pada carta, dua baris dalam setiap kumpulan, dan nilai dua baris dalam setiap kumpulan adalah sama.
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 penambahan dan penghapusan dalam 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")
Menambah dan Menghapuskan Aplikasi: Array sebagai Queue
Dengan menggunakan array, dan beberapa fungsi penambahan dan penghapusan dari array, kita boleh membina struktur data “array”. Array boleh digunakan untuk mengira purata bergerak harga tick, dan mungkin ada pelajar yang bertanya: Kenapa kita perlu membina struktur array?
Kuantiti adalah struktur yang sering digunakan dalam bidang pengaturcaraan. Kuantiti mempunyai ciri-ciri seperti:
Unsur-unsur yang masuk ke dalam barisan pertama, keluar barisan pertama.
Ini memastikan bahawa data yang terdapat dalam barisan adalah data terkini, dan panjang barisan tidak akan berkembang tanpa had (kod yang berkembang tanpa had hanya boleh ditulis pada waktu tengah hari, kerana ia boleh menjadi masalah pada waktu pagi dan petang).
Contoh berikut kami menggunakan struktur beratur untuk merekodkan harga setiap tick, mengira purata bergerak pada tahap tick, dan kemudian membandingkannya dengan purata bergerak pada tahap K-line 1 minit.
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 bahawa apabila kita menyatakan a, kita menggunakan kata kunci untuk menyatakanvarip
Oleh itu, setiap perubahan harga akan direkodkan dalam a.
Mengira fungsi yang berkaitan:
array.avg()
Cari nilai purata bagi semua elemen dalam susunan.array.min()
Cari unsur terkecil dalam susunan.array.max()
Cari unsur terbesar dalam susunan.array.stdev()
Cari perbezaan piawai bagi semua unsur dalam susunan.array.sum()
Cari jumlah semua unsur dalam array.
Fungsi yang berkaitan dengan operasi:
array.concat()
Gabungkan atau sambungkan dua array.
array.copy()
Menyalin array.
array.join
Menghubungkan semua elemen dalam array ke dalam satu senar.
array.sort()
Urutan mengikut urutan naik atau turun.
array.reverse()
Array berbalik.
array.slice()
Potong Array.
array.includes()
Elemen penghakiman
array.indexof()
Mengembalikan indeks yang pertama kali muncul apabila nilai parameter dimasukkan. Jika nilai itu tidak ditemui, kembali -1
array.lastindexof()
Cari nilai yang muncul terakhir.
Contoh ujian fungsi berkaitan pengiraan arisan:
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 pengiraan array yang lebih biasa digunakan.
Contoh fungsi yang berkaitan 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 boleh merancang fungsi tersuai. Secara umum, fungsi tersuai dalam bahasa Pine mempunyai peraturan berikut:
barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()
) tidak boleh dipanggil dalam fungsi tersuai.Dalam tutorial sebelumnya, kita telah menggunakan fungsi tersuai, seperti fungsi tersuai yang direka dalam satu baris:
barIsUp() => close > open
Fungsi ini mengembalikan sama ada BAR semasa adalah cahaya matahari.
Fungsi tersuai yang direka untuk pelbagai 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 buat sendiri dengan fungsi tersuai.
Juga, anda boleh mengembalikan contoh fungsi tersuai untuk dua pembolehubah:
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)
Satu fungsi boleh mengira garis laju, garis perlahan, dua indikator EMA rata-rata.
Fungsi terbina dalam boleh dengan mudah diFMZ PINE ScriptPencarian di sini.
Fungsi terbina dalam bahasa Pine dikelaskan:
1 , fungsi pengendalian senarstr.
Siri.
2 fungsi pengendalian nilai warnacolor.
Siri.
3 , fungsi input parameterinput.
Siri.
4. Fungsi pengiraan penunjukta.
Siri.
5. Fungsi grafikplot.
Siri.
6. Fungsi pemprosesanarray.
Siri.
7. Fungsi berkaitan transaksistrategy.
Siri.
8., Fungsi berkaitan operasi matematikmath.
Siri.
9 , fungsi lain ((pemprosesan masa, bukan plot siri fungsi lukisan grafik,request.
Fungsi siri, fungsi pemprosesan jenis, dan lain-lain).
strategy.
Fungsi siri adalah fungsi yang sering kita gunakan dalam merancang strategi, yang berkaitan dengan fungsi dan strategi untuk menjalankan operasi perdagangan semasa ia dijalankan.
1、strategy.entry
strategy.entry
Fungsi adalah fungsi perintah yang lebih penting apabila kita menulis strategi, beberapa parameter yang lebih penting adalah:id
, direction
, qty
, when
tunggu.
parameter:
id
: boleh difahami sebagai nama pertama yang diberikan kepada kedudukan perdagangan tertentu untuk rujukan. Boleh merujuk kepada id ini untuk membatalkan, mengubah suai pesanan, dan mendatarkan kedudukan.direction
Parameter ini akan diteruskan jika arah pesanan adalah melakukan lebih banyak (atau membeli)strategy.long
Variabel ini akan dihantar kepada anda jika anda ingin menjual.strategy.short
Variabel ini ialah:qty
: Tentukan jumlah pesanan, jika anda tidak menghantar parameter ini, anda akan menggunakan jumlah pesanan lalai.when
Keadaan pelaksanaan: anda boleh menentukan parameter ini untuk mengawal sama ada operasi perintah semasa ini akan dicetuskan.limit
Tentukan harga yang terhad untuk pesanan.stop
: Harga Hentikan Kerosakan.strategy.entry
Perincian pelaksanaan fungsistrategy
Pengendalian tetapan parameter semasa panggilan fungsi juga boleh dilakukan melalui“Parameter modem perpustakaan kelas pertukaran bahasa Pine”Untuk lebih terperinci mengenai kawalan tetapan, kawalan parameter modem perpustakaan kelas transaksi bahasa Pine, lihat dokumentasi di pautan tersebut.
Saya ingin berkongsi dengan anda tentang topik ini.strategy
Dalam fungsi,pyramiding
、default_qty_value
Parameter diuji dengan kod 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)
Permulaan kod/*backtest ... */
Bahagian pakej adalah untuk seting semula, untuk merekodkan maklumat seperti masa seting semula pada masa itu, untuk memudahkan debug, bukan kod strategi.
Dalam kod:strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
Apabila kita menetapkanpyramiding
Apabila parameternya adalah 3, maka kita boleh setkan 3 kali perdagangan dalam arah yang sama. Jadi dalam contoh ini, 4 kali.strategy.entry
Operasi perintah berikut tidak dilaksanakan.default_qty_value
Parameter adalah 0.1, jadi ID yang dilambangkan sebagai long1strategy.entry
Pergerakan perintah seterusnya ditetapkan secara lalai sebagai 0.1.strategy.entry
Fungsi ini dipanggil dengan fungsi yang kita tentukan.direction
adalahstrategy.long
Oleh itu, setiap pesanan yang dibuat pada masa ujian balasan adalah dengan bayaran.
Perhatian dalam kodstrategy.entry("long3", ...
Operasi perintah berikut dipanggil dua kali, untuk ID yang sama: long3strategy.entry
Operasi perintah bawah tidak berjaya, panggilan keduastrategy.entry
Fungsi untuk mengubah pesanan ID ini: ((Data yang ditunjukkan semasa ujian pengulangan juga dapat melihat bahawa pesanan harga terhad ini telah diubah untuk 0.3)). Sebagai contoh lain, jika ID pertama kali diperdagangkan untuk pesanan 3, teruskan dengan menggunakan ID yang diperdagangkan untuk 3strategy.entry
Jika fungsi ini dipesan, maka kedudukan pesanan akan terkumpul pada IDlong3
2、strategy.close
strategy.close
Fungsi ini digunakan untuk kedudukan kosong yang menentukan ID kedudukan masuk. Parameter utama adalah:id
,when
,qty
,qty_percent
。
parameter:
id
Ini adalah ID masuk yang diperlukan untuk melakukan setoran, yang kami gunakan.strategy.entry
ID yang ditetapkan apabila fungsi pesanan masuk dibuka.when
Syarat pelaksanaan:qty
: Bilangan simpanan kosong.qty_percent
Peratusan saham kosong.Untuk mengetahui lebih lanjut mengenai fungsi ini, lihat contoh berikut:
Dalam kod/*backtest ... */
Ini adalah maklumat konfigurasi semasa FMZ.COM International Station Retest, anda boleh menghapus, menetapkan pasaran, jenis, dan jangka masa yang anda perlukan 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 ujian menunjukkan bahawa tiga kali berturut-turut mula melakukan masuk berganda, ID masuk masing-masing adalah long1, dan kemudian menggunakanstrategy.close
Hasil yang berbeza yang diukur apabila parameter fungsi yang berbeza ditetapkan pada kedudukan rata.strategy.close
Fungsi ini tidak mempunyai parameter untuk menentukan harga pesanan terendah untuk kedudukan terendah. Fungsi ini digunakan terutamanya untuk kedudukan terendah dengan harga pasaran semasa.
3、strategy.close_all
strategy.close_all
Fungsi ini digunakan untuk meratakan semua pegangan semasa, kerana skrip bahasa Pine hanya boleh memegang pegangan satu arah, iaitu jika ada isyarat yang berlawanan dengan arah pegangan semasa akan mencetuskan pegangan semasa dan kemudian mencetuskan pegangan berdasarkan isyarat. Oleh itu.strategy.close_all
Apabila dipanggil, ia akan menghapuskan semua pegangan di arah semasa.strategy.close_all
Parameter utama fungsi ialah:when
。
parameter:
when
Syarat pelaksanaan:Kami menggunakan contoh untuk melihat:
/*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 permulaan kod ujian, jumlah pegangan adalah 0…strategy.position_size==0
Jadi, apabila ia memenuhi syarat yang ditetapkan oleh parameter when, ia hanya akan melaksanakan ID sebagai set yang panjang.strategy.entry
Fungsi kemasukan: selepas memegang banyak kedudukanstrategy.position_size
Lebih besar daripada 0, maka ID adalah fungsi masuk short yang mungkin dilaksanakan, kerana kedudukan yang memegang banyak kepala, isyarat pembalikan shorting yang muncul pada masa ini akan menyebabkan kedudukan yang memegang banyak kepala kosong. Kemudian kita menulis dalam keadaan if apabilastrategy.position_size < 0
Apabila memegang kedudukan kosong, maka ia akan menebus semua kedudukan yang dipegang pada masa ini.enableStop := true
│Menghentikan pelaksanaan strategi untuk melihat log │
boleh didapatistrategy.close_all
Fungsi ini tidak mempunyai parameter untuk menentukan harga pesanan terendah untuk kedudukan terendah. Fungsi ini digunakan terutamanya untuk kedudukan terendah dengan harga pasaran semasa.
4、strategy.exit
strategy.exit
Fungsi ini digunakan untuk operasi kedudukan kosong untuk memegang kedudukan masuk, yang berbeza dengan fungsi ini ialahstrategy.close
danstrategy.close_all
Fungsi ini adalah untuk segera menebus kedudukan pada harga pasaran semasa.strategy.exit
Fungsi akan melakukan perancangan kedudukan rata mengikut parameter yang ditetapkan.
parameter:
id
: ID pesanan untuk borang terhad ini.from_entry
: ID kemasukan yang digunakan untuk menentukan operasi setinggi.qty
: Bilangan simpanan kosong.qty_percent
Peratusan saham kosong, julat: 0 ~ 100 ◦profit
: Matlamat keuntungan, dalam mata.loss
: Matlamat Hentikan Kerosakan, dalam mata.limit
: Matlamat keuntungan, dengan harga yang ditetapkan.stop
: Matlamat Hentikan Kerosakan, dengan harga yang ditetapkan.when
Syarat pelaksanaan:Menggunakan strategi ujian 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 ujian balasan model harga masa nyata, strategi ujian ini bermula dengan melakukan 3 operasi kemasukan:strategy.entry
Fungsi), long1 sengaja ditetapkanlimit
Parameter, harga langganan adalah 1 sehingga ia tidak boleh diperdagangkan. Kemudian uji syarat fungsi keluarstrategy.exit
❚ Menggunakan penangguhan mengikut bilangan titik, penangguhan mengikut harga, menggunakan kedudukan jumlah tetap tetap, menggunakan penangguhan mengikut peratusan. ❚ Oleh kerana contoh lebar hanya menunjukkan penangguhan. ❚ Operasi penangguhan juga sama.strategy.exit
Fungsi ini juga mempunyai parameter tracking stop loss yang lebih kompleks:trail_price
、trail_points
、trail_offset
Anda juga boleh menguji cara menggunakannya dalam contoh ini.
5、strategy.cancel
strategy.cancel
Fungsi yang digunakan untuk membatalkan / menghentikan semua arahan untuk senarai pendahuluan.strategy.order
, strategy.entry
, strategy.exit
Ia boleh menghasilkan ID kemasukan. Parameter utama fungsi ini adalah:id
、when
。
parameter:
id
ID yang perlu dibatalkan:when
Syarat pelaksanaan:Fungsi ini difahami sebagai fungsi yang digunakan untuk membatalkan perintah kemasukan 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 / menghentikan semua arahan senarai pendahuluan ◦ boleh ditetapkanwhen
Parameter
parameter:
when
Syarat 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, parameter, dan sebagainya hampir sama denganstrategy.entry
Persamaan, perbezaanstrategy.order
Fungsi tidak dilindungistrategy
Fungsipyramiding
Pengaturan parameter memberi kesan, tiada had jumlah pesanan.
parameter:
id
: boleh difahami sebagai nama pertama yang diberikan kepada kedudukan perdagangan tertentu untuk rujukan. Boleh merujuk kepada id ini untuk membatalkan, mengubah suai pesanan, dan mendatarkan kedudukan.direction
Parameter ini akan diteruskan jika arah pesanan adalah melakukan lebih banyak (atau membeli)strategy.long
Variabel ini akan dihantar kepada anda jika anda ingin menjual.strategy.short
Variabel ini ialah:qty
: Tentukan jumlah pesanan, jika anda tidak menghantar parameter ini, anda akan menggunakan jumlah pesanan lalai.when
Keadaan pelaksanaan: anda boleh menentukan parameter ini untuk mengawal sama ada operasi perintah semasa ini akan dicetuskan.limit
Tentukan harga yang terhad untuk pesanan.stop
: Harga Hentikan Kerosakan.Kita akan gunakanstrategy.order
Tidak ada had untuk jumlah siri, dan ia adalah gabunganstrategy.exit
Fungsi Terma Exit Fungsi Terma Exit Fungsi. Membina skrip yang menyerupai transaksi grid. Contoh sangat mudah, hanya untuk pembelajaran:
/*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-contoh strategi dalam tutorial ini hanya digunakan untuk strategi pengajaran, strategi bimbingan dan reka bentuk idea, tidak melakukan apa-apa panduan perdagangan, cadangan.
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 trend yang ditulis dalam bahasa Pine sangat mudah, di sini kita merancang strategi trend yang mudah untuk dilacak dengan indikator trend super. Mari kita menganalisis kod sumber strategi ini.
Pertama, gunakan kod strategi.strategy
Fungsi melakukan beberapa tetapan mudah:strategy("supertrend", overlay=true)
Ia hanya menetapkan satu tajuk strategi yang dipanggil “supertrend”.overlay
Parameternya ialahtrue
Kita merancang strategi Pine atau kita belajar skrip strategi Pine. Pertama kita lihat pada reka bentuk parameter antara muka strategi, kita lihat pada kod sumber untuk strategi indikator trend super, di mana kita telah belajar dalam kursus sebelum ini.input
fungsi
[supertrend, direction] = ta.supertrend(input(5, “factor”), input.int(10, “atrPeriod”))
input
Panggilan fungsi digunakan secara langsung sebagaita.supertrend
Parameter fungsi penunjuk digunakan untuk mengira penunjuk trend super. Di antaranya: