더블 스무디드 이동 평균 거래 전략


생성 날짜: 2023-10-13 15:45:58 마지막으로 수정됨: 2023-10-13 15:45:58
복사: 1 클릭수: 642
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 듀얼 플레임 이동 평균 시스템을 주요 거래 신호로 사용하며 거래량 검증 지표 TDFI와 결합하여 거래 신호 필터링을 수행하여 플레임 이동 평균의 장점을 발휘하여 비주류 시장 환경에서 잘못된 거래를 줄입니다.

전략 원칙

이 전략은 두 개의 다른 변수 설정의 평평한 이동 평균 그룹이 협력하여 주요 거래 신호를 사용한다. 먼저 빠른 설정의 8 주기 평평한 이동 평균 그룹이 협력하여 첫 번째 확인 신호를 사용한다. 그리고 약간 느린 16 주기 평평한 이동 평균을 사용하여 두 번째 확인 신호를 사용한다. 빠른 이동 평균이 구매 신호를 발산하면, 약간 느린 이동 평균이 동일한 방향으로 신호를 발산하고 가장 최근의 1 ~ 2 K 라인 내에 있다면, 더 많은 거래가 이루어진다.

전략적 이점

  • 평평한 이동 평균은 동향을 효과적으로 추적하여 시장 소음에 영향을 받지 않고 중장선 동향을 잡는 데 도움이 됩니다.
  • 이중 평평한 이동 평균 조합, 신호의 신뢰성을 높여서 비주류 시장에서 잘못된 거래를 방지합니다.
  • 거래량 지표의 도입, 낮은 거래량으로 인한 잘못된 신호를 필터링하여 불필요한 손실을 방지합니다.
  • 전략 매개 변수를 최적화 할 수있는 넓은 공간, 다양한 품종과 주기에 따라 조정할 수 있으며, 적응력이 강합니다.

전략적 위험

  • 평평한 이동 평균 시스템은 트렌드 반전 시 신호를 늦게 인식할 수 있으며, 약간의 손실을 초래할 수 있습니다.
  • 비 주류 상황에서는, 이중 평평한 이동 평균이 동시에 잘못된 신호를 발산할 수 있습니다.
  • 거래량 지표의 효과는 제한되어 있으며 모든 잘못된 신호를 완전히 피할 수 없습니다.

Above risks를 줄이기 위해, 다음의 최적화 방향이 고려될 수 있다:

  • 트렌드 강도 지표가 추가되어 트렌드 전환점을 판단할 수 있습니다.
  • 부드러운 이동 평균 변수를 최적화하여 느린 구성을 합리화합니다.
  • 다른 거래량 지표를 시도하여 낮은 양의 잘못된 신호에 대한 필터링 효과를 향상시킵니다.

전략 최적화 방향

  • MACD와 같은 보조 지표에 트렌드 전환점을 추가합니다.
  • 다른 품종 특성에 맞게 ATR 정지 손해 차단 매개 변수를 조정
  • “전략적 수익률을 높이기 위해 지분 비율을 늘리려고 한다”
  • 응답 결과에 따라 최적화 변수, 전략 안정성을 향상

요약하다

이 전략은 전체적으로 전형적인 트렌드 추적 전략이다. 이중 평평한 이동 평균 시스템은 거래량 필터 지표 TDFI와 결합하여 트렌드 추적 기능을 더 잘 발휘할 수 있으며, 비주류 상황에서의 잘못된 신호율을 줄일 수 있다. 파라미터를 최적화하여, 다른 주기 및 품종의 시장 특성에 적응할 수 있다. 그러나 이 전략은 기계적으로 적용되는 것보다 파라미터 조정에 더 의존한다. 역점의 식별과 불충분한 파라미터 조정이 전략의 효과에 미치는 영향에 주의가 필요하다. 전체적으로, 이 전략의 사고 방식은 명확하고 이해하기 쉬우며, 실전에서 추가적으로 최적화할 가치가 있다.

전략 소스 코드
/*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
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////