슈퍼트렌드 지지선과 저항선, ADX 지표를 기반으로 한 고빈도 트레이딩 전략


생성 날짜: 2024-02-19 15:01:36 마지막으로 수정됨: 2024-02-19 15:01:36
복사: 1 클릭수: 871
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

슈퍼트렌드 지지선과 저항선, ADX 지표를 기반으로 한 고빈도 트레이딩 전략

개요

이 전략은 하이프레임 트레이딩을 구현하기 위해 초 트렌드 지원 저항선과 ADX 지표를 통합적으로 사용합니다. 초 트렌드 지원 저항선은 최신 지원 저항점을 동적으로 계산하여 가격 트렌드를 판단하고 거래 신호를 발송합니다. ADX 지표는 트렌드 강도를 판단하고 ADX 값을 필터링 조건으로 설정하여 트렌드가 충분히 강할 때만 거래 신호를 발송합니다.

전략 원칙

  1. 지원 저항선을 계산한다. 종점 가격을 기준으로 하향에 ATR의 1개를 더한다. 가격이 이 선을 넘으면 트렌드 반전으로 판단한다.

  2. ADX 지표는 트렌드 강도를 판단한다. ADX가 설정값보다 높을 때, 트렌드가 충분히 강하다고 생각한다.

  3. 둘을 결합하여 거래 신호를 발산한다. ADX가 충분히 커서 지지를 통과할 때만 더 많은 공백을 한다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 초 트렌드 라인 동적 계산은 저항을 지원하고, 돌파구를 빠르게 판단할 수 있다.

  2. ADX 지표는 비 트렌드 시나리오를 효과적으로 필터링하여 유효하지 않은 거래를 줄인다.

  3. 이 부분의 본문은 “미국”입니다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. 하지만, 이 기하급수적인 흐름은 매우 큰 폭으로 상승할 수 있습니다.

  2. ADX값을 잘못 설정하면 정책 성능에도 영향을 미칩니다.

  3. 높은 주파수 거래는 거래비용이 높습니다.

대응방법:

  1. 초변수를 최적화하고, 돌파폭을 적절히 완화한다.

  2. ADX 변수를 테스트하는 것이 좋습니다.

  3. 거래 빈도를 적절히 낮추십시오.

최적화 방향

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

  1. ATR 배수 파라미터를 최적화하여 지지 저항선을 더욱 안정화한다.

  2. 다양한 ADX 변수를 테스트하여 최적의 값을 찾아보세요.

  3. 단편적 손실을 통제하기 위해 Stop Loss 메커니즘에 가입하십시오.

요약하다

이 전략은 초 트렌드 라인 및 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)