Adaptive Moving Average Trading Strategy (Strategi Perdagangan Rata-rata Bergerak yang Adaptif)

Penulis:ChaoZhang, Tanggal: 2024-02-22 17:09:39
Tag:

img

Gambaran umum

Strategi ini adalah strategi mengikuti tren berdasarkan rata-rata bergerak adaptif. Ini menggunakan dua rata-rata bergerak DEMA dengan periode yang berbeda untuk menghasilkan sinyal perdagangan. Strategi ini akan secara otomatis menyesuaikan kerangka waktu untuk analisis berdasarkan periode saat ini, memungkinkan pelacakan multi-frame waktu.

Logika Strategi

Strategi ini menggunakan garis DEMA cepat dan garis DEMA lambat untuk membangun sinyal perdagangan. Garis cepat memiliki periode tf dan garis lambat memiliki periode tf*2. Sinyal beli dihasilkan ketika garis cepat melintasi di atas garis lambat. Sinyal jual dihasilkan ketika garis cepat melintasi di bawah garis lambat. Ini memungkinkan strategi untuk melacak tren jangka menengah hingga panjang. Selain itu, strategi ini juga menggunakan filter rata-rata bergerak ganda Hull untuk mengurangi perdagangan berisik. Sinyal hanya dihasilkan ketika filter Hull menyetujui arah.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa ia dapat beradaptasi dengan periode yang berbeda secara otomatis. Ini akan memilih kerangka waktu analisis dari harian ke mingguan berdasarkan periode saat ini. Ini membuat strategi cocok untuk berbagai lingkungan pasar. Selain itu, struktur rata-rata bergerak ganda dapat melacak tren secara efektif, dan filter ganda meningkatkan kualitas sinyal. Akibatnya, strategi ini sangat cocok untuk melacak tren jangka menengah hingga panjang.

Analisis Risiko

Risiko utama dari strategi ini berasal dari pembalikan tren. Ketika pasar transisi dari pasar bull ke pasar bear, garis cepat dan lambat dapat menyeberang tajam ke bawah, menghasilkan kerugian mengambang yang besar. Selain itu, filter garis juga dapat kehilangan beberapa peluang menguntungkan. Jika filter tidak setuju dengan arah harga, sinyal yang menguntungkan akan dilewatkan. Akibatnya, strategi ini terutama menargetkan pasar tren jangka menengah hingga panjang yang stabil.

Arahan Optimasi

Strategi dapat dioptimalkan dengan menyesuaikan parameter filter atau menggunakan indikator lain sebagai pengganti. Misalnya, MACD dapat diuji alih-alih HullMA, atau parameter periode HullMA dapat disesuaikan. Kombinasi parameter yang berbeda juga dapat diuji untuk menemukan aturan perdagangan yang lebih cocok. Selain itu, indikator volatilitas juga dapat dimasukkan untuk mengontrol ukuran posisi. Posisi yang lebih kecil dapat diambil ketika volatilitas pasar meningkat.

Kesimpulan

Sebagai kesimpulan, ini adalah strategi tren yang sangat praktis. Ini dapat secara otomatis menyesuaikan kerangka waktu analisis untuk periode yang berbeda dan cocok untuk perdagangan di horizon waktu yang berbeda. Struktur rata-rata bergerak ganda dapat secara konsisten melacak tren, dan filter juga meningkatkan kualitas sinyal. Secara keseluruhan, ini cocok untuk investor yang mencari pengembalian jangka menengah hingga panjang yang stabil.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//
//---------------------------------------------
//* Author - PPSingnal
//* http://ppsignal.com
//---------------------------------------------
//
//

strategy (title="PPSignal V4 (Auto Adaptive Times)", shorttitle="PPSignal V4", overlay=true)
delayOffset = input(defval = 0, title = "Delay Open/Close MA (Forces Non-Repainting)", minval = 0, step = 1)

//----------------------------------------    INICIO PPI     ----------------------------------------

// - PARÁMETROS DE ENTRADA
// SE DEFINE LA RESOLUCIÓN
useRes1 = true
setRes1 = true


tf = timeframe.period == "60" ? 4 : timeframe.period == "240" ? 4 : timeframe.period == "D" ? 4 : timeframe.period == "W" ?4 : 4


// PRIMER DEMA
type   = "DEMA"
src   = close
len    = tf
off   = 0
lsma   = 0
// SEGUNDA DEMA
type2   = "DEMA"
src2    = open
len2    = tf
off2    = 0
lsma2   = 0

// - INPUTS END

//----------------------------------------    INICIO FUNCIONES     ----------------------------------------

// RETORNA UNA MEDIA MOVIL (TYPE=TIPO / SRC = TIPO DE PRECIO / LEN=LONGITUD / LSMA=0)
variant(type, src, len, lsma) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, lsma)                                         // Least Squares
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : v1

// SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414*3.14159 / len)
    b1 = 2*a1*cos(1.414*3.14159 / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1*(src + nz(src[1])) / 2 + c2*nz(v12[1]) + c3*nz(v12[2])
   

// RETORNA LA RESOLUCIÓN SETEADA Y SINO LA DEFAULT
// 3H:      1min - 3min - 5min - 15min
// DIARIO:  30 - 45 - 60
// SEMANAL: 120 - 180 - 240 - D


reso(exp, use, res) => use ? request.security(syminfo.tickerid, timeframe.period=="1" ? "D" : timeframe.period=="3" ? "D" : timeframe.period=="5" ? "D" : timeframe.period=="15" ? "D" : timeframe.period=="30" ? "D" : timeframe.period=="45" ? "W" : timeframe.period=="60" ? "W" : timeframe.period=="120" ? "W" : timeframe.period=="180" ? "W" : timeframe.period=="240" ? "W" : timeframe.period=="D" ? "W" : "W", exp) : exp




//----------------------------------------    FIN FUNCIONES     ----------------------------------------

//----------------------------------------    INICIO VARIABLES     ----------------------------------------

// DEMAS
ma_short    = reso(variant(type, src[off], len, lsma), useRes1, setRes1)
ma_long     = reso(variant(type2, src2[off2], len2, lsma2), useRes1, setRes1)


//----------------------------------------    FIN VARIABLES     ----------------------------------------


//----------------------------------------    FIN PPI     ----------------------------------------

//----------------------------------------    PRIMER FILTRO      ----------------------------------------
// Double HullMA
scolor      = false

n=1
n2ma=2*wma(close,round(n/2))
nma=wma(close,n)
diff=n2ma-nma
sqn=round(sqrt(n))

n2ma1=2*wma(close[1],round(n/2))
nma1=wma(close[1],n)
diff1=n2ma1-nma1
sqn1=round(sqrt(n))

n1=wma(diff,sqn)
n2=wma(diff1,sqn)

//----------------------------------------    FIN PRIMER FILTRO     ----------------------------------------

//----------------------------------------    INICIO CONDICIONES      ----------------------------------------

// CONDICION CON FILTRO
cruce= (ma_short > ma_long) and n1>n2 ? true : ma_short < ma_long ? false : cruce[1]
// Condition

// FONDO DE COLOR
bground = cruce ? white : red
bgcolor(bground, transp=90)


// BARRAS COLOREADAS
barcol = cruce ? yellow : red 
barcolor(barcol, transp=0)

closePlot   = plot(ma_short, title = "Zone 1", color = gray, circles = 0, style = circles, transp = 100)
openPlot   = plot(ma_long, title = "Zone 2", color = green, circles = 0, style = circles, transp = 100)
trendState  = ma_short > ma_long ? true : ma_short < ma_long ? false : trendState[1]

// channel fill
closePlotU  = plot(trendState ? ma_short : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? ma_long : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : ma_short, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : ma_long, transp = 100, editable = false)

fill(openPlotU, closePlotU, title = "Up Trend Fill", color = yellow, transp = 70)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = red, transp = 70)




//----------------------------------------    FIN CONDICIONES     ----------------------------------------

//----------------------------------------    INICIO ESTRATEGIA      ----------------------------------------

//CONDICION COMPRA
longCond    = (ma_short > ma_long) and n1>=n2

//CONDICION VENTA

shortCond    = (ma_short < ma_long)

//ABRO COMPRA A
strategy.entry("Bull Trend", strategy.long, when = longCond)

//ABRO VENTA A
strategy.entry("Bearish Trend", strategy.short, when = shortCond)

//CIERRO VENTA A
strategy.exit("Exit Short", from_entry = "Bull Trend", when = shortCond)

//CIERRO COMPRA A
strategy.exit("Exit Long", from_entry = "Bearish Trend", when = longCond)

//----------------------------------------    FIN ESTRATEGIA     ----------------------------------------





Lebih banyak