ADX 필터링된 슈퍼트렌드 피보트 거래 전략

저자:차오장날짜: 2024-02-19 15:01:36
태그:

img

전반적인 설명

이 전략은 슈퍼트렌드 피보트 포인트와 ADX 지표를 결합하여 고주파 거래를 수행합니다. 슈퍼트렌드 라인은 가격 트렌드를 결정하고 거래 신호를 생성하기 위해 최신 지원 및 저항 수준을 동적으로 계산합니다. ADX 지표는 트렌드 강도를 측정하고 필터로 작용하며 트렌드가 충분히 강할 때만 거래를합니다.

전략 논리

  1. 피보트 지원 및 저항 라인을 계산합니다. 닫기 가격을 받아 ATR 범위를 위와 아래로 더하거나 빼십시오. 이러한 라인의 파열은 트렌드 반전을 나타냅니다.

  2. ADX는 트렌드 강도를 결정합니다. 높은 ADX 값은 강한 트렌드를 나타냅니다.

  3. 거래 신호를 위해 둘을 결합하십시오. 피보트 브레이크와 높은 ADX에서만 장거리 / 단위로 이동하십시오.

이점 분석

이 전략의 장점:

  1. 역동적인 슈퍼트렌드 라인은 급격히 돌파구를 식별합니다.

  2. ADX 필터는 범위에 묶인 시장에서 잘못된 신호를 피합니다.

  3. 좋은 리스크/리워드 비율과 마감 통제

위험 분석

이 전략의 위험:

  1. 간격 움직임은 슈퍼 트렌드 라인을 무효화시킬 수 있습니다.

  2. ADX 임계값을 제대로 설정하지 못하면 성능에 영향을 미칩니다.

  3. 높은 거래 빈도는 거래 비용을 증가시킵니다.

해결책:

  1. 더 넓은 범위를 허용하기 위해 매개 변수를 최적화하십시오.

  2. 더 나은 ADX 값을 테스트합니다.

  3. 거래 빈도를 줄여라

최적화 방향

개선 할 수 있는 영역:

  1. 더 견고한 선들을 위해 ATR 곱셈을 최적화하세요.

  2. 다른 ADX 매개 변수를 테스트합니다.

  3. 손실을 제한하기 위해 스톱 로스를 추가합니다.

결론

이 전략은 슈퍼트렌드와 ADX의 강점을 결합하여 ADX에 의해 품질에 대해 필터링된 높은 확률의 트렌드 반전 지점을 식별합니다. 매개 변수 조정 및 메커니즘 조정으로 안정적으로 수익을 창출하는 고주파 전략이 될 수 있습니다.


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

//@version=4
strategy("STPP20 + ADX", overlay = true)

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

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50)
AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1)
AtrPd=input(defval = 20, title = "ATR Period", minval=1)

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

float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

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

float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? 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 = 25
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? 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 = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, lenADX)


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

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


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

if (buy)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long)


if (sell) and (strategy.position_size > 0)
    strategy.order("Sell", false, when = sell)

더 많은