Adaptive Moving Average Channel Breakout Strategy adalah strategi breakout mengikut trend berdasarkan Adaptive Moving Average (AMA) dan julat saluran adaptif untuk menjana isyarat perdagangan. Ia menggunakan AMA untuk menentukan arah trend harga semasa dan tahap saluran adaptif untuk mengesan isyarat breakout harga untuk kemasukan dan keluar tepat pada masanya.
Penunjuk teras strategi ini adalah Purata Bergerak Adaptif (AMA), yang digunakan untuk menangkap trend harga.
AMA (t) = α (t-1) * P (t) + [1 - α (t-1) ] * AMA (t-1)
Di mana P (t) adalah harga semasa, dan α (t) adalah konstanta pelunturan antara 0 dan 1. α (t) diselaraskan secara dinamik mengikut peraturan tertentu untuk mengawal kepekaan AMA terhadap perubahan harga. Khususnya, α (t) adalah sebanding dengan penyimpangan SNRT antara AMA dan harga, yang dikira sebagai:
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
Oleh itu, apabila turun naik harga meningkat, α ((t) akan meningkat untuk menjadikan AMA lebih responsif; apabila turun naik berkurangan, α ((t) akan berkurangan untuk menjadikan AMA lebih lancar.
Berdasarkan AMA, strategi ini membina julat saluran adaptif untuk mengesan isyarat penembusan harga.
Atas: H ((t) = (1 + β*H ((t-1)) * AMA ((t)
Bawah: L ((t) = (1 - β*L ((t-1)) * AMA ((t)
Di mana β adalah parameter yang boleh diselaraskan yang mengawal lebar saluran.
Masuk dalam jangka panjang apabila harga memecahkan di atas paras atas.
Masuk pendek apabila harga pecah di bawah tahap yang lebih rendah.
Jika tidak, tinggal rata.
Kelebihan strategi ini termasuk:
AMA lebih fleksibel dalam menangkap trend harga berbanding purata bergerak mudah, terutamanya di pasaran yang tidak menentu.
Saluran adaptif boleh menyesuaikan lebarnya secara dinamik, berkembang apabila trend tidak jelas dan menyempitkan apabila trend muncul.
Isyarat harga boleh menangkap trend yang bermula dengan kadar kemenangan yang lebih tinggi.
Logiknya mudah dan jelas, mudah difahami dan automatik untuk perdagangan kuantitatif.
Risiko strategi ini termasuk:
Parameter AMA yang tidak betul boleh terlepas trend harga atau menghasilkan isyarat palsu.
Parameter saluran adaptif seperti β perlu disesuaikan dengan teliti, jika tidak, terlalu banyak whipsaw atau trend yang terlepas mungkin berlaku.
Penembusan harga mudah terdedah kepada penembusan palsu, memerlukan lebih banyak penapis.
Strategi ini tidak merangkumi pengurusan risiko atau mekanisme hentian kerugian.
Strategi ini boleh dioptimumkan dengan:
Memperbaiki pengiraan α untuk menjadikan AMA lebih responsif.
Menambah pengesahan lanjut selepas pelepasan awal untuk mengelakkan isyarat palsu.
Menggunakan penapis seperti jumlah atau turun naik untuk mengesahkan kesahihan pecah.
Menggabungkan stop loss untuk mengunci keuntungan dan mengawal risiko.
Mengoptimumkan saiz kedudukan untuk kelas aset yang berbeza.
Ringkasnya, Adaptive Moving Average Channel Breakout Strategy adalah strategi breakout trend yang mudah dan praktikal. Ia menggunakan AMA yang fleksibel untuk mengesan trend harga dan saluran adaptif untuk mengesan isyarat breakout. Strategi ini mempunyai beberapa kelebihan tetapi juga potensi risiko. Dengan pengoptimuman seperti penyesuaian parameter, menambah penapis, dan meningkatkan berhenti, ia boleh menjadi lebih mantap. Secara keseluruhan, ia menyediakan model asas yang kukuh untuk perdagangan kuantitatif.
/*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)