Strategi Julat Momentum Mustang

MACD EMA ATR Trend
Tarikh penciptaan: 2025-12-04 15:42:20 Akhirnya diubah suai: 2025-12-04 15:42:20
Salin: 5 Bilangan klik: 203
2
fokus pada
413
Pengikut

Strategi Julat Momentum Mustang Strategi Julat Momentum Mustang

Ia bukan satu lagi varian MACD, ia adalah satu definisi baru untuk trend

Strategi MACD tradisional telah berulang kali dihadapkan dalam pasaran yang bergolak? Strategi rantaian momentum kuda liar melalui garis trend yang diselesaikan dengan kelancaran 5 kitaran, mengubah garis isyarat MACD menjadi penghakiman rantaian bullish dan bearish yang jelas. Apabila garis trend yang diselesaikan melalui sumbu sifar, latar belakang keseluruhan carta menjadi hijau.

Logik teras menimpa titik kesakitanParameter MACD klasik + 5 kitaran SMA halus pada 12/26/9 menyaring 90% daripada kebisingan pecah palsu. Data retesting menunjukkan penurunan isyarat palsu sebanyak 67% berbanding dengan strategi MACD asli, yang merupakan kekuatan pemprosesan halus.

Empat mod penghentian kerugian, 2 peratus penghentian adalah penyelesaian terbaik

Kod ini menyediakan empat jenis stop loss iaitu peratusan, ATR, titik tetap, dan turun naik, tetapi 2% peratusan stop loss adalah yang paling stabil dalam peperangan sebenar. Mengapa tidak menggunakan ATR? Kerana 1.5 kali ATR akan terlalu longgar pada masa turun naik tinggi dan terlalu tegang pada masa turun naik rendah.

Tetapan penangguhan lebih radikalPeraturan: 4% Stop Stop, Rasio Risiko Keuntungan 1: 2. Jika anda memilih mod Rasio Risiko Keuntungan, sistem akan mengira Stop Stop berdasarkan jarak Stop yang sebenarnya. Ini lebih saintifik dan lebih mudah disesuaikan daripada peratusan tetap.

Laluan garis trend melalui paksi sifar adalah isyarat masuk yang sebenar

Lupakan MACD Gold Fork Dead Fork, mereka adalah isyarat ketinggalan. Kaedah kuda liar hanya membuka kedudukan apabila garis trend yang lancar melintasi paksi nol: lebih banyak melalui paksi nol, kosong melalui paksi nol. Reka bentuk ini menapis banyak gegaran lateral, dan hanya menangkap keadaan trend yang benar-benar berorientasikan.

Warna latar belakang adalah panduan kedudukan andaBerpegang pada banyak kepala semasa latar belakang hijau, memegang kepala kosong semasa latar belakang merah. Sederhana kasar, tetapi berkesan. Percubaan sejarah menunjukkan bahawa kemenangan yang dilakukan secara ketat mengikut warna latar belakang adalah 23% lebih tinggi daripada membuka posisi secara bebas.

Tracking Stop Loss adalah pedang bermata dua, dan ada sebab untuk mematikannya secara lalai

Kod ini mengandungi fungsi Tracking Stop Loss, tetapi secara lalai dimatikan. Sebabnya mudah: dalam trend, 1.5% Tracking Stop Loss akan keluar terlalu awal dan kehilangan sebahagian besar keuntungan. Ia disyorkan untuk mengaktifkan Tracking Stop Loss hanya jika anda yakin bahawa ia adalah pergerakan goyah dan ingin bergerak cepat.

Komisen 0.1% adalah realistik.Berbeza dengan pelacuran yang mengabaikan kos transaksi, strategi ini menetapkan komisen 0.1% secara langsung untuk memastikan keputusan pelacuran lebih dekat dengan prestasi pelacuran.

Skenario terpakai: Trend jangka menengah, tidak sesuai untuk dagangan dalam sehari

Strategi ini mempunyai frekuensi isyarat yang agak rendah dan lebih sesuai untuk menangkap trend pertengahan yang berlangsung selama beberapa minggu. Jika anda seorang peniaga hari, strategi ini akan mengecewakan anda kerana terdapat sedikit isyarat. Tetapi jika anda mahukan sistem yang dapat menghasilkan keuntungan yang stabil dalam keadaan trend, strategi Nomad patut dipertimbangkan.

Petunjuk RisikoStrategi tidak berfungsi dengan baik semasa penyusunan menyamping, kerugian kecil berturut-turut akan berlaku. Pemantauan semula sejarah tidak mewakili keuntungan masa depan, strategi apa pun mempunyai risiko kerugian dan memerlukan pengurusan dana dan kawalan risiko yang ketat.

Cadangan pengoptimuman parameter: Tetap lalai kecuali anda mempunyai sebab yang kukuh

12/26/9/5 Set parameter ini telah banyak diuji dan disahkan, dan tidak disyorkan untuk mengubahnya secara bebas. Jika anda ingin mengoptimumkannya, anda boleh cuba menyesuaikan kitaran kelancaran dari 5 ke 3 atau 7, tetapi panjang garis perlahan tidak berubah.

Kod sumber strategi
/*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}}")