Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

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

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

Tutorial Pengenalan Bahasa PINE Kuantitatif Pencipta

Di sini, kita akan membincangkan beberapa parameter utama fungsi input:

  • defval: nilai lalai untuk pilihan parameter dasar yang ditetapkan oleh fungsi input, menyokong pembolehubah, nilai, dan senar terbina dalam bahasa Pine
  • title: nama parameter yang ditunjukkan oleh polisi pada antara muka polisi pada cakera keras/pemeriksaan semula.
  • tooltip: isyarat parameter dasar, apabila tetikus diletakkan di atas parameter dasar, ia akan memaparkan maklumat teks yang ditetapkan untuk parameter ini.
  • group: nama kumpulan parameter dasar yang boleh diberikan kepada kumpulan parameter ∂.

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

Struktur Syarat

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

Pernyataan if

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

Kata ganti

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 ungkapanswitchContohnya:

// 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.stringinput.intfungsi. input.stringIa juga boleh digunakan untuk menghantar semula string.input.intFungsi ini digunakan untuk mengembalikan nilai integer.optionsCara menggunakan parameter.optionsParameter 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.

  1. Tidak bersuaraswitch

Mari kita lihat.switchPenggunaan 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 < openTukarkan 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”.)

Struktur kitaran

untuk frasa

返回值 = 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 forbreakKata kunci: Apabila dilakukanbreakSelepas itu, kitaran berhenti. digunakan dalam kitaran forcontinueKata kunci: Apabila dilakukancontinueSelepas itu, loop akan mengabaikan.continueKod 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")

untuk … dalam perenggan

for ... inPerkataan 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 testArrayPenulisan

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

  1. Penjumlahan

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

Perkataan sementara

whilePerkataan 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

Kumpulan

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

Array pengisytiharan

gunaarray<int> afloat[] bArray 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.newdanarray.fromTerdapat 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.islastUntuk masa nyata, hanya satu elemen yang akan dicetak, iaitu nilai 0 .

Membaca dan menulis elemen dalam array

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.

Menjelajah unsur-unsur

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

Sumber data sejarah

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)

Fungsi penambahan dan penyingkiran

  1. Fungsi yang berkaitan dengan operasi penambahan dalam susunan:

array.unshift()array.insert()array.push()

  1. Fungsi yang berkaitan dengan penghapusan dalam susunan:

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 menyatakanvaripOleh itu, setiap perubahan harga akan direkodkan dalam a.

Fungsi pengiraan dan pengendalian argumen

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

fungsi

Fungsi tersuai

Bahasa Pine boleh merancang fungsi tersuai. Secara umum, fungsi tersuai dalam bahasa Pine mempunyai peraturan berikut:

  1. Semua fungsi ditakrifkan dalam skop global skrip. Tidak boleh mendeklarasikan fungsi dalam fungsi lain.
  2. Tidak membenarkan fungsi memanggil dirinya sendiri dalam kodnya sendiri.
  3. Pada asasnya, semua bahasa PINE mempunyai fungsi grafik yang terbina dalam.barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()) tidak boleh dipanggil dalam fungsi tersuai.
  4. Fungsi boleh ditulis dalam bentuk baris tunggal, baris berbilang. Nilai yang dikembalikan dalam ayat terakhir adalah nilai yang dikembalikan oleh fungsi semasa, dan nilai yang dikembalikan boleh dikembalikan dalam bentuk unsur.

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

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

Fungsi urus niaga

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.entryFungsi adalah fungsi perintah yang lebih penting apabila kita menulis strategi, beberapa parameter yang lebih penting adalah:id, direction, qty, whentunggu.

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.
  • directionParameter ini akan diteruskan jika arah pesanan adalah melakukan lebih banyak (atau membeli)strategy.longVariabel ini akan dihantar kepada anda jika anda ingin menjual.strategy.shortVariabel ini ialah:
  • qty: Tentukan jumlah pesanan, jika anda tidak menghantar parameter ini, anda akan menggunakan jumlah pesanan lalai.
  • whenKeadaan pelaksanaan: anda boleh menentukan parameter ini untuk mengawal sama ada operasi perintah semasa ini akan dicetuskan.
  • limitTentukan harga yang terhad untuk pesanan.
  • stop: Harga Hentikan Kerosakan.

strategy.entryPerincian pelaksanaan fungsistrategyPengendalian 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.strategyDalam fungsi,pyramidingdefault_qty_valueParameter 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 menetapkanpyramidingApabila parameternya adalah 3, maka kita boleh setkan 3 kali perdagangan dalam arah yang sama. Jadi dalam contoh ini, 4 kali.strategy.entryOperasi perintah berikut tidak dilaksanakan.default_qty_valueParameter adalah 0.1, jadi ID yang dilambangkan sebagai long1strategy.entryPergerakan perintah seterusnya ditetapkan secara lalai sebagai 0.1.strategy.entryFungsi ini dipanggil dengan fungsi yang kita tentukan.directionadalahstrategy.longOleh 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.entryOperasi perintah bawah tidak berjaya, panggilan keduastrategy.entryFungsi 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.entryJika fungsi ini dipesan, maka kedudukan pesanan akan terkumpul pada IDlong3


2、strategy.close

strategy.closeFungsi ini digunakan untuk kedudukan kosong yang menentukan ID kedudukan masuk. Parameter utama adalah:idwhenqtyqty_percent

parameter:

  • idIni adalah ID masuk yang diperlukan untuk melakukan setoran, yang kami gunakan.strategy.entryID yang ditetapkan apabila fungsi pesanan masuk dibuka.
  • whenSyarat pelaksanaan:
  • qty: Bilangan simpanan kosong.
  • qty_percentPeratusan 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.closeHasil yang berbeza yang diukur apabila parameter fungsi yang berbeza ditetapkan pada kedudukan rata.strategy.closeFungsi 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_allFungsi 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_allApabila dipanggil, ia akan menghapuskan semua pegangan di arah semasa.strategy.close_allParameter utama fungsi ialah:when

parameter:

  • whenSyarat 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==0Jadi, apabila ia memenuhi syarat yang ditetapkan oleh parameter when, ia hanya akan melaksanakan ID sebagai set yang panjang.strategy.entryFungsi kemasukan: selepas memegang banyak kedudukanstrategy.position_sizeLebih 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 < 0Apabila 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_allFungsi 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.exitFungsi ini digunakan untuk operasi kedudukan kosong untuk memegang kedudukan masuk, yang berbeza dengan fungsi ini ialahstrategy.closedanstrategy.close_allFungsi ini adalah untuk segera menebus kedudukan pada harga pasaran semasa.strategy.exitFungsi 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_percentPeratusan 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.
  • whenSyarat 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.entryFungsi), long1 sengaja ditetapkanlimitParameter, 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.exitFungsi ini juga mempunyai parameter tracking stop loss yang lebih kompleks:trail_pricetrail_pointstrail_offsetAnda juga boleh menguji cara menggunakannya dalam contoh ini.


5、strategy.cancel

strategy.cancelFungsi yang digunakan untuk membatalkan / menghentikan semua arahan untuk senarai pendahuluan.strategy.order, strategy.entry , strategy.exitIa boleh menghasilkan ID kemasukan. Parameter utama fungsi ini adalah:idwhen

parameter:

  • idID yang perlu dibatalkan:
  • whenSyarat 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_allFungsi danstrategy.cancelFungsi serupa ◦ membatalkan / menghentikan semua arahan senarai pendahuluan ◦ boleh ditetapkanwhenParameter

parameter:

  • whenSyarat 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.orderFungsi fungsi, parameter, dan sebagainya hampir sama denganstrategy.entryPersamaan, perbezaanstrategy.orderFungsi tidak dilindungistrategyFungsipyramidingPengaturan 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.
  • directionParameter ini akan diteruskan jika arah pesanan adalah melakukan lebih banyak (atau membeli)strategy.longVariabel ini akan dihantar kepada anda jika anda ingin menjual.strategy.shortVariabel ini ialah:
  • qty: Tentukan jumlah pesanan, jika anda tidak menghantar parameter ini, anda akan menggunakan jumlah pesanan lalai.
  • whenKeadaan pelaksanaan: anda boleh menentukan parameter ini untuk mengawal sama ada operasi perintah semasa ini akan dicetuskan.
  • limitTentukan harga yang terhad untuk pesanan.
  • stop: Harga Hentikan Kerosakan.

Kita akan gunakanstrategy.orderTidak ada had untuk jumlah siri, dan ia adalah gabunganstrategy.exitFungsi 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 strategi

Contoh-contoh strategi dalam tutorial ini hanya digunakan untuk strategi pengajaran, strategi bimbingan dan reka bentuk idea, tidak melakukan apa-apa panduan perdagangan, cadangan.

Strategi penunjuk trend super

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.strategyFungsi melakukan beberapa tetapan mudah:strategy("supertrend", overlay=true)Ia hanya menetapkan satu tajuk strategi yang dipanggil “supertrend”.overlayParameternya ialahtrueKita 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.inputfungsi

[supertrend, direction] = ta.supertrend(input(5, “factor”), input.int(10, “atrPeriod”))

inputPanggilan fungsi digunakan secara langsung sebagaita.supertrendParameter fungsi penunjuk digunakan untuk mengira penunjuk trend super. Di antaranya:

  • input(5, “factor”) -