ADX 동적 지표와 결합된 개장 및 마감 이동 평균 교차의 양적 거래 전략

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
생성 날짜: 2025-02-18 13:35:54 마지막으로 수정됨: 2025-02-18 13:35:54
복사: 1 클릭수: 445
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ADX 동적 지표와 결합된 개장 및 마감 이동 평균 교차의 양적 거래 전략

개요

이 전략은 SMMA, EMA, DEMA 등 여러 가지 이동 평균 라인 유형을 사용하여, 평평선 교차점을 식별하여 시장 추세 변화를 포착하고, ADX 지표를 사용하여 추세 강도를 확인하여 거래의 신뢰성을 향상시킵니다.

전략 원칙

전략의 핵심 논리는 오픈 가격과 클로징 가격의 이동 평균을 계산하여, 클로징 가격 평균이 오픈 가격 평균을 상향으로 가로질러 ADX 값이 설정 값보다 크면, 다중 신호를 발생시키고, 클로징 가격 평균이 오픈 가격 평균을 상향으로 가로질러 ADX 값이 설정 값보다 크면, 공백 신호를 발생시킨다. 전략은 간단한 이동 평균 (SMA), 지수 이동 평균 (EMA), 이중 지수 이동 평균 (EMAD) 등 다양한 이동 평균 계산 방법을 지원하며, 시장 특성에 따라 가장 적합한 평균 유형을 선택할 수 있습니다.

전략적 이점

  1. 유연성: 다양한 이동 평균 라인 유형을 지원하여 시장 환경에 따라 최적의 평균 라인 계산 방법을 선택할 수 있습니다.
  2. 트렌드 확인: ADX 지표 필터링으로, 흔들리는 시장의 가짜 신호를 효과적으로 줄일 수 있습니다.
  3. 리스크 관리가 완성된: 스톱로스 및 스톱 스 기능을 포함하여 거래 당 리스크를 효과적으로 제어할 수 있다
  4. 고도의 사용자 정의: 평균주기, ADX 마이너스, 거래 방향 등과 같은 여러 파라미터 인터페이스를 제공하여 전략을 최적화할 수 있습니다.
  5. 다중 시간 주기를 지원합니다: 다른 시간 주기에 실행할 수 있으며, 다른 거래 스타일에 적합합니다.

전략적 위험

  1. 평균 지연성: 이동 평균은 본질적으로 지연 지표이며, 빠르게 변동하는 시장에서 지연 신호를 일으킬 수 있습니다.
  2. 가짜 브레이크 위험: ADX 필터링이 있음에도 불구하고 시장의 흔들림에 따라 평균적인 가짜 브레이크가 발생할 수 있습니다.
  3. 매개 변수 민감성: 전략 효과는 매개 변수 설정에 민감하며, 다른 시장 환경에 따라 적절히 조정해야 합니다.
  4. 시장 적응성: 트렌드가 뚜렷한 시장에서 더 잘 작동하지만, 불안정한 시장에서는 자주 거래될 수 있습니다.
  5. 계산 복잡성: 여러 개의 평균선 타입의 계산은 시스템 부하를 증가시킬 수 있으며, 운영 효율성에 주의가 필요합니다.

전략 최적화 방향

  1. 볼륨 지표 소개: 볼륨 변화를 결합하면 추세의 효과를 확인할 수 있습니다.
  2. ADX 매개 변수를 최적화: 다양한 시장 주기적 동성에 따라 ADX 마이너스를 조정
  3. 트렌드 확인 지표를 추가: 신호 신뢰성을 높이기 위해 다른 트렌드 지표를 추가하는 것을 고려할 수 있습니다.
  4. 손해 차단 메커니즘의 개량: 추적 손해 차단 또는 변동률 적응 손해 차단을 도입
  5. 거래 시간을 최적화: 시장의 변동성과 유동성을 고려하여 최적의 거래 시간을 선택하십시오.

요약하다

이것은 ADX 지표와 클래식 평행선 교차 전략을 결합한 양적 거래 시스템이다. 여러 평행선 유형의 지원과 ADX 트렌드 확인을 통해 시장 추세를 더 잘 파악할 수 있으며, 완벽한 위험 제어 장치를 갖추고 있다. 전략은 커스터마이징성이 강하며, 다양한 시장 환경에 따라 최적의 조정을 할 수 있다. 일부 고유한 위험이 있지만, 합리적인 매개 변수 설정과 지속적인 최적화를 통해 전략은 좋은 실용적 가치를 가지고 있다.

전략 소스 코드
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © algostudio

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===