
Esta estrategia se basa en el diseño de señales de negociación basadas en indicadores de canales dinámicos para generar señales de compra y venta en función de la subida y bajada de los canales de ruptura de precios. La estrategia solo realiza operaciones de varios titulares, y si se produce una señal de venta, la posición queda cerrada.
Esta estrategia utiliza el promedio SMA y la amplitud de fluctuación real de ATR para construir un canal de potencia. Los carriles superiores y inferiores del canal son:
En la vía = SMA + ATR * el factor La línea inferior = SMA - ATR * factor
Cuando el precio sube por la vía, genera una señal de compra; cuando el precio baja por la vía, genera una señal de venta.
Debido a que solo se hace más de una vez, si aparece una señal de venta, se cancela la orden de apertura anterior y la posición se vuelve a la posición vacía.
En concreto, la lógica de la estrategia es la siguiente:
La estrategia tiene las siguientes ventajas:
La estrategia también tiene sus riesgos:
Respuesta:
Esta estrategia puede ser optimizada en los siguientes aspectos:
Esta estrategia se basa en el indicador de canal de movimiento, captura las tendencias del mercado de manera simple y efectiva. La lógica de la estrategia es clara y fácil de entender, genera señales de negociación mediante el avance y descenso del canal de ruptura de precios. Aunque solo hacer múltiples cabezas y no tener un mecanismo de salida es insuficiente, se puede mejorar mediante la optimización de parámetros, la adición de módulos de cabezas vacías, la adición de paradas, etc. En general, esta estrategia tiene un gran espacio de mejora y es una estrategia cuantitativa que vale la pena estudiar en profundidad y aplicar.
/*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)