三重过滤动量趋势捕捉系统:ASO-SSL-MBI 综合策略

ASO SSL MBI ATR SMA
创建日期: 2025-06-16 15:02:06 最后修改: 2025-06-16 15:02:06
复制: 1 点击次数: 58
avatar of ianzeng123 ianzeng123
2
关注
68
关注者

三重过滤动量趋势捕捉系统:ASO-SSL-MBI 综合策略 三重过滤动量趋势捕捉系统:ASO-SSL-MBI 综合策略

概述

三重过滤动量趋势捕捉系统是一种基于规则的趋势和动量交易策略,它将三个独特的技术模型(高级情绪振荡器ASO、SSL通道和动量突破指标MBI)整合为一个综合引擎。该策略专为那些偏好经过良好过滤的入场点、减少噪音干扰和清晰交易结构的交易者设计。这种综合方法通过要求三个独立指标的一致性来确保信号的可靠性,并使用ATR(平均真实范围)来动态设置止盈和止损水平,从而实现风险管理的自适应性。

策略原理

该策略的核心逻辑基于三个主要技术指标的协同作用:

  1. 高级情绪振荡器(ASO):测量市场中看涨与看跌力量的优势。ASO通过将盘内压力与组范围动态相结合的自定义公式来计算市场情绪。该指标有三种计算模式,可以灵活地强调不同的市场方面。ASO产生交叉信号,这是策略中的关键确认要素。

  2. SSL通道:这是一个基于高点和低点移动平均线的经典趋势跟踪方法。它有助于过滤掉虚假信号,使交易与更广泛的市场方向保持一致。当SSL上轨线高于下轨线时表示看涨趋势,反之则为看跌趋势。

  3. 动量突破指标(MBI):寻找价格突破近期极值的情况。它在其他过滤器对齐后作为最终的触发机制。MBI通过检查价格是否突破过去特定周期(默认为12)的最高/最低水平来工作。

交易信号仅在以下条件满足时产生: - 新的ASO/SSL趋势一致性出现 - MBI突破在相同方向发生 - 最近的ASO交叉(看涨或看跌)确认信号

具体来说,多头入场条件是:MBI为正值(表示上行突破)、ASO看涨(ASO Bulls > ASO Bears)、ASO刚刚产生看涨交叉、SSL处于看涨状态。空头入场条件则相反。一旦触发交易,系统会使用ATR的倍数来设置动态的止盈和止损水平,使风险管理能够适应市场波动性。

策略优势

  1. 多重确认机制:通过要求三个独立指标的一致性,该策略显著减少了虚假信号,提高了交易质量。这种”三重过滤”方法确保只有强烈的趋势信号才会触发交易。

  2. 自适应风险管理:策略使用ATR来计算止盈和止损水平,使其能够根据市场波动性自动调整。这确保了在不同市场条件下风险敞口的一致性。

  3. 灵活的参数设置:策略允许用户调整各个组件的参数,包括ASO周期和计算方法、SSL移动平均线周期、MBI突破回顾期以及ATR相关设置,从而可以根据不同的市场环境和个人风险偏好进行优化。

  4. 清晰的交易结构:该策略的规则明确且易于理解,为交易者提供了清晰的入场和出场条件,减少了主观判断的需要。

  5. 无重叠交易:策略设计为在当前交易关闭前不会开启新交易,这有助于管理风险并防止过度交易。

  6. 趋势与动量的结合:通过结合趋势跟踪(SSL)和动量突破(MBI)指标,该策略能够在捕捉趋势的同时确认动量,这通常会导致更可靠的交易信号。

策略风险

  1. 过度过滤风险:由于需要三个独立指标的一致性,该策略可能会错过一些有利可图的交易机会。在某些市场条件下,这种严格的过滤可能导致交易频率较低。

解决方法:可以考虑调整各个指标的参数以适应不同的市场环境,或者在高波动性市场中适当放宽某些条件。

  1. 参数敏感性:策略的性能高度依赖于所选择的参数。不适当的参数设置可能导致过多的虚假信号或错过重要的市场动向。

解决方法:进行全面的回测和参数优化,找到适合特定市场和时间框架的最佳参数组合。考虑使用步进式回测来评估参数变化对性能的影响。

  1. 趋势反转风险:在强烈的趋势反转期间,该策略可能会经历较大的回撤,因为它需要所有三个指标都确认反转才能改变方向。

解决方法:考虑添加趋势强度过滤器或波动性调节机制,在极端市场条件下调整策略行为。也可以实施更激进的止损机制来减轻潜在的大幅回撤。

  1. 滑点和执行风险:特别是在波动性较高的市场中,实际执行价格可能与信号生成时的价格有显著差异。

解决方法:在回测中加入滑点模拟,并在实盘交易中使用限价单而非市价单。考虑在策略中增加额外的安全边际来应对执行风险。

  1. 过度依赖技术指标:该策略完全基于技术分析,忽略了基本面因素,这在某些市场条件下可能是一个限制。

解决方法:考虑结合基本面过滤器或市场情绪指标来补充技术信号。例如,可以添加波动性条件,在市场波动过大时避免交易。

策略优化方向

  1. 动态参数调整:实现基于市场条件(如波动性或趋势强度)自动调整策略参数的机制。例如,在高波动性环境中可以扩大ATR倍数,而在低波动性环境中则缩小。这样可以更好地适应不同的市场状态,提高策略的稳健性。

  2. 添加市场环境过滤器:引入额外的过滤器来识别当前的市场环境(如趋势、震荡或随机),并根据不同环境调整策略行为。例如,在震荡市场中可能需要更严格的入场条件,而在强趋势市场中则可以放宽某些条件。

  3. 部分仓位管理:实现更复杂的仓位管理系统,允许基于信号强度、市场波动性或其他因素进行部分进出场。这可以帮助减轻”全有或全无”交易方法的风险,提供更细致的风险控制。

  4. 时间过滤器优化:增强现有的回测时间过滤功能,加入日内时间过滤或特定市场条件下的时间过滤。某些市场在特定时间段可能表现出更明显的趋势特性,针对这些时间段优化策略可以提高整体性能。

  5. 指标改进:考虑对现有指标进行改进或替换。例如,可以使用自适应移动平均线代替SSL中的简单移动平均线,或者探索ASO的替代计算方法以更好地捕捉市场情绪变化。

  6. 机器学习增强:引入机器学习算法来优化参数选择或预测哪些市场条件下策略可能表现最佳。这可以帮助系统从历史数据中学习并适应未来的市场变化。

  7. 止盈/止损优化:实现更复杂的止盈策略,如跟踪止盈或基于支撑/阻力水平的动态止盈。同样,可以考虑基于市场结构的智能止损机制,而不仅仅依赖于ATR倍数。

总结

三重过滤动量趋势捕捉系统是一个全面的交易策略,通过整合ASO情绪指标、SSL趋势通道和MBI动量突破指标,提供了一种严格过滤的趋势跟踪方法。该策略的主要优势在于其多重确认机制和自适应风险管理系统,这有助于减少虚假信号并适应不同的市场波动条件。

尽管存在过度过滤和参数敏感性等潜在风险,但通过适当的参数优化和额外的风险管理技术,这些问题可以得到有效缓解。未来的优化方向可以包括动态参数调整、市场环境过滤和更复杂的仓位管理系统,这些都有潜力进一步提高策略的性能和稳健性。

总的来说,这种三重过滤方法为那些寻求明确结构和可靠交易信号的交易者提供了一个有价值的工具。通过结合情绪分析、趋势识别和动量确认,该策略能够在各种市场条件下识别高概率交易机会,同时保持谨慎的风险管理。对于愿意投入时间进行参数优化和策略调整的交易者来说,这种方法可以成为他们交易系统的有力组成部分。

策略源码
/*backtest
start: 2024-06-16 00:00:00
end: 2025-06-14 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Darkoexe

//@version=5

strategy("PMZ's Triple Filter Trend Strategy {Darkoexe}", overlay=true, initial_capital=10000, pyramiding=2, margin_long=50, margin_short=50)



length=input.int(10,"ASO Period?",minval=1,maxval=100)
mode=input.int(0,"ASO Calculation Method:",minval=0,maxval=2)
intrarange=high-low
grouplow=ta.lowest(low,length)
grouphigh=ta.highest(high,length)
groupopen=open[length-1]
grouprange=grouphigh-grouplow
K1=intrarange==0 ? 1 : intrarange
K2=grouprange==0 ? 1 : grouprange
intrabarbulls=((((close-low)+(high-open))/2)*100)/K1
groupbulls=((((close-grouplow)+(grouphigh-groupopen))/2)*100)/K2
intrabarbears=((((high-close)+(open-low))/2)*100)/K1
groupbears=((((grouphigh-close)+(groupopen-grouplow))/2)*100)/K2
TempBufferBulls= mode==0 ? (intrabarbulls+groupbulls)/2 : mode==1 ? intrabarbulls : groupbulls
TempBufferBears= mode==0 ? (intrabarbears+groupbears)/2 : mode==1 ? intrabarbears : groupbears
ASOBulls=ta.sma(TempBufferBulls,length)
ASOBears=ta.sma(TempBufferBears,length)

//ASO

// Modification
var cross = false

var isASObull = ASOBulls>ASOBears ? true : false

if(ASOBulls>ASOBears and isASObull == false)
    isASObull := true
    cross := true

else if(ASOBulls<ASOBears and isASObull == true)
    isASObull := false
    cross := true

else
    cross := false

//SSL

len=input.int(title="SSL Period", defval=10)
smaHigh=ta.sma(high, len)
smaLow=ta.sma(low, len)
float Hlv = na
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh: smaLow
sslUp   = Hlv < 0 ? smaLow : smaHigh



//Modification
var isSSLbull = sslUp>sslDown ? true: false

if(sslUp>sslDown)
    isSSLbull := true

else if(sslUp<sslDown)
    isSSLbull := false


//MBI

per = input(12,title="MBI Period")
H = ta.highest(hl2,per)
hi = H[1]
L = ta.lowest(hl2,per)
lo = L[1]
cl = close

ind = cl>hi? 1 : cl<lo? -1 : 0


//Modification
var longCondition = false
var shortCondition = false

if(ind>0 and isASObull==true and cross==true and isSSLbull==true)
    longCondition := true

else if(ind<0 and isASObull==false and cross==true and isSSLbull==false)
    shortCondition := true

// Define strategy parameters
// risk_percent = input(2, title="Risk Percentage")
targetATR = input(1, title="Take Profit ATR ratio")
stopLossATR = input(1.5, title="Stop loss ATR ratio")
atrPeriod = input(14, title="ATR period")


ATR = ta.atr(atrPeriod)
// Calculate take profit level based on the reward ratio
take_profit_price = longCondition?  close + (targetATR*ATR): shortCondition? close - (targetATR*ATR): 0
stop_loss_price = longCondition?  close - (stopLossATR*ATR): shortCondition? close + (stopLossATR*ATR): 0


if (longCondition and strategy.opentrades == 0)

    // take_profit_price = close + targetATR*ATR
    // stop_loss_price = close - (stopLossATR*ATR)
    strategy.entry("My Long Entry Id", strategy.long)
    strategy.exit("Exit", from_entry="My Long Entry Id", stop=stop_loss_price, limit=take_profit_price)
    longCondition := false

else if (shortCondition and strategy.opentrades == 0)

    // take_profit_price = close - targetATR*ATR
    // stop_loss_price = close + (stopLossATR*ATR)
    strategy.entry("My Short Entry Id", strategy.short)
    strategy.exit("Exit", from_entry="My Short Entry Id", stop=stop_loss_price, limit=take_profit_price)
    shortCondition := false
相关推荐