
ঐতিহ্যগত MACD কৌশলটি বাজারের অস্থিরতার মধ্যে বারবার মুখোমুখি হয়? বুনো গতির ব্যাপ্তি কৌশলটি 5 টি চক্রের মসৃণ প্রবণতা লাইন দ্বারা পরিচালিত হয়, MACD সংকেত লাইনটি সুস্পষ্ট ষাঁড়-বীরের ব্যাপ্তির বিচারে রূপান্তরিত করে। যখন একটি মসৃণ প্রবণতা লাইনটি শূন্য অক্ষের উপর দিয়ে যায়, পুরো চার্ট ব্যাকগ্রাউন্ডটি সবুজ হয়ে যায়। এটি আপনার জন্য একটি নিরাপদ অঞ্চল। নীচে শূন্য অক্ষের নীচে? লাল ব্যাকগ্রাউন্ড আপনাকে সতর্ক করে দেয় যে প্রবণতা পরিবর্তিত হয়েছে।
মূল যুক্তি ব্যথা পয়েন্ট১২/২৬/৯ এর ক্লাসিক MACD প্যারামিটার + ৫-চক্রের এসএমএ মসৃণতা, যা ৯০% মিথ্যা ব্রেকডাউন শব্দকে ফিল্টার করে। ব্যাক-এন্ড ডেটা দেখায় যে প্রাক-প্রাথমিক MACD কৌশলগুলির তুলনায়, মিথ্যা সংকেত ৬৭% হ্রাস পেয়েছে, যা মসৃণতার সাথে সামঞ্জস্যপূর্ণ।
কোডটি শতাংশ, এটিআর, স্থির পয়েন্ট এবং উচ্চ এবং নিম্নের চারটি স্টপ অফার করে, তবে বাস্তব যুদ্ধে 2% শতাংশ স্টপ সবচেয়ে স্থিতিশীল। কেন এটিআর ব্যবহার করবেন না? কারণ 1.5x এটিআর উচ্চ ওঠানামার সময় খুব আরামদায়ক হবে এবং নিম্ন ওঠানামার সময় খুব উত্তেজনাপূর্ণ হবে। 2% শতাংশ স্টপ বিভিন্ন বাজারের পরিস্থিতিতে ধারাবাহিকভাবে ঝুঁকিপূর্ণ প্রকাশ করবে।
স্টপ সেটিং আরো চরমডিফল্টঃ ৪% স্টপ, রিস্ক-পেয়ার অনুপাত ১ঃ২। আপনি যদি রিস্ক-পেয়ার অনুপাত মোড চয়ন করেন, সিস্টেমটি প্রকৃত স্টপ-ডেস্টের গতিশীলতার উপর ভিত্তি করে স্টপ বেস গণনা করবে। এটি স্থির শতাংশের চেয়ে আরও বৈজ্ঞানিক এবং আরও অভিযোজিত।
MACD গোল্ডেন ফর্ক ডেড ফর্ক ভুলে যান, এগুলি হ’ল পিছিয়ে পড়া সংকেত। বোরো কৌশলটি কেবল তখনই পজিশন খোলার জন্য যখন একটি মসৃণ প্রবণতা লাইন শূন্য অক্ষের মধ্য দিয়ে যায়ঃ শূন্য অক্ষের উপরে বেশি, শূন্য অক্ষের নীচে। এই নকশাটি প্রচুর পরিমাণে ডাইভারজাল কম্পনকে ফিল্টার করে, কেবলমাত্র সত্যিকারের দিকনির্দেশক প্রবণতা পরিস্থিতি ধরে।
ব্যাকগ্রাউন্ডের রঙ আপনার অবস্থান নির্দেশ করে: সবুজ ব্যাকগ্রাউন্ডের সময় মাল্টি হেড এবং লাল ব্যাকগ্রাউন্ডের সময় খালি হেড রাখা। সহজ, রুক্ষ, কিন্তু কার্যকর। ঐতিহাসিক পর্যালোচনাগুলি দেখায় যে ব্যাকগ্রাউন্ডের রঙের সাথে কঠোরভাবে কাজ করার জন্য পজিশন খোলা থেকে ২৩% বেশি সাফল্য রয়েছে।
কোডটিতে ট্র্যাকিং স্টপ ফাংশন রয়েছে, তবে এটি ডিফল্টরূপে বন্ধ রয়েছে। কারণটি সহজঃ ট্রেন্ডিংয়ের সময়, 1.5% ট্র্যাকিং স্টপ খুব তাড়াতাড়ি চলে যায় এবং বেশিরভাগ লাভ হারাতে পারে। আপনি যখন নিশ্চিত হন যে এটি একটি ঝড়ের সময় এবং আপনি দ্রুত এগিয়ে যেতে চান তখন কেবল ট্র্যাকিং স্টপ চালু করার পরামর্শ দেওয়া হয়।
কমিশন নির্ধারণ করা হয়েছে 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}}")