이 전략은 이중 MACD 지표와 가격 행동 분석을 결합한 거래 전략이다. 이 전략은 15 분 시간 프레임에서 MACD 히스토그램의 색상 변화를 통해 시장 추세를 식별하고, 5 분 시간 프레임에서 강력한 촛불 패턴을 찾고, 1 분 시간 프레임에서 브레이크 아웃 신호를 확인합니다. ATR 기반의 동적 스톱 로스 및 트레이일링 취리 메커니즘을 사용하여 수익 잠재력을 극대화하면서 위험을 효과적으로 관리합니다.
이 전략은 시장 트렌드를 확인하기 위해 다른 매개 변수 (34/144/9 및 100/200/50) 를 가진 두 개의 MACD 지표를 사용합니다. 두 MACD 히스토그램이 동일한 색상 트렌드를 보여주면 시스템은 5 분 차트에서 1.5 배 더 큰 몸으로 특징인 강력한 촛불 패턴을 찾습니다. 강력한 촛불이 확인되면 시스템은 1 분 차트에서 브레이크를 모니터링합니다. 가격이 상승 추세에서 최고 또는 하락 추세에서 최저를 넘을 때 포지션은 열립니다. 스톱은 ATR에 따라 설정되며, 동적 인 취리 수익에 1.5x ATR 배수가 사용됩니다.
이 전략 시스템은 기술 분석과 리스크 관리를 결합한 포괄적인 전략 시스템이다. 다중 시간 프레임 분석과 엄격한 신호 필터링을 통해 거래 품질을 보장하며 동적인 스톱과 후속 수익을 통해 위험을 효과적으로 관리합니다. 전략은 강력한 적응력을 보이지만 시장 조건에 따라 지속적인 최적화를 요구합니다. 라이브 거래에 대한 철저한 백테스팅과 매개 변수 최적화와 특정 시장 특성에 따른 조정과 함께 권장됩니다.
/*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