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

Tác giả:ChaoZhang, Ngày: 2024-02-22 17:09:39
Tags:

img

Tổng quan

Chiến lược này là một chiến lược theo xu hướng dựa trên các đường trung bình động thích nghi. Nó sử dụng hai đường trung bình động DEMA với các khoảng thời gian khác nhau để tạo ra tín hiệu giao dịch. Chiến lược sẽ tự động điều chỉnh khung thời gian cho phân tích dựa trên khoảng thời gian hiện tại, cho phép theo dõi nhiều khung thời gian.

Chiến lược logic

Chiến lược này sử dụng đường DEMA nhanh và đường DEMA chậm để xây dựng tín hiệu giao dịch. Đường nhanh có thời gian tf và đường chậm có thời gian tf * 2. Một tín hiệu mua được tạo ra khi đường nhanh vượt qua đường chậm. Một tín hiệu bán được tạo ra khi đường nhanh vượt qua đường chậm. Điều này cho phép chiến lược theo dõi xu hướng trung và dài hạn. Ngoài ra, chiến lược cũng sử dụng bộ lọc trung bình di chuyển kép Hull để giảm giao dịch ồn ào. Các tín hiệu chỉ được tạo ra khi bộ lọc Hull đồng ý về hướng.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó có thể thích nghi với các giai đoạn khác nhau tự động. Nó sẽ chọn khung thời gian phân tích từ hàng ngày đến hàng tuần dựa trên giai đoạn hiện tại. Đ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 khác nhau. Ngoài ra, cấu trúc trung bình động kép có thể theo dõi xu hướng hiệu quả và bộ lọc kép làm tăng chất lượng tín hiệu. Kết quả là, chiến lược này rất phù hợp để theo dõi xu hướng trung và dài hạn.

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 chuyển từ thị trường tăng sang thị trường gấu, các đường nhanh và chậm có thể vượt qua mạnh xuống, dẫn đến tổn thất nổi lớn. Ngoài ra, bộ lọc đường cũng có thể bỏ lỡ một số cơ hội có lợi nhuận. Nếu bộ lọc không đồng ý với hướng giá, những tín hiệu có lợi khác sẽ bị bỏ qua. Kết quả là, chiến lược này chủ yếu nhắm vào các thị trường xu hướng ổn định trung và dài hạn.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa bằng cách điều chỉnh các tham số bộ lọc hoặc sử dụng các chỉ số khác thay thế. Ví dụ, MACD có thể được kiểm tra thay vì HullMA, hoặc các tham số thời gian HullMA có thể được điều chỉnh. Các kết hợp tham số khác nhau cũng có thể được kiểm tra để tìm các quy tắc giao dịch phù hợp hơn. Ngoài ra, các chỉ số biến động cũng có thể được kết hợp để kiểm soát kích thước vị trí. Các vị trí nhỏ hơn có thể được thực hiện khi biến động thị trường tăng.

Kết luận

Kết luận, đây là một chiến lược thích nghi rất thực tế theo xu hướng. Nó có thể tự động điều chỉnh khung thời gian phân tích cho các giai đoạn khác nhau và phù hợp để giao dịch trên các chân trời thời gian khác nhau. Cấu trúc trung bình động kép 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. Nhìn chung, nó phù hợp với các nhà đầu tư tìm kiếm lợi nhuận ổn định trung và dài hạn.


/*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     ----------------------------------------





Thêm nữa