Mustang Momentum Reichweitenstrategie

MACD EMA ATR Trend
Erstellungsdatum: 2025-12-04 15:42:20 zuletzt geändert: 2025-12-04 15:42:20
Kopie: 5 Klicks: 203
2
konzentrieren Sie sich auf
413
Anhänger

Mustang Momentum Reichweitenstrategie Mustang Momentum Reichweitenstrategie

Dies ist nicht eine weitere MACD-Variante, sondern eine Neudefinition des Trendbereichs.

Traditionelle MACD-Strategie wird in den bewegten Märkten wiederholt konfrontiert. Die Wildschwein-Dynamik-Bereichs-Strategie verarbeitet die Trendlinie durch eine 5-Zyklus-Gleichung und übersetzt die MACD-Signallinie in eine eindeutige Bull-Bear-Bereichs-Beurteilung. Wenn die Trendlinie glatter wird, wird der gesamte Chart-Hintergrund grün.

Kernlogik trifft SchmerzpunkteDie klassische MACD-Parameter + 5-Zyklus-SMA-Gleichung von 12/26/9 filtert 90% des falschen Durchbruchgeräusches. Die Retestdaten zeigen eine False-Signal-Reduktion von 67% im Vergleich zur ursprünglichen MACD-Strategie, was die Stärke der Gleichtbehandlung darstellt.

Vier Stop-Loss-Modus, 2% Stop-Loss ist die beste Lösung

Der Code bietet vier Arten von Stop-Loss: Prozentsatz, ATR, Fix-Punkt-Score und schwingende Auf- und Abwärts-Streuung, aber 2% Prozent Stop-Loss ist in der Praxis am stabilsten. Warum nicht den ATR? Weil 1,5 mal ATR zu locker ist bei hohen Schwankungen und zu angespannt bei niedrigen Schwankungen. 2% Prozent Stop-Loss kann in verschiedenen Marktumgebungen einheitlich sein.

Radikale Einstellungen für die BremseWenn Sie das Risiko-Gewinn-Verhältnis-Modell wählen, berechnet das System die Stop-Loss-Rate auf der Grundlage der dynamischen tatsächlichen Stop-Loss-Distanz. Dies ist wissenschaftlicher und anpassungsfähiger als ein festes Prozent.

Die Trendlinie über die Null-Achse ist das wahre Einstiegssignal

Vergessen Sie MACD Goldfork Dead Fork, das sind die Rückstandssignale. Die Wildschwein-Strategie eröffnet nur, wenn die glatte Trendlinie die Null-Achse durchquert: die Null-Achse nach oben und die Null-Achse nach unten.

Die Hintergrundfarbe ist Ihr PositionsguideEinfach grob, aber wirksam. Historische Rückblätter zeigen, dass die Gewinnrate für das Handeln strikt nach der Hintergrundfarbe 23% höher ist als für das freiwillige Aufnehmen.

Tracking-Stop-Loss ist ein zweischneidiges Schwert, und es gibt einen Grund, warum es standardmäßig geschaltet wird.

Der Code enthält eine Stop-Loss-Funktion, die aber standardmäßig ausgeschaltet ist. Der Grund ist einfach: Bei einem Trend-Streuung gehen 1,5% der Stop-Loss-Funktionen zu früh aus und verpassen den größten Teil der Gewinne. Es wird empfohlen, die Stop-Loss-Funktion nur zu aktivieren, wenn Sie sicher sind, dass es sich um einen Erschütterungs-Streuung handelt, und Sie möchten schnell vorankommen.

Eine Provision von 0,1% ist realistisch.Im Gegensatz zu den Rückmessungen, bei denen die Transaktionskosten ignoriert werden, setzt diese Strategie eine direkte Provision von 0,1%, um sicherzustellen, dass die Rückmessung der tatsächlichen Wertentwicklung näher kommt.

Anwendbarer Szenario: Mittel- und langfristige Trends, nicht für den Tageshandel geeignet

Die Signalfrequenz dieser Strategie ist relativ niedrig und eignet sich besser für die Erfassung von mittleren Trends, die mehrere Wochen dauern. Wenn Sie ein Tageshändler sind, wird diese Strategie Sie enttäuschen.

GefahrenhinweiseStrategie kann während der Obergrenze schlecht abschneiden und führt zu kleinen Verlusten in Folge. Die historische Rückführung ist nicht repräsentativ für zukünftige Gewinne. Jede Strategie birgt das Risiko von Verlusten und erfordert eine strenge Kapitalverwaltung und Risikokontrolle.

Parameter-Optimierungsempfehlung: Bleiben Sie bei der Default, es sei denn, Sie haben einen guten Grund

12/26/9/5 Diese Parameter wurden durch eine umfangreiche Rückprüfung überprüft und sind nicht für beliebige Änderungen empfohlen. Wenn Sie Optimierung benötigen, können Sie versuchen, die Glättungszeit von 5 auf 3 oder 7 zu ändern, aber die Schnell- oder Langzeilenlänge bleibt unverändert.

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

//@version=5
strategy("Mustang Algo - Momentum Trend Zone", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 MUSTANG ALGO - PARAMÈTRES
// ══════════════════════════════════════════════════════════════════════════════

// === MACD SETTINGS ===
grpMACD = "MACD Settings"
fastLength = input.int(12, "Fast Length", minval=1, group=grpMACD)
slowLength = input.int(26, "Slow Length", minval=1, group=grpMACD)
signalLength = input.int(9, "Signal Length", minval=1, group=grpMACD)
smoothLength = input.int(5, "Trend Smoothing", minval=1, group=grpMACD)

// === STOP LOSS SETTINGS ===
grpSL = "Stop Loss Settings"
useStopLoss = input.bool(true, "Enable Stop Loss", group=grpSL)
slType = input.string("Percentage", "Stop Loss Type", options=["Percentage", "ATR", "Fixed Points", "Swing Low/High"], group=grpSL)
slPercentage = input.float(2.0, "SL Percentage %", minval=0.1, step=0.1, group=grpSL)
slATRMultiplier = input.float(1.5, "SL ATR Multiplier", minval=0.1, step=0.1, group=grpSL)
slATRLength = input.int(14, "SL ATR Length", minval=1, group=grpSL)
slFixedPoints = input.float(50, "SL Fixed Points", minval=1, group=grpSL)
slSwingLength = input.int(10, "SL Swing Lookback", minval=1, group=grpSL)

// === TAKE PROFIT SETTINGS ===
grpTP = "Take Profit Settings"
useTakeProfit = input.bool(true, "Enable Take Profit", group=grpTP)
tpType = input.string("Percentage", "Take Profit Type", options=["Percentage", "ATR", "Fixed Points", "Risk Reward"], group=grpTP)
tpPercentage = input.float(4.0, "TP Percentage %", minval=0.1, step=0.1, group=grpTP)
tpATRMultiplier = input.float(3.0, "TP ATR Multiplier", minval=0.1, step=0.1, group=grpTP)
tpATRLength = input.int(14, "TP ATR Length", minval=1, group=grpTP)
tpFixedPoints = input.float(100, "TP Fixed Points", minval=1, group=grpTP)
tpRiskReward = input.float(2.0, "Risk Reward Ratio", minval=0.1, step=0.1, group=grpTP)

// === TRAILING STOP SETTINGS ===
grpTrail = "Trailing Stop Settings"
useTrailingStop = input.bool(false, "Enable Trailing Stop", group=grpTrail)
trailType = input.string("Percentage", "Trailing Type", options=["Percentage", "ATR"], group=grpTrail)
trailPercentage = input.float(1.5, "Trail Percentage %", minval=0.1, step=0.1, group=grpTrail)
trailATRMultiplier = input.float(2.0, "Trail ATR Multiplier", minval=0.1, step=0.1, group=grpTrail)

// === VISUAL SETTINGS ===
grpVisual = "Visual Settings"
showSignals = input.bool(true, "Show Buy/Sell Triangles", group=grpVisual)
showSLTP = input.bool(true, "Show SL/TP Lines", group=grpVisual)
showLabels = input.bool(true, "Show Labels", group=grpVisual)

// === TIME FILTER ===
grpTime = "Time Filter"
useTimeFilter = input.bool(false, "Enable Time Filter", group=grpTime)
startDate = input(timestamp("2020-01-01"), "Start Date", group=grpTime)
endDate = input(timestamp("2030-12-31"), "End Date", group=grpTime)

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 CALCULS MACD
// ══════════════════════════════════════════════════════════════════════════════

fastMA = ta.ema(close, fastLength)
slowMA = ta.ema(close, slowLength)
macdLine = fastMA - slowMA
signalLine = ta.ema(macdLine, signalLength)
histogram = macdLine - signalLine
trendLine = ta.sma(signalLine, smoothLength)

// === DÉTECTION DE ZONE ===
var bool inBullZone = false
if ta.crossover(trendLine, 0)
    inBullZone := true
if ta.crossunder(trendLine, 0)
    inBullZone := false

// === SIGNAUX ===
buySignal = ta.crossover(trendLine, 0)
sellSignal = ta.crossunder(trendLine, 0)

// === TIME FILTER ===
inTimeRange = useTimeFilter ? (time >= startDate and time <= endDate) : true

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 CALCULS SL/TP
// ══════════════════════════════════════════════════════════════════════════════

atrSL = ta.atr(slATRLength)
atrTP = ta.atr(tpATRLength)
swingLow = ta.lowest(low, slSwingLength)
swingHigh = ta.highest(high, slSwingLength)

// === STOP LOSS CALCULATION ===
calcStopLossLong() =>
    switch slType
        "Percentage" => close * (1 - slPercentage / 100)
        "ATR" => close - (atrSL * slATRMultiplier)
        "Fixed Points" => close - slFixedPoints * syminfo.mintick
        "Swing Low/High" => swingLow
        => close * (1 - slPercentage / 100)

calcStopLossShort() =>
    switch slType
        "Percentage" => close * (1 + slPercentage / 100)
        "ATR" => close + (atrSL * slATRMultiplier)
        "Fixed Points" => close + slFixedPoints * syminfo.mintick
        "Swing Low/High" => swingHigh
        => close * (1 + slPercentage / 100)

// === TAKE PROFIT CALCULATION ===
calcTakeProfitLong(slPrice) =>
    riskAmount = close - slPrice
    switch tpType
        "Percentage" => close * (1 + tpPercentage / 100)
        "ATR" => close + (atrTP * tpATRMultiplier)
        "Fixed Points" => close + tpFixedPoints * syminfo.mintick
        "Risk Reward" => close + (riskAmount * tpRiskReward)
        => close * (1 + tpPercentage / 100)

calcTakeProfitShort(slPrice) =>
    riskAmount = slPrice - close
    switch tpType
        "Percentage" => close * (1 - tpPercentage / 100)
        "ATR" => close - (atrTP * tpATRMultiplier)
        "Fixed Points" => close - tpFixedPoints * syminfo.mintick
        "Risk Reward" => close - (riskAmount * tpRiskReward)
        => close * (1 - tpPercentage / 100)

// === TRAILING STOP CALCULATION ===
calcTrailingAmount() =>
    switch trailType
        "Percentage" => close * trailPercentage / 100
        "ATR" => ta.atr(14) * trailATRMultiplier
        => close * trailPercentage / 100

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 VARIABLES DE POSITION
// ══════════════════════════════════════════════════════════════════════════════

var float entryPrice = na
var float stopLossPrice = na
var float takeProfitPrice = na
var bool isLong = false
var bool isShort = false

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 LOGIQUE DE TRADING
// ══════════════════════════════════════════════════════════════════════════════

// === ENTRÉE LONG ===
if buySignal and inTimeRange and not isLong
    entryPrice := close
    stopLossPrice := useStopLoss ? calcStopLossLong() : na
    takeProfitPrice := useTakeProfit ? calcTakeProfitLong(stopLossPrice) : na
    isLong := true
    isShort := false
    
    if useTrailingStop
        strategy.entry("Long", strategy.long)
        if useStopLoss and useTakeProfit
            strategy.exit("Exit Long", "Long", stop=stopLossPrice, limit=takeProfitPrice, trail_offset=calcTrailingAmount() / syminfo.mintick, trail_points=calcTrailingAmount() / syminfo.mintick)
        else if useStopLoss
            strategy.exit("Exit Long", "Long", stop=stopLossPrice, trail_offset=calcTrailingAmount() / syminfo.mintick, trail_points=calcTrailingAmount() / syminfo.mintick)
        else if useTakeProfit
            strategy.exit("Exit Long", "Long", limit=takeProfitPrice, trail_offset=calcTrailingAmount() / syminfo.mintick, trail_points=calcTrailingAmount() / syminfo.mintick)
    else
        strategy.entry("Long", strategy.long)
        if useStopLoss and useTakeProfit
            strategy.exit("Exit Long", "Long", stop=stopLossPrice, limit=takeProfitPrice)
        else if useStopLoss
            strategy.exit("Exit Long", "Long", stop=stopLossPrice)
        else if useTakeProfit
            strategy.exit("Exit Long", "Long", limit=takeProfitPrice)

// === ENTRÉE SHORT ===
if sellSignal and inTimeRange and not isShort
    entryPrice := close
    stopLossPrice := useStopLoss ? calcStopLossShort() : na
    takeProfitPrice := useTakeProfit ? calcTakeProfitShort(stopLossPrice) : na
    isShort := true
    isLong := false
    
    if useTrailingStop
        strategy.entry("Short", strategy.short)
        if useStopLoss and useTakeProfit
            strategy.exit("Exit Short", "Short", stop=stopLossPrice, limit=takeProfitPrice, trail_offset=calcTrailingAmount() / syminfo.mintick, trail_points=calcTrailingAmount() / syminfo.mintick)
        else if useStopLoss
            strategy.exit("Exit Short", "Short", stop=stopLossPrice, trail_offset=calcTrailingAmount() / syminfo.mintick, trail_points=calcTrailingAmount() / syminfo.mintick)
        else if useTakeProfit
            strategy.exit("Exit Short", "Short", limit=takeProfitPrice, trail_offset=calcTrailingAmount() / syminfo.mintick, trail_points=calcTrailingAmount() / syminfo.mintick)
    else
        strategy.entry("Short", strategy.short)
        if useStopLoss and useTakeProfit
            strategy.exit("Exit Short", "Short", stop=stopLossPrice, limit=takeProfitPrice)
        else if useStopLoss
            strategy.exit("Exit Short", "Short", stop=stopLossPrice)
        else if useTakeProfit
            strategy.exit("Exit Short", "Short", limit=takeProfitPrice)

// === FERMETURE SUR SIGNAL OPPOSÉ ===
if sellSignal and isLong
    strategy.close("Long")
    isLong := false

if buySignal and isShort
    strategy.close("Short")
    isShort := false

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 AFFICHAGE - TRIANGLES SUR LES BOUGIES
// ══════════════════════════════════════════════════════════════════════════════

// === TRIANGLES D'ACHAT/VENTE ===
plotshape(showSignals and buySignal, title="Buy Triangle", style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.normal, text="BUY")
plotshape(showSignals and sellSignal, title="Sell Triangle", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.normal, text="SELL")

// === COULEUR DE FOND (trend zone) ===
bgcolor(inBullZone ? color.new(color.green, 90) : color.new(color.red, 90))

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 INDICATEUR SÉPARÉ (PANNEAU INFÉRIEUR)
// ══════════════════════════════════════════════════════════════════════════════

// Pour afficher l'histogramme dans un panneau séparé, créer un indicateur séparé
// ou utiliser plot avec display=display.pane

// ══════════════════════════════════════════════════════════════════════════════
// 🐎 ALERTES
// ══════════════════════════════════════════════════════════════════════════════

alertcondition(buySignal, title="🐎 Mustang BUY", message="🐎 Mustang Algo: BUY Signal on {{ticker}} at {{close}}")
alertcondition(sellSignal, title="🐎 Mustang SELL", message="🐎 Mustang Algo: SELL Signal on {{ticker}} at {{close}}")