
यह रणनीति ओवर-ट्रेंडिंग सूचक और MACD सूचक के संभावित रुझान प्रतिवर्तन संकेतों का उपयोग करती है, जो RSI सूचक के ओवर-बिक्री-ओवर-बिक्री संकेतों के साथ मिलकर एक अधिक स्थिर और कुशल ओपनिंग और क्लोजिंग सिग्नल सिस्टम बनाता है। रणनीति को ओवर-ट्रेंडिंग MACD क्वांटिटेटिव रणनीति कहा जाता है।
इस रणनीति का मुख्य तर्क यह है कि सुपरट्रेंड सूचक और मैकड सूचक को एक साथ उपयोग किया जाता है ताकि स्थिति खोलने के लिए संकेत दिया जा सके।
ओवर-ट्रेंडिंग भाग में, रणनीति ओवर-ट्रेंडिंग संकेतक की दिशा में बदलाव को एक संभावित उलट संकेत के रूप में उपयोग करती है। ओवर-ट्रेंडिंग संकेतक की दिशा में ऊपर से नीचे की ओर जाने पर एक खरीद संकेत उत्पन्न होता है; ओवर-ट्रेंडिंग संकेतक की दिशा में नीचे से ऊपर की ओर जाने पर एक बिक्री संकेत उत्पन्न होता है।
एमएसीडी भाग में, रणनीति संभावित पलटाव के अवसरों का आकलन करने के लिए एमएसीडी संकेतक के निचले समय-फ्रेम ((सूर्य रेखा) पर ढलान और शून्य-अक्ष क्रॉसिंग का उपयोग करती है। जब एमएसीडी की ढलान पूर्ण मूल्य से अधिक होती है (उप-मूल्य से अधिक) और ढलान समान रूप से ऊपर की ओर रहता है, तो संकेत उत्पन्न होता है; यदि एमएसीडी संकेतक शून्य-अक्ष को पार करता है, तो सहायक संकेत भी उत्पन्न होता है। एमएसीडी भाग के संकेत अधिक ट्रेंड से अधिक होते हैं।
स्थिति खोलने के संकेतों पर, रणनीति को ओवरट्रेंड सिग्नल और MACD सिग्नल की दिशा में एकजुट रहने की आवश्यकता होती है ताकि स्थिति खोलने के निर्देश जारी किए जा सकें।
इसके अलावा, RSI सूचकांक के ओवरबॉय ओवरबॉन्ड सिग्नल को भी पेश किया गया है। RSI सूचकांक 80 से अधिक होने पर एक बिकने का संकेत देता है, और 20 से कम होने पर एक खरीदने का संकेत देता है, जो पलटने का समय निर्धारित करने में मदद करता है।
इस रणनीति का सबसे बड़ा लाभ सूचक संकेतों की विविधता में निहित है। विभिन्न सूचकांकों के बीच एक दूसरे के पूरक हो सकते हैं, जिससे समग्र संकेत अधिक स्थिर और विश्वसनीय हो सकता है।
एक सुपरट्रेंड सूचक का पलटाव संकेत एक अपेक्षाकृत मजबूत अल्पकालिक प्रवृत्ति को पकड़ सकता है; MACD स्केलिंग मध्यम और दीर्घकालिक प्रवृत्ति की ताकत का आकलन कर सकता है और झूठे पलटाव से गुमराह नहीं किया जा सकता है; और आरएसआई एक क्षेत्र में उतार-चढ़ाव की स्थिति में ओवरबॉय ओवरबॉय के लिए सबसे अच्छा स्थिति खोलने और स्थिति को शांत करने का समय बता सकता है। कई सूचक संकेतों का ओवरलैप, कुछ शोर ट्रेडों को फ़िल्टर कर सकता है और उच्च जीत दर प्राप्त कर सकता है।
इसके अलावा, रणनीति का समय सीमा सेट करना भी काफी उचित है। सुपरट्रेंड एक घंटे की समय सीमा का उपयोग करता है, जबकि एमएसीडी सूचक एक दिन की रेखा का उपयोग करता है, जिससे व्यापार की आवृत्ति सुनिश्चित होती है और रुझान निर्णय की स्थिरता को ध्यान में रखा जाता है।
इस रणनीति का मुख्य जोखिम यह है कि संकेतक के बीच भ्रमित सिग्नल की संभावना अधिक है। उदाहरण के लिए, सुपरट्रेंड में एक झूठी उलटफेर होती है, जबकि मैकड सिग्नल सिंक्रनाइज़ नहीं होते हैं। इससे अनावश्यक नुकसान हो सकता है।
इसके अलावा, आरएसआई सूचक का उपयोग समय के लिए भी किया जा सकता है या बहुत देर हो सकती है, जिससे रणनीति के लिए अधिकतम समय नहीं मिल सकता है।
अंत में, MACD सूचकांक के लिए बहुत अधिक स्केलेबिलिटी थ्रेशोल्ड सेट करने से कमजोर पलटाव के अवसरों को भी याद किया जा सकता है।
इस रणनीति को और अधिक अनुकूलित किया जा सकता हैः
नुकसान की रोकथाम के लिए एक तंत्र की शुरूआत करना।
MACD स्लिपेज के लिए निर्णय गतिशील थ्रेशोल्ड जोड़ें। जब बाजार में भारी उतार-चढ़ाव होता है तो स्लिपेज थ्रेशोल्ड बढ़ाएं, और जब बाजार स्थिर होता है तो थ्रेशोल्ड को कम करें।
आरएसआई सूचकांक के लिए एक समायोजन शर्त को शामिल किया गया है। यानी, आरएसआई 80 से अधिक होने के बाद एक स्पष्ट समायोजन की आवश्यकता होती है और फिर समायोजन पर विचार किया जाता है।
Testing MACD with volume and see if it improves signal reliability
Trying automated parameter tuning to find optimal settings
ओवरफिटिंग ट्रेंड मैकड क्वांटिटेटिव स्ट्रेटजी ओवरफिटिंग कई संकेतकों को एकीकृत करता है जो स्थिति को खोलने और स्थिति को शांत करने के लिए संकेत देता है। इसका लाभ यह है कि संकेत स्थिर है, जीत की उच्च दर है, जिसे पैरामीटर अनुकूलन के माध्यम से और बढ़ाया जा सकता है। जोखिम और अनुकूलन दिशा भी मुख्य रूप से पैरामीटर सेटिंग ओवरफिटिंग की समस्या पर केंद्रित है। कुल मिलाकर, इस रणनीति में बहुत मजबूत वास्तविक युद्ध अनुप्रयोग मूल्य है।
/*backtest
start: 2022-12-19 00:00:00
end: 2023-12-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("SuperTrend.MACD Strategy", overlay=false, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100000, pyramiding=5, process_orders_on_close=true)
// ---------------- Utility Functions ----------------
getArrayValue(float[] arr, int ago) =>
if ago >= 0
array.get(arr, ago >= array.size(arr) ? na: array.size(arr) + -1 * ago -1)
else
na
filterNA(float[] a, s, int y) =>
int x = 0
if not na(s[0])
array.push(a, s[0])
if array.size(a) > y
array.shift(a)
a
pine_rsi(float[] x, int y) =>
x0 = getArrayValue(x, 0)
x1 = getArrayValue(x, 1)
u = math.max(x0 - x1, 0) // upward ta.change
d = math.max(x1 - x0, 0) // downward ta.change
rs = ta.rma(u, y) / ta.rma(d, y)
res = 100 - 100 / (1 + rs)
res
turnAround(float[] arr) =>
int isTurnAround = 0
now = getArrayValue(arr, 0)
p1 = getArrayValue(arr, 1)
p2 = getArrayValue(arr, 2)
if p1 > now and p1 > p2
isTurnAround := -1
else if p1 < now and p1 < p2
isTurnAround := 1
intergerizeSignal(i) =>
i>0 ? 1 : i<0 ? -1 : 0
linreg(float[] y, int n, int offset=0) =>
float slope = na
float intercept = na
int endcursor = offset + n - 1
if array.size(y) > endcursor
float sumX = 0
float sumX2 = 0
float sumY = 0
float sumY2 = 0
float sumXY = 0
for i=offset to endcursor
yv = array.get(y, i)
sumY += yv
sumY2 += math.pow(yv, 2)
sumX += i
sumX2 += math.pow(i, 2)
sumXY += i*yv
// Pearson correlation coefficient
r = (n * sumXY - sumX * sumY) / math.sqrt((n * sumY2 - math.pow(sumY, 2)) * (n * sumX2 - math.pow(sumX, 2)))
// Coefficient of determination
r2 = math.pow(r, 2)
meanX = sumX / n
meanY = sumY / n
slope := (n * sumXY - sumX * sumY) / (n * sumX2 - math.pow(sumX, 2))
intercept := meanY - slope * meanX
[slope, intercept]
isStartOfDay() => dayofweek != dayofweek[1]
// ---------------- Variables ----------------
varip float st_signal = 0
varip float macd_signal = 0
varip float macd_close_signal = 0
varip float histo_signal = 0
var int openSignal = 0
var int closeSignal = 0
// -------------------------------- Supertrend Signal (Open) --------------------------------
// ST calculation
atrPeriod = input(10, "Supertrend ATR Length")
factor = input.float(2.0, "Supertrend Factor", step = 0.01)
[_, direction] = ta.supertrend(factor, atrPeriod)
st_direction_change = ta.change(direction)
if st_direction_change < 0
st_signal := 4
if st_direction_change > 0
st_signal := -4
// -------------------------------- MACD Signal (Open + Close) --------------------------------
// MACD Calculation
fastLength = input(12, title="MACD Fast Length")
slowLength = input(26, title="MACD Slow Length")
signalLength = input(9, title="MACD Signal Length")
macdSlowTimeframe = input.timeframe("D", "MACD Timeframe")
macdSlopeLookbackOpen = input(7, title="MACD Slope Lookback - Open")
macdSlopeLookbackClose = input(3, title="MACD Slope Lookback - Close")
dailyClose = request.security(syminfo.tickerid, macdSlowTimeframe, close, barmerge.gaps_on)
[macdLine, signalLine, _] = ta.macd(dailyClose, fastLength, slowLength, signalLength)
// MACD Slope calculation
varip macdHistory = array.new<float>(0)
varip macdSlowSlopeArr = array.new<float>(0)
varip float macdSlowSlope = na
varip float macdCloseSlope = na
if not na(macdLine[0])
array.push(macdHistory, macdLine[0])
if array.size(macdHistory) > macdSlopeLookbackOpen
array.shift(macdHistory)
[s1, _] = linreg(macdHistory, macdSlopeLookbackOpen)
macdSlowSlope := s1
array.push(macdSlowSlopeArr, macdSlowSlope)
if array.size(macdSlowSlopeArr) > macdSlopeLookbackClose
array.shift(macdSlowSlopeArr)
[s2, _] = linreg(macdSlowSlopeArr, macdSlopeLookbackClose)
macdCloseSlope := s2
// MACD Signal Calculation
// > open signal
threshold_macdSlowSlope = input.float(0.75, "MACD Slope Open Threshold", step = 0.05)
macdSlowSlopeOverThreshold = math.abs(macdSlowSlope) >= threshold_macdSlowSlope
macdSlowSlopeTrend = macdSlowSlope - getArrayValue(macdSlowSlopeArr, 1)
macdSlowSlopeTrendConfirm = macdSlowSlope*macdSlowSlopeTrend >0
if (macdSlowSlopeOverThreshold and macdSlowSlopeTrendConfirm)
macd_signal := 3*macdSlowSlope/math.abs(macdSlowSlope)
else
macd_signal := 0
// > close signal
int macdCloseSignal = 0
macdCloseSignal := intergerizeSignal(macdCloseSlope)
// Histogram signal Calculation
histSlow = macdLine - signalLine
if (ta.crossover(histSlow, 0))
histo_signal := 2
if (ta.crossunder(histSlow, 0))
histo_signal := -2
// -------------------------------- RSI Signal (Close) --------------------------------
int rsiCloseSignal = 0
varip float rsiSlow = na
rsiPeriod = input(14, title="RSI Period")
varip dailyCloseRSIFilter = array.new_float()
// rewrite pine_rsi to remove NaN value from series at calculation
dailyCloseRSIFilter := filterNA(dailyCloseRSIFilter, dailyClose, rsiPeriod)
if not na(dailyClose[0])
rsiSlow := pine_rsi(dailyCloseRSIFilter, rsiPeriod)
if rsiSlow > 80
rsiCloseSignal := -1
else if rsiSlow < 20
rsiCloseSignal := 1
else
rsiCloseSignal := 0
// -------------------------------- Overall Signal --------------------------------
// Close signal
closeSignals = array.from(macdCloseSignal, rsiCloseSignal)
closeSignal := array.includes(closeSignals, 1) ? 1 : array.includes(closeSignals, -1) ? -1 : 0
closeSignal := closeSignal * 5
// Open signal
if (macd_signal * st_signal > 0) and (macd_signal * macd_close_signal >= 0)
openSignal := intergerizeSignal(st_signal)
openSignal := openSignal * 6
else
openSignal := 0
// -------------------------------- Order --------------------------------
// if strategy.position_size == 0
if openSignal * closeSignal >=0
if openSignal > 0
strategy.entry("Long Entry", strategy.long)
else if openSignal < 0
strategy.entry("Short Entry", strategy.short)
if strategy.position_size != 0
if closeSignal < 0
strategy.close("Long Entry")
if closeSignal > 0
strategy.close("Short Entry")
// -------------------------------- Plot --------------------------------
plot(closeSignal, title="Close Signal", color=color.red, linewidth = 1, style=plot.style_area)
plot(openSignal, title="Open Signal", color=color.green, linewidth = 1, style=plot.style_area)
plot(st_signal, title="ST Signal", color=color.black, linewidth = 1, style=plot.style_circles)
plot(macd_signal, title="MACD Signal", color=color.blue, linewidth = 1, style=plot.style_circles)
// plot(macdSlowSlope, title="macd slow slope", color=color.purple, linewidth = 1, style=plot.style_line)
// plot(macdCloseSlope, title="macd slow slope", color=color.lime, linewidth = 1, style=plot.style_line)
hline(0, "Zero Line", color=color.gray)