Esta estrategia diseña una estrategia de negociación de retroceso basada en el indicador del canal de Keltner.
Esta estrategia utiliza el indicador del canal de Keltner para juzgar las tendencias de precios. El canal de Keltner consiste en un promedio móvil y un rango verdadero promedio (ATR). El tren superior es igual al promedio móvil más N veces ATR; el tren inferior es igual al promedio móvil menos N veces ATR. Cuando el precio atraviesa el tren inferior del canal desde abajo hacia arriba, se considera que el poder alcista se ve mejorado y se pueden tomar posiciones largas; cuando el precio atraviesa el tren superior desde arriba hacia abajo, se considera que el poder bajista se ve mejorado y se pueden tomar posiciones cortas.
Además, la base de la estrategia para juzgar las oportunidades de retroceso es que el precio toca o rompe el límite del canal de nuevo. Por ejemplo, después de que el precio sube para romper el rieles inferiores, si cae de nuevo para tocar el rieles inferiores sin tocar el rieles superiores, es una oportunidad para tomar un retroceso largo. La estrategia abrirá posiciones largas en este momento.
Se trata de una estrategia comercial que utiliza las características de retroceso de los precios.
Los principales riesgos de esta estrategia son:
Contramedidas:
La estrategia se puede optimizar en los siguientes aspectos:
Esta estrategia integra el juicio de tendencia y los métodos de negociación de retroceso, y tiene ventajas únicas en la captura de tendencias de reversión.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("Keltner bounce from border. No repaint. (by Zelibobla)", shorttitle="Keltner border bounce", overlay=true) price = close // build Keltner keltnerLength = input(defval=200, minval=1, title="Keltner EMA Period Length") keltnerATRLength = input(defval=200, minval=1, title="Keltner ATR Period Length (the same as EMA length in classic Keltner Channels)") keltnerDeviation = input(defval=8, minval=1, maxval=15, title="Keltner band width (in ATRs)") closeOnEMATouch = input(type=bool, defval=false, title="Close trade on EMA touch? (less drawdown, but less profit and higher commissions impact)") enterOnBorderTouchFromInside = input(type=bool, defval=false, title="Enter on border touch from inside? (by default from outside, which is less risky but less profitable)") SL = input(defval=50, minval=0, maxval=10000, title="Stop loss in ticks (leave zero to skip)") EMA = sma(price, keltnerLength) ATR = atr(keltnerATRLength) top = EMA + ATR * keltnerDeviation bottom = EMA - ATR * keltnerDeviation buyEntry = crossover(price, bottom) sellEntry = crossunder(price, top) plot(EMA, color=aqua,title="EMA") p1 = plot(top, color=silver,title="Keltner top") p2 = plot(bottom, color=silver,title="Keltner bottom") fill(p1, p2) tradeSize = input(defval=1, minval=1, title="Trade size") if ( enterOnBorderTouchFromInside and crossunder(price, bottom) ) strategy.entry("BUY", strategy.long, qty=tradeSize, comment="BUY") else if( crossover(price, bottom) ) strategy.entry("BUY", strategy.long, qty=tradeSize, comment="BUY") if( crossover(price,EMA) and closeOnEMATouch ) strategy.close("BUY") if( 0 != SL ) strategy.exit("EXIT BUY", "BUY", qty=tradeSize, loss=SL) strategy.exit("EXIT SELL", "SELL", qty=tradeSize, loss=SL) if( enterOnBorderTouchFromInside and crossover(price, bottom) ) strategy.entry("SELL", strategy.long, qty=tradeSize, comment="SELL") else if ( crossunder(price, top) ) strategy.entry("SELL", strategy.short, qty=tradeSize, comment="SELL") if( crossunder(price, EMA) and closeOnEMATouch ) strategy.close("SELL")