트리플 이동 평균 시퀀스 전략: 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
수행원

트리플 이동 평균 시퀀스 전략: <sup>2</sup>⁄<sub>3</sub> 진입 + <sup>3</sup>⁄<sub>3</sub> 증가 포지션 트리플 이동 평균 시퀀스 전략: <sup>2</sup>⁄<sub>3</sub> 진입 + <sup>3</sup>⁄<sub>3</sub> 증가 포지션

, 이건 신세안의 전략이냐?

이 전략은 마치 빨간색과 초록색으로 빛나는 것을 기다리는 것과 같습니다. 한 번 켜지는 불빛이 아니라 세 번 켜지는 것을 기다려야 합니다. MA5가 MA10을 넘어서 (첫 번째 불빛), 다음이 MA30을 넘어서 (두 번째 불빛), 마지막으로 MA60을 넘어서 (세 번째 불빛).

의 핵심 논리

이 전략의 핵심은 “열차 교차” 이 도미노 덩어리처럼 순서대로 떨어져야 계산된다! MA5 ((5 주기 평균선) 은 선두 이며, MA10, MA30, MA60을 차례로 돌파한다. 2/3의 돌파를 완료하면 전략은 작은 포지션을 시험한다. 3/3의 돌파를 완료하면 포지션을 추가 할 수 있습니다.

️ 피터 가이드: 저파동 필터

가장 똑똑한 곳은 여기 있습니다! 전략은 낮은 변동 환경에서만 시작되며, 브린의 대역폭을 통해 판단하십시오. 왜? 왜냐하면 높은 변동 시장에서 가짜 돌파구가 너무 많기 때문에 폭풍우에 운전하는 것과 같기 때문입니다.

실전 하이라이트 기능

스마트 탈퇴이 경우, 마이너스 마이너스 (MA) 가 30이 되면 손실을 중단하고, 손실을 확대할 기회를 주지 않습니다.냉각기 설계이 거래는 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")