Chiến lược giao dịch đường trung bình động được làm mịn kép


Ngày tạo: 2023-10-13 15:45:58 sửa đổi lần cuối: 2023-10-13 15:45:58
sao chép: 1 Số nhấp chuột: 642
1
tập trung vào
1617
Người theo dõi

Tổng quan

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

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

Chiến lược này sử dụng hai nhóm trung bình di chuyển trơn hoạt động với các thiết lập tham số khác nhau làm tín hiệu giao dịch chính. Đầu tiên, sử dụng nhóm trung bình di chuyển trơn hoạt động 8 chu kỳ với thiết lập nhanh để làm tín hiệu xác nhận đầu tiên, sau đó sử dụng trung bình di chuyển trơn hoạt động 16 chu kỳ chậm hơn để làm tín hiệu xác nhận thứ hai. Khi trung bình di chuyển nhanh phát ra tín hiệu mua, nếu trung bình di chuyển chậm hơn cũng phát ra tín hiệu theo cùng một hướng và trong 1 đến 2 đường K gần nhất, thì sẽ có nhiều giao dịch; khi trung bình di chuyển nhanh phát ra tín hiệu bán, nếu trung bình di chuyển chậm hơn cũng phát ra tín hiệu theo cùng một hướng và trong 1 đến 2 đường K gần nhất, thì sẽ có vị trí trống.

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

  • Trung bình di chuyển trơn có thể theo dõi xu hướng một cách hiệu quả, tránh bị ảnh hưởng bởi tiếng ồn thị trường, có lợi cho việc nắm bắt xu hướng đường dài
  • Sự kết hợp của hai đường trung bình di chuyển phẳng giúp tăng độ tin cậy của tín hiệu và tránh các giao dịch sai trong các thị trường phi chính thống
  • Việc đưa ra chỉ số khối lượng giao dịch, có thể lọc các tín hiệu sai lệch do khối lượng thấp, tránh mất mát không cần thiết
  • Các tham số chiến lược có nhiều không gian để tối ưu hóa, có thể điều chỉnh theo các giống và chu kỳ khác nhau, thích ứng mạnh mẽ

Rủi ro chiến lược

  • Hệ thống trung bình di chuyển trơn có thể nhận ra tín hiệu muộn khi xu hướng đảo ngược, có thể gây ra một số tổn thất
  • Trong các trường hợp không chính yếu, các đường trung bình di chuyển kép có thể phát ra các tín hiệu sai cùng một lúc.
  • Chỉ số khối lượng giao dịch có hiệu quả hạn chế, không thể hoàn toàn tránh được tất cả các tín hiệu sai lệch

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

  • Thêm các chỉ số xu hướng để giúp xác định điểm đảo ngược xu hướng
  • Tối ưu hóa các tham số trung bình di chuyển trơn để cấu hình nhanh hơn
  • Thử các chỉ số khối lượng giao dịch khác nhau để tăng hiệu quả lọc các tín hiệu sai lệch với khối lượng thấp

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

  • Thêm các chỉ số hỗ trợ như MACD để đánh giá điểm đảo ngược xu hướng
  • Điều chỉnh tham số ATR Stop Loss Stop để phù hợp với các đặc điểm khác nhau của giống
  • Cố gắng tăng tỷ lệ đặt hàng để tăng lợi nhuận chiến lược
  • Tối ưu hóa các tham số dựa trên kết quả phản hồi để tăng sự ổn định của chiến lược

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 điển hình. Hệ thống trung bình di chuyển trơn kép kết hợp với chỉ số lọc khối lượng giao dịch TDFI, có thể thực hiện tốt hơn chức năng theo dõi xu hướng, đồng thời giảm tỷ lệ tín hiệu sai trong điều kiện không phổ biến. Bằng cách tối ưu hóa tham số, có thể thích ứng với các đặc điểm thị trường của các chu kỳ và giống khác nhau.

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