多周期市场疲劳度分析策略与风险管理系统


创建日期: 2025-09-03 13:34:05 最后修改: 2025-09-03 13:34:05
复制: 0 点击次数: 1
avatar of ianzeng123 ianzeng123
1
关注
139
关注者

多周期市场疲劳度分析策略与风险管理系统 多周期市场疲劳度分析策略与风险管理系统

概述

本策略是一个基于市场疲劳度分析的多层级交易系统,通过对价格动态的深入分析来识别市场可能出现转折的关键时刻。该策略结合了动态的风险管理机制,包括资金管理、止损优化以及回撤控制等多个维度,形成了一个完整的交易决策框架。

策略原理

策略核心是通过监测价格连续运动来判断市场疲劳程度。具体来说: 1. 通过比较当前收盘价与之前第4根K线的收盘价来确定趋势方向 2. 设置了三个不同强度级别(9/12/14)的信号触发点 3. 当价格持续朝一个方向运动时,系统会累积信号计数 4. 一旦达到预设的信号强度阈值,系统会给出相应级别的交易信号 5. 整合了基于ATR的动态止损机制和风险回报比的仓位管理系统

策略优势

  1. 多层级信号系统提供了不同程度的交易机会识别
  2. 通过资金管理和风险控制机制来保护资金安全
  3. 采用ATR动态止损,能更好地适应市场波动
  4. 引入了追踪止损机制,可以更好地锁定利润
  5. 设置了最大回撤保护,避免过度损失
  6. 系统具有良好的可扩展性和参数优化空间

策略风险

  1. 在震荡市场中可能产生错误信号
  2. 固定的信号阈值可能不适合所有市场环境
  3. 快速反转行情下止损可能较大
  4. 需要较多的参数优化工作
  5. 资金管理系统可能在某些情况下限制获利空间

策略优化方向

  1. 引入市场波动率过滤机制,在不同波动环境下调整信号阈值
  2. 增加成交量分析维度,提高信号可靠性
  3. 开发自适应的参数优化系统
  4. 加入更多的市场环境分析指标
  5. 优化资金管理系统,使其更具灵活性

总结

该策略通过多层级的疲劳度分析和完善的风险管理系统,为交易者提供了一个系统化的交易框架。虽然存在一些需要优化的地方,但整体设计理念完整,具有实际应用价值。建议在实盘中采用保守的资金管理策略,并持续进行参数优化和系统改进。

策略源码
/*backtest
start: 2024-09-02 00:00:00
end: 2025-09-02 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
args: [["ContractType","ag2509",360008]]
*/

//@version=6
//策略定义:创建一个带有风险管理和回撤控制的改进疲惫信号交易策略
strategy(title="Improved Exhaustion Signal with Risk Management and Drawdown Control", 
    shorttitle="Exhaustion Signal", overlay=true)

//输入参数设置:定义用户可调整的策略参数
showLevel1 = input.bool(true, 'Show Level 1 Signals');//是否显示一级信号
showLevel2 = input.bool(true, 'Show Level 2 Signals');//是否显示二级信号
showLevel3 = input.bool(true, 'Show Level 3 Signals');//是否显示三级信号

//信号强度阈值设置:定义不同级别信号的触发条件
level1 = 9;//一级信号阈值
level2 = 12;//二级信号阈值
level3 = 14;//三级信号阈值

//风险管理参数设置:控制每笔交易的风险暴露
riskPercentage = input.float(5.0, title="Risk Percentage per Trade", minval=1, maxval=20.0);
//每笔交易风险百分比
riskRewardRatio = input.float(3.0, title="Risk-to-Reward Ratio", minval=1.0, maxval=5.0);
//风险回报比例
trailingStop = input.bool(true, title="Enable Trailing Stop");//是否启用追踪止损
trailingStopDistance = input.int(50, title="Trailing Stop Distance (in points)", minval=1);
//追踪止损距离(以点为单位)

//回撤保护设置:防止过大亏损的保护机制
maxDrawdown = input.float(10.0, title="Max Drawdown Percentage", minval=0.1, maxval=50.0);
//最大允许回撤百分比,超过此值将停止交易

//全局变量声明:用于跟踪策略状态的重要变量
var int cycle = 0;//当前周期计数
var int bullishSignals = 0;//看涨信号计数
var int bearishSignals = 0;//看跌信号计数
var float equityHigh = na;//账户权益最高值,初始化为未定义

//回撤监控逻辑:持续监控账户回撤情况
if (na(equityHigh) or strategy.equity > equityHigh)
    equityHigh := strategy.equity;//更新权益最高值

drawdownPercent = 100 * (equityHigh - strategy.equity) / equityHigh;//计算当前回撤百分比

//回撤保护机制:当回撤超过限制时停止交易
if drawdownPercent >= maxDrawdown
    strategy.close_all();//关闭所有持仓

//重置和即时重检函数:使用数组返回值处理信号重置逻辑
f_resetAndRecheck(_bullish, _bearish, _cycle, _close, _close4) =>
    newBullish = _bullish;//临时看涨信号变量
    newBearish = _bearish;//临时看跌信号变量
    newCycle = _cycle;//临时周期变量

    //根据价格行为重置周期
    newBullish := 0;//重置看涨信号
    newBearish := 0;//重置看跌信号
    newCycle := 0;//重置周期

    //价格判断逻辑:根据当前价格与4个周期前价格的关系确定信号方向
    if _close < _close4
        newBullish := 1;//设置看涨信号
        newCycle := newBullish;//更新周期为看涨
    else if _close > _close4
        newBearish := 1;//设置看跌信号
        newCycle := newBearish;//更新周期为看跌

    //返回结果数组:创建包含三个值的数组用于返回结果
    resultArray = array.new_int(3, 0);//创建长度为3的整数数组
    array.set(resultArray, 0, newBullish);//设置看涨信号值
    array.set(resultArray, 1, newBearish);//设置看跌信号值
    array.set(resultArray, 2, newCycle);//设置周期值

    resultArray;//返回结果数组

//疲惫信号主逻辑:核心的信号检测和计数逻辑
if cycle < 9
    //看涨周期检测:当收盘价低于4个周期前的收盘价
    if close < close[4]
        bullishSignals += 1;//看涨信号计数加1
        bearishSignals := 0;//重置看跌信号
        cycle := bullishSignals;//更新周期为当前看涨信号数
    //看跌周期检测:当收盘价高于4个周期前的收盘价
    else if close > close[4]
        bearishSignals += 1;//看跌信号计数加1
        bullishSignals := 0;//重置看涨信号
        cycle := bearishSignals;//更新周期为当前看跌信号数
    //其他情况处理:价格没有明确方向时的处理
    else
        newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
        //调用重置函数
        bullishSignals := array.get(newVals, 0);//获取新的看涨信号值
        bearishSignals := array.get(newVals, 1);//获取新的看跌信号值
        cycle := array.get(newVals, 2);//获取新的周期值
else
    //高级信号检测:当周期数达到9或以上时的复杂逻辑
    //看涨信号检查:处理现有看涨信号的继续或重置
    if bullishSignals > 0
        //中等强度信号检测:信号强度小于三级阈值减1
        if bullishSignals < (level3 - 1)
            if close < close[3]
                bullishSignals += 1;//看涨信号计数加1
                bearishSignals := 0;//重置看跌信号
                cycle := bullishSignals;//更新周期
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
                bullishSignals := array.get(newVals, 0);//重置后的看涨信号
                bearishSignals := array.get(newVals, 1);//重置后的看跌信号
                cycle := array.get(newVals, 2);//重置后的周期
        //最高级信号检测:当信号强度达到三级阈值减1时
        else if bullishSignals == (level3 - 1)
            if close < close[2]
                bullishSignals := level3;//设置为最高级看涨信号
                cycle := bullishSignals;//更新周期
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
                bullishSignals := array.get(newVals, 0);//重置后的看涨信号
                bearishSignals := array.get(newVals, 1);//重置后的看跌信号
                cycle := array.get(newVals, 2);//重置后的周期
        //超出范围处理:信号强度超出预期范围时的重置
        else
            newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
            bullishSignals := array.get(newVals, 0);//重置后的看涨信号
            bearishSignals := array.get(newVals, 1);//重置后的看跌信号
            cycle := array.get(newVals, 2);//重置后的周期
    //看跌信号检查:处理现有看跌信号的继续或重置(逻辑与看涨相反)
    else if bearishSignals > 0
        //中等强度信号检测:信号强度小于三级阈值减1
        if bearishSignals < (level3 - 1)
            if close > close[3]
                bearishSignals += 1;//看跌信号计数加1
                bullishSignals := 0;//重置看涨信号
                cycle := bearishSignals;//更新周期
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
                bullishSignals := array.get(newVals, 0);//重置后的看涨信号
                bearishSignals := array.get(newVals, 1);//重置后的看跌信号
                cycle := array.get(newVals, 2);//重置后的周期
        //最高级信号检测:当信号强度达到三级阈值减1时
        else if bearishSignals == (level3 - 1)
            if close > close[2]
                bearishSignals := level3;//设置为最高级看跌信号
                cycle := bearishSignals;//更新周期
            else
                newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
                bullishSignals := array.get(newVals, 0);//重置后的看涨信号
                bearishSignals := array.get(newVals, 1);//重置后的看跌信号
                cycle := array.get(newVals, 2);//重置后的周期
        //超出范围处理:信号强度超出预期范围时的重置
        else
            newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
            bullishSignals := array.get(newVals, 0);//重置后的看涨信号
            bearishSignals := array.get(newVals, 1);//重置后的看跌信号
            cycle := array.get(newVals, 2);//重置后的周期
    //无信号状态处理:当既没有看涨也没有看跌信号时
    else
        newVals = f_resetAndRecheck(bullishSignals, bearishSignals, cycle, close, close[4]);
        bullishSignals := array.get(newVals, 0);//重置后的看涨信号
        bearishSignals := array.get(newVals, 1);//重置后的看跌信号
        cycle := array.get(newVals, 2);//重置后的周期

//信号标志位定义:根据信号强度和用户设置确定是否显示信号
bullishLevel1 = showLevel1 and (bullishSignals == level1);//一级看涨信号标志
bearishLevel1 = showLevel1 and (bearishSignals == level1);//一级看跌信号标志

bullishLevel2 = showLevel2 and (bullishSignals == level2);//二级看涨信号标志
bearishLevel2 = showLevel2 and (bearishSignals == level2);//二级看跌信号标志

bullishLevel3 = showLevel3 and (bullishSignals == level3);//三级看涨信号标志
bearishLevel3 = showLevel3 and (bearishSignals == level3);//三级看跌信号标志

//信号图形显示:在图表上绘制不同级别的信号标记
plotshape(bullishLevel1, style=shape.diamond, color=color.new(#30ff85, 0), textcolor=color.white, 
    size=size.tiny, location=location.belowbar, title="Level 1 Bullish Signal");
//一级看涨信号:绿色钻石图标显示在K线下方
plotshape(bearishLevel1, style=shape.diamond, color=color.new(#ff1200, 0), textcolor=color.white, 
    size=size.tiny, location=location.abovebar, title="Level 1 Bearish Signal");
//一级看跌信号:红色钻石图标显示在K线上方

plotshape(bullishLevel2, style=shape.xcross, color=color.new(#30ff85, 0), textcolor=color.white, 
    size=size.tiny, location=location.belowbar, title="Level 2 Bullish Signal");
//二级看涨信号:绿色叉形图标显示在K线下方
plotshape(bearishLevel2, style=shape.xcross, color=color.new(#ff1200, 0), textcolor=color.white, 
    size=size.tiny, location=location.abovebar, title="Level 2 Bearish Signal");
//二级看跌信号:红色叉形图标显示在K线上方

plotshape(bullishLevel3, style=shape.flag, color=color.new(#30ff85, 0), textcolor=color.white, 
    size=size.tiny, location=location.belowbar, title="Level 3 Bullish Signal");
//三级看涨信号:绿色旗帜图标显示在K线下方
plotshape(bearishLevel3, style=shape.flag, color=color.new(#ff1200, 0), textcolor=color.white, 
    size=size.tiny, location=location.abovebar, title="Level 3 Bearish Signal");
//三级看跌信号:红色旗帜图标显示在K线上方

//三级信号后重置:当达到最高级信号后重置所有计数器
if bullishSignals == level3 or bearishSignals == level3
    bullishSignals := 0;//重置看涨信号计数
    bearishSignals := 0;//重置看跌信号计数
    cycle := 0;//重置周期计数

//回测交易逻辑:基于信号级别设定基本的多空入场条件
longCondition = bullishLevel1 or bullishLevel2 or bullishLevel3;//做多条件
shortCondition = bearishLevel1 or bearishLevel2 or bearishLevel3;//做空条件

//仓位计算:基于风险百分比计算合适的交易仓位大小
equity = strategy.equity;//当前账户权益
riskAmount = equity * riskPercentage / 100;//单笔交易风险金额
atr = ta.atr(14);//14周期平均真实波幅   
stopLossLevel = (atr * 1.5) * syminfo.pointvalue;//使用ATR的1.5倍作为动态止损距离
positionSize = riskAmount / stopLossLevel;//根据风险金额计算仓位大小

//策略执行逻辑:根据信号条件执行买入和卖出操作
if longCondition
    strategy.entry("Long", strategy.long, qty=positionSize);//执行做多入场

if shortCondition
    strategy.entry("Short", strategy.short, qty=positionSize);//执行做空入场

//止损和止盈设定:基于具体价格水平设置退出条件
stopLoss = stopLossLevel;//止损距离
takeProfit = stopLoss * riskRewardRatio;//止盈距离(基于风险回报比)

//应用止损止盈:为策略设置具体的退出价格水平
strategy.exit("Exit Long", from_entry="Long", stop=close - stopLoss, limit=close + takeProfit);
//多头头寸止损止盈设置
strategy.exit("Exit Short", from_entry="Short", stop=close + stopLoss, limit=close - takeProfit);
//空头头寸止损止盈设置

//追踪止损功能:动态调整止损价格以保护利润
if trailingStop
    strategy.exit("Exit Long Trailing", from_entry="Long", trail_price=close - trailingStopDistance, 
        trail_offset=trailingStopDistance);//多头追踪止损
    strategy.exit("Exit Short Trailing", from_entry="Short", trail_price=close + trailingStopDistance, 
        trail_offset=trailingStopDistance);//空头追踪止损