- Cuadrado
- Estrategia dinámica de desarrollo de canales
Estrategia dinámica de desarrollo de canales
El autor:
¿ Qué pasa?, Fecha: 2024-02-27 15:15:07
Las etiquetas:
Resumen general
Esta estrategia utiliza el indicador del canal de Keltner, combinado con líneas de promedio móvil, para establecer precios dinámicos de compra y venta de ruptura para lograr operaciones de ruptura de compra baja-venta alta.
Principio de la estrategia
- Calcular la mediana del canal: utilizar la media móvil exponencial para calcular la mediana del precio del canal
- Calcular el ancho de banda del canal: utilizar la media móvil de la volatilidad real, la volatilidad real media o la amplitud de precio para calcular el ancho de banda del canal
- Rejillo superior e inferior del canal: media ± N veces ancho de banda del canal
- Orden de entrada: Cuando el precio toque el rieles superior, establecer el precio de compra de ruptura y esperar el avance; cuando el precio toque el rieles inferior, establecer el precio de venta de ruptura y esperar el avance
- Orden de salida: Stop loss cuando el precio vuelve a la mediana después de comprar, o cuando el precio más alto excede el precio de entrada; Stop loss cuando el precio vuelve a la mediana después de vender, o cuando el precio más bajo es inferior al precio de entrada
Análisis de ventajas
- El uso de canales dinámicos puede capturar rápidamente los cambios en las tendencias del mercado
- El uso de la mediana es propicio para juzgar la dirección de las tendencias de los precios
- N veces la configuración de ancho de banda hace que el rango del canal sea razonable para evitar ajustes frecuentes de posición
- El uso de mecanismos de avance se ajusta a la teoría de tendencias y sigue la tendencia
- El establecimiento de condiciones de stop loss controla estrictamente los riesgos
Análisis de riesgos
- La selección del método para calcular la línea mediana afectará al efecto de coincidencia del rango de canales y los precios.
- Los múltiplos N excesivamente grandes o pequeños afectarán a la tasa de rendimiento de la estrategia
- Las compras y ventas de ruptura tienden a formar señales falsas y deben detenerse estrictamente
Direcciones de optimización
- Pruebe diferentes métodos de cálculo de la línea mediana para encontrar los parámetros óptimos
- Prueba diferentes valores de N para encontrar el multiplicador óptimo
- Aumentar la amplitud de la brecha para evitar señales falsas
- Optimizar la lógica de stop loss para controlar estrictamente la pérdida única
Resumen de las actividades
La estrategia general utiliza métodos científicos y razonables para juzgar las tendencias y direcciones de los precios a través de indicadores dinámicos del canal, establece parámetros razonables para capturar señales de avance, logra compras bajas-venta alta y obtiene rendimientos excedentes.
/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
s = ta.sma(source, length)
e = ta.ema(source, length)
exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, 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 (src < ma or high >= bprice )
cancelScond = crossScond and (src > 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")
Más.