该策略运用双指数移动平均线(DEMA)计算价格的波动率,并对波动率进行再平滑处理,从而发现价格波动的趋势,在波动率上升时做多,在波动率下降时做空。
计算价格的双指数移动平均线(DEMA),公式为:DEMA = 2*EMA(price, N) - EMA(EMA(price, N), N)
计算价格相对于DEMA的波动率:波动率 = (price - DEMA) / price * 100%
对波动率进行再次DEMA平滑处理,获取波动率的趋势信号
当再平滑后的波动率上穿某一水平时,做多;当再平滑后的波动率下穿某一水平时,做空
可设定只在某个时间段内交易
使用双指数移动平均线,能更快捕捉价格变化趋势
波动率能反映市场的多空情绪,波动率上升代表多头占优,下降代表空头占优
对波动率进行二次平滑,可过滤掉短期噪音,捕捉主要趋势
可设定只在特定时间段交易,避免不必要的滑点损失
采用止损、离场策略,可控制风险
在剧烈行情时,DEMA可能产生滞后,从而错过最佳入场点位
波动率指标可能出现虚假突破,应结合其他指标进行验证
sollte设定止损点位,以防止亏损扩大
在交易时间段之外,会错过交易机会
交易时间段的选择需要根据历史数据测试,不恰当的时间段可能降低收益
优化DEMA参数,采用更小幅度的N值
结合其他指标如RSI、MACD等进行综合判断
根据历史数据和最大可承受亏损确定止损点
优化交易时间段的选择
对不同品种分别测试最佳交易时间段
测试不同的DEMA参数组合,找到平滑效果最佳的参数
尝试其他不同类型的移动平均线,如EMA、SMA等
对波动率指标进行多次平滑,找到最佳的平滑参数
添加其他辅助指标,实现多因子 verification
使用机器学习等方法自动优化入场和离场参数
针对不同品种分别测试最佳参数组合
增加止损和离场策略,严格控制风险
该策略通过计算价格的DEMA波动率并进行再平滑,能快速发现市场多空情绪的变化趋势,在波动率上升时做多,在波动率下降时做空,实现顺势交易。但策略可能存在DEMA滞后、虚假突破等问题。应优化参数,严格止损,并辅助其他指标进行综合判断。如果使用得当,该策略可以抓住市场趋势换向的机会,获得较好的投资回报。
/*backtest start: 2022-10-17 00:00:00 end: 2023-10-23 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version= 2 strategy("DEMA of DPD Strategy ",shorttitle="DPD% DEMA " ,overlay=false) buyper =input(-2) sellper=input(2) demalen = input(50,title="Dema Length") e1= ema(close,demalen) e2=ema(e1,demalen) demaprice = 2 * e1 - e2 price=close demadifper = ((price-demaprice)/price)*100 OverDemaPer = input(1, title="Band for OverBought") UnderDemaPer= input(-1,title="Band for OverSold") band1 = hline(OverDemaPer) band0 = hline(UnderDemaPer) zeroline=0 fill(band1, band0, color=green, transp=90) demalen2 = input(21,title="DEMA to Calculate dema of DPD") demaofdpd =ema(demadifper,demalen2) demaofdpd2 =ema(demaofdpd,demalen2) resultstrategy = 2*demaofdpd - demaofdpd2 plot(resultstrategy,color=blue) yearfrom = input(2018) yearuntil =input(2019) monthfrom =input(6) monthuntil =input(12) dayfrom=input(1) dayuntil=input(31) if ( crossover(resultstrategy,buyper) ) strategy.entry("BUY", strategy.long, stop=close, oca_name="TREND", comment="BUY") else strategy.cancel(id="BUY") if ( crossunder(resultstrategy,sellper) ) strategy.entry("SELL", strategy.short,stop=close, oca_name="TREND", comment="SELL") else strategy.cancel(id="SELL")