동적 적응 모멘텀 브레이크아웃 전략

ATR EMA MOM
생성 날짜: 2024-07-29 14:36:32 마지막으로 수정됨: 2024-07-29 14:36:32
복사: 0 클릭수: 464
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

동적 적응 모멘텀 브레이크아웃 전략

개요

동적 자기 적응 동력 돌파 전략 (Dynamic Adaptive Momentum Breakthrough Strategy) 은 동적 자기 적응 동력 지표와 그래프 형태를 이용한 고급 정량화 거래 전략이다. 이 전략은 동적으로 동력 주기를 조정하여 시장의 변동에 적응하고, 여러 필터링 조건을 결합하여 높은 확률의 트렌드 돌파 기회를 식별한다. 전략의 핵심은 시장 동력의 변화를 포착하는 데 있으며, 동시에 침수 형태를 진입 신호로 사용하여 거래의 정확성과 수익성을 향상시킨다.

전략 원칙

  1. 동적 주기 조정:

    • 전략은 적응 동력 지표를 사용하여 시장의 변동성 동력에 따라 계산 주기를 조정한다.
    • 높은 변동 기간 동안, 주기는 시장 변화에 신속하게 대응하기 위해 단축됩니다. 낮은 변동 기간 동안, 주기는 과도한 거래를 피하기 위해 연장됩니다.
    • 주기 범위는 10에서 40 사이로 설정되어 있으며, ATR 지표로 변동 상태를 판단한다.
  2. 동력 계산과 평형:

    • 동적주기를 이용한 동력지수
    • 동량을 EMA 부드럽게 처리할 수 있고, 기본적으로 7주기 EMA를 사용한다.
  3. 트렌드 판단:

    • 동력 기울기를 계산하여 트렌드 방향을 결정합니다.
    • 긍정적인 기울기는 상승세를 나타내고, 부정적인 기울기는 하락세를 나타낸다.
  4. 이 사진의 제목은 “Swallowing Form Recognition”입니다.

    • 사용자 정의 함수를 사용하여 상장과 하락의 삼키는 형태를 식별한다.
    • 현재 과 이전 의 오픈 가격, 클로징 가격 관계를 고려한다.
    • 최소 실체 크기의 필터를 도입하여 형태의 신뢰성을 높였다.
  5. 거래 신호 생성:

    • 다중중 신호: 삼킨 형태 + 양동력 기울기.
    • 허공 신호: 하락 삼킨 형태 + 마이너스 동력 경사.
  6. 거래 관리:

    • 신호 확인 후 다음 K 선이 열릴 때 진입한다.
    • 고정 포지션 사이클 (기본 3개의 K선) 이후 자동 평점

전략적 이점

  1. 적응력:

    • 동적으로 동력 주기를 조정하여 다른 시장 환경에 적응한다.
    • 높은 변동성 기간에 신속한 대응, 낮은 변동성 기간에 과도한 거래를 피한다.
  2. 다중 인증 메커니즘:

    • 기술 지표 ((동력) 과 가격 형태 ((호수)) 를 결합하여 신호 신뢰도를 높인다.
    • 기울기 및 크기를 필터링하여 잘못된 신호를 줄여줍니다.
  3. 정확한 입국 시간:

    • 이 포커는 트렌드 전환점을 포착하기 위한 포커 형태를 사용합니다.
    • 동력 경사율과 결합하여 신흥 트렌드에 진입하는 것을 보장합니다.
  4. 위험 관리:

    • 고정 지주주기, 과도한 보유로 인한 철수를 방지한다.
    • 엔터티 크기를 필터링하여 미세한 변동으로 인한 잘못된 판단을 줄여줍니다.
  5. 유연하고 맞춤형:

    • 다양한 시장 및 시간 프레임에 최적화 할 수 있는 여러 조정 가능한 매개 변수
    • 선택적 EMA 평평 기능, 균형 감수성 및 안정성.

전략적 위험

  1. 가짜 해킹 위험:

    • 상자 시장에서 빈번한 가짜 브레이크 신호가 발생할 수 있습니다.
    • 완화 방법: 이동 평균의 교차와 같은 추가적인 추세 확인 지표를 추가합니다.
  2. 미성년자 문제:

    • EMA 평준화를 사용하면 신호가 지연되어 최적의 입구 지점을 놓치게 될 수 있다.
    • 완화 방법: EMA 주기를 조정하거나 더 민감한 평형 방법을 사용하는 것을 고려하십시오.
  3. 고정 탈퇴 메커니즘의 한계:

    • 고정 주기 탈퇴는 수익 트렌드를 조기 종료하거나 손실을 연장할 수 있다.
    • 완화 방법: 동적 스톱 스톱을 도입하여, 추적 스톱이나 변동률에 기반한 탈퇴를 실시한다.
  4. 한 시간 틀에 지나치게 의존하는 것:

    • 전략은 더 큰 시간 프레임의 전체적인 경향을 무시할 수 있습니다.
    • 완화 방법: 더 큰 추세와 일치하는 거래 방향을 보장하기 위해 다중 시간 프레임 분석을 도입하십시오.
  5. 변수 민감성:

    • 너무 많은 조정 가능한 매개 변수는 과도한 역사 데이터 일치로 이어질 수 있다.
    • 완화 방법: 단계적 최적화와 크로스 샘플 테스트를 사용하여 매개 변수 안정성을 검증한다.

전략 최적화 방향

  1. 다중 시간 프레임 통합:

    • 더 큰 시간 프레임의 트렌드 판단을 도입하고 주 트렌드 방향으로만 거래하십시오.
    • 그 이유는 거래의 전반적인 성공률을 높이고 역동적인 거래를 피하기 위해서다.
  2. 동적 정지 손실:

    • ATR 또는 동력 변화 기반의 동적 상실을 구현한다.
    • 트렌드 스톱을 사용하여 트렌드 수익을 극대화하십시오.
    • 이유: 시장의 변동에 적응하고, 수익을 보호하고, 철수량을 줄입니다.
  3. 볼륨 프로파일 분석:

    • 볼륨 프로파일을 통합하여 핵심 지지 저항 지점을 식별한다.
    • 이유: 입점 위치의 정확성을 높이고, 무효 상태에서 브레이크 위치 거래를 피한다.
  4. 기계학습 최적화:

    • 기계학습 알고리즘을 사용하여 동적으로 조정하는 파라미트.
    • 그 이유는 전략의 지속적인 적응과 장기적인 안정성입니다.
  5. 감정 지표 통합:

    • 시장의 감정 지표, 예를 들어 VIX 또는 옵션의 암시 변동률을 도입하십시오.
    • 이유: 극심한 감정에 대처하고 과도한 거래를 피하기 위한 전략적 행동
  6. 관련성 분석:

    • 여러 관련 자산의 동시 이동을 고려하십시오.
    • 그 이유는 신호의 신뢰성을 높이고 시장의 강력한 추세를 식별하기 위해서다.

요약하다

동적 자기 적응 동력 돌파 전략은 기술 분석과 정량화 방법을 결합한 고급 거래 시스템이다. 동적으로 동력 주기를 조정하고, 삼림 형태를 식별하고, 여러 필터링 조건을 결합함으로써, 이 전략은 다양한 시장 환경에서 고 확률의 트렌드 돌파 기회를 적응적으로 포착할 수 있다. 가짜 돌파구와 변수 감수성과 같은 일부 고유한 위험이 있지만, 여러 시간 프레임 분석, 동적 위험 관리 및 기계 학습 응용과 같은 제안 된 최적화 방향을 통해 전략은 안정성과 수익성을 더욱 향상시킬 잠재력을 가지고 있다.

전략 소스 코드
/*backtest
start: 2024-06-28 00:00:00
end: 2024-07-28 00:00:00
period: 1h
basePeriod: 15m
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/
// © ironperol
//@version=5
strategy("Adaptive Momentum Strategy", overlay=true, margin_long=100, margin_short=100)

// Input parameters for customization
src = input.source(close, title="Source")
min_length = input.int(10, minval=1, title="Minimum Length")
max_length = input.int(40, minval=1, title="Maximum Length")
ema_smoothing = input.bool(true, title="EMA Smoothing")
ema_length = input.int(7, title="EMA Length")
percent = input.float(2, title="Percent of Change", minval=0, maxval=100) / 100.0

// Separate body size filters for current and previous candles
min_body_size_current = input.float(0.5, title="Minimum Body Size for Current Candle (as a fraction of previous body size)", minval=0)
min_body_size_previous = input.float(0.5, title="Minimum Body Size for Previous Candle (as a fraction of average body size of last 5 candles)", minval=0)

close_bars = input.int(3, title="Number of Bars to Hold Position", minval=1) // User-defined input for holding period

//######################## Calculations ##########################

// Initialize dynamic length variable
startingLen = (min_length + max_length) / 2.0
var float dynamicLen = na
if na(dynamicLen)
    dynamicLen := startingLen

high_Volatility = ta.atr(7) > ta.atr(14)

if high_Volatility
    dynamicLen := math.max(min_length, dynamicLen * (1 - percent))
else
    dynamicLen := math.min(max_length, dynamicLen * (1 + percent))

momentum = ta.mom(src, int(dynamicLen))
value = ema_smoothing ? ta.ema(momentum, ema_length) : momentum

// Calculate slope as the difference between current and previous value
slope = value - value[1]

// Calculate body sizes
currentBodySize = math.abs(close - open)
previousBodySize = math.abs(close[1] - open[1])

// Calculate average body size of the last 5 candles
avgBodySizeLast5 = math.avg(math.abs(close[1] - open[1]), math.abs(close[2] - open[2]), math.abs(close[3] - open[3]), math.abs(close[4] - open[4]), math.abs(close[5] - open[5]))

//######################## Long Signal Condition ##########################

// Function to determine if the candle is a bullish engulfing
isBullishEngulfing() =>
    currentOpen = open
    currentClose = close
    previousOpen = open[1]
    previousClose = close[1]
    isBullish = currentClose >= currentOpen
    wasBearish = previousClose <= previousOpen
    engulfing = currentOpen <= previousClose and currentClose >= previousOpen
    bodySizeCheckCurrent = currentBodySize >= min_body_size_current * previousBodySize
    bodySizeCheckPrevious = previousBodySize >= min_body_size_previous * avgBodySizeLast5
    isBullish and wasBearish and engulfing and bodySizeCheckCurrent and bodySizeCheckPrevious

// Long signal condition
longCondition = isBullishEngulfing() and slope > 0

// Plotting long signals on chart
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="Long", title="Long Condition")

// Alerts for long condition
if (longCondition)
    alert("Long condition met", alert.freq_once_per_bar_close)

//######################## Short Signal Condition ##########################

// Function to determine if the candle is a bearish engulfing
isBearishEngulfing() =>
    currentOpen = open
    currentClose = close
    previousOpen = open[1]
    previousClose = close[1]
    isBearish = currentClose <= currentOpen
    wasBullish = previousClose >= previousOpen
    engulfing = currentOpen >= previousClose and currentClose <= previousOpen
    bodySizeCheckCurrent = currentBodySize >= min_body_size_current * previousBodySize
    bodySizeCheckPrevious = previousBodySize >= min_body_size_previous * avgBodySizeLast5
    isBearish and wasBullish and engulfing and bodySizeCheckCurrent and bodySizeCheckPrevious

// Short signal condition
shortCondition = isBearishEngulfing() and slope < 0

// Plotting short signals on chart
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="Short", title="Short Condition")

// Alerts for short condition
if (shortCondition)
    alert("Short condition met", alert.freq_once_per_bar_close)

//######################## Trading Logic ##########################

// Track the bar number when the position was opened
var int longEntryBar = na
var int shortEntryBar = na

// Enter long trade on the next candle after a long signal
if (longCondition and na(longEntryBar))
    strategy.entry("Long", strategy.long)
    longEntryBar := bar_index + 1

// Enter short trade on the next candle after a short signal
if (shortCondition and na(shortEntryBar))
    strategy.entry("Short", strategy.short)
    shortEntryBar := bar_index + 1

// Close long trades `close_bars` candles after entry
if (not na(longEntryBar) and bar_index - longEntryBar >= close_bars)
    strategy.close("Long")
    longEntryBar := na

// Close short trades `close_bars` candles after entry
if (not na(shortEntryBar) and bar_index - shortEntryBar >= close_bars)
    strategy.close("Short")
    shortEntryBar := na