Основная идея этой стратегии заключается в том, чтобы использовать волатильность цен для оценки рыночных тенденций. Когда волатильность повышается, это означает, что рынок формирует новую тенденцию. А когда волатильность снижается, это означает, что текущая тенденция заканчивается. Стратегия рассчитывает процентное изменение цены, а затем фильтрует его с помощью двойных скользящих средних, чтобы получить индикатор, отражающий волатильность цен. Она генерирует сигналы покупки, когда индикатор пересекает линию сигнала, и продает сигналы, когда пересекает ниже.
Стратегия сначала рассчитывает процентное изменение цены:
i=(src/nz(src[1], src))*100
Затем он отфильтровывает i с 35-периодным скользящим средним показателем волатильности pmol2. Pmol2 снова отфильтровывается с 20-периодным скользящим средним показателем pmol. Наконец, 10-периодный скользящий средний показатель pmol используется в качестве сигнальной линии pmols. Купить, когда pmol пересекает pmols, и продавать, когда пересекает ниже.
Эта стратегия использует процентные изменения и двойную фильтрацию MA для извлечения волатильности цен и оценки изменений тренда. Она относится к относительно зрелым стратегиям технических индикаторов. Стратегия имеет хорошую способность улавливать тренд, но среднюю способность распознавания поворотных точек. Может оптимизироваться с помощью настройки параметров и добавления вспомогательных условий.
/*backtest start: 2022-12-01 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Strategy for DPMO", overlay=true) src=input(close, title="Source") length1=input(35, title="First Smoothing") length2=input(20, title="Second Smoothing") siglength=input(10, title="Signal Smoothing") ebc=input(false, title="Enable Bar Colors") upSign = '↑' // indicates the indicator shows uptrend downSign = '↓' // incicates the indicator showing downtrend exitSign ='x' //indicates the indicator uptrend/downtrend ending calc_csf(src, length) => sm = 2.0/length csf=(src - nz(csf[1])) * sm + nz(csf[1]) csf i=(src/nz(src[1], src))*100 pmol2=calc_csf(i-100, length1) pmol=calc_csf( 10 * pmol2, length2) pmols=ema(pmol, siglength) d=pmol-pmols hc=d>0?d>d[1]?lime:green:d<d[1]?red:orange buyDPMO = hc==lime and hc[1]!=lime closeBuyDPMO = hc==green and hc[1]!=green sellDPMO = hc==red and hc[1]!=red closeSellDPMO = hc==orange and hc[1]!=orange plotshape(buyDPMO, color=lime, style=shape.labelup, textcolor=#000000, text="DPMO", location=location.belowbar, transp=0) plotshape(closeBuyDPMO, color=green, style=shape.labelup, textcolor=#ffffff, text="X", location=location.belowbar, transp=0) plotshape(sellDPMO, color=red, style=shape.labeldown, textcolor=#000000, text="DPMO", location=location.abovebar, transp=0) plotshape(closeSellDPMO, color=orange, style=shape.labeldown, textcolor=#ffffff, text="X", location=location.abovebar, transp=0) barcolor(ebc?hc:na) strategy.entry("Long", strategy.long, when=buyDPMO) strategy.close("Long", when=closeBuyDPMO or sellDPMO) strategy.entry("Short", strategy.short, when=sellDPMO) strategy.close("Short", when=closeSellDPMO or buyDPMO)