
Strategi ini adalah strategi pelacakan tren yang didasarkan pada garis rata-rata bergerak yang beradaptasi sendiri. Strategi ini menggunakan garis rata-rata bergerak DEMA dari dua periode yang berbeda untuk menghasilkan sinyal jual beli. Strategi ini secara otomatis beradaptasi dengan analisis granular berdasarkan periode yang berbeda, untuk melacak beberapa kerangka waktu.
Strategi menggunakan DEMA garis cepat dan DEMA garis lambat untuk membangun sinyal perdagangan. Periode garis cepat adalah tf, periode garis lambat adalah tf*2。 Ketika garis cepat melewati garis lambat, sinyal beli dihasilkan; Ketika garis cepat melewati garis lambat, sinyal jual dihasilkan. Oleh karena itu, trend garis panjang dan menengah dapat diikuti. Selain itu, strategi ini juga menggunakan filter Hull ganda untuk mengurangi noise transaksi.
Keuntungan terbesar dari strategi ini adalah dapat beradaptasi dengan siklus yang berbeda. Strategi ini akan secara otomatis memilih analisis grafit berdasarkan non-siklus, yang dapat digunakan dari garis matahari hingga garis lingkar. Ini membuat strategi ini cocok untuk berbagai lingkungan pasar. Selain itu, struktur dua garis sejajar dapat secara efektif melacak tren, dan penyaringan dua garis meningkatkan kualitas sinyal.
Risiko utama dari strategi ini berasal dari pembalikan tren. Ketika pasar masuk dari bull market ke bear market, garis cepat dan lambat dapat mengalami persilangan ke bawah yang tajam, menyebabkan kerugian besar. Selain itu, filter dua baris juga dapat menghapus beberapa peluang untuk menghasilkan uang.
Strategi dapat dioptimalkan dengan menyesuaikan parameter filter atau menggunakan penggantian indikator lainnya. Misalnya, MACD dapat diuji untuk menggantikan HullMA, atau menyesuaikan parameter siklus HullMA. Juga, kombinasi parameter yang berbeda dapat diuji untuk mencari aturan perdagangan yang lebih cocok.
Strategi ini secara keseluruhan merupakan strategi pelacakan tren yang sangat praktis. Strategi ini dapat secara otomatis menyesuaikan siklus analisis untuk trading pada periode waktu yang berbeda. Struktur biner dapat menstabilkan pelacakan tren, dan filter juga meningkatkan kualitas sinyal.
/*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 ----------------------------------------