Adaptive Moving Average Channel Breakout Strategi

Penulis:ChaoZhang, Tarikh: 2023-11-02 15:05:56
Tag:

img

Ringkasan

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.

Prinsip Strategi

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.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. AMA lebih fleksibel dalam menangkap trend harga berbanding purata bergerak mudah, terutamanya di pasaran yang tidak menentu.

  2. Saluran adaptif boleh menyesuaikan lebarnya secara dinamik, berkembang apabila trend tidak jelas dan menyempitkan apabila trend muncul.

  3. Isyarat harga boleh menangkap trend yang bermula dengan kadar kemenangan yang lebih tinggi.

  4. Logiknya mudah dan jelas, mudah difahami dan automatik untuk perdagangan kuantitatif.

Analisis Risiko

Risiko strategi ini termasuk:

  1. Parameter AMA yang tidak betul boleh terlepas trend harga atau menghasilkan isyarat palsu.

  2. Parameter saluran adaptif seperti β perlu disesuaikan dengan teliti, jika tidak, terlalu banyak whipsaw atau trend yang terlepas mungkin berlaku.

  3. Penembusan harga mudah terdedah kepada penembusan palsu, memerlukan lebih banyak penapis.

  4. Strategi ini tidak merangkumi pengurusan risiko atau mekanisme hentian kerugian.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dengan:

  1. Memperbaiki pengiraan α untuk menjadikan AMA lebih responsif.

  2. Menambah pengesahan lanjut selepas pelepasan awal untuk mengelakkan isyarat palsu.

  3. Menggunakan penapis seperti jumlah atau turun naik untuk mengesahkan kesahihan pecah.

  4. Menggabungkan stop loss untuk mengunci keuntungan dan mengawal risiko.

  5. Mengoptimumkan saiz kedudukan untuk kelas aset yang berbeza.

Kesimpulan

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)

Lebih lanjut