Chiến lược trung bình di chuyển và siêu xu hướng kép

Tác giả:ChaoZhang, Ngày: 2023-09-28 15:12:50
Tags:

Tổng quan

Chiến lược này tạo ra các tín hiệu giao dịch dựa trên sự chéo chéo của trung bình động 21 ngày và 55 ngày, và sử dụng chỉ số siêu xu hướng để lọc ra các tín hiệu sai.

Chiến lược logic

Mã đầu tiên xác định EMA 21 ngày (EMA1) và EMA 55 ngày (EMA2). Một tín hiệu mua được tạo ra khi EMA1 vượt qua EMA2. Một tín hiệu bán được tạo ra khi EMA1 vượt qua dưới EMA2.

Để lọc các tín hiệu sai, chỉ số siêu xu hướng được thêm vào. siêu xu hướng tính toán hướng xu hướng dựa trên giá ATR và giá cao thấp gần đây. Trong mã, trên đường siêu xu hướng là xu hướng tăng và dưới đó là xu hướng giảm.

Vì vậy, tín hiệu mua chỉ được tạo ra khi EMA1 vượt qua trên EMA2 trong một xu hướng tăng. Một tín hiệu bán chỉ được tạo ra khi EMA1 vượt qua dưới EMA2 trong một xu hướng giảm. Siêu xu hướng lọc các tín hiệu sai trong quá trình chuyển đổi xu hướng.

Ngoài ra, các đường trung bình động 200 ngày và 233 ngày được cộng lại để xác định xu hướng dài hạn.

Ưu điểm

  1. Trung bình di chuyển kép kết hợp với siêu xu hướng có thể xác định hiệu quả xu hướng và lọc các tín hiệu sai.

  2. Các thông số trung bình động có thể điều chỉnh có thể điều chỉnh chiến lược theo các điều kiện thị trường khác nhau.

  3. Mức trung bình động dài hạn ngăn ngừa rủi ro từ các xu hướng mâu thuẫn.

  4. Quy tắc rõ ràng dễ dàng cho giao dịch thuật toán.

  5. Các tín hiệu mua / bán trực quan làm cho các quyết định giao dịch rõ ràng.

Rủi ro

  1. Các đường trung bình động có thể tạo ra tín hiệu sai xung quanh các điểm biến.

  2. Cài đặt tham số không phù hợp có thể gây ra xu hướng bị bỏ qua hoặc tín hiệu sai quá mức.

  3. Tần suất giao dịch cao dẫn đến chi phí giao dịch cao hơn.

  4. Các thông số siêu xu hướng cần được tối ưu hóa để cân bằng hiệu quả lọc và chậm.

  5. Trung bình dài hạn có thể chậm trong việc tạo ra tín hiệu.

Những cải tiến

  1. Kiểm tra các kết hợp trung bình động khác nhau để tìm các thông số tối ưu.

  2. Tối ưu hóa các thông số siêu xu hướng để cân bằng lọc và chậm.

  3. Thêm các chỉ số khác như âm lượng để xác nhận thêm tín hiệu.

  4. Kết hợp tình cảm và phân tích tin tức để xác định các bước ngoặt tiềm năng.

  5. Sử dụng máy học để tối ưu hóa các tham số một cách năng động.

Kết luận

Chiến lược này kết hợp các điểm mạnh của đường trung bình động kép và siêu xu hướng trong việc xác định xu hướng và lọc tín hiệu sai. Nó có thể được cải thiện liên tục thông qua tối ưu hóa tham số và xác thực bổ sung. Mặc dù có một số rủi ro, chúng có thể được quản lý thông qua các kỹ thuật kiểm soát rủi ro. Chiến lược này phù hợp với giao dịch thuật toán.


/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bhavikmota

//@version=4
strategy("EMA & Supertrend", overlay = true)

//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)

//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)


//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)

//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)

//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)

//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)


Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


//Trading logic

Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend

Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend

//Execution Logic - Placing Order

start = timestamp(2008,1,1,0,0)

if time>= start
    strategy.entry("long", strategy.long, when=Enterlong)
    strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)

Thêm nữa