Chiến lược giao dịch trung bình di chuyển trơn tru kép

Tác giả:ChaoZhang, Ngày: 2023-10-13 15:45:58
Tags:

Tổng quan

Chiến lược này sử dụng một hệ thống trung bình di chuyển trơn tru hai lần như là tín hiệu giao dịch chính, kết hợp với chỉ số xác nhận khối lượng TDFI để lọc tín hiệu giao dịch, để tận dụng những lợi thế của trung bình di chuyển trơn tru trong khi giảm các giao dịch không chính xác trên các thị trường không có xu hướng.

Chiến lược logic

Chiến lược này sử dụng hai bộ trung bình di chuyển mượt mà với cấu hình tham số khác nhau như tín hiệu giao dịch chính. Đầu tiên một trung bình di chuyển mượt mà nhanh 8 giai đoạn được sử dụng làm xác nhận ban đầu, sau đó một trung bình di chuyển mượt mà 16 giai đoạn chậm hơn một chút đóng vai trò là xác nhận thứ hai. Khi MA nhanh đưa ra tín hiệu mua, nếu MA chậm hơn cũng báo hiệu theo cùng hướng trong vòng 1-2 thanh cuối cùng, một vị trí dài được mở. Khi MA nhanh đưa ra tín hiệu bán, nếu MA chậm hơn cũng báo hiệu theo cùng hướng trong vòng 1-2 thanh cuối cùng, một vị trí ngắn được mở ra. Các bước ra được kích hoạt khi MA xác nhận thứ hai đảo ngược hướng. Ngoài ra, chỉ số khối lượng TDFI được sử dụng để phát hiện khối lượng giao dịch đằng sau các tín hiệu giá năng lượng gây hiểu lầm. Các giao dịch chỉ được thực hiện khi phù hợp với kỳ vọng.

Ưu điểm

  • Các MA trơn tru theo dõi hiệu quả xu hướng và tránh tiếng ồn thị trường, bắt được xu hướng trung và dài hạn
  • Thiết lập MA lỏng lẻo kép tăng độ tin cậy tín hiệu, tránh giao dịch không chính xác trên các thị trường không có xu hướng
  • Bộ lọc giới thiệu chỉ số âm lượng gây hiểu lầm các tín hiệu âm lượng thấp, tránh mất mát không cần thiết
  • Không gian tối ưu hóa tham số cao, có thể được điều chỉnh cho các sản phẩm và khung thời gian khác nhau, thích nghi cao

Rủi ro

  • Các MA trơn tru có thể chậm để xác định sự đảo ngược xu hướng, có khả năng dẫn đến một số lỗ
  • Các MAs gọn gàng đôi vẫn có thể tạo ra các tín hiệu sai đồng thời trong các thị trường không có xu hướng
  • Chỉ số âm lượng có hiệu quả hạn chế, không thể lọc tất cả các tín hiệu gây hiểu lầm

Để giảm rủi ro, các hướng tối ưu hóa sau đây có thể được xem xét:

  • Thêm chỉ số sức mạnh xu hướng để hỗ trợ xác định sự đảo ngược xu hướng
  • Tối ưu hóa các thông số MA trơn tru để cấu hình nhanh / chậm hiệu quả hơn
  • Kiểm tra các chỉ số âm lượng khác nhau để lọc tốt hơn các tín hiệu âm lượng thấp gây hiểu nhầm

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

  • Thêm MACD vv để giúp xác định sự đảo ngược xu hướng
  • Điều chỉnh dừng và giới hạn ATR để phù hợp với các đặc điểm sản phẩm khác nhau
  • Cố gắng tăng kích thước vị trí để cải thiện chiến lược lợi nhuận
  • Tối ưu hóa các tham số dựa trên kết quả backtest để tăng cường tính ổn định

Tóm lại

Nhìn chung, đây là một chiến lược theo xu hướng điển hình. Hệ thống MA gọn gàng kép kết hợp với bộ lọc khối lượng TDFI có thể tận dụng hiệu quả khả năng theo dõi xu hướng trong khi giảm tỷ lệ tín hiệu không chính xác trong các thị trường không theo xu hướng. Thông qua tối ưu hóa tham số, nó có thể được thích nghi với các khung thời gian và sản phẩm khác nhau. Tuy nhiên, nó dựa nhiều hơn vào điều chỉnh tham số hơn là ứng dụng cơ học.


/*backtest
start: 2022-10-06 00:00:00
end: 2023-10-12 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Designed per No Nonsense Forex VP rules
//Made to be as modular as possible, so we can swap the indicators in and out.
//Originated from causecelebre
//Tried to put in as much VP rules as possible

///////////////////////////////////////////////////
//Rules Implemented:
///////////////////////////////////////////////////
// - SL 1.5 x ATR
// - TP 1 x ATR
//
// - Entry conditions
//// - Entry within first confirmation cross over and 1 candle of second confirmation + volume
// - Exit conditions
//// - Exit on exit indicator or when baseline or confirmation flip 

///////////////////////////////////////////////////
//Trades entries
///////////////////////////////////////////////////
// - First entry L1 or S1 with standard SL and TP

///////////////////////////////////////////////////
//Included Indicators and settings
///////////////////////////////////////////////////
// - Confirmtion = SSL 8, 16
// - Volume = TDFI 6

///////////////////////////////////////////////////
//Credits
// Strategy causecelebre https://www.tradingview.com/u/causecelebre/
// TDFI causecelebre https://www.tradingview.com/u/causecelebre/
// SSL Channel ErwinBeckers https://www.tradingview.com/u/ErwinBeckers/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// strategy(title="NNFX Strategy 3 Indicator Template | jh", overlay = true, pyramiding=0, initial_capital=20000, currency=currency.USD, calc_on_order_fills=0,default_qty_type=strategy.fixed, default_qty_value=10000)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Set the main stuff  ****
///////////////////////////////////////////////////

//Price
price = close

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ATR stuff
///////////////////////////////////////////////////

slMultiplier = input(1.5, "SL")
tpMultiplier = input(1, "TP")

atrlength = input(title="ATR Length", defval=14, minval=1)
atrsmoothing = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])

ma_function(source, atrlength) => 
    if atrsmoothing == "RMA"
        rma(source, atrlength)
    else
        if atrsmoothing == "SMA"
            sma(source, atrlength)
        else
            if atrsmoothing == "EMA"
                ema(source, atrlength)
            else
                wma(source, atrlength)

//plot(ma_function(tr(true), atrlength), title = "ATR", color=#991515, transp=0)

atr = ma_function(tr(true), atrlength)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Confirmation 1 Fast ****
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//SSL 6
///////////////////////////////////////////////////

ssllen1=input(title="SSL 1 Length Period", defval=8)
smaHigh1=sma(high, ssllen1)
smaLow1=sma(low, ssllen1)
Hlv1 = na
Hlv1 := close > smaHigh1 ? 1 : close < smaLow1 ? -1 : Hlv1[1]
sslDown1 = Hlv1 < 0 ? smaHigh1: smaLow1
sslUp1   = Hlv1 < 0 ? smaLow1 : smaHigh1

plot(sslDown1, "SSL Down", linewidth=1, color=red)
plot(sslUp1, "SSL Up", linewidth=1, color=lime)

///////////////////////////////////////////////////
//Confirm Signals
///////////////////////////////////////////////////

c_Up = sslUp1
c_Down =sslDown1

//Signals based on crossover
c_cross_Long = crossover(c_Up, c_Down)
c_cross_Short = crossover(c_Down, c_Up)

//Signals based on signal position
c_trend_Long = c_Up > c_Down ? 1 : 0
c_trend_Short = c_Down > c_Up ? 1 : 0

confirm_Long = c_cross_Long
confirm_Short = c_cross_Short

plotshape(c_cross_Long, color = green, style=shape.triangleup, location=location.top)
plotshape(c_cross_Short, color = red, style=shape.triangledown, location=location.top)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Confirmation 2 Slow ****
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//SSL 30
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//SSL
///////////////////////////////////////////////////

ssllen2=input(title="SSL 2 Length Period", defval=16)
smaHigh2=sma(high, ssllen2)
smaLow2=sma(low, ssllen2)
Hlv2 = na
Hlv2 := close > smaHigh2 ? 1 : close < smaLow2 ? -1 : Hlv2[1]
sslDown2 = Hlv2 < 0 ? smaHigh2: smaLow2
sslUp2   = Hlv2 < 0 ? smaLow2 : smaHigh2

plot(sslDown2, "SSL Down", linewidth=1, color=orange)
plot(sslUp2, "SSL Up", linewidth=1, color=blue)

///////////////////////////////////////////////////
//Confirm Signals
///////////////////////////////////////////////////
c2_Up = sslUp2
c2_Down = sslDown2

//Signals based on crossover
c2_cross_Long = crossover(c2_Up, c2_Down)
c2_cross_Short = crossover(c2_Down, c2_Up)

//Signals based on signal position
c2_trend_Long = c2_Up > c2_Down ? 1 : 0
c2_trend_Short = c2_Down > c2_Up ? 1 : 0

confirm2_Long = c2_trend_Long
confirm2_Short = c2_trend_Short

plotshape(c2_cross_Long, color = green, style=shape.triangleup, location=location.bottom)
plotshape(c2_cross_Short, color = red, style=shape.triangledown, location=location.bottom)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  **** Volume Indicator Start ****
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//TDFI
///////////////////////////////////////////////////

lookback = input(6, title = "TDFI Lookback") 
filterHigh = input(0.05, title = "Filter High") 
filterLow = input(-0.05, title = "Filter Low") 

mma = ema(price * 1000, lookback)
smma = ema(mma, lookback)

impetmma = mma - mma[1]
impetsmma= smma - smma[1]
divma = abs(mma - smma)
averimpet = (impetmma + impetsmma) / 2

number = averimpet
pow = 3
result = na

for i = 1 to pow - 1
    if i == 1
        result := number
    result := result * number

tdf = divma * result
ntdf = tdf / highest(abs(tdf), lookback * 3)

///////////////////////////////////////////////////
//Volume Signals
///////////////////////////////////////////////////
v_Long = ntdf > filterHigh ? 1 : 0
v_Short = filterLow > ntdf ? 1 : 0

volumeLong = v_Long
volumeShort = v_Short

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **************************** Logic to handle NNFX rules ****************************
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//Checking for confirmation indication with 1 candle difference for second confirmtion and volume
enterLong   = confirm_Long and (confirm2_Long[0] or confirm2_Long[1])      and (volumeLong[0] or volumeLong[1]) ? 1 : 0
enterShort  = confirm_Short and (confirm2_Short[0] or confirm2_Short[1])   and (volumeShort[0] or volumeShort[1]) ? 1 : 0

exitLong = c_cross_Short or c2_cross_Short ? 1 : 0 
exitShort = c_cross_Long or c2_cross_Long ? 1 : 0 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Entries and Exits
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if (year>2009)

    //Long entries with standard 1.5 ATR for SL, 1 ATR for TP
    long_sl = price - (atr * slMultiplier)
    long_tp = price + (atr * tpMultiplier)

    //Short entries with standard 1.5 ATR for SL, 1 ATR for TP
    short_sl = price + (atr * slMultiplier)
    short_tp = price - (atr * tpMultiplier)

    strategy.close("L1", when = exitLong)
    strategy.close("S1", when = exitShort)

    strategy.exit("L Limit Exit", "L1", stop = long_sl, limit = long_tp)
    strategy.exit("S Limit Exit", "S1", stop = short_sl, limit = short_tp)

    strategy.order("L1", strategy.long, when = enterLong)
    strategy.order("S1", strategy.short, when = enterShort)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//End
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    




Thêm nữa