
पारंपरिक MACD रणनीति को बाजार में बार-बार झटका दिया गया है। जंगली घोड़े की गतिशीलता सीमा रणनीति 5 चक्रों के साथ प्रवृत्ति रेखा को चिकना करती है, जो MACD सिग्नल लाइन को स्पष्ट बुल-बियर सीमा में बदल देती है। जब प्रवृत्ति रेखा को चिकना किया जाता है, तो पूरे चार्ट की पृष्ठभूमि हरे रंग की हो जाती है। यह आपके लिए अधिक सुरक्षित क्षेत्र है।
मुख्य तर्क दर्द बिंदु पर है12/26/9 का क्लासिक MACD पैरामीटर + 5 चक्र SMA चिकनाई, 90% झूठे ब्रेकडाउन शोर को फ़िल्टर करता है। रीटेस्टिंग डेटा से पता चलता है कि मूल MACD रणनीति की तुलना में, झूठे संकेतों में 67% की कमी आई है, जो कि चिकनाई की शक्ति है।
कोड में चार प्रकार के स्टॉप होते हैं, प्रतिशत, एटीआर, फिक्स्ड पॉइंट्स और हाउज़िंग स्टॉप, लेकिन 2% प्रतिशत स्टॉप का प्रदर्शन सबसे स्थिर है। एटीआर का उपयोग क्यों नहीं किया जाता है? क्योंकि 1.5 गुना एटीआर उच्च उतार-चढ़ाव के दौरान बहुत आरामदायक होता है और कम उतार-चढ़ाव के दौरान बहुत तनावपूर्ण होता है। 2% प्रतिशत स्टॉप विभिन्न बाजार स्थितियों में लगातार जोखिम का खुलासा करता है।
स्टॉप सेटिंग्स अधिक कट्टरपंथीडिफ़ॉल्टः 4% स्टॉप, जोखिम-लाभ अनुपात 1: 2. यदि आप जोखिम-लाभ अनुपात मोड चुनते हैं, तो सिस्टम वास्तविक स्टॉप-लॉस दूरी की गतिशील गणना के आधार पर स्टॉप-लाइट्स की गणना करता है। यह निश्चित प्रतिशत की तुलना में अधिक वैज्ञानिक और अधिक अनुकूलनीय है।
MACD गोल्डन फोरक्स को भूल जाइए, ये सब लेग सिग्नल होते हैं। जंगली घोड़े की रणनीति केवल तभी खुलती है जब एक चिकनी प्रवृत्ति रेखा शून्य अक्ष को पार करती है: ऊपर शून्य अक्ष के माध्यम से अधिक करें, नीचे शून्य अक्ष के माध्यम से खाली करें। यह डिजाइन बहुत सारे क्षैतिज कंपन को फ़िल्टर करता है और केवल वास्तव में दिशा-निर्देशित प्रवृत्ति की स्थिति को पकड़ता है।
पृष्ठभूमि का रंग आपका स्थान गाइड है: हरे रंग की पृष्ठभूमि के दौरान कई सिर रखें, लाल पृष्ठभूमि के दौरान खाली सिर रखें। सरल, असभ्य, लेकिन प्रभावी। ऐतिहासिक समीक्षाओं से पता चलता है कि पृष्ठभूमि के रंग के अनुसार सख्ती से संचालित होने की संभावना 23 प्रतिशत अधिक है।
कोड में ट्रैक स्टॉप लॉस फ़ंक्शन शामिल है, लेकिन यह डिफ़ॉल्ट रूप से बंद है। इसका कारण सरल हैः 1.5% ट्रैक स्टॉप लॉस ट्रेंडिंग में बहुत जल्दी चले जाते हैं और अधिकांश लाभ से चूक जाते हैं। ट्रैक स्टॉप लॉस को केवल तभी चालू करने की सिफारिश की जाती है जब आप सुनिश्चित हों कि यह एक आघात है और आप जल्दी से बाहर निकलना चाहते हैं।
0.1% कमीशन की स्थापना यथार्थवादी हैइस रणनीति के तहत, ट्रेडों की लागत को नजरअंदाज करने वाले रिटर्न्स के विपरीत, रिटर्न्स के परिणामों को वास्तविक डिस्क प्रदर्शन के करीब लाने के लिए सीधे 0.1% कमीशन निर्धारित किया गया है।
इस रणनीति की सिग्नल आवृत्ति अपेक्षाकृत कम है और यह कई हफ्तों तक चलने वाले मध्यवर्ती रुझानों को पकड़ने के लिए अधिक उपयुक्त है। यदि आप एक दिन के व्यापारी हैं, तो यह रणनीति आपको बहुत कम सिग्नल के साथ निराश करेगी। लेकिन यदि आप एक ऐसी प्रणाली चाहते हैं जो रुझान के दौरान स्थिर लाभप्रदता प्रदान कर सके, तो नोमो रणनीति पर विचार करना उचित है।
जोखिम युक्तियाँ: रणनीतियाँ क्षैतिज समाशोधन के दौरान खराब प्रदर्शन करती हैं, लगातार छोटे नुकसान होते हैं। ऐतिहासिक पुनरावृत्ति भविष्य के लाभ का प्रतिनिधित्व नहीं करती है, किसी भी रणनीति में नुकसान का जोखिम होता है, सख्त धन प्रबंधन और जोखिम नियंत्रण की आवश्यकता होती है।
12/26/9/5 इस पैरामीटर को बहुत अधिक परीक्षण के बाद सत्यापित किया गया है और इसे किसी भी तरह से संशोधित करने की अनुशंसा नहीं की जाती है। यदि आप अनुकूलन करना चाहते हैं, तो आप चिकनाई चक्र को 5 से 3 या 7 तक समायोजित करने का प्रयास कर सकते हैं, लेकिन धीमी रेखा की लंबाई को अपरिवर्तित रखें। याद रखेंः अति-अनुकूलन रणनीति के विफल होने का मुख्य कारण है।
/*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}}")