Estrategia dinámica de desarrollo de canales

El autor:¿ Qué pasa?, Fecha: 2024-02-27 15:15:07
Las etiquetas:

img

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

  1. Calcular la mediana del canal: utilizar la media móvil exponencial para calcular la mediana del precio del canal
  2. 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
  3. Rejillo superior e inferior del canal: media ± N veces ancho de banda del canal
  4. 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
  5. 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

  1. El uso de canales dinámicos puede capturar rápidamente los cambios en las tendencias del mercado
  2. El uso de la mediana es propicio para juzgar la dirección de las tendencias de los precios
  3. N veces la configuración de ancho de banda hace que el rango del canal sea razonable para evitar ajustes frecuentes de posición
  4. El uso de mecanismos de avance se ajusta a la teoría de tendencias y sigue la tendencia
  5. El establecimiento de condiciones de stop loss controla estrictamente los riesgos

Análisis de riesgos

  1. La selección del método para calcular la línea mediana afectará al efecto de coincidencia del rango de canales y los precios.
  2. Los múltiplos N excesivamente grandes o pequeños afectarán a la tasa de rendimiento de la estrategia
  3. Las compras y ventas de ruptura tienden a formar señales falsas y deben detenerse estrictamente

Direcciones de optimización

  1. Pruebe diferentes métodos de cálculo de la línea mediana para encontrar los parámetros óptimos
  2. Prueba diferentes valores de N para encontrar el multiplicador óptimo
  3. Aumentar la amplitud de la brecha para evitar señales falsas
  4. 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.