
この戦略は,赤緑の灯が点灯するのを待つようなものです! 一つの灯が点灯するのではなく,三つの灯が順番に点灯するのを待つことです. MA5がMA10を過ぎて (最初の灯),MA30を過ぎて (第二の灯),MA60を過ぎて (第三の灯) になります. 重点を絞りましょう! 2つの灯が点灯すると小牛試験刀が点灯し,3つの灯が全点灯すると重倉攻撃ができます!
この戦略の精髓は”,シーケンシャル・クロス”がドミノの骨盤のように,順番に倒れる必要があるという点にある!MA5 ((5周期平均線) は,先頭羊であり,MA10,MA30,MA60を順番に突破しなければならない. 2/3の突破を完了すると,戦略は小ポジションの試験水となり, 3/3の完全な突破を完了すると,さらにポジションが加えられる.
戦略は低波動環境でのみ起動し,ブリン帯域で判断する.なぜ?高波動市場では,偽の突破があまりにも多く,嵐の中で運転しているように,道路の状況がよくわからないので,車転がりやすいからです.風が静かであるときにのみ,この”赤緑灯”システムは最も信頼できます.
スマート脱退価格がMA30に達すると,損失を拡大させる機会を与えず,即座に停止します.冷却期設計感情的な取引を避けるために,取引の後に15回の冷静期があります.K線保護:平日のポジションは,当日のポジションを開けることはできません.
/*backtest
start: 2024-09-29 00:00:00
end: 2025-09-26 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Bybit","currency":"ETH_USDT","balance":500000}]
*/
//@version=6
strategy("顺序三连穿越:2/3先入 + 3/3加仓(仅低波动过滤)", overlay=true, initial_capital=100000,
commission_type=strategy.commission.percent, commission_value=0.05,
pyramiding=1, calc_on_order_fills=true, calc_on_every_tick=false,
default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// ===== 参数 =====
len5 = input.int(5, "MA5", minval=1)
len10 = input.int(10, "MA10", minval=1)
len30 = input.int(30, "MA30", minval=1)
len60 = input.int(60, "MA60", minval=1)
maSrc = input.source(close, "均线价格源")
maType= input.string("SMA", "均线类型", options=["SMA","EMA","WMA","RMA"])
useShort = input.bool(true, "启用大死叉做空(含2/3先入)")
useIntrabarExit = input.bool(true, "触及MA30当根平仓")
seqMaxBars = input.int(200, "三穿最大跨度(超时重置)", minval=5)
cooldownBars = input.int(15, "平仓后冷却期", minval=0)
// —— 仅低波动过滤 ——
bbLen = input.int(20, "BW长度", minval=5)
bbMult = input.float(2.0, "BW倍数", step=0.1)
bwFloor = input.float(0.015, "带宽下限(仅过滤过小波动)", step=0.001)
useBW = input.bool(true, "启用低波动过滤")
// —— 3/3是否加仓 ——
addOnFull = input.bool(true, "3/3确认时加一笔")
addQtyPct = input.float(100, "加仓占权益%", step=1.0, minval=1, maxval=100)
// ===== 均线 =====
ma(_src, _len) =>
(maType == "EMA" ? ta.ema(_src, _len) :
maType == "WMA" ? ta.wma(_src, _len) :
maType == "RMA" ? ta.rma(_src, _len) :
ta.sma(_src, _len))
ma5 = ma(maSrc, len5)
ma10 = ma(maSrc, len10)
ma30 = ma(maSrc, len30)
ma60 = ma(maSrc, len60)
// ===== 带宽(仅过滤过小波动) =====
basis = ta.sma(close, bbLen)
dev = bbMult * ta.stdev(close, bbLen)
upper = basis + dev
lower = basis - dev
bw = basis != 0 ? (upper - lower) / basis : 0.0
vol_ok = (not useBW) or (bw >= bwFloor)
// ===== 多头状态机 =====
var int stL = 0
var int stL_bar0 = na
stL_prev = stL
advL1 = stL == 0 and ta.crossover(ma5, ma10)
advL2 = stL == 1 and ta.crossover(ma5, ma30)
advL3 = stL == 2 and ta.crossover(ma5, ma60)
if advL1
stL := 1
stL_bar0 := bar_index
else if advL2
stL := 2
else if advL3
stL := 3
if stL >= 3 and ta.crossunder(ma5, ma60)
stL := 2
if stL >= 2 and ta.crossunder(ma5, ma30)
stL := math.min(stL, 1)
if stL >= 1 and ta.crossunder(ma5, ma10)
stL := 0
stL_bar0 := na
if stL > 0 and not na(stL_bar0) and (bar_index - stL_bar0 > seqMaxBars)
stL := 0
stL_bar0 := na
long_early_raw = (stL_prev == 1 and stL == 2) // 5↑10 与 5↑30 完成
long_full_raw = (stL_prev == 2 and stL == 3) // 追加 5↑60
// ===== 空头状态机(对称) =====
var int stS = 0
var int stS_bar0 = na
stS_prev = stS
advS1 = stS == 0 and ta.crossunder(ma5, ma10)
advS2 = stS == 1 and ta.crossunder(ma5, ma30)
advS3 = stS == 2 and ta.crossunder(ma5, ma60)
if advS1
stS := 1
stS_bar0 := bar_index
else if advS2
stS := 2
else if advS3
stS := 3
if stS >= 3 and ta.crossover(ma5, ma60)
stS := 2
if stS >= 2 and ta.crossover(ma5, ma30)
stS := math.min(stS, 1)
if stS >= 1 and ta.crossover(ma5, ma10)
stS := 0
stS_bar0 := na
if stS > 0 and not na(stS_bar0) and (bar_index - stS_bar0 > seqMaxBars)
stS := 0
stS_bar0 := na
short_early_raw = (stS_prev == 1 and stS == 2)
short_full_raw = (stS_prev == 2 and stS == 3)
// ===== 冷静期与同根重入控制(先平后开) =====
var int coolUntil = na
var bool closedThisBar = false
closedThisBar := false
if strategy.position_size > 0 and (useIntrabarExit ? close <= ma30 : close[1] <= ma30[1])
strategy.close_all(comment="触及MA30平多")
coolUntil := bar_index + cooldownBars
closedThisBar := true
if strategy.position_size < 0 and (useIntrabarExit ? close >= ma30 : close[1] >= ma30[1])
strategy.close_all(comment="触及MA30平空")
coolUntil := bar_index + cooldownBars
closedThisBar := true
canEnter = (na(coolUntil) or bar_index > coolUntil) and not closedThisBar
// ===== 最终信号(仅低波动过滤 + 冷静期) =====
long_early = long_early_raw and vol_ok and canEnter
long_full = long_full_raw and vol_ok and canEnter
short_early= useShort and short_early_raw and vol_ok and canEnter
short_full = useShort and short_full_raw and vol_ok and canEnter
// ===== 执行:多头 =====
if long_early and strategy.position_size <= 0
strategy.entry("LONG", strategy.long)
if long_full
if strategy.position_size <= 0
strategy.entry("LONG", strategy.long)
else if addOnFull
strategy.entry("LONG+", strategy.long, qty=addQtyPct)
// ===== 执行:空头 =====
if short_early and strategy.position_size >= 0
strategy.entry("SHORT", strategy.short)
if short_full
if strategy.position_size >= 0
strategy.entry("SHORT", strategy.short)
else if addOnFull
strategy.entry("SHORT+", strategy.short, qty=addQtyPct)
// ===== 提醒 =====
alertcondition(long_early, "多头2/3先入", "MA5 依次上穿 MA10 与 MA30")
alertcondition(long_full, "多头3/3确认", "MA5 上穿 MA60(可加仓)")
alertcondition(short_early,"空头2/3先入", "MA5 依次下穿 MA10 与 MA30")
alertcondition(short_full, "空头3/3确认", "MA5 下穿 MA60(可加仓)")
alertcondition(close <= ma30, "平多", "收盘≤MA30")
alertcondition(close >= ma30, "平空", "收盘≥MA30")