Sumber daya yang dimuat... Pemuatan...

PINE Bahasa Tutorial Pengantar FMZ Quant

Penulis:FMZ~Lydia, Dibuat: 2022-09-23 15:23:34, Diperbarui: 2024-02-27 16:47:41

.3, batas = 3)

jika tidak barstate.ishistory dan tutup < terbuka Strategi. Batalkan. Strategi. Batalkan ((long2) Strategi. Batalkan ((long3) isStop:= true


---------------------------

6. ```strategy.cancel_all```

The ```strategy.cancel_all``` function is similar to the ```strategy.cancel``` function. It can cancel/stop all pre-listed commands. The ```when``` parameter can be specified.

Parameters:

- ```when```: Execution conditions.

```pine
/*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 

  1. strategy.order

Fungsi dan pengaturan parameter daristrategy.orderfungsi hampir identik denganstrategy.entryPerbedaannya adalah bahwastrategy.orderfungsi tidak terpengaruh olehpyramidingpengaturan parameter daristrategyfungsi, dan tidak ada batas jumlah pesanan.

Parameter:

  • id: dapat dipahami sebagai memberikan nama untuk posisi perdagangan untuk referensi. id dapat dirujuk untuk membatalkan, memodifikasi pesanan dan menutup posisi.
  • direction: Jika arah pesanan panjang (beli), masukkan variabel bawaanstrategy.long, dan jika Anda ingin pergi pendek (menjual), lulus dalam variabelstrategy.short.
  • qty: Tentukan jumlah pesanan yang akan ditempatkan, jika parameter ini tidak dilewati, jumlah pesanan default akan digunakan.
  • when: Kondisi eksekusi, Anda dapat menentukan parameter ini untuk mengontrol apakah operasi order saat ini dipicu atau tidak.
  • limit: Tentukan harga batas pesanan.
  • stopHarga stop loss.

Kami akan menggunakan fitur yangstrategy.ordertidak memiliki batas pada jumlah pesanan yang ditempatkan, dikombinasikan denganstrategy.exitfungsi keluar bersyarat untuk membangun skrip yang mirip dengan perdagangan grid. contohnya sangat sederhana dan untuk tujuan pembelajaran saja:

/*backtest
start: 2021-03-01 00:00:00
end: 2022-08-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/

varip beginPrice = -1

if not barstate.ishistory
    if beginPrice == -1 or (math.abs(close - beginPrice) > 1000 and strategy.opentrades == 0) 
        beginPrice := close
    
    for i = 0 to 20
        strategy.order("buy"+i, strategy.long, 0.01, limit=beginPrice-i*200, when=(beginPrice-i*200)<close)
        strategy.exit("coverBuy"+i, "buy"+i, qty=0.01, profit=200)
        
        strategy.order("sell"+i, strategy.short, 0.01, limit=beginPrice+i*200, when=(beginPrice+i*200)>close)
        strategy.exit("coverSell"+i, "sell"+i, qty=0.01, profit=200)

Contoh Strategi

Contoh strategi dalam tutorial ini hanya untuk tujuan instruksional, untuk membimbing ide desain strategi, dan bukan untuk panduan atau saran perdagangan.

Strategi Indikator Super Tren

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

Sangat mudah untuk menulis strategi tren dengan menggunakan bahasa Pine, dan di sini kita akan merancang strategi tren sederhana dengan indikator tren super.

Pertama, kode strategi dimulai dengan beberapa pengaturan sederhana dengan menggunakanstrategyFungsi:strategy("supertrend", overlay=true)``, which just sets a strategy title "supertrend". Thepenyambunganparameter is set tobenar, so that the drawn indicator lines and other content are displayed on the main chart. The first thing we need to look at when designing a Pine strategy or learning a Pine strategy script is the strategy interface parameter design. Let's look at the source code of the ''supertrend indicator strategy'', which has theinput ` ` fungsi yang kita pelajari di kursus sebelumnya

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

Peraturaninputpanggilan fungsi digunakan sebagai parameter langsung keta.supertrendfungsi indikator untuk menghitung indikator supertrend.

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

Secara default, fungsi ini menetapkan dua kontrol parameter pada layar strategi bahasa Pine, seperti yang ditunjukkan di bawah ini:

img

Seperti yang kita lihat, nilai default pada kontrol adalah parameter pertama dariinputFungsi daninputserangkaian fungsi (di sini adalahinput.int), yang juga dijelaskan dalam bagian sebelumnya. Dengan dua fungsi ini, kita kemudian dapat mengatur parameter darita.supertrendfungsi pada layar strategi.supertrendfungsi menghitung data hargasupertrenddan data arahdirectionLalu kita gunakanplotfungsi untuk menggambar grafik, perhatikan bahwa ketika menggambar grafik, itu didasarkan pada arah indikator supertrend, hanya arah saat ini digambar.directionadalah -1, tren pasar saat ini naik, ketikadirectionJadi kita bisa melihat bahwaplotFungsi menarik grafik ketika penghakimandirectionadalah lebih besar atau kurang dari 0.

Yang berikutnyaif... else ifLogika adalah penilaian sinyal perdagangan.direction < 0Saat ini, jika data hargasupertrenddalam indikator super trend lebih tinggi dari harga indikator super trend pada dua BAR sebelumnya (yaitu,supertrend[2], remember that the historical operator refers to the historical data of a variable), itu akan digunakan sebagai sinyal masuk untuk pergi panjang. ingat itu? jika ada posisi saat ini, memanggil fungsi order terbalik akan menutup posisi sebelumnya pertama, dan kemudian membuka posisi sesuai dengan arah perdagangan saat ini.supertrend > supertrend[2]tidak terpenuhi, selamastrategy.position_size < 0memegang posisi pendek, itu akan memicustrategy.close_all()Eksekusi fungsi untuk menutup semua posisi.

direction > 0Jika ada posisi panjang, semua posisi akan ditutup, dan kemudian ketika kondisisupertrend < supertrend[3]diisi, sinyal pendek akan dipicu.[3]untuk merujuk data harga dari indikator super trend pada BAR ketiga dari nomor sebelumnya? itu mungkin niat penulis strategi. setelah semua, risiko pendek di beberapa pasar, seperti pasar perdagangan kontrak, sedikit lebih besar dari risiko panjang.

Untukta.supertrendIndikator, ada yang tertarik bagaimana menilai apakah tren saat ini naik atau turun?

Bahkan indikator ini juga dapat diimplementasikan dalam bentuk fungsi khusus dalam bahasa Pine:

pine_supertrend(factor, atrPeriod) =>
	src = hl2
	atr = ta.atr(atrPeriod)
	upperBand = src + factor * atr
	lowerBand = src - factor * atr
	prevLowerBand = nz(lowerBand[1])
	prevUpperBand = nz(upperBand[1])

	lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
	upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
	int direction = na
	float superTrend = na
	prevSuperTrend = superTrend[1]
	if na(atr[1])
		direction := 1
	else if prevSuperTrend == prevUpperBand
		direction := close > upperBand ? -1 : 1
	else
		direction := close < lowerBand ? 1 : -1
	superTrend := direction == -1 ? lowerBand : upperBand
	[superTrend, direction]

Fungsi kustom ini persis algoritma yang sama dengan fungsi built-inta.supertrend, dan tentu saja data indikator yang dihitung juga sama persis. Seperti yang dapat kita lihat dari algoritma fungsi kustom ini, indikator super trend Pine terintegrasi dihitung dengan menggunakanhl2variabel built-in (harga tertinggi dan terendah dijumlahkan dan kemudian dibagi dengan 2, yaitu rata-rata harga tertinggi dan terendah), dan kemudian indikator ATR (volatilitas) dihitung untuk periode tertentu berdasarkan parameter atrPeriod. Kemudian jalur atas dan bawah dibangun dengan menggunakan hl2 dan ATR.

PembaruanlowerBanddanupperBandMenurut ungkapan ternar dalam kode.

    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand

lowerBand: lowerBand, digunakan untuk menentukan apakah tren naik telah berubah. upperBand: upperBand, digunakan untuk menentukan apakah tren menurun telah berubah. lowerBand dan upperBand selalu dihitung, hanya arah tren saat ini yang ditentukan pada akhir fungsi kustom ini.

    else if prevSuperTrend == prevUpperBand
        direction := close > upperBand ? -1 : 1
    else
        direction := close < lowerBand ? 1 : -1

Di sini dinilai bahwa jika nilai harga BAR terakhir pada tren super adalahprevUpperBand, yaitu band atas, berarti bahwa arus adalah kecenderungan menurun.closemelebihiupperBandharga pecah, tren dianggap telah bergeser pada titik ini dan dikonversi ke uptrend.directionJika tidak, itu tetap ditetapkan menjadi 1 (trend menurun). Itulah mengapa Anda melihat dalam strategi super trendif direction < 0ketika kondisi sinyal dipicu untuk pergi panjang.direction > 0, kondisi sinyal dipicu untuk pergi pendek.

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

Akhirnya, data harga dan data arah Indikator Super Trend tertentu dikembalikan berdasarkan pilihan arah.

Strategi penyeimbangan dinamis

/*backtest
start: 2021-03-01 00:00:00
end: 2022-09-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["v_input_1",4374],["v_input_2",3],["v_input_3",300],["ZPrecision",0,358374]]
*/

varip balance = input(50000, "balance")
varip stocks = input(0, "stocks")

maxDiffValue = input(1000, "maxDiffValue")


if balance - close * stocks > maxDiffValue and not barstate.ishistory
    // more balance , open long 
    tradeAmount = (balance - close * stocks) / 2 / close
    strategy.order("long", strategy.long, tradeAmount)
    balance := balance - tradeAmount * close
    stocks := stocks + tradeAmount
    runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)

else if close * stocks - balance > maxDiffValue and not barstate.ishistory
    // more stocks , open short 
    tradeAmount = (close * stocks - balance) / 2 / close
    strategy.order("short", strategy.short, tradeAmount)
    balance := balance + tradeAmount * close
    stocks := stocks - tradeAmount
    runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)

plot(balance, title="balance value(quoteCurrency)", color=color.red)
plot(stocks*close, title="stocks value(quoteCurrency)", color=color.blue)

img

img

Mari kita lanjutkan dengan beberapa contoh desain strategi bahasa Pine, kali ini kita akan belajar strategi keseimbangan dinamis.BaseCurrencydan jumlahQuoteCurrency. Apapun harga relatif aset yang meningkat, nilai yang dipegang di akun meningkat dan aset dijual. Jika harga relatif aset menurun, nilai yang dipegang di akun menurun dan aset dibeli. Ini dikenal sebagai strategi keseimbangan dinamis. Sebenarnya, strategi keseimbangan dinamis adalah semacam strategi grid yang berkinerja baik di pasar osilasi. Tetapi di pasar tren, itu akan terus kehilangan uang, kita perlu menunggu harga untuk kembali untuk mengurangi kerugian perlahan untuk keuntungan, tetapi keuntungannya adalah bahwa strategi keseimbangan dinamis selalu dapat menangkap tren osilasi pasar.

Kelemahan, seperti yang ditunjukkan pada grafik backtest dari strategi ini, adalah bahwa strategi memiliki kerugian mengambang besar selama tahap tren harga umum naik (atau turun).

Mari kita lihat desain kode strategi:

Kami menggunakan desain sederhana yang mensimulasikanbalance(yaitu, jumlah aset QuoteCurrency) danstocks(yaitu, jumlah aset BaseCurrency) informasi saldo dalam strategi. kita tidak membaca jumlah aset yang sebenarnya dalam akun, kita hanya menggunakan jumlah simulasi untuk menghitung pembelian dan penjualan yang sesuai.maxDiffValue, yang merupakan kriteria penilaian untuk melakukan penyeimbangan. Pada harga saat ini, hanya ketika penyimpangan antaraBaseCurrencydanQuoteCurrencymelebihimaxDiffValueApakah proses penyeimbangan berlangsung, menjual aset dengan harga tinggi dan membeli aset dengan harga rendah untuk menyeimbangkan kembali aset.

Sinyal perdagangan strategi pemicu harus dalam tahap BAR real time, jadi jika penilaian dalam kondisi perdagangan strategi ditetapkan dengannot barstate.ishistory. Beli saatbalancenilai melebihistocksOperasi penjualan dilakukan setelah melakukan laporan perdagangan, maka transaksi yang dilakukan adalah transaksi penjualan.balancedanstocksvariabel diperbarui dan kemudian menunggu pemicu saldo berikutnya.

Informasi di atas dari strategi backtest berisi harga spesies pada saat awal strategi backtest, harga adalah 1458, jadi saya mengatur parameterbalanceuntuk: 4374 (1458*3) sengaja, mengatur parameterstocks3. Biarkan aset mulai seimbang.

Strategi Super Trend dengan Pelacakan Stop Loss dan Take Profit

Dalam kursus sebelumnya, kita telah belajar tentangstrategy.exitposisi keluar fungsi, yang kita tidak memiliki contoh untuk menjelaskan pelacakan berhenti dan mengambil keuntungan fungsi. dalam contoh desain strategi ini kita akan menggunakanstrategy.exitfungsi untuk mengoptimalkan strategi super tren.

Pertama-tama mari kita lihat parameter stop-loss dan take-profit pelacakan daristrategy.exitFungsi:

  1. Parametertrail_price: Posisi yang memicu tindakan logis menempatkan urutan stop-loss tracking dan stop-loss close (di posisi yang ditentukan oleh harga).
  2. Parametertrail_offset: Jarak dari harga tertinggi (saat pergi panjang) atau terendah (saat pergi pendek) dari posisi tertutup yang ditempatkan setelah pelaksanaan aksi stop-loss dan take-profit pelacakan.
  3. Parametertrail_pointsSeperti:trail_priceparameter, kecuali bahwa ia mengambil poin keuntungan sebagai posisi yang ditentukan.

Apakah itu tidak mudah dimengerti? Tidak masalah! Mari kita pergi melalui skenario backtesting strategi untuk memahami, yang sebenarnya cukup sederhana.

/*backtest
start: 2022-09-23 00:00:00
end: 2022-09-23 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

strategy("test", overlay = true)

varip a = na
varip highPrice = na
varip isTrade = false 
varip offset = 30

if not barstate.ishistory and not isTrade
    strategy.entry("test 1", strategy.long, 1)
    strategy.exit("exit 1", "test 1", 1, trail_price=close+offset, trail_offset=offset)
    a := close + offset
    runtime.log("the price per point is:", syminfo.mintick, ", current close:", close)
    isTrade := true 

if close > a and not barstate.ishistory
    highPrice := na(highPrice) ? close : highPrice
    highPrice := close > highPrice ? close : highPrice

plot(a, "trail_price trigger line")    
plot(strategy.position_size>0 ? highPrice : na, "current highest price")
plot(strategy.position_size>0 ? highPrice-syminfo.mintick*offset : na, "moving stop trigger line")

img

img

img

Langsung masuk panjang ketika strategi mulai untuk melaksanakan, dan kemudian segera menempatkanstrategy.exitorder exit (itu menentukan pelacakan parameter stop-loss dan take-profit), ketika harga perubahan pasar naik di atas garis pemicu trail_price, implementasi logika stop-loss dan take-profit trailing, stop-loss dan take-profit line (biru) mulai mengikuti penyesuaian dinamis harga tertinggi, posisi garis biru adalah stop-loss dan take-profit trigger untuk menutup posisi, dan akhirnya ketika harga pasar turun di bawah garis biru yang memicu penutupan posisi. Dikombinasikan dengan garis yang ditarik pada grafik, sangat mudah dipahami.

Kemudian kita menggunakan fitur ini untuk mengoptimalkan strategi super tren, kita hanya menetapkanstrategy.exitPerintah exit plan untuk perintah entry strategi untuk menambahkan fitur stop-loss dan take-profit ini.

if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
    trail_price := strategy.position_size > 0 ? close + offset : close - offset
    strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
    runtime.log("the price per point is:", syminfo.mintick, ", current close:", close, ",trail_price:", trail_price)
    state := 2 
    tradeBarIndex := bar_index

Kode strategi lengkap:

/*backtest
start: 2022-05-01 00:00:00
end: 2022-09-27 00:00:00
period: 1d
basePeriod: 5m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

varip trail_price = na
varip offset = input(50, "offset")
varip tradeBarIndex = 0
// 0 : idle , 1 current_open , 2 current_close
varip state = 0  

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

if strategy.position_size == 0 
    trail_price := na 
    state := 0

[superTrendPrice, dir] = ta.supertrend(input(2, "atr coefficient"), input(20, "atr period"))

if ((dir[1] < 0 and dir[2] > 0) or (superTrendPrice[1] > superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
    strategy.entry("open", strategy.long, 1)
    state := 1
else if ((dir[1] > 0 and dir[2] < 0) or (superTrendPrice[1] < superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
    strategy.entry("open", strategy.short, 1)
    state := 1


// Reverse signal, close all positions
if strategy.position_size > 0 and dir[2] < 0 and dir[1] > 0
    strategy.cancel_all()
    strategy.close_all()
    runtime.log("trend reversal, long positions all closed")
else if strategy.position_size < 0 and dir[2] > 0 and dir[1] < 0
    strategy.cancel_all()
    strategy.close_all()
    runtime.log("trend reversal, short positions all closed")


if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
    trail_price := strategy.position_size > 0 ? close + offset : close - offset
    strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
    runtime.log("the price per point is:", syminfo.mintick, ", current close:", close, ", trail_price:", trail_price)
    state := 2 
    tradeBarIndex := bar_index


plot(superTrendPrice, "superTrendPrice", color=dir>0 ? color.red : color.green, overlay=true)

Lebih banyak