
你知道吗?市场其实就像一个巨大的几何图形游乐场!这套策略把复杂的价格走势简化成三种可爱的形状:💎钻石代表反转信号,🔺三角形代表趋势延续,⭕圆圈代表震荡过滤。就像给市场戴上了一副”几何眼镜”,瞬间看清价格的真实意图!
策略的核心逻辑超级简单:快慢EMA形成云带判断大趋势,然后根据价格相对于云带的位置,给不同的高低点突破贴上不同的”标签”。在云带下方的突破是钻石反转信号,在云带上方的突破是三角延续信号,而那些EMA分离度不够的信号就被圆圈标记为”噪音”过滤掉。
钻石信号💎:专门捕捉反转机会!当价格在EMA云带下方出现更高低点,或在云带上方出现更低高点时触发。这就像在谷底发现宝石,或在山顶看到警示灯一样明显。
三角信号🔺:趋势延续的得力助手!价格在云带上方出现更高低点,或在云带下方出现更低高点时激活。想象成冲浪时顺着浪头继续前进,成功率自然更高。
圆圈过滤⭕:这个设计太贴心了!当EMA分离度小于设定阈值时,所有信号都被标记为”震荡噪音”。就像给策略装了个”防抖功能”,避免在横盘市中频繁开仓。
止损逻辑采用前期关键点位:多头止损设在前低点,空头止损设在前高点。这种方法的好处是有明确的技术依据,不会因为随意设置而被”假突破”扫掉。
RSI出场机制也很聪明:多头仓位在RSI从70以上回落时平仓,空头仓位在RSI从30以下反弹时平仓。这样既能锁定利润,又能避免在极端超买超卖区域继续持仓的风险。
最适合场景:中短周期的趋势跟踪和反转交易,特别是在波动性适中的市场环境中表现出色。策略会自动调整仓位大小:反转信号用50%仓位试探,延续信号用100%仓位跟进。
避坑指南:千万别在极度震荡的市场中盲目使用!虽然有圆圈过滤机制,但如果市场长期横盘,信号会变得稀少。另外,这套策略更依赖技术分析,重大基本面消息可能会让几何形状”失效”。
记住,最好的策略不是最复杂的,而是最适合你交易风格的那一套! 🎪
/*backtest
start: 2024-09-26 00:00:00
end: 2025-09-24 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("💎🔺⚫ Diamond-Triangle-Circle Strategy", overlay=true)
// === INPUTS ===
ema_fast = input.int(10, "Fast EMA Length")
ema_slow = input.int(20, "Slow EMA Length")
min_ema_separation = input.float(0.1, "Min EMA Separation %", minval=0.01, maxval=1.0)
rsi_length = input.int(14, "RSI Length")
rsi_exit_level = input.int(70, "RSI Exit Level")
// === CALCULATIONS ===
ema_fast_val = ta.ema(close, ema_fast)
ema_slow_val = ta.ema(close, ema_slow)
rsi = ta.rsi(close, rsi_length)
// EMA Cloud and separation
cloud_bull = ema_fast_val > ema_slow_val
ema_separation_pct = math.abs(ema_fast_val - ema_slow_val) / close * 100
chop_filter = ema_separation_pct >= min_ema_separation
// Price position relative to cloud
price_above_cloud = close > math.max(ema_fast_val, ema_slow_val)
price_below_cloud = close < math.min(ema_fast_val, ema_slow_val)
// === HIGHER LOW DETECTION ===
lowPoint = ta.lowest(low, 3)
prevLowPoint = ta.lowest(low[3], 3)
isHigherLow = low == lowPoint and low > prevLowPoint
higherLowConfirmed = isHigherLow and close > open
// === LOWER HIGH DETECTION ===
highPoint = ta.highest(high, 3)
prevHighPoint = ta.highest(high[3], 3)
isLowerHigh = high == highPoint and high < prevHighPoint
lowerHighConfirmed = isLowerHigh and close < open
// === SIGNAL CLASSIFICATION ===
// Diamond Signal - Reversal (below cloud)
diamondBullish = higherLowConfirmed and price_below_cloud and chop_filter
diamondBearish = lowerHighConfirmed and price_above_cloud and chop_filter
// Triangle Signal - Continuation (above cloud)
triangleBullish = higherLowConfirmed and price_above_cloud and chop_filter
triangleBearish = lowerHighConfirmed and price_below_cloud and chop_filter
// Circle Signal - Chop (filtered out - display only)
chopBullish = higherLowConfirmed and not chop_filter
chopBearish = lowerHighConfirmed and not chop_filter
// === RSI EXIT LOGIC ===
rsi_was_above_70 = rsi[1] >= rsi_exit_level and rsi < rsi[1]
rsi_was_below_30 = rsi[1] <= (100 - rsi_exit_level) and rsi > rsi[1]
// === STOP LOSS LOGIC ===
var float long_stop = na
var float short_stop = na
if diamondBullish or triangleBullish
long_stop := prevLowPoint
if diamondBearish or triangleBearish
short_stop := prevHighPoint
// === STRATEGY EXECUTION ===
// Long Entries
if diamondBullish
strategy.entry("Diamond Long", strategy.long, qty=50, comment="💎 Reversal")
if triangleBullish
strategy.entry("Triangle Long", strategy.long, qty=100, comment="🔺 Continuation")
// Short Entries
if diamondBearish
strategy.entry("Diamond Short", strategy.short, qty=50, comment="💎 Reversal")
if triangleBearish
strategy.entry("Triangle Short", strategy.short, qty=100, comment="🔺 Continuation")
// === EXITS ===
// Long Exits
if strategy.position_size > 0
if close <= long_stop
strategy.close_all(comment="Stop Loss")
else if rsi_was_above_70
strategy.close_all(comment="RSI Exit")
// Short Exits
if strategy.position_size < 0
if close >= short_stop
strategy.close_all(comment="Stop Loss")
else if rsi_was_below_30
strategy.close_all(comment="RSI Exit")
// === VISUAL ELEMENTS ===
// EMA Cloud
ema1 = plot(ema_fast_val, "Fast EMA", color.new(color.blue, 60), linewidth=1)
ema2 = plot(ema_slow_val, "Slow EMA", color.new(color.blue, 60), linewidth=1)
fill(ema1, ema2, color=cloud_bull ? color.new(color.green, 85) : color.new(color.red, 85), title="EMA Cloud")
// Signal Shapes
plotshape(diamondBullish, "Diamond Long", shape.diamond, location.belowbar,
color.new(color.lime, 0), size=size.small, text="💎")
plotshape(diamondBearish, "Diamond Short", shape.diamond, location.abovebar,
color.new(color.red, 0), size=size.small, text="💎")
plotshape(triangleBullish, "Triangle Long", shape.triangleup, location.belowbar,
color.new(color.green, 20), size=size.small, text="🔺")
plotshape(triangleBearish, "Triangle Short", shape.triangledown, location.abovebar,
color.new(color.orange, 20), size=size.small, text="🔺")
plotshape(chopBullish, "Chop Long", shape.circle, location.belowbar,
color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopBearish, "Chop Short", shape.circle, location.abovebar,
color.new(color.gray, 50), size=size.tiny, text="⚫")
// Stop Loss Lines
plot(strategy.position_size > 0 ? long_stop : na, "Long Stop", color.red, linewidth=2)
plot(strategy.position_size < 0 ? short_stop : na, "Short Stop", color.red, linewidth=2)
// Background coloring for market conditions
bgcolor(not chop_filter ? color.new(color.yellow, 95) : na, title="Chop Zone")
// === ALERTS ===
alertcondition(diamondBullish, title="Diamond Long Signal", message="💎 REVERSAL LONG - {{ticker}} at {{close}}")
alertcondition(diamondBearish, title="Diamond Short Signal", message="💎 REVERSAL SHORT - {{ticker}} at {{close}}")
alertcondition(triangleBullish, title="Triangle Long Signal", message="🔺 CONTINUATION LONG - {{ticker}} at {{close}}")
alertcondition(triangleBearish, title="Triangle Short Signal", message="🔺 CONTINUATION SHORT - {{ticker}} at {{close}}")
alertcondition(strategy.position_size == 0 and strategy.position_size[1] != 0, title="Position Closed", message="💰 POSITION CLOSED - {{ticker}} at {{close}}")