
Strategi penembusan harga saluran yang disesuaikan secara otomatis adalah strategi penembusan garis panjang yang didasarkan pada rata-rata bergerak yang disesuaikan secara otomatis (AMA) dan ruang saluran yang disesuaikan untuk menilai sinyal jual beli. Strategi ini menggunakan AMA untuk menghitung arah tren harga saat ini dan menggabungkan ruang saluran yang disesuaikan secara dinamis untuk menemukan sinyal penembusan harga, sehingga dapat dibeli dan dijual pada waktu yang tepat.
Indikator inti dari strategi ini adalah rata-rata rata-rata bergerak ((AMA), yang digunakan untuk menangkap tren harga. Rumus perhitungan AMA adalah:
AMA(t) = α(t-1) * P(t) + [1 - α(t-1)] * AMA(t-1)
Di antaranya, P (t) adalah harga saat ini, dan α (t) adalah konstan rata, yang nilainya berkisar antara 0 dan 1. α (t) disesuaikan secara dinamis oleh aturan tertentu untuk mengontrol sensitivitas AMA terhadap perubahan harga. Secara khusus, α (t) adalah proporsional terhadap AMA dan margin defisit harga SNRT, rumus SNRT adalah sebagai berikut:
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
Dengan demikian, ketika harga berfluktuasi besar, α (t) akan meningkat, membuat AMA lebih sensitif mengikuti harga; ketika harga berfluktuasi kecil, α (t) akan berkurang, membuat AMA memiliki smoothness yang lebih tinggi.
Berdasarkan AMA, strategi kemudian membangun jangkauan saluran adaptif untuk mendeteksi sinyal terobosan harga. Jalur atas dan bawah dari jangkauan saluran adalah:
Jalur atas: H (t) = (1 + β)*H(t-1)) * AMA(t)
Jalur bawah: L (t) = (1 - β)*L(t-1)) * AMA(t)
di mana β adalah parameter yang dapat disesuaikan untuk mengontrol lebar saluran. Akhirnya, strategi menghasilkan sinyal perdagangan dengan melihat apakah harga akan menembus tren naik atau turun:
Jika harga naik, lakukan lebih banyak.
Jika harga turun ke bawah, maka Anda harus mengambil posisi kosong.
Jika tidak, tidak ada.
Strategi ini memiliki keuntungan sebagai berikut:
Menggunakan AMA, bukan rata-rata bergerak biasa, dapat menangkap tren harga dengan lebih fleksibel, terutama untuk pasar yang lebih berfluktuasi.
Adaptive channel scope dapat disesuaikan secara dinamis, memperluas lebar channel saat terjadi ketidakpastian, dan mempersempit channel saat ada tren yang jelas.
Dengan menggunakan sinyal perdagangan terobosan harga, dapat ditangkap tepat waktu pada tahap awal tren, dengan tingkat kemenangan yang lebih tinggi.
Logika strategi sederhana dan jelas, mudah dipahami dan diterapkan, cocok untuk perdagangan kuantitatif.
Strategi ini juga memiliki risiko sebagai berikut:
Setting parameter AMA yang tidak tepat dapat menyebabkan kesalahan tren harga atau menghasilkan sinyal palsu.
Parameter saluran adaptif seperti β perlu diatur dengan hati-hati, jika tidak, akan terjadi terlalu banyak transaksi atau kehilangan tren.
Sinyal-sinyal penembusan harga yang mudah dibohongi oleh penembusan palsu harus disaring dengan lebih banyak indikator.
Strategi itu sendiri tidak mempertimbangkan pengelolaan dana dan mekanisme penghentian kerugian, dan ada risiko kerugian.
Strategi ini dapat dioptimalkan dengan:
Mengoptimalkan metode penghitungan α-value AMA agar lebih sensitif terhadap perubahan harga.
Menambahkan konfirmasi lebih lanjut setelah terobosan saluran, untuk menghindari terobosan palsu menghasilkan sinyal yang salah.
Filter digabungkan dengan volume transaksi atau indikator volatilitas untuk memastikan efektivitas terobosan.
Menambahkan mekanisme tracking stop loss untuk mengunci keuntungan dan mengendalikan risiko.
Mengoptimalkan pengelolaan dana, menentukan manajemen posisi yang wajar untuk berbagai aset.
Adaptive channel breakout strategi secara keseluruhan adalah strategi trend tracking breakout yang sederhana dan praktis. Ini adalah strategi yang fleksibel untuk mengikuti tren harga dengan mengadaptasi rata-rata bergerak, dan didukung dengan sinyal breakout yang ditemukan melalui channel adaptif. Strategi ini memiliki beberapa keuntungan, tetapi ada juga risiko yang mungkin.
/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857
strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)
testPeriod() => true
price = input(title='Price Source:', type=input.source, defval=close)
ama = price
hb = price
lb = price
// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.
normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)
// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)
// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)
offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)
// pi/2
pi2 = 1.5707963267948966
// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
fast = _period/2
lambda = _period/fast
alpha = lambda * (_period - 1)/(_period - lambda)
average1 = wma(_src,_period)
average2 = wma(average1,fast)
nwma = (1+alpha)*average1 - alpha*average2
ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])
deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])
beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama
snr := if price > hb
((price - ama[1])/ama[1])/beta_lb
else
if price < lb
-((price - ama[1])/ama[1])/beta_hb
else
0
normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)
plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)
// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black
// Buy Condition
if(price > hb)
bc := true
d := color.green
// Sell Condition
if(price < lb)
sc := true
d := color.red
if(testPeriod())
strategy.entry("Long", strategy.long, when = bc)
strategy.entry("Short", strategy.short, when = sc)
alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')
plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)