Strategi ini diperdagangkan dengan menilai keadaan harga terhadap penembusan saluran Brin. Strategi ini adalah salah satu jenis strategi penembusan saluran, yang bertujuan untuk menangkap peluang perdagangan trend yang terbentuk oleh penembusan saluran harga.
Prinsip-prinsip strategi:
Untuk mengira laluan tali pinggang Brin, garisan tengah adalah garisan purata bergerak sederhana n hari, dan garisan atas dan bawah adalah garisan tengah dengan perbezaan standard beberapa kali ganda.
Apabila harga dari atas ke bawah menembusi downtrend, masuklah ke dalam kedudukan pendek. Apabila harga dari bawah ke atas menembusi uptrend, masuklah ke dalam kedudukan ganda.
Tetapkan garis hentian kerugian di luar garis lintasan ke arah yang bertentangan, untuk kawalan risiko.
Sesuaikan jalur lebar saluran mengikut penarikan maksimum, optimumkan parameter.
Ini adalah satu-satunya cara untuk mengelakkan penembusan palsu.
Kelebihan strategi ini:
Penembusan saluran dapat menentukan titik-titik perubahan.
Pengoptimuman parameter Brin adalah mudah dan praktikal, dan tidak mudah untuk dioptimumkan.
Dengan jumlah transaksi, penapisan palsu boleh dilakukan untuk meningkatkan kualiti.
Risiko strategi ini:
Brin mempunyai masalah ketinggalan yang lebih ketara dan mungkin terlepas titik kemasukan terbaik.
Pembalasan yang mudah berlaku selepas penembusan, perlu menetapkan hentian yang munasabah.
Dalam usaha untuk mengoptimumkan perdagangan frekuensi rendah, peluang mungkin terlepas.
Ringkasnya, strategi ini berdagang dengan menilai keadaan penembusan Brin Belt, merupakan strategi penembusan saluran yang tipikal. Peraturan relatif mudah membantu pengoptimuman parameter, tetapi masalah tetapan lag dan hentikan kerugian masih perlu diwaspadai, untuk mendapatkan keuntungan yang stabil dalam jangka panjang.
/*backtest
start: 2023-08-12 00:00:00
end: 2023-09-11 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
// strategy("ChannelBreakOutStrategyV2.1", commission_type = "percent", commission_value = 0.1, calc_on_order_fills = true, overlay=true)
length = input(title="Length", minval=1, maxval=1000, defval=40)
maxR = input(title = "R", minval = 1.0, maxval = 10, defval = 3, step = 0.1)
adoptR = input(title = "Auto Adjust R", defval = false)
stepR = input(title = "Step in R", minval = 0.01, maxval = 0.1, step = 0.01, defval = 0.02)
baseYear = input(title = "Base Year", minval = 2000, maxval = 2016, defval = 2000)
volumeTh = input(title = "Volume Threadhold", minval = 100.0, maxval = 200, defval = 120, step = 5)
hasLong = input(title = "Include Long", defval = true)
hasShort = input(title = "Include Short", defval = true)
usePositionSizing = input(title = "Enable Position Sizing", defval = true)
getTrailStop(val, current) =>
s = val > 1.6 ? 0.8 : val >= 1.4 ? 0.85 : val >= 1.3 ? 0.9 : 0.93
s * current
upBound = highest(high, length)
downBound = lowest(low, length)
hasVol = (volume / sma(volume, length) * 100 >= volumeTh) ? 1 : 0
hasPos = strategy.position_size != 0 ? 1 : 0
trailstop = atr(length) * 3
ptvalue = syminfo.pointvalue
equity = strategy.openprofit > 0 ? strategy.equity - strategy.openprofit : strategy.equity
curR = adoptR == false ? maxR : n == 0 ? maxR : hasPos == 1 ? curR[1] : (rising(equity,1) > 0? curR[1] + stepR : falling(equity, 1) > 0 ? curR[1] <= 2.0 ? 2.0 : curR[1] - stepR : curR[1])
contracts = usePositionSizing == false ? 20 : floor(equity / 100 * curR / (trailstop * ptvalue))
realbuystop = close - trailstop
realsellstop = close + trailstop
isPFst = (hasPos[1] == 0 and hasPos == 1) ? 1 : 0
isPOn = (hasPos[1] + hasPos == 2) ? 1 : 0
largestR = hasPos == 0 or isPFst == 1 ? -1 : nz(largestR[1]) < close ? close : largestR[1]
pctRise = largestR / strategy.position_avg_price
rbs = strategy.position_size <= 0 ? realbuystop : isPFst ? strategy.position_avg_price - trailstop : pctRise >= 1.3 ? getTrailStop(pctRise, largestR) : (isPOn and realbuystop > rbs[1] and close > close[1]) ? realbuystop : rbs[1]
rss = strategy.position_size >= 0 ? realsellstop : isPFst ? strategy.position_avg_price + trailstop : (isPOn and realsellstop < rss[1] and close < close[1]) ? realsellstop : rss[1]
isStart = na(rbs) or na(rss) ? 0 : 1
buyARun = close - open > 0 ? 0 : open - close
sellARun = open - close > 0 ? 0 : close - open
if (strategy.position_size > 0 and buyARun >= trailstop / 3 * 2 and pctRise < 1.3)
strategy.close("buy")
strategy.cancel("exit")
if (strategy.position_size < 0 and sellARun >= trailstop / 3 * 2)
strategy.close("sell")
strategy.cancel("exit")
strategy.cancel("buy")
strategy.cancel("sell")
conLong = hasLong == true and hasPos == 0 and year > baseYear and (isStart + hasVol) == 2
strategy.order("buy", strategy.long, qty = contracts, stop=upBound + syminfo.mintick * 5, comment="BUY", when = conLong)
if (rbs > high)
strategy.close("buy")
strategy.exit("exit", "buy", stop = rbs, when = hasPos == 1 and isStart == 1)
conShort = hasShort == true and hasPos == 0 and year > baseYear and (isStart + hasVol) == 2
strategy.order("sell", strategy.short, qty = contracts, stop=downBound - syminfo.mintick * 5, comment="SELL", when = conShort)
if (rss < low)
strategy.close("sell")
strategy.exit("exit", "sell", stop = rss, when = hasPos == 1 and isStart == 1)
plot(series = rbs, color=blue)
plot(series = realbuystop, color=green)
plot(series = rss, color=red)
plot(series = realsellstop, color=yellow)