트렌드 추적 후속 중지 전략

저자:차오장, 날짜: 2024-01-17 11:19:06
태그:

img

전반적인 설명

트렌드 추적 트레일링 스톱 전략은 트렌드 판단 지표와 트레일링 스톱 메커니즘을 결합한 양적 거래 전략이다. 이 전략은 현재 트렌드 방향을 결정하기 위해 슈퍼 트렌드 지표를 사용하고 트렌드 추적 및 위험 통제를 달성하여 실시간으로 가격 변화를 추적하기 위해 트레일링 스톱 라인을 사용합니다.

전략 원칙

이 전략은 먼저 슈퍼트렌드 지표를 계산하여 현재 트렌드가 상향 또는 하향인지 판단합니다. 슈퍼트렌드 지표는 트렌드 방향을 보다 정확하게 결정하기 위해 ATR 지표와 회전점을 통합합니다. 슈퍼트렌드 지표가 상승세를 판단하면 구매 신호가 생성됩니다. 하향 추세를 판단하면 판매 신호가 생성됩니다.

구매 신호가 생성되면 전략은 긴 포지션을 열 것입니다. 동시에 실시간으로 후속 스톱 라인을 계산합니다. 이 스톱 라인의 계산 방법은 ATR 지표 값을 빼고 피보트 포인트입니다. 현재 폐쇄 가격이 이 스톱 라인보다 높을 때까지, 스톱 라인은 실시간으로 상승하고 합리적인 스톱 손실 위치를 유지합니다. 가격이 스톱 라인을 통과하면 포지션은 스톱 손실로 종료됩니다.

이 전략은 또한 ADX 및 RSI 지표를 통합하여 부적절한 거래 신호를 필터합니다. ADX가 설정된 임계치보다 높고 RSI가 합리적인 수준에있을 때만 Supertrend 지표의 신호가 포지션을 열 때 신뢰할 수 있습니다.

이점 분석

이 전략의 가장 큰 장점은 트렌드 방향을 잘 파악하고 트렌드 추적을 달성 할 수 있다는 것입니다. 슈퍼트렌드 지표는 단순한 이동 평균보다 더 정확하며 전환점을 신속하게 결정할 수 있습니다. 동시에 후속 정지 메커니즘은 수익 잠금 최대화 및 위험을 효과적으로 제어하기 위해 자동으로 정지 수준을 조정 할 수 있습니다.

또한 ADX 및 RSI 지표는 필터레이션 전략에 추가되어 높은 시장 변동성 기간 동안 오류를 피할 수 있습니다. ADX 지표는 충분한 추세를 보장하고 RSI 지표는 과잉 구매 및 과잉 판매 시나리오를 피하여 수익성을 향상시킵니다.

위험 분석

이 전략의 가장 큰 위험은 트렌드 판단이 잘못되고 슈퍼트렌드 지표가 잘못된 신호를 발산한다는 것입니다. 슈퍼트렌드 지표가 단순한 이동 평균보다 우월하지만 복잡한 시장 조건에서 잘못된 판단이 발생할 것은 불가피합니다. 이 시점에서 손실을 제어하기 위해 스톱 로스 메커니즘에 의존해야합니다.

또한, 잘못된 전략 매개 변수 설정 또한 위험을 초래할 수 있다. 예를 들어, 너무 큰 ATR 매개 변수는 지나치게 공격적인 스톱-로스 라인 조정으로 이어질 수 있다. ADX 및 RSI 매개 변수들의 잘못된 설정은 또한 거래 기회를 놓칠 수도 있고 잘못된 트레이드의 가능성을 증가시킬 수도 있다. 이것은 최적의 매개 변수를 찾기 위해 광범위한 역사적 백테스팅을 필요로 한다.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. DMI와 KDJ와 같은 다른 트렌드 판단 지표를 슈퍼 트렌드 지표와 결합하여 판단 정확성을 향상시킬 수있는 멀티 팩터?? 판단 시스템을 형성하도록 시도하십시오.

  2. 기계 학습 기반의 적응적 매개 변수 최적화 모듈을 증가시켜 ATR 매개 변수, ADX 매개 변수, RSI 매개 변수 등을 고정 값 대신 실시간 시장에 따라 조정할 수 있습니다.

  3. 신호 필터링을 위한 RSI 지표를 대체하기 위해 감정 지표를 도입한다. RSI 지표는 복잡한 시장 조건에서 잘 작동하지 않지만 사회적 감정 지표는 시장 열정을 더 잘 결정할 수 있다.

  4. 포지션 사이징 관리 모듈을 증가시킵니다. 정지선과 현재 가격 사이의 거리에 따라 포지션 크기를 동적으로 조정합니다. 정지선에서 멀어질수록 수익 잠재력을 향상시키기 위해 포지션 크기가 적절히 증가 할 수 있습니다.

결론

트렌드 추적 트레일링 스톱 전략은 트렌드 분석, 트레일링 스톱 및 멀티 팩터 필터링과 같은 방법을 종합적으로 사용합니다. 트렌드를 캡처하는 동안 위험을 엄격히 제어하고 더 성숙한 수치 전략입니다. 더 복잡한 시장 환경에 적응하기 위해 이 전략을 최적화하는 데 여전히 큰 잠재력이 있습니다.


/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Bendre ADX Sup Trend", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 18, title = "ATR Period")

StartDate = input(timestamp("1 Dec 2022"), title="Start Date")
EndDate = input(timestamp("12 Jan 2023"), title="End Date")

var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)

float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph

if lastpp > 0
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))

var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)

//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)


// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 


if (buy and vrsi > overBought)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long)
    // strategy.close("Sell", "close Sell")

if (sell) and (strategy.position_size > 0)
    // strategy.entry("Sell", strategy.short)
    strategy.close("Buy", "Close Buy")

// if(sell and vrsi < overSold )
//     strategy.entry("Sell", strategy.short)

// if(buy) and (strategy.position_size > 0)
//     strategy.close("Sell", "close Sell")





더 많은