Die Kernidee dieser Strategie besteht darin, die Preisvolatilität zu nutzen, um Markttrends zu beurteilen. Wenn die Volatilität steigt, bedeutet dies, dass der Markt einen neuen Trend bildet. Und wenn die Volatilität sinkt, bedeutet dies, dass der aktuelle Trend endet. Die Strategie berechnet die prozentuale Preisänderung und filtert sie dann mit doppelten gleitenden Durchschnitten, um einen Indikator zu erhalten, der die Preisvolatilität widerspiegelt. Sie erzeugt Kaufsignale, wenn der Indikator über seine Signallinie geht, und verkauft Signale, wenn er darunter geht.
Die Strategie berechnet zunächst die prozentuale Preisänderung:
i=(src/nz(src[1], src))*100
Dann wird i mit einem gleitenden Durchschnitt von 35 Perioden gefiltert, um den vorläufigen Volatilitätsindikator pmol2 zu erhalten. Pmol2 wird erneut mit einem gleitenden Durchschnitt von 20 Perioden gefiltert, um den endgültigen Indikator pmol zu erhalten. Schließlich wird ein gleitender Durchschnitt von 10 Perioden von pmol als Signallinie pmols verwendet.
Diese Strategie verwendet prozentuale Veränderung und doppelte MA-Filterung, um Preisvolatilität zu extrahieren und Trendveränderungen zu beurteilen. Sie gehört zu den relativ ausgereiften technischen Indikatorstrategien. Die Strategie hat eine gute Trendfangfähigkeit, aber eine mittlere Wendepunkterkennungsfähigkeit. Sie kann über Parameter-Tuning und Hinzufügen von Hilfsbedingungen optimiert werden.
/*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)