Estrategia de seguimiento de rupturas de precios máximos y mínimos


Fecha de creación: 2023-12-22 12:59:43 Última modificación: 2023-12-22 12:59:43
Copiar: 1 Número de Visitas: 606
1
Seguir
1623
Seguidores

Estrategia de seguimiento de rupturas de precios máximos y mínimos

Descripción general

Una estrategia de seguimiento de la tendencia en la que el precio se encuentra en el punto más alto o más bajo de la línea K anterior. Combina una media móvil para determinar la dirección de la tendencia, entra en el punto de ruptura y luego establece un stop loss o un stop loss de seguimiento para bloquear las ganancias.

Principio de estrategia

La estrategia se basa en las siguientes condiciones para decidir si abrir o cerrar una posición:

  1. Para determinar si la línea K está subiendo o bajando, juzgue si la línea K es roja o verde.
  2. Determina si la línea K actual supera el punto más alto o más bajo de la línea K anterior.
  3. El uso de medias móviles rápidas y medias móviles lentas para determinar la dirección de la tendencia
  4. Cuando la línea K ascendente rompa el punto más alto de la línea K descendente anterior, haga más; cuando la línea K descendente rompa el punto más bajo de la línea K ascendente anterior, haga hueco
  5. Las condiciones de posición en paridad son stop loss o tracking stop loss trigger; también se puede configurar un stop loss inmediato si aparece una línea K inversa

La estrategia se combina con un segundo juicio de línea K inversa para filtrar falsos brechas y asegurar la fiabilidad de la señal de brecha.

Análisis de las ventajas

  • La estrategia es clara y las operaciones son fáciles de manejar.
  • La combinación de dos medias móviles asegura que las grandes tendencias sean correctas
  • El mecanismo de seguimiento de las pérdidas ayuda a bloquear más ganancias
  • El mecanismo de la línea K inversa ayuda a evitar la búsqueda de la cima y la baja

Análisis de riesgos

  • El fracaso de la brecha podría causar pérdidas operativas en la línea ultracorta.
  • El riesgo de un falso avance en situaciones de temblor es mayor
  • Las medias móviles dobles pueden estar rezagadas y causar errores de juicio

Medidas de control de riesgos:

  1. Elegir un índice o un índice de mercado dominante, evitando el alto riesgo de las acciones
  2. Optimización de los parámetros de las medias móviles para mejorar la precisión de los juicios
  3. Aumentar adecuadamente el margen de pérdidas para asegurar el control de las pérdidas individuales

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Prueba de diferentes combinaciones de parámetros de la media móvil
  2. Pruebas de combinación con otros indicadores
  3. Parámetros para optimizar posiciones abiertas y puntos de parada
  4. Aumentar las reglas de selección cuantitativa para seleccionar los mejores
  5. Optimización de la autoadaptación de parámetros en combinación con algoritmos de aprendizaje automático

Resumir

La estrategia de ruptura de altas y bajas es una estrategia de seguimiento de tendencias más madura en general, que puede capturar un cierto grado de tendencia bajo el juicio auxiliar de las medias móviles, y los mecanismos de stop loss y tracking stop loss también ayudan a bloquear los beneficios. A través de la prueba y optimización continuas, la configuración de los parámetros de la estrategia y el efecto pueden ser más excelentes.

Código Fuente de la Estrategia
/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity)

useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy')
trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy')

fastMALength = input(5 , 'Fast MA length', group = 'Trend strength')
fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength')

slowMALength = input(10, 'Slow MA length', group = 'Trend strength')
slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength')

ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength')

useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy')
secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength')

longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings')
shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings')

fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength)
slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength)

FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters')
FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters')
FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters')
ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters')
ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters')
ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters')
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>time>=start and time<=finish?true:false
afterStartDate = time >= start and time<=finish?true:false
closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters')

trailStopMA = ta.ema(close, trailStopMALength)

isGreenCandle = close > open
isRedCandle = close < open
isBrokenHigh = close > open[1]
isPriorCandleRed = close[1] < open[1]
isPriorPriorCandleRed = close[2] < open[2]
isPriorPriorCandleGreen = close[2] > open[2]
isPriorCandleGreen = close[1] > open[1]
isBrokenLow = close < open[1]

isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh
isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow

isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false
isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false

longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled
longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA)
longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition

shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled
shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA)
shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition

if (longOpenCondition)
    strategy.entry("Long Entry", strategy.long)

if (longCloseCondition)
    strategy.close('Long Entry', 'Long Exit')

if (shortOpenCondition)
    strategy.entry("Short Entry", strategy.long)

if (shortCloseCondition)
    strategy.close('Short Entry', 'Short Exit')

if (closeTradesEOD and hour >= 14 and minute >= 30)
    strategy.close_all("EOD")

plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red)
plot(fastMA)
plot(ignoreSlowMA ? na : slowMA, linewidth = 4)