//@version=6
strategy(“密集判断_海龙2025.06”, overlay=true, default_qty_type=strategy.fixed, default_qty_value=10)
// ===== 均线计算 =====
ema10 = ta.ema(close, 10)
sma20 = ta.sma(close, 20)
sma60 = ta.sma(close, 60)
sma120 = ta.sma(close, 120)
ema20 = ta.ema(close, 20)
ema60 = ta.ema(close, 60)
ema120 = ta.ema(close, 120)
// ===== 均线绘图 =====
plot(ema10, title=”EMA10″, color=color.green, linewidth=2)
plot(sma20, title=”SMA20″, color=color.rgb(14, 13, 13), linewidth=2)
plot(ema20, title=”EMA20″, color=color.new(#807e7c, 20), linewidth=2)
plot(sma60, color=color.blue, title=”SMA60″)
plot(ema60, color=color.new(color.blue, 50), title=”EMA60″)
plot(sma120, color=color.purple, title=”SMA120″)
plot(ema120, color=color.new(color.purple, 50), title=”EMA120″)
// ===== 参数设置 =====
tight_range_all = input.float(20.0, title=”【所有均线】最大垂直差值”)
tight_range_partial = input.float(10.0, title=”【部分均线】最大垂直差值 (EMA10, EMA20, SMA20)”)
bar_range_min = input.float(15.0, title=”K线最小高低差”)
bar_range_prev_min = input.float(5.0, title=”前一K线最小高低差”)
cooldownBars = input.int(10, title=”信号冷却周期(单位:根)”)
tp_points = input.float(15.0, title=”止盈点数”)
sl_points = input.float(20.0, title=”止损点数”)
// ===== 判断条件 =====
ma_high = math.max(ema10, sma20, sma60, sma120, ema20, ema60, ema120)
ma_low = math.min(ema10, sma20, sma60, sma120, ema20, ema60, ema120)
ma_diff = ma_high – ma_low
ma_partial_high = math.max(ema10, ema20, sma20)
ma_partial_low = math.min(ema10, ema20, sma20)
ma_partial_diff = ma_partial_high – ma_partial_low
bar_range = high – low
bar_range_prev = high[1] – low[1]
bar_range_prev_ok = bar_range_prev > bar_range_prev_min
isGreen = close > open
isRed = close < open ema10_top = ema10 >= ma_partial_high
ema10_bottom = ema10 <= ma_partial_low
// 满足所有和部分均线的差值要求
conditionBase = (ma_diff < tight_range_all) and (ma_partial_diff < tight_range_partial) and (bar_range > bar_range_min)
// ===== 信号冷却控制 =====
var int lastSignalBar = -1000
canShowSignal = (bar_index – lastSignalBar) > cooldownBars
// ===== 判断前一根K线是上涨(绿色)或下跌(红色) =====
prev_isGreen = close[1] > open[1]
prev_isRed = close[1] < open[1]
// ===== 策略执行逻辑(加入 bar_range_prev_ok 条件) =====
if canShowSignal and conditionBase and isGreen and ema10_top and prev_isGreen and bar_range_prev_ok
label.new(x=bar_index, y=ema10, text=”看涨”, style=label.style_label_up, color=color.green, textcolor=color.white)
strategy.entry(“Long”, strategy.long, qty=0.5, comment=”看涨”)
strategy.exit(“TP/SL Long”, from_entry=”Long”, limit=close + tp_points, stop=close – sl_points)
lastSignalBar := bar_index
if canShowSignal and conditionBase and isRed and ema10_bottom and prev_isRed and bar_range_prev_ok
label.new(x=bar_index, y=ema10, text=”看跌”, style=label.style_label_down, color=color.red, textcolor=color.white)
strategy.entry(“Short”, strategy.short, qty=0.5, comment=”看跌”)
strategy.exit(“TP/SL Short”, from_entry=”Short”, limit=close – tp_points, stop=close + sl_points)
lastSignalBar := bar_index
// ===== 辅助标签(显示每根K线的高低差,选填) =====
showLabel = input.bool(true, title=”显示高低差标签?”)
threshold = input.float(5.0, title=”最小差值显示标签”)
if showLabel and bar_range >= threshold
label.new(x=bar_index,
y=high,
text=”差: ” + str.tostring(bar_range, format.mintick),
style=label.style_label_down,
color=color.black,
textcolor=color.white,
size=size.small)