52주 최고가 및 최저가 포지션 확장 분석 시스템과 결합된 다단계 동적 MACD 추세 추적 정량적 전략

MACD MA EMA SMA RSI
생성 날짜: 2024-12-27 14:27:51 마지막으로 수정됨: 2024-12-27 14:27:51
복사: 0 클릭수: 94
1
집중하다
1166
수행원

52주 최고가 및 최저가 포지션 확장 분석 시스템과 결합된 다단계 동적 MACD 추세 추적 정량적 전략

개요

이 전략은 MACD 다단계 시간 프레임 교차 신호와 52주 고저동 동적 지지부진의 압력치를 결합한 양적 거래 시스템이다. 이 전략은 주경과 일계 두 시간 주기 MACD 지표 교차를 통해 거래 신호를 확인하고, 52주 고저동적 형성 동적 지지부진의 압력선을 활용하여 시장 움직임을 판단하는 데 도움을 주며, 더 안정적인 거래 결정을 가능하게 한다.

전략 원칙

이 전략은 다음과 같은 핵심 논리에 기반을 두고 있습니다.

  1. 입시 신호는 둘레 MACD 골드포크와 일선 MACD 골드포크에 의해 공동 확인되며, 두 시간 주기 MACD 지표가 모두 볼 수 있는 신호가 나타나도록 요구된다.
  2. 출구 신호는 일선 MACD 사각지대에 의해 촉발되며, 일선 MACD 지표에 사각지대가 나타나면 평상시 출장한다.
  3. 동적 스톱 손실은 출전 신호를 발동하는 날의 최저 가격 위치에 설정된다.
  4. 52주 하위 하위선은 사용자가 선택한 계산 기준 ((최고 최저 가격 또는 종식 가격) 에 따라 동적으로 생성되며, 오른쪽으로 확장하여 중요한 참조 지점을 형성한다.
  5. 전략은 5%의 포지션 관리를 채택하고, 단일 거래 비용은 1 통화 단위이다.

전략적 이점

  1. 다중 시간 프레임 확인: 둘레와 일선 두 층의 MACD 신호 공명으로 가짜 돌파구를 필터링하여 거래의 정확성을 향상시킵니다.
  2. 동적 지지 압력: 52주 하위/고위 경계는 중요한 시장 심리적 가격 지표를 제공하며, 트렌드의 강도를 판단하는데 도움이 된다.
  3. 리스크 통제: 동적 스톱스 메커니즘을 적용하여 시장의 변동에 따라 스톱스 위치를 조정하여 수익을 보호하는 목적에 도달합니다.
  4. 높은 가시성: 명확한 그래픽 인터페이스를 통해 중요한 가격과 신호를 표시하여 거래자가 이해하고 작동하기 쉽다.
  5. 체계화된 거래: 엄격한 출입규칙은 감정적인 방해를 방지하고 거래의 객관성을 향상시킵니다.

전략적 위험

  1. 흔들림 시장은 적용되지 않는다: 가로판 흔들림 시장에서, 자주 MACD 교차는 과도한 가짜 신호를 초래할 수 있다.
  2. 지연 위험: MACD 지표 자체는 지연성이 있으며, 최적의 입학 시기를 놓칠 수 있습니다.
  3. 자금 관리 위험: 고정 비율 포지션은 특정 시장 환경에서 충분히 유연하지 않을 수 있습니다.
  4. 시장 격차 위험: 큰 폭으로 상승할 경우 실제 스톱 손실 가격은 예상보다 훨씬 낮을 수 있습니다.
  5. 매개 변수 최적화 위험: 과잉 최적화 매개 변수는 과잉 적합 문제를 일으킬 수 있다.

전략 최적화 방향

  1. 양 가격 관계 분석을 도입: 기존의 MACD 신호를 기반으로 거래량을 증가시키는 것을 고려한다.
  2. 포지션 관리를 최적화: 시장의 변동성에 따라 더 유연한 포지션 관리 메커니즘을 설계합니다.
  3. 손해 차단 메커니즘을 개선: 이동 손해 차단 또는 ATR 기반의 동적 손해 차단을 추가하는 것이 고려될 수 있습니다.
  4. 시장 환경 필터링을 추가합니다: 트렌드 강도 지표를 도입하여 강한 트렌드 시장에서만 포지션을 개설합니다.
  5. 신호 필터링 메커니즘 개발: 더 엄격한 신호 확인 조건을 설계하여 가짜 신호를 줄인다.

요약하다

이 전략은 MACD 다시간 프레임 크로스 신호와 52주 고저의 동적인 지지부진 압박선을 결합하여 전체적인 트렌드 추적 거래 시스템을 구축한다. 이 전략의 장점은 신호 확인의 신뢰성과 위험 통제의 완전성에 있다. 그러나 여전히 불안한 시장과 뒤처진 위험에 대한 주의가 필요하다. 이 전략은 지속적인 최적화와 개선으로 트렌드 시장에서 안정적인 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("MACD Bitcoin strategy con 52W High/Low (linee estese)", overlay=true)

// === MACD SETTINGS ===
fastLength = 12
slowLength = 26
signalSmoothing = 9

// Funzione per ottenere i valori MACD
getMACD(source, timeframe) =>
    [macdLine, signalLine, _] = ta.macd(source, fastLength, slowLength, signalSmoothing)
    [macdLine, signalLine]

// Valori MACD Settimanali
[macdWeekly, signalWeekly] = request.security(syminfo.tickerid, "W", getMACD(close, "W"), lookahead=barmerge.lookahead_on)

// Valori MACD Giornalieri
[macdDaily, signalDaily] = getMACD(close, "D")

// Variabile per lo stop loss
var float lowOfSignalCandle = na

// Condizione per l'ingresso
longConditionWeekly = ta.crossover(macdWeekly, signalWeekly)
exitConditionDaily = ta.crossunder(macdDaily, signalDaily)

// Imposta Stop Loss sulla candela giornaliera
if (exitConditionDaily)
    lowOfSignalCandle := low

// Condizione di ingresso nel trade
enterTradeCondition = macdWeekly > signalWeekly and ta.crossover(macdDaily, signalDaily)

if (enterTradeCondition)
    strategy.entry("MACD Long", strategy.long)

if (not na(lowOfSignalCandle))
    strategy.exit("Stop Loss", "MACD Long", stop=lowOfSignalCandle)

if (strategy.position_size == 0)
    lowOfSignalCandle := na

// // === 52 WEEK HIGH/LOW SETTINGS ===
// // Input per selezionare tra Highs/Lows o Close
// high_low_close = input.string(defval="Highs/Lows", title="Base 52 week values on candle:", options=["Highs/Lows", "Close"])

// // Calcolo dei valori delle 52 settimane
// weekly_hh = request.security(syminfo.tickerid, "W", ta.highest(high, 52), lookahead=barmerge.lookahead_on)
// weekly_ll = request.security(syminfo.tickerid, "W", ta.lowest(low, 52), lookahead=barmerge.lookahead_on)
// weekly_hc = request.security(syminfo.tickerid, "W", ta.highest(close, 52), lookahead=barmerge.lookahead_on)
// weekly_lc = request.security(syminfo.tickerid, "W", ta.lowest(close, 52), lookahead=barmerge.lookahead_on)

// // Selezione dei valori in base all'input
// high_plot = high_low_close == "Highs/Lows" ? weekly_hh : weekly_hc
// low_plot = high_low_close == "Highs/Lows" ? weekly_ll : weekly_lc

// // === LINEE ORIZZONTALI ESTESE FINO AL PREZZO ATTUALE ===
// var line highLine = na
// var line lowLine = na

// // Linea Orizzontale per il 52W High
// if (na(highLine))
//     highLine := line.new(bar_index, high_plot, bar_index + 1, high_plot, color=color.green, width=2, style=line.style_dashed, extend=extend.right)
// else
//     line.set_y1(highLine, high_plot)
//     line.set_y2(highLine, high_plot)

// // Linea Orizzontale per il 52W Low
// if (na(lowLine))
//     lowLine := line.new(bar_index, low_plot, bar_index + 1, low_plot, color=color.red, width=2, style=line.style_dashed, extend=extend.right)
// else
//     line.set_y1(lowLine, low_plot)
//     line.set_y2(lowLine, low_plot)

// // Etichette per le linee orizzontali
// var label highLabel = na
// var label lowLabel = na

// if (na(highLabel))
//     highLabel := label.new(bar_index, high_plot, "52W High", color=color.green, textcolor=color.white, style=label.style_label_down, size=size.small)
// else
//     label.set_y(highLabel, high_plot)
//     label.set_x(highLabel, bar_index)

// if (na(lowLabel))
//     lowLabel := label.new(bar_index, low_plot, "52W Low", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.small)
// else
//     label.set_y(lowLabel, low_plot)
//     label.set_x(lowLabel, bar_index)

// // Tracciamento delle Linee Estese
// plot(high_plot, title="52W High", color=color.green, style=plot.style_linebr)
// plot(low_plot, title="52W Low", color=color.red, style=plot.style_linebr)