
Знаете ли вы? Эта тактика похожа на ожидание красно-зеленого фонаря! Не один фонарь загорается, а три фонаря загораются в последовательности.
Суть этой стратегии заключается в том, что “последовательное скрещивание” костей, как домино, должно падать в последовательном порядке, чтобы считать! MA5 ((5 циклическая средняя линия) является лидером, он должен последовательно прорвать MA10, MA30 и MA60. Когда завершится 2⁄3 прорыва, стратегия будет пробовать небольшие позиции; когда завершится 3⁄3 полного прорыва, можно будет добавить позиции!
Самые умные места здесь! Стратегия запускается только в условиях низкой волатильности, судя по полосе пропускания Бринна. Почему? Потому что в высоко волатильных рынках слишком много ложных прорывов, как вождение автомобиля в штормовом веке, легко перевернуться, не видя дорожных условий.
Умный выход из системыЕсли цена достигнет уровня MA30, то убыток прекратится немедленно, и убыток не будет увеличиваться.Проектирование охлажденияНапример, если вы хотите, чтобы ваши деньги были вложены в ваш бизнес, вы можете использовать его в качестве инструмента для борьбы с эмоциями, которые могут возникнуть в результате торговли.Защита с 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")