Die Ressourcen sind geladen. Beförderung...

Multi-SMA-Zone Breakout mit dynamischer Gewinnverbindung

Schriftsteller:ChaoZhang, Datum: 2024-12-20 16:28:54
Tags:SMA

img

Übersicht

Dies ist eine dynamische Trendfolgestrategie, die auf SMA-Indikatoren basiert, die Preiszonen, stochastische Indikatoren und mehrere Gewinnschutzmechanismen kombiniert. Die Strategie überwacht Preisbewegungen in verschiedenen Zonen, integriert kurzfristige und langfristige gleitende Durchschnitts-Crossover-Signale und verwendet stochastische Indikatoren, um Marktbedingungen und Trendstärke für eine effiziente Trendfassung zu bestimmen.

Strategieprinzipien

Die Kernlogik umfasst mehrere Schlüsselkomponenten:

  1. Verwendet 19- und 74-Zeitrahmen-SMAs zur Entwicklung des Trendrahmens
  2. Verwendet einen 60-Perioden-Stochastischen Indikator, um Marktbedingungen zu beurteilen, indem die SMA-Farben in gelbe, grüne, rote und orangefarbene Zustände kategorisiert werden
  3. Preiszonen in 5 wichtige Ebenen für die Festlegung der Preisstärke unterteilt
  4. Für die Einreise sind folgende Voraussetzungen erforderlich:
    • SMA im grünen oder gelben Zustand
    • Preisdurchbruch über der orangefarbenen Zone
    • Schlusskurs über der kurzfristigen SMA
  5. Implementiert zwei Gewinnmechanismen:
    • Prozentsatzbasierter Abzugsschutz gegen höchsten Preis
    • Gewinnverbindung für den festen Betrag

Strategische Vorteile

  1. Mehrere Bestätigungsmechanismen verringern falsche Signale
  2. Die dynamische Zonenteilung passt sich den unterschiedlichen Marktbedingungen an
  3. Doppelgewinnmechanismen sorgen für eine bessere Risikokontrolle
  4. Eine klare Marktzustandsklassifizierung hilft, den Marktrhythmus zu erfassen
  5. Echtzeit-Überwachung des Handelsstatus erleichtert die Debugging der Strategie
  6. Kombiniert technische Indikatoren mit Preisbewegungsanalysen

Strategische Risiken

  1. Kann zu einem übermäßigen Handel auf verschiedenen Märkten führen
  2. Festwertgewinne könnten größere Trends übersehen
  3. Parameteroptimierung kann zu Überanpassung führen
  4. Potenzieller Gewinnverlust bei schnellen Marktumkehrungen
  5. Mehrere Bestätigungsbedingungen könnten einige Handelsmöglichkeiten verpassen Lösungen:
  • Hinzufügen von Volatilitätsfiltern
  • Dynamische Anpassung der Gewinnparameter
  • Verbesserung der Anerkennung des Marktumfelds
  • Optimieren Sie die Entscheidung zum Zeitpunkt des Ausstiegs

Strategieoptimierungsrichtlinien

  1. Einführung von Volatilitätsindikatoren zur Anpassung dynamischer Parameter
  2. Anpassung der Gewinnbedingungen an die Marktlage
  3. Mechanismus zur Volumenbestätigung hinzufügen
  4. Einbeziehung von Trendstärkenfiltern
  5. Optimierung der Zonenteilung unter Berücksichtigung der Merkmale des Marktes
  6. Verbesserung der Risikomanagementmechanismen, einschließlich:
    • Täglicher Stop-Loss
    • Höchstmenge
    • Zeitbegrenzungen für die Positionsaufnahme

Zusammenfassung

Die Strategie baut ein umfassendes Handelssystem durch den integrierten Einsatz mehrerer technischer Indikatoren und Analysemethoden für die Preisentwicklung auf. Ihre Stärken liegen in mehreren Bestätigungsmechanismen und flexiblen Gewinnsystemen, während der Einfluss des Marktumfelds auf die Strategieleistung beachtet werden muss. Durch kontinuierliche Optimierung und verbessertes Risikomanagement zeigt die Strategie das Potenzial, eine stabile Performance unter verschiedenen Marktbedingungen aufrechtzuerhalten.


/*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)

Verwandt

Mehr