Chiến lược này dựa trên chỉ số Williams %R và tối ưu hóa hiệu suất giao dịch bằng cách điều chỉnh năng động các mức lấy lợi nhuận và dừng lỗ. Các tín hiệu mua được tạo ra khi Williams %R vượt quá khu vực bán quá (-80), và các tín hiệu bán được tạo ra khi nó vượt qua dưới khu vực mua quá (-20). Một Mức trung bình chuyển động nhân tố (EMA) được sử dụng để làm mịn các giá trị Williams %R và giảm tiếng ồn. Chiến lược cung cấp các thiết lập tham số linh hoạt, bao gồm thời gian chỉ số, mức lấy lợi nhuận / dừng lỗ (TP / SL), giờ giao dịch và lựa chọn hướng giao dịch, để thích nghi với các điều kiện thị trường và sở thích của nhà giao dịch khác nhau.
Chiến lược điều chỉnh động TP / SL Williams % R nắm bắt các điều kiện giá mua quá mức và bán quá mức một cách đơn giản và hiệu quả trong khi cung cấp các thiết lập tham số linh hoạt để thích nghi với môi trường thị trường và phong cách giao dịch khác nhau. Chiến lược điều chỉnh năng động mức lợi nhuận và dừng lỗ, có thể kiểm soát tốt hơn rủi ro và bảo vệ lợi nhuận. Tuy nhiên, khi áp dụng chiến lược trong thực tế, vẫn nên chú ý đến các yếu tố như cài đặt tham số, xác nhận tín hiệu và lựa chọn thời gian giao dịch để tiếp tục cải thiện độ bền và lợi nhuận của chiến lược.
/*backtest start: 2024-05-01 00:00:00 end: 2024-05-31 23:59:59 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Williams %R Strategy defined buy/sell criteria with TP / SL", overlay=true) // User inputs for TP and SL levels tp_level = input.int(defval=60, title="Take Profit (ticks)", minval=10, maxval=500, step=10) sl_level = input.int(defval=60, title="Stop Loss (ticks)", minval=10, maxval=200, step=10) // Williams %R calculation length = input.int(defval=21, title="Length", minval=5, maxval=50, step=1) willy = 100 * (close - ta.highest(length)) / (ta.highest(length) - ta.lowest(length)) // Exponential Moving Average (EMA) of Williams %R ema_length = input.int(defval=13, title="EMA Length", minval=5, maxval=50, step=1) ema_willy = ta.ema(willy, ema_length) // User inputs for Williams %R thresholds buy_threshold = -80 sell_threshold = -20 // User input to enable/disable specific trading hours use_specific_hours = input.bool(defval=false, title="Use Specific Trading Hours") start_hour = input(defval=timestamp("0000-01-01 09:00:00"), title="Start Hour") end_hour = input(defval=timestamp("0000-01-01 11:00:00"), title="End Hour") // User input to choose trade direction trade_direction = input.string(defval="Both", title="Trade Direction", options=["Buy Only", "Sell Only", "Both"]) // User input to enable/disable "Minutes Before" and "Minutes After" options enable_minutes_before_after = input.bool(defval=true, title="Enable Minutes Before/After Options") minutes_before = enable_minutes_before_after ? input.int(defval=10, title="Minutes Before the Top of the Hour", minval=0, maxval=59, step=1) : 0 minutes_after = enable_minutes_before_after ? input.int(defval=10, title="Minutes After the Top of the Hour", minval=0, maxval=59, step=1) : 0 // Condition to check if the current minute is within the user-defined time window around the top of the hour is_top_of_hour_range = (minute(time) >= (60 - minutes_before) and minute(time) <= 59) or (minute(time) >= 0 and minute(time) <= minutes_after) // Condition to check if the current time is within the user-defined specific trading hours in_specific_hours = true if use_specific_hours in_specific_hours := (hour(time) * 60 + minute(time)) >= (hour(start_hour) * 60 + minute(start_hour)) and (hour(time) * 60 + minute(time)) <= (hour(end_hour) * 60 + minute(end_hour)) // Buy and Sell conditions with time-based restriction buy_condition = ta.crossover(willy, buy_threshold) and is_top_of_hour_range and in_specific_hours sell_condition = ta.crossunder(willy, sell_threshold) and is_top_of_hour_range and in_specific_hours // Strategy entry and exit with TP and SL if (trade_direction == "Buy Only" or trade_direction == "Both") and buy_condition strategy.entry("Buy", strategy.long) if (trade_direction == "Sell Only" or trade_direction == "Both") and sell_condition strategy.entry("Sell", strategy.short) // If a buy entry was taken, allow the trade to be closed after reaching TP and SL or if conditions for a sell entry are true if (strategy.opentrades > 0) strategy.exit("TP/SL", profit=tp_level, loss=sl_level) // Plot Williams %R and thresholds for visualization hline(-20, "Upper Band", color=color.red) hline(-80, "Lower Band", color=color.green) plot(willy, title="%R", color=color.yellow, linewidth=2) plot(ema_willy, title="EMA", color=color.aqua, linewidth=2)