Basado en una estrategia de avance de canal dinámico


Fecha de creación: 2024-02-27 15:15:07 Última modificación: 2024-02-27 15:15:07
Copiar: 0 Número de Visitas: 567
1
Seguir
1617
Seguidores

Basado en una estrategia de avance de canal dinámico

Descripción general

Esta estrategia utiliza el indicador de canal de Keltner, combinado con un promedio móvil, para establecer precios de compra y venta de ruptura dinámica y realizar operaciones de ruptura de compra y venta de baja y alta. La estrategia identifica automáticamente oportunidades de compra y venta de ruptura de canal.

Principio de estrategia

  1. Calcular la media de la vía: usar el índice para calcular la media de los precios
  2. Cálculo de la banda de canales: Cálculo de la banda de canales de la media móvil aplicada a la amplitud real o a la media real o al alza de precios
  3. Líneas de subida y bajada de la vía: banda de entrada de la vía media ± N veces
  4. Orden de entrada: cuando el precio toque la línea de la vía superior, establece el precio de compra de la ruptura y espera la ruptura; cuando el precio toque la línea de la vía inferior, establece el precio de venta de la ruptura y espera la ruptura
  5. Orden de salida: se detiene cuando la compra se vuelve a la vía media o cuando el precio más alto supera el precio de entrada; se detiene cuando el precio más bajo es inferior al precio de entrada o cuando el precio más bajo es inferior al precio de entrada o cuando el precio más alto rebota en la vía media después de la venta

Análisis de las ventajas

  1. El uso de canales dinámicos para capturar rápidamente los cambios en las tendencias del mercado
  2. El uso de la vía media es útil para determinar la dirección de los precios
  3. La configuración de N veces el ancho de banda permite un rango de acceso razonable y evita ajustes frecuentes de posición
  4. El uso de mecanismos de ruptura, de acuerdo con la teoría de la tendencia, se basa en la tendencia
  5. Establecer condiciones de stop loss y controlar el riesgo

Análisis de riesgos

  1. La elección del método de cálculo de la línea de la órbita media afecta el alcance del canal y el efecto de la coincidencia de precios
  2. N multiplicado por un número demasiado grande o demasiado pequeño puede afectar la rentabilidad de la estrategia
  3. Las compras y ventas de ruptura son propensas a crear señales falsas y deben detenerse estrictamente.

Dirección de optimización

  1. Prueba diferentes métodos de cálculo de la línea media para encontrar el mejor parámetro
  2. Prueba diferentes valores de N para encontrar el múltiplo óptimo
  3. Aumentar la brecha para evitar falsas señales
  4. Optimización de la lógica de detención de pérdidas, control estricto de las pérdidas individuales

Resumir

Esta estrategia utiliza la ciencia de manera general para determinar el movimiento y la dirección de los precios a través de indicadores de canal dinámico, establecer parámetros razonables para capturar señales de ruptura, lograr una venta baja y alta, y luego obtener ganancias excedentarias. Al mismo tiempo, optimiza continuamente el riesgo de la estrategia para que pueda operar de manera estable en varios mercados.

Código Fuente de la Estrategia
/*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")