Sumber dimuat naik... memuat...

Tutorial pengenalan Bahasa PINE FMZ Quant

Penulis:FMZ~Lydia, Dicipta: 2022-09-23 15:23:34, Dikemas kini: 2024-02-27 16:47:41

.3, had=3)

jika tidak barstate.ishistory dan tutup < terbuka strategi.batalkan ((long1) strategi.batalkan ((long2) strategi.batalkan ((long3) isStop:= benar


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

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 tetapan parameterstrategy.orderfungsi hampir sama denganstrategy.entryPerbezaannya ialahstrategy.orderfungsi tidak dipengaruhi olehpyramidingtetapan parameterstrategyfungsi, dan tidak ada had jumlah pesanan.

Parameter:

  • id: Ia boleh difahami sebagai memberi nama kepada kedudukan dagangan untuk rujukan. ID boleh dirujuk untuk membatalkan, mengubahsuai pesanan dan menutup kedudukan.
  • direction: Jika arah pesanan adalah panjang (beli), masukkan pembolehubah terbina dalamstrategy.long, dan jika anda mahu pergi pendek (menjual), lulus dalam pembolehubahstrategy.short.
  • qty: Tentukan jumlah pesanan yang akan diletakkan, jika parameter ini tidak diteruskan, jumlah pesanan lalai akan digunakan.
  • when: Keadaan pelaksanaan, anda boleh menentukan parameter ini untuk mengawal sama ada operasi pesanan semasa ini dicetuskan atau tidak.
  • limit: Tentukan harga had pesanan.
  • stop: Harga Stop Loss.

Kami akan menggunakan ciri yangstrategy.ordertidak mempunyai had pada jumlah pesanan yang diletakkan, digabungkan denganstrategy.exitfungsi keluar bersyarat untuk membina skrip yang serupa dengan perdagangan grid. contohnya sangat mudah dan untuk tujuan pembelajaran sahaja:

/*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 adalah untuk tujuan pengajaran sahaja, untuk membimbing idea reka bentuk strategi, dan bukan untuk panduan atau nasihat perdagangan.

Strategi Penunjuk Super Trend

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

Ia sangat mudah untuk menulis strategi trend dengan menggunakan bahasa Pine, dan di sini kita akan merancang strategi trend berikut yang mudah dengan penunjuk trend super.

Pertama, kod strategi bermula dengan beberapa tetapan mudah dengan menggunakanstrategyfungsi:strategy("supertrend", overlay=true)``, which just sets a strategy title "supertrend". Thepenyambunganparameter is set tobetul, 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 kita belajar dalam kursus sebelumnya

[supertrend, arah] = ta.supertrend(input(5, factor),input.int(10, trPeriod))

Peraturaninputpanggilan fungsi digunakan sebagai parameter terus kepadata.supertrendfungsi penunjuk untuk mengira penunjuk supertrend. Antara mereka:

Secara lalai, fungsi menetapkan dua kawalan parameter pada skrin strategi bahasa Pine, seperti yang ditunjukkan di bawah:

img

Seperti yang kita lihat, nilai lalai pada kawalan adalah parameter pertamainputfungsi daninputsiri fungsi (di sini adalahinput.intDengan kedua-dua fungsi ini, kita kemudian boleh menetapkan parameterta.supertrendfungsi pada skrin strategi.supertrendfungsi mengira data hargasupertrenddan data arahdirectionKemudian kita gunakanplotfungsi untuk melukis carta, ambil perhatian bahawa apabila melukis carta, ia adalah berdasarkan arah penunjuk supertrend, hanya arah semasa yang digambar.directionadalah -1, trend pasaran semasa adalah menaik, apabiladirectionadalah 1, trend pasaran semasa adalah ke bawah. jadi kita boleh melihat bahawaplotfungsi menarik carta apabila penghakimandirectionadalah lebih besar daripada atau kurang daripada 0.

Seterusnyaif... else ifLogik adalah penghakiman isyarat perdagangan.direction < 0Jika ini benar, ia bermakna bahawa pasaran semasa berada dalam peringkat menaik.supertrenddalam penunjuk super trend adalah lebih tinggi daripada harga penunjuk super trend pada dua BAR sebelumnya (iaitu,supertrend[2], remember that the historical operator refers to the historical data of a variable), ia akan digunakan sebagai isyarat kemasukan untuk pergi lama. ingat itu? jika terdapat kedudukan semasa, memanggil fungsi pesanan terbalik akan menutup kedudukan sebelumnya terlebih dahulu, dan kemudian membuka kedudukan mengikut arah perdagangan semasa.supertrend > supertrend[2]tidak dipenuhi, selagistrategy.position_size < 0memegang kedudukan pendek, ia akan mencetuskanstrategy.close_all()pelaksanaan fungsi untuk menutup semua kedudukan.

direction > 0adalah sama apabila ia adalah dalam peringkat trend ke bawah. jika terdapat kedudukan panjang, semua kedudukan akan ditutup, dan kemudian apabila keadaansupertrend < supertrend[3]adalah dipenuhi, isyarat pendek akan dicetuskan.[3]untuk merujuk data harga penunjuk super trend pada BAR ketiga nombor sebelumnya? mungkin niat penulis strategi. selepas semua, risiko pendek di beberapa pasaran, seperti pasaran perdagangan kontrak, sedikit lebih besar daripada risiko panjang.

Untukta.supertrendTanda, ada sesiapa yang berminat dengan bagaimana untuk menilai sama ada trend semasa adalah ke atas atau ke bawah?

Malah, penunjuk ini juga boleh dilaksanakan dalam bentuk fungsi tersuai 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 tersuai ini adalah algoritma yang sama dengan fungsi terbina dalamta.supertrend, dan sudah tentu data penunjuk yang dikira juga sama. Seperti yang kita lihat dari algoritma fungsi tersuai ini, Pines terbina dalam indikator super trend dikira dengan menggunakanhl2pembolehubah terbina dalam (harga tertinggi dan terendah ditambahkan bersama-sama dan kemudian dibahagikan dengan 2, iaitu purata harga tertinggi dan terendah), dan kemudian penunjuk ATR (volatiliti) dikira untuk tempoh tertentu berdasarkan parameter atrPeriod. Kemudian trek atas dan bawah dibina dengan menggunakan hl2 dan ATR.

Kemas kinilowerBanddanupperBandmengikut ungkapan ternar dalam kod.

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

lowerBand: lowerBand, digunakan untuk menentukan sama ada trend menaik telah berubah. upperBand: upperBand, digunakan untuk menentukan sama ada trend menurun telah berubah. lowerBand dan upperBand sentiasa dikira, hanya arah trend semasa ditentukan pada akhir fungsi tersuai ini.

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

Di sini ia dinilai bahawa jika nilai harga BAR terakhir pada super trend adalahprevUpperBand, iaitu band atas, ia bermakna bahawa arus adalah trend ke bawah.closemelebihiupperBandharga pecah, trend dianggap telah bergeser pada titik ini dan ditukar kepada trend menaik.directionJika tidak, ia masih ditetapkan kepada 1 (ke arah menurun). Itulah sebabnya anda melihat dalam strategi super trendif direction < 0apabila keadaan isyarat dicetuskan untuk pergi lama.direction > 0, keadaan isyarat dicetuskan 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 dinamik

/*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 teruskan dengan beberapa contoh reka bentuk strategi bahasa Pine, kali ini kita akan belajar strategi keseimbangan dinamik.BaseCurrencydan jumlahQuoteCurrency. Tidak kira harga relatif aset mana yang meningkat, nilai yang dipegang dalam akaun meningkat dan aset dijual. Jika harga relatif aset menurun, nilai yang dipegang dalam akaun menurun dan aset dibeli. Ini dikenali sebagai strategi penyeimbangan dinamik. Sebenarnya, strategi keseimbangan dinamik adalah sejenis strategi grid yang berfungsi dengan baik di pasaran berayun. Tetapi di pasaran trend, ia akan terus kehilangan wang, kita perlu menunggu harga kembali untuk mengurangkan kerugian secara perlahan untuk keuntungan, tetapi kelebihan adalah bahawa strategi penyeimbangan dinamik selalu dapat menangkap trend berayun pasaran.

Kelemahannya, seperti yang ditunjukkan pada carta backtest strategi ini, adalah bahawa strategi ini mempunyai kerugian terapung yang besar semasa peringkat trend harga umum naik (atau turun).

Mari kita lihat reka bentuk kod strategi:

Kami menggunakan reka bentuk yang dipermudah yang mensimulasikanbalance(iaitu, bilangan aset QuoteCurrency) danstocks(iaitu, bilangan aset BaseCurrency) maklumat baki dalam strategi. kita tidak membaca jumlah sebenar aset dalam akaun, kita hanya menggunakan jumlah yang disimulasikan untuk mengira pembelian yang sesuai dan menjual.maxDiffValuePada harga semasa, hanya apabila penyimpangan antaraBaseCurrencydanQuoteCurrencymelebihimaxDiffValueAdakah proses penyeimbangan berlaku, menjual aset dengan harga yang tinggi dan membeli aset dengan harga yang rendah untuk menyeimbangkan semula aset.

Pembebasan isyarat perdagangan strategi mesti berada dalam peringkat BAR masa nyata, jadi jika pertimbangan dalam syarat perdagangan strategi ditetapkan dengannot barstate.ishistory. Beli apabilabalancenilai melebihistocksOperasi jualan dilakukan. Selepas pelaksanaan laporan perdagangan,balancedanstockspembolehubah dikemas kini dan kemudian menunggu pemicu baki seterusnya.

Maklumat di atas strategi backtest mengandungi harga spesies pada masa permulaan strategi backtest, harga adalah 1458, jadi saya menetapkan parameterbalanceuntuk: 4374 (1458*3) dengan sengaja, menetapkan parameterstocks3. Biarkan aset bermula dalam keseimbangan.

Strategi Super Trend dengan Pengesanan Stop Loss dan Ambil Keuntungan

Dalam kursus sebelumnya, kita telah belajar tentangstrategy.exitkedudukan keluar fungsi, yang kita tidak mempunyai contoh untuk menerangkan pemantauan berhenti dan mengambil keuntungan fungsi. dalam contoh reka bentuk strategi ini, kita akan menggunakanstrategy.exitfungsi untuk mengoptimumkan strategi super trend.

Pertama-tama mari kita lihat parameter pemantauan stop-loss dan mengambil keuntungan daristrategy.exitfungsi:

  1. Parametertrail_price: Posisi yang mencetuskan tindakan logik untuk meletakkan perintah stop-loss dan close stop-loss (pada kedudukan yang ditentukan oleh harga).
  2. Parametertrail_offset: Jarak dari harga tertinggi (apabila pergi panjang) atau terendah (apabila pergi pendek) kedudukan tertutup yang diletakkan selepas pelaksanaan tindakan stop-loss dan mengambil keuntungan.
  3. Parametertrail_pointsSeperti:trail_priceparameter, kecuali bahawa ia mengambil mata keuntungan sebagai kedudukan yang ditentukan.

Tidak mudah untuk difahami? Tidak penting! Mari kita melalui senario ujian strategi untuk difahami, yang sebenarnya agak mudah.

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

Memasuki panjang segera apabila strategi mula untuk melaksanakan, dan kemudian segera meletakkanstrategy.exitperintah keluar (ia menentukan parameter pemantauan stop-loss dan mengambil keuntungan), apabila harga perubahan pasaran meningkat di atas garis pemicu trail_price, pelaksanaan logik stop-loss dan mengambil keuntungan, stop-loss dan mengambil keuntungan (biru) mula mengikuti penyesuaian dinamik harga tertinggi, kedudukan garis biru adalah pemicu stop-loss dan mengambil keuntungan untuk menutup kedudukan, dan akhirnya apabila harga pasaran jatuh di bawah garis biru yang mencetuskan penutupan kedudukan.

Kemudian kita menggunakan ciri ini untuk mengoptimumkan strategi super trend, kita hanya menetapkanstrategy.exitPerintah pelan keluar kepada perintah kemasukan strategi untuk menambah ciri stop-loss dan mengambil keuntungan yang terakhir 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

Kod 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 lanjut