Chiến lược giao dịch đường trung bình động thích ứng


Ngày tạo: 2024-02-22 17:09:39 sửa đổi lần cuối: 2024-02-22 17:09:39
sao chép: 0 Số nhấp chuột: 642
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch đường trung bình động thích ứng

Tổng quan

Chiến lược này là một chiến lược theo dõi xu hướng dựa trên đường trung bình di chuyển tự điều chỉnh. Nó sử dụng đường trung bình di chuyển DEMA của hai chu kỳ khác nhau để tạo ra tín hiệu mua và bán. Chiến lược sẽ tự điều chỉnh phân tích hạt theo chu kỳ khác nhau để theo dõi nhiều khung thời gian.

Nguyên tắc chiến lược

Chiến lược sử dụng DEMA đường nhanh và DEMA đường chậm để xây dựng tín hiệu giao dịch. Chu kỳ đường nhanh là tf, chu kỳ đường chậm là tf*2。 Khi đường nhanh đi qua đường chậm sẽ tạo ra tín hiệu mua; khi đường nhanh đi qua đường chậm sẽ tạo ra tín hiệu bán。 Như vậy có thể theo dõi xu hướng đường dài và dài。 Ngoài ra, chiến lược cũng sử dụng bộ lọc Hull kép di động để giảm tiếng ồn giao dịch。 Chỉ khi bộ lọc Hull theo cùng hướng sẽ phát ra tín hiệu giao dịch。

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là có thể tự điều chỉnh theo chu kỳ khác nhau. Nó sẽ tự động chọn phân tích hạt dựa trên không chu kỳ và có thể được sử dụng từ mặt trời đến đường tròn. Điều này làm cho chiến lược phù hợp với nhiều môi trường thị trường. Ngoài ra, cấu trúc hai đường đều có thể theo dõi xu hướng hiệu quả, bộ lọc hai đường tăng chất lượng tín hiệu.

Phân tích rủi ro

Rủi ro chính của chiến lược này đến từ sự đảo ngược xu hướng. Khi thị trường đi từ thị trường bò sang thị trường gấu, đường nhanh và đường chậm có thể có sự giao thoa xuống mạnh, dẫn đến tổn thất lớn. Ngoài ra, bộ lọc hai đường cũng có thể loại bỏ một số cơ hội kiếm tiền.

Hướng tối ưu hóa

Các chiến lược có thể được tối ưu hóa bằng cách điều chỉnh các tham số lọc hoặc sử dụng các chỉ số thay thế khác. Ví dụ, MACD có thể được thử nghiệm thay thế HullMA, hoặc điều chỉnh các tham số chu kỳ của HullMA. Ngoài ra, các kết hợp tham số khác nhau có thể được thử nghiệm để tìm các quy tắc giao dịch phù hợp hơn. Ngoài ra, nó có thể được kết hợp với chỉ số dao động để kiểm soát quy mô vị trí.

Tóm tắt

Chiến lược này nói chung là một chiến lược theo dõi xu hướng tự điều chỉnh rất thực tế. Nó có thể tự động điều chỉnh chu kỳ phân tích để phù hợp với các giao dịch trong các khoảng thời gian khác nhau. Cấu trúc hai dòng đồng đều có thể theo dõi xu hướng ổn định và bộ lọc cũng cải thiện chất lượng tín hiệu.

Mã nguồn chiến lược
/*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     ----------------------------------------