ADX 트렌드 돌파 모멘텀 트레이딩 전략

ADX DMI MA ATR
생성 날짜: 2024-11-28 15:44:59 마지막으로 수정됨: 2024-11-28 15:44:59
복사: 0 클릭수: 583
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ADX 트렌드 돌파 모멘텀 트레이딩 전략

개요

이것은 평균 트렌드 지표 ((ADX) 와 가격 돌파구를 기반으로 한 양적 거래 전략이다. 이 전략은 주로 ADX 지표 수치를 모니터링하여 시장 트렌드 강도를 판단하고, 가격 돌파구 신호와 결합하여 시장 동력을 포착한다. 이 전략은 특정 거래 시간 내에 작동하도록 설정되어 있으며, 중지 손실과 매일 거래 횟수 제한을 통해 위험 관리를 수행한다.

전략 원칙

전략의 핵심 논리에는 다음과 같은 핵심 요소가 포함됩니다.

  1. ADX 지수 모니터링: ADX 지수를 사용하여 시장 트렌드 강도를 평가합니다. ADX 값이 17.5보다 낮으면 시장이 새로운 트렌드를 형성할 가능성이 있음을 나타냅니다.
  2. 가격 돌파 판단: 이 전략은 지난 34주기의 최고 종료 가격을 추적하고, 현재 가격이 이 저항 지점을 돌파했을 때 거래 신호를 발동한다.
  3. 거래 시간 관리: 전략은 낮은 유동성 시기의 위험을 피하기 위해 지정된 거래 시간 (0730-1430) 내에서만 작동합니다.
  4. 리스크 관리 장치:
    • 단일 거래 손실을 제한하기 위해 고정 달러 스톱을 설정합니다.
    • 한 거래 시점에 최대 3건의 거래 제한
    • 거래시간이 끝나면 자동으로 모든 지분을 매기죠.

전략적 이점

  1. 트렌드 캡처 능력: ADX 지표와 가격 돌파구가 결합되어 시장의 초기 트렌드를 효과적으로 식별할 수 있다.
  2. 리스크 관리: 고정된 손실, 거래 수 제한 및 자동 폐지 장치와 같은 다단계 리스크 제어 조치를 포함합니다.
  3. 높은 자동화: 전략 논리가 명확하고, 완전히 자동화 된 거래가 이루어지고, 인적 개입이 필요하지 않습니다.
  4. 유연성: 상이한 시장 상황에 따라 중지 금액, 회수 주기 등과 같은 매개 변수를 조정할 수 있다.

전략적 위험

  1. 가짜 브레이크아웃 위험: 흔들리는 시장에서 가짜 브레이크아웃이 발생할 수 있으며, 이로 인해 연속적인 손실이 발생할 수 있다.
  2. 매개 변수 의존성: 전략 효과는 ADX 값과 회귀 주기 설정에 크게 의존한다.
  3. 시간 제한: 특정 시간대에만 거래할 수 있고 다른 시간대에 거래할 수 있는 기회를 놓칠 수 있다.
  4. 스톱 손실 설정: 고정 달러 스톱 손실은 다양한 변동률 환경에서 충분히 유연하지 않을 수 있습니다.

전략 최적화 방향

  1. 동적 중지: 다른 시장 변동 환경에 적응하기 위해 고정 된 달러 중지를 ATR 기반의 동적 중지로 변경하는 것이 좋습니다.
  2. 시장 환경 필터: 변동률 필터를 추가하여 높은 변동률 환경에서 거래를 조정하거나 중지하십시오.
  3. 입시 최적화: 거래량 확인을 늘리고, 돌파 신호의 신뢰성을 높이는 것을 고려할 수 있다.
  4. 동적 변수 조정: ADX 시점과 회귀 사이클의 적응 조정 메커니즘을 구현한다.

요약하다

이것은 구조적이고 논리적으로 명확한 트렌드 추적 전략이다. ADX 지표와 가격 돌파구를 결합하여 효과적인 위험 관리 프레임 워크 아래에서 시장 트렌드 기회를 포착한다. 일부 최적화 공간이 있지만 전략의 기본 프레임 워크는 양적 거래 시스템의 기본 구성 요소로 적합하며 전략의 기본 프레임 워크는 견고하다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
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/
// © HuntGatherTrade
// ========================
// NQ 30 minute, ES 30 minute

//@version=5
strategy("ADX Breakout", overlay=false, initial_capital=25000, default_qty_value=1)

// ===============================
// Input parameters
// ===============================
stopLoss = input(1000.0, title="Stop Loss ($)", group="Exits")
session = input("0730-1430:1234567", group="Trade Session")
highestLB = input(34, title="Highest lookback window", group="Indicator values")

// ===============================
// Trade Session Handling
// ===============================
t = time(timeframe.period, session)

// Reset numTrades at the start of each session
var int numTrades = 0
is_new_session = ta.change(time("D")) != 0
if is_new_session
    numTrades := 0

// ===============================
// Entry Conditions
// ===============================
[plusDI, minusDI, adxValue] = ta.dmi(50, 14)
entryCondition = (close >= ta.highest(close, highestLB)[1]) and (adxValue < 17.5) and (strategy.position_size == 0) and (numTrades < 3) and not na(t)

// ===============================
// 7. Execute Entry
// ===============================
var float stopPricePlot = na

if entryCondition
    entryPrice = close + syminfo.mintick
    strategy.entry("Long Entry", strategy.long, stop=entryPrice)
    //stopPrice = strategy.position_avg_price - (stopLoss / syminfo.pointvalue)
    //strategy.exit("Stop Loss", "Long Entry", stop=stopPrice)
    numTrades += 1

if (strategy.position_size > 0) and (strategy.position_size[1] == 0)
    stopPoints = stopLoss / syminfo.pointvalue
    stopPrice = strategy.position_avg_price - stopPoints
    stopPrice := math.round(stopPrice / syminfo.mintick) * syminfo.mintick
    strategy.exit("Stop Loss", from_entry="Long Entry", stop=stopPrice)


if ta.change(strategy.opentrades) == 1
    float entryPrice = strategy.opentrades.entry_price(0)
    stopPricePlot := entryPrice - (stopLoss / syminfo.pointvalue)

if ta.change(strategy.closedtrades) == 1
    stopPricePlot   := na

plot(stopPricePlot, "Stop-loss level", color.red, 1, plot.style_linebr)

// ===============================
// Exit at End of Session
// ===============================
if na(t) and strategy.position_size != 0
    strategy.close_all(comment="End of Day Exit")