
Chiến lược này dựa trên chỉ số Williams %R, để tối ưu hóa hiệu suất giao dịch bằng cách điều chỉnh động mức dừng lỗ. Nó tạo ra tín hiệu mua khi Williams %R đi qua vùng Bán quá mức (−80) và tạo ra tín hiệu bán khi đi qua vùng Bán quá mức (−20). Đồng thời sử dụng chỉ số di chuyển trung bình (EMA) để làm mịn giá trị Williams %R để giảm tiếng ồn.
Chiến lược dừng lỗ động của Williams % R nắm bắt tình trạng quá mua và quá bán của giá bằng cách đơn giản và hiệu quả, đồng thời cung cấp các thiết lập tham số linh hoạt để phù hợp với các môi trường thị trường và phong cách giao dịch khác nhau. Chiến lược này điều chỉnh động mức dừng lỗ để kiểm soát rủi ro và bảo vệ lợi nhuận tốt hơn. Tuy nhiên, trong ứng dụng thực tế, vẫn cần chú ý đến các yếu tố như thiết lập tham số, xác nhận tín hiệu, lựa chọn thời gian giao dịch để tiếp tục cải thiện sự ổn định và khả năng sinh lợi 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)