Chiến lược theo xu hướng dựa trên chỉ báo SMA đa kỳ


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

Chiến lược theo xu hướng dựa trên chỉ báo SMA đa kỳ

Tổng quan

Chiến lược này thực hiện phán đoán và theo dõi xu hướng bằng cách kết hợp sử dụng nhiều đường trung bình SMA của các chu kỳ khác nhau. Ý tưởng cốt lõi là: so sánh xu hướng tăng và giảm của SMA của các chu kỳ khác nhau, phán đoán xu hướng; khi trên SMA chu kỳ ngắn đi trên SMA chu kỳ dài, làm nhiều hơn; khi trên SMA chu kỳ ngắn đi trên SMA chu kỳ dài, làm trống. Đồng thời, kết hợp với chỉ số ZeroLagEMA để xác nhận vào và ra khỏi thị trường.

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

  1. Sử dụng đường trung bình SMA của 5 chu kỳ khác nhau, lần lượt là chu kỳ 10, chu kỳ 20, chu kỳ 50, chu kỳ 100 và chu kỳ 200.
  2. So sánh xu hướng tăng và giảm của 5 đường trung bình để xác định xu hướng. Ví dụ, khi đường trung bình SMA 10 chu kỳ, 20 chu kỳ, 100 chu kỳ và 200 chu kỳ tăng cùng một lúc, xác định xu hướng tăng; khi đường trung bình giảm cùng một lúc, xác định xu hướng giảm.
  3. So sánh các giá trị khác nhau của chu kỳ SMA, tạo ra tín hiệu giao dịch. Ví dụ, khi 10 chu kỳ SMA trên đường đi 20 chu kỳ SMA, tạo ra tín hiệu vào cửa; khi 10 chu kỳ SMA dưới đường đi 20 chu kỳ SMA, tạo ra tín hiệu vào cửa.
  4. Sử dụng ZeroLagEMA như tín hiệu xác nhận vào và ra sân. Làm nhiều khi đi vòng chậm trên ZeroLagEMA có chu kỳ nhanh; làm nhiều vị trí khi đi bằng phẳng. Cách phán đoán tín hiệu trống ngược lại.

Lợi thế chiến lược

  1. Sử dụng nhiều kết hợp đường trung bình SMA khác nhau, bạn có thể đánh giá hiệu quả xu hướng của thị trường.
  2. So sánh giá trị SMA chu kỳ có thể tạo ra tín hiệu giao dịch, hình thành quy tắc nhập và thoát định lượng.
  3. Zero LagEMA có thể giúp tránh các giao dịch không cần thiết và tăng sự ổn định của chiến lược.
  4. Kết hợp với các tín hiệu giao dịch và đánh giá xu hướng, nó có thể theo dõi xu hướng giao dịch.

Rủi ro chiến lược và giải pháp

  1. Khi thị trường đi vào giai đoạn thu xếp xung đột, tín hiệu đường trung bình SMA có thể xảy ra liên tục, mang lại nhiều rủi ro giao dịch không hiệu quả và mất mát.
    • Giải pháp: Tăng thông số nhiễu của ZeroLagEMA để tránh tín hiệu vô hiệu.
  2. Do tham chiếu đến SMA có nhiều chu kỳ, tín hiệu được đánh giá là có một sự chậm trễ, không thể phản ứng kịp thời với biến động giá mạnh trong ngắn hạn.
    • Giải pháp: Kết hợp các chỉ số nhạy cảm hơn, như MACD, để hỗ trợ phán đoán.

Hướng tối ưu hóa chiến lược

  1. Tối ưu hóa các tham số chu kỳ SMA để tìm các tham số kết hợp tốt nhất.
  2. Thêm các chiến lược dừng lỗ, chẳng hạn như theo dõi dừng lỗ, để kiểm soát tổn thất đơn lẻ hơn nữa.
  3. Tăng cơ chế quản lý số vị trí để chiến lược tăng vị trí khi xu hướng mạnh và giảm vị trí khi dao động.
  4. Kết hợp với các chỉ số hỗ trợ khác như MACD, KDJ, và nhiều hơn nữa, cải thiện sự ổn định của chiến lược.

Tóm tắt

Chiến lược này thực hiện hiệu quả của chiến lược bằng cách kết hợp nhiều đường trung bình SMA chu kỳ, có thể tăng giá trị hiệu quả của chiến lược bằng cách tối ưu hóa các tham số chu kỳ SMA, chiến lược dừng lỗ, quản lý vị trí, v.v.

Mã nguồn chiến lược
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Forex MA Racer - SMA Performance /w ZeroLag EMA Trigger", shorttitle = "FX MA Racer (5x SMA, 2x zlEMA)", overlay=false )

// === INPUTS ===
hr0             = input(defval = true, title = "=== SERIES INPUTS ===")
smaSource       = input(defval = close, title = "SMA Source")
sma1Length      = input(defval = 10, title = "SMA 1 Length")
sma2Length      = input(defval = 20, title = "SMA 2 Length")
sma3Length      = input(defval = 50, title = "SMA 3 Length")
sma4Length      = input(defval = 100, title = "SMA 4 Length")
sma5Length      = input(defval = 200, title = "SMA 5 Length")
smaDirSpan      = input(defval = 4, title = "SMA Direction Span")
zlmaSource      = input(defval = close, title = "ZeroLag EMA Source")
zlmaFastLength  = input(defval = 9, title = "ZeroLag EMA Fast Length")
zlmaSlowLength  = input(defval = 21, title = "ZeroLag EMA Slow Length")
hr1             = input(defval = true, title = "=== PLOT TIME LIMITER ===")
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth      = input(defval = 02, title = "Start From Month", minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
hr2             = input(defval = true, title = "=== TRAILING STOP ===")
useStop     = input(defval = false, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === SERIES SETUP ===
// Fast ZeroLag EMA
zema1=ema(zlmaSource, zlmaFastLength)
zema2=ema(zema1, zlmaFastLength)
d1=zema1-zema2
zlemaFast=zema1+d1

// Slow ZeroLag EMA
zema3=ema(zlmaSource, zlmaSlowLength)
zema4=ema(zema3, zlmaSlowLength)
d2=zema3-zema4
zlemaSlow=zema3+d2

// Simple Moving Averages
period10 = sma(close, sma1Length)
period20 = sma(close, sma2Length)
period50 = sma(close, sma3Length)
period100 = sma(close, sma4Length)
period200 = sma(close, sma5Length)
// === /SERIES SETUP ===

// === PLOT ===
// colors of plotted MAs
p1 = (close < period10) ? #FF0000 : #00FF00
p2 = (close < period20) ? #FF0000 : #00FF00
p3 = (close < period50) ? #FF0000 : #00FF00
p4 = (close < period100) ? #FF0000 : #00FF00
p5 = (close < period200) ? #FF0000 : #00FF00

plot(period10, title='10 Period', color = p1, linewidth=1)
plot(period20, title='20 Period', color = p2, linewidth=2)
plot(period50, title='50 Period', color = p3, linewidth=4)
plot(period100, title='100 Period', color = p4, linewidth=6)
plot(period200, title='200 Period', color = p5, linewidth=10)
// === /PLOT ===

//BFR = BRFIB ? (maFast+maSlow)/2 : abs(maFast - maSlow)

// === STRATEGY ===
// calculate SMA directions
direction10 = rising(period10, smaDirSpan) ? +1 : falling(period10, smaDirSpan) ? -1 : 0
direction20 = rising(period20, smaDirSpan) ? +1 : falling(period20, smaDirSpan) ? -1 : 0
direction50 = rising(period50, smaDirSpan) ? +1 : falling(period50, smaDirSpan) ? -1 : 0
direction100 = rising(period100, smaDirSpan) ? +1 : falling(period100, smaDirSpan) ? -1 : 0
direction200 = rising(period200, smaDirSpan) ? +1 : falling(period200, smaDirSpan) ? -1 : 0

// conditions
// SMA Direction Trigger
dirUp = direction10 > 0 and direction20 > 0 and direction100 > 0 and direction200 > 0
dirDn = direction10 < 0 and direction20 < 0 and direction100 < 0 and direction200 < 0

longCond = (period10>period20) and (period20>period50) and (period50>period100) and  dirUp//and (close > period10) and (period50>period100) //and (period100>period200)
shortCond = (period10<period20) and (period20<period50) and dirDn//and (period50<period100) and (period100>period200)

longExit = crossunder(zlemaFast, zlemaSlow) or crossunder(period10, period20)
shortExit = crossover(zlemaFast, zlemaSlow) or crossover(period10, period20)


// entries and exits
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit


if( true )
    // entries
    strategy.entry("long", strategy.long, when = longCond)
    strategy.entry("short", strategy.short, when = shortCond)

        
    // trailing stop
    if (useStop)
        strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
        strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)

    // exits
    strategy.close("long", when = longExit)
    strategy.close("short", when = shortExit)
// === /STRATEGY ===