이 전략은 윌리엄스 %R 지표에 기반하고 있으며, 영업 성과를 동적으로 조정하여 수익을 취하고 손실을 멈추는 수준을 최적화합니다. 윌리엄스 %R가 과소매 영역 (-80) 을 넘을 때 구매 신호가 생성되고, 과소매 영역 (-20) 을 넘을 때 판매 신호가 생성됩니다. 기하급수적인 이동 평균 (EMA) 이 윌리엄스 %R 값을 부드럽게하고 소음을 줄이기 위해 사용됩니다. 전략은 다양한 시장 조건과 거래자의 선호도에 적응하기 위해 지표 기간, 이익/손실 (TP/SL) 수준, 거래 시간 및 거래 방향 선택 등 유연한 매개 변수 설정을 제공합니다.
윌리엄스 %R 동적 TP/SL 조정 전략은 다양한 시장 환경과 거래 스타일에 적응하기 위해 유연한 매개 변수 설정을 제공하면서 단순하고 효과적인 방식으로 과소 구매 및 과소 판매 가격 조건을 포착합니다. 전략은 수익을 취하고 손실을 중지하는 수준을 동적으로 조정하여 위험을 더 잘 제어하고 이익을 보호 할 수 있습니다. 그러나 전략을 실제로 적용할 때, 전략의 안정성과 수익성을 더욱 향상시키기 위해 매개 변수 설정, 신호 확인 및 거래 시간 선택과 같은 요소에 여전히주의를 기울여야합니다.
/*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)