本策略是一个基于市场疲劳度分析的多层级交易系统,通过对价格动态的深入分析来识别市场可能出现转折的关键时刻。该策略结合了动态的风险管理机制,包括资金管理、止损优化以及回撤控制等多个维度,形成了一个完整的交易决策框架。
策略核心是通过监测价格连续运动来判断市场疲劳程度。具体来说: 1. 通过比较当前收盘价与之前第4根K线的收盘价来确定趋势方向 2. 设置了三个不同强度级别(9/12/14)的信号触发点 3. 当价格持续朝一个方向运动时,系统会累积信号计数 4. 一旦达到预设的信号强度阈值,系统会给出相应级别的交易信号 5. 整合了基于ATR的动态止损机制和风险回报比的仓位管理系统
该策略通过多层级的疲劳度分析和完善的风险管理系统,为交易者提供了一个系统化的交易框架。虽然存在一些需要优化的地方,但整体设计理念完整,具有实际应用价值。建议在实盘中采用保守的资金管理策略,并持续进行参数优化和系统改进。
/*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);//空头追踪止损