Durchbruch mehrerer SMA-Intervalle und dynamische Gewinnsicherungsstrategie für quantitativen Handel

SMA
Erstellungsdatum: 2024-12-20 16:28:54 zuletzt geändert: 2024-12-20 16:28:54
Kopie: 0 Klicks: 441
1
konzentrieren Sie sich auf
1617
Anhänger

Durchbruch mehrerer SMA-Intervalle und dynamische Gewinnsicherungsstrategie für quantitativen Handel

Überblick

Dies ist eine dynamische Trend-Tracking-Trading-Strategie, die auf SMA-Indikatoren basiert und eine Kombination aus Preisspanne, Randomisierungsindikatoren und mehrfachen Gewinnschutzmechanismen enthält. Die Strategie kombiniert die Bewegung der Preise in verschiedenen Bereichen mit dem Kreuzsignal der kurzfristigen und langfristigen Moving Averages, während die Randomisierungsindikatoren zur Bestimmung der Marktlage und der Trendstärke verwendet werden, um eine effiziente Trendfangung zu erreichen.

Strategieprinzip

Die Kernlogik der Strategie umfasst die folgenden Schlüsselelemente:

  1. Trendrahmen mit 19- und 74-Perioden-SMAs
  2. Die Farben des SMAs werden in vier Zuständen unterteilt: Gelb, Grün, Rot und Orange.
  3. Fünf wichtige Ebenen in den Preisklassen, um zu erkennen, ob die Preise stark oder schwach sind
  4. Die Teilnahmevoraussetzungen müssen gleichzeitig erfüllt sein:
    • SMA ist grün oder gelb
    • Preise durchbrechen orange Zone
    • Schlusskurs über kurzfristigen SMA
  5. Es gibt zwei Arten von Stopps:
    • Der Prozentsatz der Rücknahme des Schutzes auf der Grundlage des Höchstpreises
    • Gewinne werden auf Basis von Fixpunkten gesperrt

Strategische Vorteile

  1. Mehrfachbestätigung reduziert Falschmeldungen
  2. Dynamische Segmentierung für unterschiedliche Marktumstände
  3. Dual Stop-Mechanismen bieten bessere Risikokontrollen
  4. Eine klare Klassifizierung der Marktlage hilft, den Markttakt zu erfassen
  5. Echtzeit-Überwachung des Handelsstatus für die Strategie-Debugging
  6. Technische Indikatoren in Kombination mit einer Analyse des Preisverhaltens

Strategisches Risiko

  1. Überhöhung der Handelsströme in den turbulenten Märkten
  2. Die Festplatte hat vielleicht etwas verpasst.
  3. Parameteroptimierung kann zu Überanpassung führen
  4. Ein Teil der Gewinne könnte verloren gehen, wenn sich der Markt schnell umdreht
  5. Mehrere Bestätigungsbedingungen könnten einige Transaktionsmöglichkeiten verpassen Die Lösung:
  • Schwingungsratefilter hinzufügen
  • Dynamische Anpassung der Parameter
  • Stärkung des Mechanismus zur Identifizierung des Marktumfelds
  • Optimierung der Timing-Funktion

Richtung der Strategieoptimierung

  1. Einführung von Parametern für die dynamische Anpassung der Volatilitätsindikatoren
  2. Anpassung der Stop-Off-Bedingungen an die Marktlage
  3. Mechanismus zur Bestätigung des Transaktionsvolumens hinzufügen
  4. Hinzufügen von Trendstärkenfiltern
  5. Optimierung der Verteilung nach Regionen unter Berücksichtigung der Merkmale des Marktes
  6. Verbesserung der Risikomanagementmechanismen, wie zum Beispiel:
    • Tägliche Stop-Loss
    • Maximale Rückzugskontrolle
    • Haltezeitbeschränkung

Zusammenfassen

Die Strategie baut ein vollständiges Handelssystem auf, indem sie mehrere technische Indikatoren und Methoden zur Analyse des Preisverhaltens kombiniert. Die Strategie hat die Vorteile von mehreren Bestätigungsmechanismen und einem flexiblen Stop-System, muss aber auch auf die Auswirkungen der Marktumgebung auf die Strategie-Performance achten. Durch kontinuierliche Optimierung und Verbesserung des Risikomanagements wird die Strategie unter verschiedenen Marktumgebungen stabil bleiben.

Strategiequellcode
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="SMA Color Strategy", 
     overlay=true, 
     initial_capital=10000,
     max_bars_back=5000,
     max_labels_count=500,
     max_boxes_count=500,
     default_qty_type=strategy.fixed,
     default_qty_value=1,
     currency=currency.NONE,
     process_orders_on_close=true)

// === INPUTS ===
zoneLength = input.int(20, "Price Zone Length", minval=5)
profitLockPct = input.float(50, "Profit Lock Percentage", minval=1, maxval=100, step=5) / 100
ticksToLock = input.int(12, "Ticks to Activate Lock", minval=1, tooltip="Number of ticks price must move up to activate tick-based lock")
ticksToSecure = input.int(10, "Ticks to Secure", minval=1, tooltip="Number of ticks to lock in once activated")

// Calculate tick values
tickSize = syminfo.mintick
ticksToLockPoints = ticksToLock * tickSize
ticksToSecurePoints = ticksToSecure * tickSize

// Calculate price zones
h = ta.highest(high, zoneLength)
l = ta.lowest(low, zoneLength)
priceRange = h - l
lvl5 = h
lvl4 = l + (priceRange * 0.75)  // Orange line
lvl3 = l + (priceRange * 0.50)  // Yellow line
lvl2 = l + (priceRange * 0.25)  // Green line
lvl1 = l

// Calculate SMAs
sma19 = ta.sma(close, 19)
sma74 = ta.sma(close, 74)

// Stochastic calculation for color logic
k = ta.stoch(close, high, low, 60)
d = ta.sma(k, 10)

// SMA Color Logic with state tracking
var color currentSMAColor = color.orange
var color previousSMAColor = color.orange
var string currentColorName = "ORANGE"
var string previousColorName = "ORANGE"

smaColor = if d >= 80 or d <= 20
    color.rgb(255, 215, 0)
else if d > d[1]
    color.green
else if d < d[1]
    color.red
else
    color.orange

// Update color state and names
if smaColor != currentSMAColor
    previousSMAColor := currentSMAColor
    currentSMAColor := smaColor
    previousColorName := currentColorName
    currentColorName := if smaColor == color.rgb(255, 215, 0)
        "YELLOW"
    else if smaColor == color.green
        "GREEN"
    else if smaColor == color.red
        "RED"
    else
        "ORANGE"

// Color logic for SMA74
sma74Color = if smaColor == color.rgb(255, 215, 0)
    color.rgb(255, 215, 0)                          
else if sma74 < sma19                               
    color.green
else                                                
    color.red

// === ENTRY CONDITIONS ===
smaIsGreen = smaColor == color.green
greenCandle = close > open
candleAboveOrange = close > lvl4
candleAboveSMA = close > sma19
crossedAboveOrange = ta.crossover(close, lvl4)
smaIsYellow = smaColor == color.rgb(255, 215, 0)

longCondition1 = smaIsGreen and greenCandle and candleAboveOrange and candleAboveSMA and crossedAboveOrange
longCondition2 = smaIsYellow and crossedAboveOrange and candleAboveSMA

// === PROFIT LOCK SYSTEM ===
var float entryPrice = na
var float maxPrice = na
var float profitLockLevel = na
var bool tickLockActivated = false
var float tickBasedLockLevel = na

// Reset variables on new trade entry
if (longCondition1 or longCondition2)
    entryPrice := close
    maxPrice := close
    profitLockLevel := close * (1 - profitLockPct)
    tickLockActivated := false
    tickBasedLockLevel := na

// Update maximum price and profit locks when in a trade
if strategy.position_size > 0
    maxPrice := math.max(maxPrice, high)
    profitLockLevel := math.max(profitLockLevel, maxPrice * (1 - profitLockPct))
    
    // Check if price has moved up enough to activate tick-based lock
    if not tickLockActivated and (maxPrice - entryPrice) >= ticksToLockPoints
        tickLockActivated := true
        tickBasedLockLevel := entryPrice + ticksToSecurePoints

// === EXIT CONDITIONS ===
exitOnYellowLine = close < lvl3
exitOnProfitLock = low < profitLockLevel and strategy.position_size > 0
exitOnTickLock = tickLockActivated and low < tickBasedLockLevel

// === TRADE MANAGEMENT ===
if (longCondition1 or longCondition2)
    strategy.entry("Long", strategy.long)

if strategy.position_size > 0
    if exitOnYellowLine
        strategy.close("Long", comment="Close below yellow")
    if exitOnProfitLock
        strategy.close("Long", comment="Profit lock triggered")
    if exitOnTickLock
        strategy.close("Long", comment="Tick-based lock triggered")

// Plot indicators
plot(sma19, "SMA 19", color=smaColor, linewidth=2)
plot(sma74, "SMA 74", color=sma74Color, linewidth=2)
plot(lvl5, "Upper Zone Top", color=color.red, linewidth=2)
plot(lvl4, "Upper Zone Bottom", color=color.orange, linewidth=2)
plot(lvl3, "Middle Line", color=color.yellow, linewidth=2)
plot(lvl2, "Lower Zone Top", color=color.green, linewidth=2)
plot(lvl1, "Lower Zone Bottom", color=color.blue, linewidth=2)

// Plot profit lock levels
plot(strategy.position_size > 0 ? profitLockLevel : na, "Profit Lock Level", color=color.purple, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and tickLockActivated ? tickBasedLockLevel : na, "Tick Lock Level", color=color.fuchsia, style=plot.style_linebr, linewidth=2)

// Fill zones
var p1 = plot(lvl5, display=display.none)
var p2 = plot(lvl4, display=display.none)
var p3 = plot(lvl2, display=display.none)
var p4 = plot(lvl1, display=display.none)
fill(p1, p2, color=color.new(color.red, 90))
fill(p3, p4, color=color.new(color.green, 90))

// Debug Table
if barstate.islast
    var table debugTable = table.new(position.top_right, 2, 13, bgcolor=color.new(color.black, 70), frame_width=1)
    
    table.cell(debugTable, 0, 0, "Current Color", text_color=color.white)
    table.cell(debugTable, 1, 0, currentColorName, text_color=currentSMAColor)
    
    table.cell(debugTable, 0, 1, "Previous Color", text_color=color.white)
    table.cell(debugTable, 1, 1, previousColorName, text_color=previousSMAColor)
    
    table.cell(debugTable, 0, 2, "Entry 1 (Green)", text_color=color.white)
    table.cell(debugTable, 1, 2, str.tostring(longCondition1), text_color=color.white)
    
    table.cell(debugTable, 0, 3, "Entry 2 (Yellow)", text_color=color.white)
    table.cell(debugTable, 1, 3, str.tostring(longCondition2), text_color=color.white)
    
    table.cell(debugTable, 0, 4, "Current Position", text_color=color.white)
    table.cell(debugTable, 1, 4, str.tostring(strategy.position_size), text_color=color.white)
    
    table.cell(debugTable, 0, 5, "Entry Price", text_color=color.white)
    table.cell(debugTable, 1, 5, str.tostring(entryPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 6, "Max Price", text_color=color.white)
    table.cell(debugTable, 1, 6, str.tostring(maxPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 7, "Profit Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 7, str.tostring(profitLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 8, "Tick Lock Active", text_color=color.white)
    table.cell(debugTable, 1, 8, str.tostring(tickLockActivated), text_color=color.white)
    
    table.cell(debugTable, 0, 9, "Tick Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 9, str.tostring(tickBasedLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 10, "Price Move (Ticks)", text_color=color.white)
    table.cell(debugTable, 1, 10, str.tostring(strategy.position_size > 0 ? (maxPrice - entryPrice) / tickSize : 0), text_color=color.white)
    
    table.cell(debugTable, 0, 11, "Locked Profit %", text_color=color.white)
    table.cell(debugTable, 1, 11, str.tostring(strategy.position_size > 0 ? ((maxPrice - entryPrice) / entryPrice * 100) : 0.0) + "%", text_color=color.white)
    
    table.cell(debugTable, 0, 12, "Exit Signals", text_color=color.white)
    table.cell(debugTable, 1, 12, "Y:" + str.tostring(exitOnYellowLine) + " P:" + str.tostring(exitOnProfitLock) + " T:" + str.tostring(exitOnTickLock), text_color=color.white)