黄金流动性猎手策略

EMA Pivot ATR Liquidity Sweep
创建日期: 2025-11-06 11:42:28 最后修改: 2025-11-06 11:42:28
复制: 0 点击次数: 197
avatar of ianzeng123 ianzeng123
2
关注
319
关注者

黄金流动性猎手策略 黄金流动性猎手策略

🎯 这个策略到底在干什么?

你知道吗?市场上有一群”聪明钱”总是喜欢在关键位置设陷阱!这个策略就像一个经验丰富的猎手,专门识别这些陷阱并反向操作。简单来说,当价格故意”假突破”重要支撑阻力位后又快速拉回时,我们就跟着大资金的节奏进场!

📊 三重过滤系统揭秘

划重点! 这个策略用了三层防护网:

🔸 趋势过滤器:200周期EMA就像一个老司机,告诉你现在是上坡路还是下坡路 🔸 关键位识别:自动找到那些”兵家必争之地”的支撑阻力位 🔸 流动性扫荡检测:抓住大资金故意制造的”假动作”

就像钓鱼一样,你得知道鱼在哪里,用什么饵,什么时候收杆!

🎪 流动性扫荡的神奇魅力

想象一下:你在排队买奶茶,突然有人喊”免费送!”大家都冲过去,结果发现是假的,但聪明人已经趁乱插队到了前面。

市场也是这样!价格先”假装”跌破支撑位(扫荡止损单),然后迅速拉回,这时候就是最佳入场时机。策略设置了0.6倍ATR的缓冲区,确保真的是”扫荡”而不是真突破。

⚡ 风险控制:1:2的黄金比例

避坑指南:很多人做交易就像开车不系安全带,这个策略强制执行1:2的风险回报比!

  • 止损设在关键位下方0.5倍ATR
  • 止盈是止损的2倍距离
  • 就算只有40%胜率,长期也能盈利!

🚀 实战应用小贴士

这个策略最适合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.


相关推荐