Esta estrategia está diseñada basándose en el indicador Keltner Channel para generar señales comerciales cuando el precio rompe las bandas superior e inferior del canal.
La estrategia utiliza SMA y ATR para construir el Canal de Keltner.
La banda superior = SMA + ATR * multiplicador En el caso de las entidades de crédito, el valor de la inversión se calcula de acuerdo con el método de cálculo de la rentabilidad de la entidad.
Cuando el precio se rompe por encima de la banda superior, se genera una señal de compra.
Dado que sólo va largo, si aparece una señal de venta, cancelará las órdenes anteriores y aplanará la posición.
La lógica es:
Las ventajas de esta estrategia:
También hay algunos riesgos:
Soluciones:
La estrategia se puede optimizar en los siguientes aspectos:
Esta estrategia captura efectivamente las tendencias del mercado con reglas simples del canal de Keltner. La lógica es clara y fácil de entender. A pesar de la falta de salidas y módulo corto, tiene un gran potencial para mejoras como la sintonización de parámetros, la adición de paradas, ir corto, etc. En general, una estrategia cuantitativa valiosa que vale la pena una investigación y aplicación en profundidad.
/*backtest start: 2023-11-24 00:00:00 end: 2023-12-24 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Keltner Channel Strategy", overlay=true) source = close useTrueRange = input(true) length = input(20, minval=1) mult = input(1.0) ma = sma(source, length) range = useTrueRange ? tr : high - low rangema = sma(range, length) upper = ma + rangema * mult lower = ma - rangema * mult crossUpper = crossover(source, upper) crossLower = crossunder(source, lower) bprice = 0.0 bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1]) sprice = 0.0 sprice := crossLower ? low -syminfo.mintick : nz(sprice[1]) crossBcond = false crossBcond := crossUpper ? true : na(crossBcond[1]) ? false : crossBcond[1] crossScond = false crossScond := crossLower ? true : na(crossScond[1]) ? false : crossScond[1] cancelBcond = crossBcond and (source < ma or high >= bprice ) cancelScond = crossScond and (source > ma or low <= sprice ) if (cancelBcond) strategy.cancel("KltChLE") if (crossUpper) strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE") if (cancelScond) strategy.cancel("KltChSE") if (crossLower) strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)