Purata Strategi Pecahan Harga Saluran Adaptif


Tarikh penciptaan: 2023-11-02 15:05:56 Akhirnya diubah suai: 2023-11-02 15:05:56
Salin: 0 Bilangan klik: 398
1
fokus pada
1219
Pengikut

Purata Strategi Pecahan Harga Saluran Adaptif

Gambaran keseluruhan[Overview]

Strategi penembusan harga saluran serasi adalah strategi penembusan garis panjang yang berdasarkan pada purata bergerak serasi ((AMA) dan ruang saluran serasi untuk membuat keputusan mengenai isyarat jual beli. Strategi ini menggunakan AMA untuk mengira arah trend harga semasa dan menggabungkan ruang saluran yang disesuaikan secara dinamik untuk mencari isyarat penembusan harga, untuk membeli dan menjual pada masa yang sesuai.

Prinsip Strategi[Strategy Principle]

Indikator teras strategi ini adalah purata bergerak beradaptasi rata-rata ((AMA), yang digunakan untuk menangkap trend harga. Formula pengiraan AMA adalah:

AMA(t) = α(t-1) * P(t) + [1 - α(t-1)] * AMA(t-1)

Di antaranya, P (t) adalah harga semasa, dan α (t) adalah senantiasa rata, yang nilainya berkisar antara 0 hingga 1. α (t) disesuaikan secara dinamik oleh peraturan tertentu untuk mengawal sensitiviti AMA terhadap perubahan harga. Khususnya, nilai α (t) berbanding lurus dengan AMA dan harga yang menyimpang.

SNRT = (P(t) - AMA(t-1)) / AMA(t-1)

Dengan cara ini, apabila turun naik harga meningkat, α ((t) akan meningkat, menjadikan AMA lebih sensitif untuk mengikuti harga; apabila turun naik harga berkurang, α ((t) akan berkurang, menjadikan AMA lebih halus.

Berasaskan pada AMA, strategi kemudian membina julat saluran yang menyesuaikan diri untuk mencari isyarat harga yang pecah. Julat saluran yang lebih tinggi dan lebih rendah adalah:

Rel atas: H ((t) = (1 + β*H(t-1)) * AMA(t)

Laluan bawah: L (t) = (1 - β)*L(t-1)) * AMA(t)

Di mana β adalah parameter yang boleh disesuaikan untuk mengawal lebar saluran. Akhirnya, strategi menghasilkan isyarat perdagangan dengan melihat sama ada harga akan menembusi atau tidak:

  • “Saya tidak tahu apa yang perlu saya lakukan, tetapi saya tidak mahu membuat keputusan yang tidak adil.

  • “Saya tidak tahu apa-apa tentang harga, saya tidak tahu apa-apa tentang harga, saya tidak tahu apa-apa tentang harga.

  • Jika tidak, ia akan kosong.

Analisis kelebihan[Advantage Analysis]

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan AMA dan bukannya purata bergerak biasa, boleh menangkap trend harga dengan lebih fleksibel, terutamanya untuk pasaran yang lebih bergolak.

  2. Julat saluran yang menyesuaikan diri boleh disesuaikan secara dinamik, meluaskan lebar saluran apabila tidak pasti, menyempit saluran untuk mengesan harga apabila terdapat trend yang jelas.

  3. Dengan menggunakan isyarat perdagangan penembusan harga, ia dapat ditangkap tepat pada masanya di peringkat permulaan trend, dengan kadar kemenangan yang tinggi.

  4. Strategi logiknya ringkas dan jelas, mudah difahami dan dilaksanakan, sesuai untuk perdagangan kuantitatif.

Analisis risiko[Risk Analysis]

Strategi ini juga mempunyai risiko:

  1. Penetapan parameter AMA yang tidak betul boleh menyebabkan trend harga yang salah atau menghasilkan isyarat palsu.

  2. Parameter saluran penyesuaian seperti β perlu ditetapkan dengan berhati-hati, jika tidak, terdapat terlalu banyak transaksi atau kecenderungan kehilangan.

  3. Isyarat penembusan harga mudah ditipu oleh penembusan palsu dan perlu disaring dengan lebih banyak petunjuk.

  4. Strategi itu sendiri tidak mengambil kira pengurusan dana dan mekanisme penangguhan kerugian, dan terdapat risiko kerugian tertentu.

Arah pengoptimuman[Optimization Directions]

Strategi ini boleh dioptimumkan dengan:

  1. Mengoptimumkan kaedah pengiraan nilai α AMA untuk menjadikannya lebih sensitif terhadap perubahan harga.

  2. Menambah pengesahan lanjut selepas penembusan saluran untuk mengelakkan penembusan palsu menghasilkan isyarat yang salah.

  3. Penapisan digabungkan dengan jumlah dagangan atau indikator turun naik untuk memastikan keberkesanan penembusan.

  4. Menambah mekanisme tracking stop loss untuk mengunci keuntungan dan mengawal risiko.

  5. Mengoptimumkan pengurusan dana, menentukan pengurusan kedudukan yang munasabah untuk pelbagai aset.

ringkaskan[Conclusion]

Strategi penembusan harga saluran yang menyesuaikan diri secara keseluruhan adalah strategi penembusan trend yang mudah dan praktikal. Ia mengikuti trend harga dengan menggunakan purata bergerak yang menyesuaikan diri secara fleksibel, dan disokong oleh isyarat penembusan saluran yang menyesuaikan diri.

Kod sumber strategi
/*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)