Đây là một chiến lược giao dịch kết hợp các chỉ số MACD kép với phân tích hành động giá. Chiến lược xác định xu hướng thị trường thông qua sự thay đổi màu sắc trong biểu đồ MACD trên khung thời gian 15 phút, tìm kiếm các mẫu nến mạnh trên khung thời gian 5 phút và xác nhận các tín hiệu đột phá trên khung thời gian 1 phút. Nó sử dụng các cơ chế dừng lỗ động dựa trên ATR và kéo theo lợi nhuận để quản lý rủi ro một cách hiệu quả trong khi tối đa hóa tiềm năng lợi nhuận.
Chiến lược này sử dụng hai chỉ số MACD với các thông số khác nhau (34/144/9 và 100/200/50) để xác nhận xu hướng thị trường. Khi cả hai biểu đồ MACD hiển thị xu hướng màu tương tự, hệ thống tìm kiếm các mẫu nến mạnh trên biểu đồ 5 phút, đặc trưng bởi các cơ thể lớn hơn 1,5 lần so với bóng của chúng. Một khi nến mạnh được xác định, hệ thống theo dõi các đột phá trên biểu đồ 1 phút. Các vị trí được mở khi giá vượt qua mức cao trong xu hướng tăng hoặc dưới mức thấp trong xu hướng giảm.
Đây là một hệ thống chiến lược toàn diện kết hợp phân tích kỹ thuật và quản lý rủi ro. Nó đảm bảo chất lượng giao dịch thông qua phân tích nhiều khung thời gian và lọc tín hiệu nghiêm ngặt trong khi quản lý rủi ro hiệu quả thông qua dừng động và lợi nhuận theo dõi. Chiến lược cho thấy khả năng thích nghi mạnh mẽ nhưng đòi hỏi tối ưu hóa liên tục dựa trên điều kiện thị trường. Đối với giao dịch trực tiếp, nên kiểm tra kỹ lưỡng và tối ưu hóa tham số, cùng với các điều chỉnh dựa trên các đặc điểm thị trường cụ thể.
/*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