.3, had=3)
jika tidak barstate.ishistory dan tutup < terbuka
strategi.batalkan ((
---------------------------
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
strategy.order
Fungsi dan tetapan parameterstrategy.order
fungsi hampir sama denganstrategy.entry
Perbezaannya ialahstrategy.order
fungsi tidak dipengaruhi olehpyramiding
tetapan parameterstrategy
fungsi, 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.order
tidak mempunyai had pada jumlah pesanan yang diletakkan, digabungkan denganstrategy.exit
fungsi 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 dalam tutorial ini adalah untuk tujuan pengajaran sahaja, untuk membimbing idea reka bentuk strategi, dan bukan untuk panduan atau nasihat perdagangan.
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 menggunakanstrategy
fungsi:strategy("supertrend", overlay=true)``, which just sets a strategy title "supertrend". The
penyambunganparameter is set to
betul, 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 the
input ` ` fungsi kita belajar dalam kursus sebelumnya
[supertrend, arah] = ta.supertrend(input(5,
factor input.int(10,), trPeriod ))
Peraturaninput
panggilan fungsi digunakan sebagai parameter terus kepadata.supertrend
fungsi penunjuk untuk mengira penunjuk supertrend. Antara mereka:
Secara lalai, fungsi menetapkan dua kawalan parameter pada skrin strategi bahasa Pine, seperti yang ditunjukkan di bawah:
Seperti yang kita lihat, nilai lalai pada kawalan adalah parameter pertamainput
fungsi daninput
siri fungsi (di sini adalahinput.int
Dengan kedua-dua fungsi ini, kita kemudian boleh menetapkan parameterta.supertrend
fungsi pada skrin strategi.supertrend
fungsi mengira data hargasupertrend
dan data arahdirection
Kemudian kita gunakanplot
fungsi untuk melukis carta, ambil perhatian bahawa apabila melukis carta, ia adalah berdasarkan arah penunjuk supertrend, hanya arah semasa yang digambar.direction
adalah -1, trend pasaran semasa adalah menaik, apabiladirection
adalah 1, trend pasaran semasa adalah ke bawah. jadi kita boleh melihat bahawaplot
fungsi menarik carta apabila penghakimandirection
adalah lebih besar daripada atau kurang daripada 0.
Seterusnyaif... else if
Logik adalah penghakiman isyarat perdagangan.direction < 0
Jika ini benar, ia bermakna bahawa pasaran semasa berada dalam peringkat menaik.supertrend
dalam 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 < 0
memegang kedudukan pendek, ia akan mencetuskanstrategy.close_all()
pelaksanaan fungsi untuk menutup semua kedudukan.
direction > 0
adalah 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.supertrend
Tanda, 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, Pinehl2
pembolehubah 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 kinilowerBand
danupperBand
mengikut 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.close
melebihiupperBand
harga pecah, trend dianggap telah bergeser pada titik ini dan ditukar kepada trend menaik.direction
Jika tidak, ia masih ditetapkan kepada 1 (ke arah menurun). Itulah sebabnya anda melihat dalam strategi super trendif direction < 0
apabila 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.
/*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)
Mari kita teruskan dengan beberapa contoh reka bentuk strategi bahasa Pine, kali ini kita akan belajar strategi keseimbangan dinamik.BaseCurrency
dan 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.maxDiffValue
Pada harga semasa, hanya apabila penyimpangan antaraBaseCurrency
danQuoteCurrency
melebihimaxDiffValue
Adakah 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 apabilabalance
nilai melebihistocks
Operasi jualan dilakukan. Selepas pelaksanaan laporan perdagangan,balance
danstocks
pembolehubah 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 parameterbalance
untuk: 4374 (1458*3) dengan sengaja, menetapkan parameterstocks
3. Biarkan aset bermula dalam keseimbangan.
Dalam kursus sebelumnya, kita telah belajar tentangstrategy.exit
kedudukan keluar fungsi, yang kita tidak mempunyai contoh untuk menerangkan pemantauan berhenti dan mengambil keuntungan fungsi. dalam contoh reka bentuk strategi ini, kita akan menggunakanstrategy.exit
fungsi untuk mengoptimumkan strategi super trend.
Pertama-tama mari kita lihat parameter pemantauan stop-loss dan mengambil keuntungan daristrategy.exit
fungsi:
trail_price
: Posisi yang mencetuskan tindakan logik untuk meletakkan perintah stop-loss dan close stop-loss (pada kedudukan yang ditentukan oleh harga).trail_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.trail_points
Seperti:trail_price
parameter, 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")
Memasuki panjang segera apabila strategi mula untuk melaksanakan, dan kemudian segera meletakkanstrategy.exit
perintah 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.exit
Perintah 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)