Detener el seguimiento dinámico de la tendencia sólo larga Siguiendo la estrategia con filtro de estacionalidad

El autor:¿ Qué pasa?, Fecha: 2024-02-27 14:01:56
Las etiquetas:

img

Resumen general

Esta estrategia diseña una estrategia de seguimiento de tendencias de largo plazo basada en el Índice de Movimiento Dinámico (DMI), con un Rango Verdadero Promedio (ATR) detrás de la stop loss para controlar los riesgos a la baja. También incorpora horas de negociación y filtros de estacionalidad del S&P500 para una mayor optimización y ventaja.

Estrategia lógica

  1. La estrategia solo entra en operaciones en días de negociación especificados (de lunes a viernes) y horas de negociación (default 9:30am - 8:30pm hora local).

  2. Cuando el ADX está por encima de 27, indica que el mercado está en tendencia.

  3. Después de abrir una posición, el stop loss se establece en 5,5 x ATR desde el precio de entrada, y sube a medida que el precio aumenta para obtener ganancias.

  4. Opcionalmente, los patrones estacionales del S&P500 están habilitados, de modo que las operaciones solo ocurren durante períodos históricamente alcistas.

Análisis de ventajas

  1. La combinación de métricas de tendencia y stop loss ayuda a manejar de manera efectiva las tendencias y controlar la pérdida por operación.

  2. Las horas de negociación y los filtros de estacionalidad ayudan a evitar la volatilidad anormal y a reducir las señales falsas.

  3. DMI y ATR son indicadores técnicos maduros con flexibilidad en el ajuste de parámetros adecuados para la optimización cuántica.

Análisis de riesgos

  1. Los parámetros incorrectos de DMI y ATR pueden dar lugar a demasiadas o muy pocas señales.

  2. Si el stop loss está demasiado amplio, puede ocasionar paradas innecesarias y si está demasiado ajustado, puede no controlar las pérdidas.

  3. Las horas de negociación y las reglas de estacionalidad pueden filtrar algunas oportunidades rentables.

Direcciones de optimización

  1. Considere combinar otros indicadores como MACD, Bandas de Bollinger para las reglas de entrada y salida.

  2. Prueba diferentes múltiplos de ATR para detener la pérdida o ajuste dinámico de la escala de detener la pérdida.

  3. Prueba ajustando los horarios de negociación, o optimizando las fechas de entrada y salida estacionales.

  4. Intenta aplicar métodos de aprendizaje automático a los parámetros de ajuste automático.

Conclusión

Esta estrategia integra técnicas de seguimiento de tendencias y control de riesgos para superar los problemas de alta volatilidad con los sistemas de tendencias.


/*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="DMI Strategy with ADX and ATR-based Trailing SL (Long Only) and Seasonality", shorttitle="MBV-SP500-CLIMBER", overlay=true)

// Eingabeparameter für Long-Positionen
len = input.int(14, minval=1, title="DI Length")
lensig = input.int(14, title="ADX Smoothing", minval=1, maxval=50)
adxLongThreshold = input.float(27.0, title="ADX Threshold for Long", minval=0)
atrLength = input.int(14, title="ATR Length")
atrLongMultiplier = input.float(5.5, title="ATR Multiplier for Trailing SL (Long)")

startTimeHH = input.int(09, title="startTime hh")
startTimeMM = input.int(30, title="startTime mm")

endTimeHH = input.int(20, title="endTime hh")
endTimeMM = input.int(30, title="endTime mm")

// Zeitzone des Nutzers als Eingabeparameter
timezoneOffset = input.int(1, title="Timezone Offset (Hours from UTC)", minval=-12, maxval=14)


// Zusätzliche Einstellung für SP500-Saisonalität
enableSeasonality = input.bool(false, title="Enable SP500 Seasonality")
seasonColor = color.new(color.blue, 90)
activeTimeColor = color.new(color.yellow, 90) // Farbe für aktive Handelszeiten

// Handelstage und -zeiten
tradeMonday = input.bool(true, title="Trade on Monday")
tradeTuesday = input.bool(true, title="Trade on Tuesday")
tradeWednesday = input.bool(true, title="Trade on Wednesday")
tradeThursday = input.bool(true, title="Trade on Thursday")
tradeFriday = input.bool(true, title="Trade on Friday")

// Konvertierung der Uhrzeit in Unix-Zeitstempel
getUnixTime(hour, minute) =>
    adjustedHour = hour - timezoneOffset
    sessionDate = timestamp(year, month, dayofmonth, 0, 0)
    sessionDate + adjustedHour * 60 * 60000 + minute * 60000

// Start- und Endzeit als Unix-Zeitstempel
// + 1 Stunde wegen UTC
startTime = getUnixTime(startTimeHH, startTimeMM)
endTime = getUnixTime(endTimeHH, endTimeMM)


// Überprüfen, ob der aktuelle Zeitpunkt innerhalb der Handelszeit liegt
isTradingTime() => true

// Saisonale Zeiträume definieren
isSeason(time) =>
    m = month(time)
    d = dayofmonth(time)
    (m == 1 and d >= 1) or (m == 2 and d <= 15) or (m == 3 and d >= 23) or (m == 4 and d <= 17) or (m == 5 and d >= 12) or (m == 6 and d >= 27 and d <= 8) or (m == 7 and d <= 29) or (m == 10 and d >= 15) or (m == 11 and d >= 1) or (m == 12 and d <= 2) or (m == 12 and d >= 20 and d <= 27)

// Hintergrundfarbe für saisonale Bereiche und aktive Handelszeiten
bgcolor(enableSeasonality and isSeason(time) ? seasonColor : na)
bgcolor(isTradingTime() ? color.new(activeTimeColor, 90) : na)

// Berechnung von +DM, -DM, ATR
up = ta.change(high)
down = -ta.change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = ta.rma(ta.tr, len)
atr = ta.atr(atrLength)

// Berechnung von +DI, -DI und ADX
plus = fixnan(100 * ta.rma(plusDM, len) / trur)
minus = fixnan(100 * ta.rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

// Logik für LONG Signale unter Berücksichtigung der Saisonalität und Zeitfilter
longSignal = ta.crossover(adx, adxLongThreshold) and plus > minus and isTradingTime()
longSignal := longSignal and (not enableSeasonality or (enableSeasonality and isSeason(time)))


// Variable für Trailing Stop-Loss
var float longTrailingSL = na

// Variablen für die Eröffnungszeit und den Eröffnungspreis der Position
var int openBarIndex = na
var float openPrice = na

// Handelslogik für Long-Positionen
// ohne strategy.position_size == 0 gilt die Kondition für ALLE Signale und nicht nur für das erste
if (longSignal and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)
    openBarIndex := bar_index
    openPrice := close
    longTrailingSL := close - atr * atrLongMultiplier

//if (longSignal)
   //longTrailingSL := close - atr * atrLongMultiplier

// Aktualisierung des Trailing Stop-Loss
if strategy.position_size > 0
    longTrailingSL := math.max(longTrailingSL, close - atr * atrLongMultiplier)

// Ausstieg aus Long-Positionen
strategy.exit("Close Long", "Long", stop=longTrailingSL)

// Anzeige des ATR-basierten Trailing Stops für Long-Positionen
//plot(strategy.position_size > 0 ? longTrailingSL : na, color=color.red, title="ATR Trailing Stop Long")

// Anzeige des ATR-basierten Trailing Stops für Long-Positionen
plot(strategy.position_size > 0 ? longTrailingSL : na, color=color.new(color.red, 75), style=plot.style_circles, linewidth=1, title="Trailing Stop-Loss")


// Wenn eine Position geschlossen wird, zeichnen Sie die Linie
// if strategy.position_size[1] > 0 and strategy.position_size == 0
//     lineColor = longTrailingSL > openPrice ? color.new(color.green, 50) : color.new(color.red, 50) // Hellgrün für Gewinne, Hellrot für Verluste
//     line.new(openBarIndex, openPrice, bar_index, longTrailingSL, width=3, color=lineColor)


Más.