Esta estratégia projeta uma estratégia de tendência de longo prazo baseada no Índice de Movimento Dinâmico (DMI), com uma faixa verdadeira média (ATR) para controlar os riscos de queda.
A estratégia só entra em negociações em dias de negociação especificados (sexta-feira) e horários de negociação (default 9:30am - 8:30pm horário local).
Quando o ADX está acima de 27, ele sinaliza que o mercado está em tendência.
Após a abertura de uma posição, o stop loss é definido em 5,5 x ATR a partir do preço de entrada, e ele sobe à medida que o preço sobe para bloquear os lucros.
Opcionalmente, os padrões sazonais do S&P500 são ativados, de modo que as negociações ocorrem apenas durante períodos historicamente de alta.
A combinação de métricas de tendência e stop loss ajuda a controlar as tendências e as perdas por negociação.
Os horários de negociação e os filtros de sazonalidade ajudam a evitar a volatilidade anormal e a reduzir os falsos sinais.
DMI e ATR são indicadores técnicos maduros com flexibilidade no ajuste de parâmetros adequados para otimização quântica.
Os parâmetros DMI e ATR incorretos podem levar a sinais demasiados ou demasiados poucos.
A configuração de stop loss muito larga pode causar paradas desnecessárias.
As horas de negociação e as regras de sazonalidade podem filtrar algumas oportunidades lucrativas.
Considere a combinação de outros indicadores como MACD, Bollinger Bands para regras de entrada e saída.
Testar diferentes múltiplos ATR para a perda de parada ou ajuste dinâmico da escala de perda de parada.
Teste ajustando horários de negociação ou otimizando datas de entrada e saída sazonais.
Tente aplicar métodos de aprendizagem de máquina para ajustar automaticamente parâmetros.
Esta estratégia integra técnicas de seguimento de tendências e controle de risco para superar problemas de alta volatilidade com sistemas de tendências.
/*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)