三重均线序列策略:2/3入场+3/3加仓

SMA EMA WMA RMA BB volatility
创建日期: 2025-09-29 17:54:33 最后修改: 2025-09-29 17:54:33
复制: 13 点击次数: 263
avatar of ianzeng123 ianzeng123
2
关注
319
关注者

三重均线序列策略:2/3入场+3/3加仓 三重均线序列策略:2/3入场+3/3加仓

🎯 这是什么神仙策略?

你知道吗?这个策略就像是在等红绿灯🚦!不是一个灯亮就冲,而是要等三个灯按顺序亮起来。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")
相关推荐