Chiến lược này là một hệ thống giao dịch định lượng dựa trên chỉ số RSI và các nguyên tắc đảo ngược trung bình. Nó xác định các cơ hội đảo ngược thị trường bằng cách phát hiện các điều kiện mua quá mức và bán quá mức, kết hợp với phân tích phạm vi giá và vị trí giá đóng. Khái niệm cốt lõi là nắm bắt các cơ hội đảo ngược trung bình sau các điều kiện thị trường cực đoan, quản lý rủi ro thông qua các tiêu chí nhập khẩu nghiêm ngặt và cơ chế dừng lỗ năng động.
Chiến lược sử dụng nhiều cơ chế lọc để xác định tín hiệu giao dịch: Đầu tiên, giá phải giảm xuống mức thấp nhất trong 10 giai đoạn, cho thấy tình trạng thị trường quá bán; thứ hai, phạm vi giá của ngày phải lớn nhất trong 10 ngày giao dịch vừa qua, cho thấy sự biến động thị trường tăng lên; cuối cùng, nó xác nhận các tín hiệu đảo ngược tiềm năng bằng cách kiểm tra xem giá đóng có nằm trong phần tư trên của phạm vi day
Đây là một chiến lược đảo ngược trung bình có cấu trúc tốt với logic rõ ràng. Thông qua lọc nhiều điều kiện và quản lý dừng lỗ năng động, chiến lược có hiệu quả nắm bắt các cơ hội phục hồi quá bán trên thị trường trong khi kiểm soát rủi ro. Mặc dù có một số hạn chế, hiệu suất tổng thể có thể được cải thiện thông qua tối ưu hóa và tinh chỉnh hợp lý. Các nhà đầu tư được khuyên phải điều chỉnh các tham số dựa trên các đặc điểm thị trường cụ thể và khả năng chịu rủi ro của họ khi áp dụng chiến lược trong giao dịch trực tiếp.
/*backtest start: 2024-11-04 00:00:00 end: 2024-12-04 00:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Larry Conners SMTP Strategy", overlay=true, margin_long=100, margin_short=100) // --- Inputs --- // Corrected the input type declaration by removing 'type=' tickSize = input.float(0.01, title="Tick Size (e.g., 1/8 for stocks)") // --- Calculate conditions --- // 1. Today the market must make a 10-period low low10 = ta.lowest(low, 10) is10PeriodLow = low == low10 // 2. Today's range must be the largest of the past 10 bars rangeToday = high - low maxRange10 = ta.highest(high - low, 10) isLargestRange = rangeToday == maxRange10 // 3. Today's close must be in the top 25 percent of today's range rangePercent = (close - low) / rangeToday isCloseInTop25 = rangePercent >= 0.75 // Combine all buy conditions buyCondition = is10PeriodLow and isLargestRange and isCloseInTop25 // --- Buy Entry (on the next day) --- var float buyPrice = na var bool orderPending = false var float stopLoss = na // Initialize stopLoss at the top level to avoid 'Undeclared identifier' errors if (buyCondition and strategy.position_size == 0) buyPrice := high + tickSize stopLoss := low orderPending := true // Condition to place buy order the next day or the day after if orderPending and ta.barssince(buyCondition) <= 2 strategy.entry("Buy", strategy.long, stop=buyPrice) orderPending := false // --- Stop-Loss and Trailing Stop --- if (strategy.position_size > 0) stopLoss := math.max(stopLoss, low) // Move stop to higher lows (manual trailing) strategy.exit("Exit", from_entry="Buy", stop=stopLoss) // --- Plotting --- // Highlight buy conditions bgcolor(buyCondition ? color.new(color.green, 50) : na) //plotshape(series=buyCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="Buy Setup") // Plot Stop-Loss level for visualization //plot(strategy.position_size > 0 ? stopLoss : na, color=color.red, linewidth=2, title="Stop-Loss Level")