本策略是一个基于价格行为的突破交易系统,通过动态计算风险收益比来实现高质量的交易。策略每日限制交易次数在3-5次之间,确保只执行最优质的交易机会。系统采用最高价和最低价水平来识别强势的多空突破,并通过动态止损和获利目标的设置来严格控制风险收益比不低于1:5。
策略的核心逻辑包括以下几个关键部分: 1. 突破识别 - 使用lookback周期内的最高价和最低价水平作为突破参考点,当收盘价突破这些水平时触发交易信号。 2. 动态止损 - 基于stopLookback周期内的波动设置止损位置,多头使用区间最低点,空头使用区间最高点。 3. 获利目标 - 根据入场价格与止损价格之间的距离,使用风险收益比乘数(rrMultiplier)计算目标价格。 4. 交易过滤 - 实现每日最大交易次数限制,通过日期变更检测自动重置计数。
该策略通过结合价格行为分析和严格的风险管理,构建了一个简洁而有效的交易系统。通过限制每日交易次数和维持较高的风险收益比,有助于保持交易的质量。虽然存在一些潜在风险,但通过建议的优化方向可以进一步提升策略的稳定性和可靠性。策略的核心优势在于其简单而严格的交易规则,适合作为一个基础框架进行个性化调整和优化。
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 5d
basePeriod: 5d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Filtered Price Action Breakout", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// === INPUTS ===
lookback = input.int(20, title="Breakout Lookback Period", minval=5)
stopLookback = input.int(10, title="Stop Loss Lookback Period", minval=3)
rrMultiplier = input.float(5.0, title="Risk-to-Reward Multiplier", step=0.1)
maxTradesPerDay = input.int(5, title="Max Trades Per Day", minval=1)
// Ensure there are enough bars for calculations
inRange = bar_index >= lookback
// === CALCULATIONS ===
// Highest high and lowest low over the 'lookback' period
highestHigh = ta.highest(high, lookback)
lowestLow = ta.lowest(low, lookback)
// Define breakout conditions (using previous bar's level)
bullBreakout = ta.crossover(close, highestHigh[1])
bearBreakout = ta.crossunder(close, lowestLow[1])
// Store breakout signals in variables to prevent inconsistencies
bullBreakoutSignal = bullBreakout
bearBreakoutSignal = bearBreakout
// Determine stop levels based on recent swing lows/highs
longStop = ta.lowest(low, stopLookback)
shortStop = ta.highest(high, stopLookback)
// Track number of trades per day (fixing boolean condition issue)
newDay = ta.change(time("D")) != 0
todayTrades = ta.barssince(newDay)
tradeCount = 0
if newDay
tradeCount := 0
else
tradeCount := tradeCount + 1
// === STRATEGY LOGIC: ENTRY & EXIT ===
if bullBreakoutSignal and tradeCount < maxTradesPerDay
entryPrice = close
stopLevel = longStop
risk = entryPrice - stopLevel
if risk > 0
target = entryPrice + rrMultiplier * risk
strategy.entry("Long", strategy.long)
strategy.exit("Long Exit", from_entry="Long", stop=stopLevel, limit=target)
tradeCount := tradeCount + 1
if bearBreakoutSignal and tradeCount < maxTradesPerDay
entryPrice = close
stopLevel = shortStop
risk = stopLevel - entryPrice
if risk > 0
target = entryPrice - rrMultiplier * risk
strategy.entry("Short", strategy.short)
strategy.exit("Short Exit", from_entry="Short", stop=stopLevel, limit=target)
tradeCount := tradeCount + 1
// === PLOTTING ===
plot(highestHigh, color=color.green, title="Highest High (Breakout Level)")
plot(lowestLow, color=color.red, title="Lowest Low (Breakout Level)")