.3, batas = 3)
jika tidak barstate.ishistory dan tutup < terbuka
Strategi. Batalkan.
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 pengaturan parameter daristrategy.order
fungsi hampir identik denganstrategy.entry
Perbedaannya adalah bahwastrategy.order
fungsi tidak terpengaruh olehpyramiding
pengaturan parameter daristrategy
fungsi, 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.stop
Harga stop loss.Kami akan menggunakan fitur yangstrategy.order
tidak memiliki batas pada jumlah pesanan yang ditempatkan, dikombinasikan denganstrategy.exit
fungsi 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 dalam tutorial ini hanya untuk tujuan instruksional, untuk membimbing ide desain strategi, dan bukan untuk panduan atau saran 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()
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 menggunakanstrategy
Fungsi:strategy("supertrend", overlay=true)``, which just sets a strategy title "supertrend". The
penyambunganparameter is set to
benar, 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 yang kita pelajari di kursus sebelumnya
[supertrend, arah] = ta.supertrend(input(5,
faktor input.int(10,), trPeriode ))
Peraturaninput
panggilan fungsi digunakan sebagai parameter langsung keta.supertrend
fungsi indikator untuk menghitung indikator supertrend.
Secara default, fungsi ini menetapkan dua kontrol parameter pada layar strategi bahasa Pine, seperti yang ditunjukkan di bawah ini:
Seperti yang kita lihat, nilai default pada kontrol adalah parameter pertama dariinput
Fungsi daninput
serangkaian fungsi (di sini adalahinput.int
), yang juga dijelaskan dalam bagian sebelumnya. Dengan dua fungsi ini, kita kemudian dapat mengatur parameter darita.supertrend
fungsi pada layar strategi.supertrend
fungsi menghitung data hargasupertrend
dan data arahdirection
Lalu kita gunakanplot
fungsi untuk menggambar grafik, perhatikan bahwa ketika menggambar grafik, itu didasarkan pada arah indikator supertrend, hanya arah saat ini digambar.direction
adalah -1, tren pasar saat ini naik, ketikadirection
Jadi kita bisa melihat bahwaplot
Fungsi menarik grafik ketika penghakimandirection
adalah lebih besar atau kurang dari 0.
Yang berikutnyaif... else if
Logika adalah penilaian sinyal perdagangan.direction < 0
Saat ini, jika data hargasupertrend
dalam 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 < 0
memegang posisi pendek, itu akan memicustrategy.close_all()
Eksekusi fungsi untuk menutup semua posisi.
direction > 0
Jika 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.supertrend
Indikator, 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 Pinehl2
variabel 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.
PembaruanlowerBand
danupperBand
Menurut 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.close
melebihiupperBand
harga pecah, tren dianggap telah bergeser pada titik ini dan dikonversi ke uptrend.direction
Jika tidak, itu tetap ditetapkan menjadi 1 (trend menurun). Itulah mengapa Anda melihat dalam strategi super trendif direction < 0
ketika 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.
/*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 lanjutkan dengan beberapa contoh desain strategi bahasa Pine, kali ini kita akan belajar strategi keseimbangan dinamis.BaseCurrency
dan 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 antaraBaseCurrency
danQuoteCurrency
melebihimaxDiffValue
Apakah 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 saatbalance
nilai melebihistocks
Operasi penjualan dilakukan setelah melakukan laporan perdagangan, maka transaksi yang dilakukan adalah transaksi penjualan.balance
danstocks
variabel 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 parameterbalance
untuk: 4374 (1458*3) sengaja, mengatur parameterstocks
3. Biarkan aset mulai seimbang.
Dalam kursus sebelumnya, kita telah belajar tentangstrategy.exit
posisi keluar fungsi, yang kita tidak memiliki contoh untuk menjelaskan pelacakan berhenti dan mengambil keuntungan fungsi. dalam contoh desain strategi ini kita akan menggunakanstrategy.exit
fungsi untuk mengoptimalkan strategi super tren.
Pertama-tama mari kita lihat parameter stop-loss dan take-profit pelacakan daristrategy.exit
Fungsi:
trail_price
: Posisi yang memicu tindakan logis menempatkan urutan stop-loss tracking dan stop-loss close (di posisi yang ditentukan oleh harga).trail_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.trail_points
Seperti:trail_price
parameter, 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")
Langsung masuk panjang ketika strategi mulai untuk melaksanakan, dan kemudian segera menempatkanstrategy.exit
order 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.exit
Perintah 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)