리소스 로딩... 로딩...

이중 MACD 가격 행동 브레이크 트래일링 전략

저자:차오장, 날짜: 2024-11-25 11:15:50
태그:MACDATR

img

전반적인 설명

이 전략은 이중 MACD 지표와 가격 행동 분석을 결합한 거래 전략이다. 이 전략은 15 분 시간 프레임에서 MACD 히스토그램의 색상 변화를 통해 시장 추세를 식별하고, 5 분 시간 프레임에서 강력한 촛불 패턴을 찾고, 1 분 시간 프레임에서 브레이크 아웃 신호를 확인합니다. ATR 기반의 동적 스톱 로스 및 트레이일링 취리 메커니즘을 사용하여 수익 잠재력을 극대화하면서 위험을 효과적으로 관리합니다.

전략 원칙

이 전략은 시장 트렌드를 확인하기 위해 다른 매개 변수 (34/144/9 및 100/200/50) 를 가진 두 개의 MACD 지표를 사용합니다. 두 MACD 히스토그램이 동일한 색상 트렌드를 보여주면 시스템은 5 분 차트에서 1.5 배 더 큰 몸으로 특징인 강력한 촛불 패턴을 찾습니다. 강력한 촛불이 확인되면 시스템은 1 분 차트에서 브레이크를 모니터링합니다. 가격이 상승 추세에서 최고 또는 하락 추세에서 최저를 넘을 때 포지션은 열립니다. 스톱은 ATR에 따라 설정되며, 동적 인 취리 수익에 1.5x ATR 배수가 사용됩니다.

전략적 장점

  1. 멀티 타임프레임 분석: 신호 신뢰성을 향상시키기 위해 15분, 5분 및 1분 시간 프레임을 결합합니다.
  2. 트렌드 확인: 잘못된 신호를 줄이기 위해 MACD 이중 교차 검증을 사용합니다.
  3. 가격 행동 분석: 강력한 촛불 패턴을 통해 주요 가격 수준을 식별합니다.
  4. 동적 리스크 관리: ATR에 기반한 적응적 스톱 로스 및 후속 영업 메커니즘
  5. 신호 필터링: 엄격한 입시 조건으로 거짓 거래가 감소
  6. 높은 자동화: 완전 자동화 된 거래는 인간 개입을 줄입니다.

전략 위험

  1. 트렌드 역전 위험: 매우 변동성 있는 시장에서 가짜 파업이 가능합니다.
  2. 슬라이드 리스크: 1분 시간 프레임에서 높은 주파수 거래에서 슬라이드 리스크가 발생할 수 있습니다.
  3. 과잉 거래 위험: 빈번한 신호는 과도한 거래로 이어질 수 있습니다.
  4. 시장 환경 의존성: 다른 시장에서 실적이 떨어질 수 있습니다. 완화 조치:
  • 트렌드 필터를 추가
  • 최소 변동성 기준을 설정
  • 거래 빈도 제한을 적용
  • 시장 환경 인식 도입

최적화 방향

  1. MACD 매개 변수 최적화: 시장 특성에 따라 MACD 매개 변수를 조정
  2. 스톱 로스 최적화: 변동성 기반의 동적 스톱을 추가하는 것을 고려하십시오.
  3. 거래 시간 필터: 거래 창 제한을 추가
  4. 포지션 관리: 확장 된 입출장 메커니즘을 구현
  5. 시장 환경 필터링: 트렌드 강도 지표를 추가합니다.
  6. 유출 통제: 주식 곡선 기반의 위험 통제를 도입

요약

이 전략 시스템은 기술 분석과 리스크 관리를 결합한 포괄적인 전략 시스템이다. 다중 시간 프레임 분석과 엄격한 신호 필터링을 통해 거래 품질을 보장하며 동적인 스톱과 후속 수익을 통해 위험을 효과적으로 관리합니다. 전략은 강력한 적응력을 보이지만 시장 조건에 따라 지속적인 최적화를 요구합니다. 라이브 거래에 대한 철저한 백테스팅과 매개 변수 최적화와 특정 시장 특성에 따른 조정과 함께 권장됩니다.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-11-24 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
strategy("Price Action + Double MACD Strategy with ATR Trailing", overlay=true)

// Inputs for MACD
fastLength1 = input.int(34, title="First MACD Fast Length")
slowLength1 = input.int(144, title="First MACD Slow Length")
signalLength1 = input.int(9, title="First MACD Signal Length")

fastLength2 = input.int(100, title="Second MACD Fast Length")
slowLength2 = input.int(200, title="Second MACD Slow Length")
signalLength2 = input.int(50, title="Second MACD Signal Length")

// Input for ATR Trailing
atrMultiplier = input.float(1.5, title="ATR Multiplier for Trailing")

// Inputs for Stop Loss
atrStopMultiplier = input.float(1.0, title="ATR Multiplier for Stop Loss")

// MACD Calculations
[macdLine1, signalLine1, macdHist1] = ta.macd(close, fastLength1, slowLength1, signalLength1)
[macdLine2, signalLine2, macdHist2] = ta.macd(close, fastLength2, slowLength2, signalLength2)

// Get 15M MACD histogram colors
macdHist1Color = request.security(syminfo.tickerid, "15", (macdHist1 >= 0 ? (macdHist1[1] < macdHist1 ? #26A69A : #B2DFDB) : (macdHist1[1] < macdHist1 ? #FFCDD2 : #FF5252)))
macdHist2Color = request.security(syminfo.tickerid, "15", (macdHist2 >= 0 ? (macdHist2[1] < macdHist2 ? #26A69A : #B2DFDB) : (macdHist2[1] < macdHist2 ? #FFCDD2 : #FF5252)))

// Check MACD color conditions
isMacdUptrend = macdHist1Color == #26A69A and macdHist2Color == #26A69A
isMacdDowntrend = macdHist1Color == #FF5252 and macdHist2Color == #FF5252

// Function to detect strong 5M candles
isStrongCandle(open, close, high, low) =>
    body = math.abs(close - open)
    tail = math.abs(high - low) - body
    body > tail * 1.5  // Ensure body is larger than the tail

// Variables to track state
var float fiveMinuteHigh = na
var float fiveMinuteLow = na
var bool tradeExecuted = false
var bool breakoutDetected = false
var float entryPrice = na
var float stopLossPrice = na
var float longTakeProfit = na
var float shortTakeProfit = na

// Check for new 15M candle and reset flags
if ta.change(time("15"))
    tradeExecuted := false      // Reset trade execution flag
    breakoutDetected := false  // Reset breakout detection
    if isStrongCandle(open[1], close[1], high[1], low[1])
        fiveMinuteHigh := high[1]
        fiveMinuteLow := low[1]
    else
        fiveMinuteHigh := na
        fiveMinuteLow := na

// Get 1-minute close prices
close1m = request.security(syminfo.tickerid, "5", close)

// Ensure valid breakout direction and avoid double breakouts
if not na(fiveMinuteHigh) and not breakoutDetected
    for i = 1 to 3
        if close1m[i] > fiveMinuteHigh and not tradeExecuted  // 1M breakout check with close
            breakoutDetected := true
            if isMacdUptrend 
                // Open Long trade
                entryPrice := close
                stopLossPrice := close - (atrStopMultiplier * ta.atr(14))  // ATR-based stop loss
                longTakeProfit := close + (atrMultiplier * ta.atr(14)) // Initialize take profit

                strategy.entry("Long", strategy.long)
                tradeExecuted := true
            break // Exit the loop after detecting a breakout

        else if close1m[i] < fiveMinuteLow and not tradeExecuted  // 1M breakout check with close
            breakoutDetected := true
            if isMacdDowntrend
                // Open Short trade
                entryPrice := close
                stopLossPrice := close + (atrStopMultiplier * ta.atr(14))  // ATR-based stop loss
                shortTakeProfit := close - (atrMultiplier * ta.atr(14)) // Initialize take profit

                strategy.entry("Short", strategy.short)
                tradeExecuted := true
            break // Exit the loop after detecting a breakout

// Update trailing take-profit dynamically
if tradeExecuted and strategy.position_size > 0  // Long trade
    longTakeProfit := math.max(longTakeProfit, close + (atrMultiplier * ta.atr(14)))
    strategy.exit("Long TP/SL", "Long", stop=stopLossPrice, limit=longTakeProfit)

else if tradeExecuted and strategy.position_size < 0  // Short trade
    shortTakeProfit := math.min(shortTakeProfit, close - (atrMultiplier * ta.atr(14)))
    strategy.exit("Short TP/SL", "Short", stop=stopLossPrice, limit=shortTakeProfit)

// Reset trade state when position is closed
if strategy.position_size == 0
    tradeExecuted := false
    entryPrice := na
    longTakeProfit := na
    shortTakeProfit := na

관련

더 많은