Ini adalah strategi perdagangan yang menggabungkan indikator MACD ganda dengan analisis aksi harga. Strategi ini mengidentifikasi tren pasar melalui perubahan warna dalam histogram MACD pada jangka waktu 15 menit, mencari pola lilin yang kuat pada jangka waktu 5 menit, dan mengkonfirmasi sinyal breakout pada jangka waktu 1 menit.
Strategi ini menggunakan dua indikator MACD dengan parameter yang berbeda (34/144/9 dan 100/200/50) untuk mengkonfirmasi tren pasar. Ketika kedua histogram MACD menunjukkan tren warna yang sama, sistem mencari pola lilin yang kuat pada grafik 5 menit, yang ditandai dengan badan 1,5 kali lebih besar dari bayangan mereka. Setelah lilin yang kuat diidentifikasi, sistem memantau untuk pecah pada grafik 1 menit. Posisi dibuka ketika harga pecah di atas puncak dalam tren naik atau di bawah terendah dalam tren turun. Stops ditetapkan berdasarkan ATR, sementara kelipatan 1.5x ATR digunakan untuk mengambil keuntungan dinamis.
Ini adalah sistem strategi yang komprehensif yang menggabungkan analisis teknis dan manajemen risiko. Ini memastikan kualitas perdagangan melalui analisis multi-frame waktu dan penyaringan sinyal yang ketat sambil secara efektif mengelola risiko melalui berhenti dinamis dan keuntungan yang tertinggal. Strategi ini menunjukkan kemampuan beradaptasi yang kuat tetapi membutuhkan optimasi terus-menerus berdasarkan kondisi pasar. Untuk perdagangan langsung, backtesting menyeluruh dan optimasi parameter dianjurkan, bersama dengan penyesuaian berdasarkan karakteristik pasar tertentu.
/*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