
你知道吗?市场上有一群”聪明钱”总是喜欢在关键位置设陷阱!这个策略就像一个经验丰富的猎手,专门识别这些陷阱并反向操作。简单来说,当价格故意”假突破”重要支撑阻力位后又快速拉回时,我们就跟着大资金的节奏进场!
划重点! 这个策略用了三层防护网:
🔸 趋势过滤器:200周期EMA就像一个老司机,告诉你现在是上坡路还是下坡路 🔸 关键位识别:自动找到那些”兵家必争之地”的支撑阻力位 🔸 流动性扫荡检测:抓住大资金故意制造的”假动作”
就像钓鱼一样,你得知道鱼在哪里,用什么饵,什么时候收杆!
想象一下:你在排队买奶茶,突然有人喊”免费送!”大家都冲过去,结果发现是假的,但聪明人已经趁乱插队到了前面。
市场也是这样!价格先”假装”跌破支撑位(扫荡止损单),然后迅速拉回,这时候就是最佳入场时机。策略设置了0.6倍ATR的缓冲区,确保真的是”扫荡”而不是真突破。
避坑指南:很多人做交易就像开车不系安全带,这个策略强制执行1:2的风险回报比!
这个策略最适合15分钟周期的黄金交易,为什么?因为黄金市场流动性好,假突破现象明显,而且15分钟周期能过滤掉太多噪音。
记住:不要贪心!策略帮你找到了好位置,剩下的就交给市场和时间吧~
/*backtest
start: 2025-10-06 00:00:00
end: 2025-11-05 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Gold 15m: Trend + S/R + Liquidity Sweep (RR 1:2)", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1, commission_type=strategy.commission.percent, commission_value=0.0)
// ---------------------- INPUTS ----------------------
symbol_input = input.string(title="Symbol (for reference only)", defval="XAUUSD")
tf_note = input.timeframe(title="Intended timeframe", defval="15")
ema_len = input.int(200, "Trend EMA length", minval=50)
pivot_left = input.int(5, "Pivot left bars", minval=1)
pivot_right = input.int(5, "Pivot right bars", minval=1)
sweep_atr_mult = input.float(0.6, "Liquidity sweep buffer (ATR ×)", step=0.1)
sl_atr_mult = input.float(0.5, "SL buffer beyond pivot (ATR ×)", step=0.1)
min_sweep_bars = input.int(1, "Max bars between sweep and reclaim", minval=1)
use_only_trend = input.bool(true, "Only trade with trend (EMA filter)")
rr = input.float(2.0, "Reward/Risk (TP = RR × Risk)", minval=1.0, step=0.1)
enable_long = input.bool(true, "Enable Longs")
enable_short = input.bool(true, "Enable Shorts")
show_zones = input.bool(true, "Plot pivots / zones")
// ---------------------- INDICATORS ----------------------
ema_trend = ta.ema(close, ema_len)
atr = ta.atr(14)
// ---------------------- PIVOT S/R DETECTION ----------------------
// Using builtin pivots: returns price of pivot when formed, else na
ph = ta.pivothigh(high, pivot_left, pivot_right)
pl = ta.pivotlow(low, pivot_left, pivot_right)
// We'll track last confirmed pivot prices and bar index
var float lastPivotHigh = na
var int lastPivotHighBar = na
var float lastPivotLow = na
var int lastPivotLowBar = na
if not na(ph)
lastPivotHigh := ph
lastPivotHighBar := bar_index - pivot_right
if not na(pl)
lastPivotLow := pl
lastPivotLowBar := bar_index - pivot_right
// ---------------------- LIQUIDITY SWEEP DETECTION ----------------------
// For a bullish liquidity sweep (buy):
// 1) Price makes a new low wick below lastPivotLow - (atr * sweep_atr_mult) (sweep candle)
// 2) Within `min_sweep_bars` the price reclaims: close > lastPivotLow => bullish signal
var int sweepLowBar = na
var int sweepHighBar = na
// detect sweep down (wick pierce)
isSweepDown = false
if not na(lastPivotLow)
// a candle with low sufficiently below pivot
isSweepDown := low < (lastPivotLow - atr * sweep_atr_mult)
// detect sweep up (wick pierce)
isSweepUp = false
if not na(lastPivotHigh)
isSweepUp := high > (lastPivotHigh + atr * sweep_atr_mult)
// record bar of sweep
if isSweepDown
sweepLowBar := bar_index
if isSweepUp
sweepHighBar := bar_index
// check reclaim after sweep: close back above pivot (buy reclaim) or close back below pivot (sell reclaim)
// ensure reclaim happens within `min_sweep_bars` bars after sweep
bullReclaim = false
bearReclaim = false
if not na(lastPivotLow) and not na(sweepLowBar)
if (bar_index - sweepLowBar) <= min_sweep_bars and close > lastPivotLow
bullReclaim := true
if not na(lastPivotHigh) and not na(sweepHighBar)
if (bar_index - sweepHighBar) <= min_sweep_bars and close < lastPivotHigh
bearReclaim := true
// ---------------------- TREND FILTER ----------------------
in_uptrend = close > ema_trend
in_downtrend = close < ema_trend
// final entry conditions
longCondition = enable_long and bullReclaim and (not use_only_trend or in_uptrend)
shortCondition = enable_short and bearReclaim and (not use_only_trend or in_downtrend)
// Note: variable name required by Pine, we set from input
use_only_trend := use_only_trend // no-op to fix linter if needed
// ---------------------- ORDER EXECUTION & SL/TP CALC ----------------------
var int tradeId = 0
// For buy: SL = lastPivotLow - (atr * sl_atr_mult)
// risk = entry - SL
// TP = entry + rr * risk
if longCondition
// compute SL and TP
sl_price = lastPivotLow - atr * sl_atr_mult
entry_price = close
risk_amt = entry_price - sl_price
tp_price = entry_price + (risk_amt * rr)
// safety: only place trade if positive distances
if risk_amt > 0 and tp_price > entry_price
tradeId += 1
// send entry and exit with stop & limit
strategy.entry("Long_"+str.tostring(tradeId), strategy.long)
strategy.exit("ExitLong_"+str.tostring(tradeId), from_entry="Long_"+str.tostring(tradeId), stop=sl_price, limit=tp_price)
// For sell: SL = lastPivotHigh + (atr * sl_atr_mult)
// risk = SL - entry
// TP = entry - rr * risk
if shortCondition
sl_price_s = lastPivotHigh + atr * sl_atr_mult
entry_price_s = close
risk_amt_s = sl_price_s - entry_price_s
tp_price_s = entry_price_s - (risk_amt_s * rr)
if risk_amt_s > 0 and tp_price_s < entry_price_s
tradeId += 1
strategy.entry("Short_"+str.tostring(tradeId), strategy.short)
strategy.exit("ExitShort_"+str.tostring(tradeId), from_entry="Short_"+str.tostring(tradeId), stop=sl_price_s, limit=tp_price_s)
// ---------------------- PLOTTING ----------------------
// EMA (trend)
plot(ema_trend, title="EMA Trend", linewidth=2)
// arrows and markers for entries
plotshape(longCondition, title="Buy Signal", location=location.belowbar, style=shape.labelup, text="BUY", textcolor=color.white, size=size.tiny, color=color.green)
plotshape(shortCondition, title="Sell Signal", location=location.abovebar, style=shape.labeldown, text="SELL", textcolor=color.white, size=size.tiny, color=color.red)
// plot last SL/TP lines for last trade (visual reference)
// find last open position and plot currently active SL/TP if any
if strategy.position_size > 0
last_sl = strategy.position_avg_price - (strategy.position_avg_price - (lastPivotLow - atr * sl_atr_mult))
// instead use exit order price from last exit? Simpler: plot SL/TP computed earlier if long
// This may plot approximate lines; TradingView native order lines will also display.
// We skip redundant plotting to avoid confusion.