
यह रणनीति एक ट्रेडिंग प्रणाली है जिसमें इक्विटी लाइन क्रॉस सिग्नल और मार्केट स्टेटस फ़िल्टरिंग शामिल है। यह 9 चक्र और 21 चक्र सरल चलती औसत (एसएमए) के क्रॉसिंग के माध्यम से बाजार की प्रवृत्ति को पकड़ता है, जबकि औसत दिशा सूचकांक (एडीएक्स) और अराजकता सूचकांक (चोपनेस इंडेक्स, सीआई) का उपयोग करके बाजार के वातावरण को फ़िल्टर करता है, यह सुनिश्चित करता है कि केवल ट्रेंड स्पष्ट और अच्छी तरह से अस्थिर बाजारों में व्यापार किया जाए। यह विधि पारंपरिक प्रवृत्ति ट्रैकिंग रणनीतियों को आधुनिक तकनीकी संकेतकों के साथ प्रभावी रूप से जोड़ती है, जो एक अधिक मजबूत ट्रेडिंग फ्रेमवर्क प्रदान करती है।
इस रणनीति के मूल में तीन प्रमुख तत्व शामिल हैंः
रणनीति में अनुकूलित तकनीकी संकेतकों की गणना के तरीके शामिल हैं, जिसमें एक अनुकूलित योग फंक्शन, अधिकतम और न्यूनतम गणना, और मानकीकृत वास्तविक तरंग दैर्ध्य ((TR) गणना शामिल है, जिससे संकेत की सटीकता और गणना दक्षता सुनिश्चित होती है।
इस रणनीति में एक पूर्ण व्यापार प्रणाली का निर्माण किया गया है, जिसमें क्लासिक समरेखा क्रॉसिंग रणनीति को आधुनिक तकनीकी संकेतकों के साथ जोड़ा गया है। यह न केवल रुझानों को पकड़ने पर ध्यान केंद्रित करता है, बल्कि बाजार की स्थिति के लिए उपयुक्तता पर भी विशेष ध्यान देता है, जो कई फ़िल्टरिंग तंत्रों के माध्यम से व्यापार की स्थिरता को बढ़ाता है। हालांकि कुछ पैरामीटर संवेदनशीलता और पिछड़ेपन की समस्याएं हैं, लेकिन प्रस्तावित अनुकूलन दिशा के माध्यम से रणनीति में अभी भी बहुत सुधार की जगह है। कुल मिलाकर, यह एक तर्कसंगत, व्यावहारिक और मजबूत व्यापार रणनीति है।
/*backtest
start: 2024-02-22 00:00:00
end: 2024-12-06 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("MA9/MA21 Cross with ADX & CHOP Filter", overlay=true, initial_capital=10000, currency=currency.USD)
// ─── CUSTOM FUNCTIONS ──────────────────────────────────────────────────────
// Custom function to compute the sum over the last 'len' bars.
f_sum(src, len) =>
s = 0.0
for i = 0 to len - 1
s += src[i]
s
// Custom function to compute the highest value over the last 'len' bars.
f_highest(src, len) =>
h = src[0]
for i = 1 to len - 1
h := math.max(h, src[i])
h
// Custom function to compute the lowest value over the last 'len' bars.
f_lowest(src, len) =>
l = src[0]
for i = 1 to len - 1
l := math.min(l, src[i])
l
// ─── INPUTS ──────────────────────────────────────────────────────────────
ma9Period = input.int(9, title="MA 9 Period", minval=1)
ma21Period = input.int(21, title="MA 21 Period", minval=1)
adxLength = input.int(7, title="ADX Smoothing / DI Length", minval=1)
adxThresh = input.float(20.0, title="ADX Threshold", step=0.1)
chopLen = input.int(7, title="CHOP Length", minval=1)
chopOff = input.int(0, title="CHOP Offset", minval=0) // Not applied in calculation
chopThresh = input.float(50.0, title="CHOP Maximum (do not trade if above)", step=0.1)
// ─── CALCULATE INDICATORS ────────────────────────────────────────────────────
// Moving Averages
ma9 = ta.sma(close, ma9Period)
ma21 = ta.sma(close, ma21Period)
// --- True Range Calculation ---
// Manual implementation of true range (tr)
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))), math.abs(low - nz(close[1])))
// --- ADX Calculation (Manual Implementation) ---
// Calculate directional movements
upMove = high - nz(high[1])
downMove = nz(low[1]) - low
plusDM = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
// Smooth the values using the built-in rma function
atr = ta.rma(tr, adxLength)
plusDI = 100 * ta.rma(plusDM, adxLength) / atr
minusDI = 100 * ta.rma(minusDM, adxLength) / atr
dx = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adxValue = ta.rma(dx, adxLength)
// --- Choppiness Index Calculation ---
// Compute the sum of true range over chopLen periods
atrSum = f_sum(tr, chopLen)
// Compute highest high and lowest low over chopLen periods using custom functions
highestHigh = f_highest(high, chopLen)
lowestLow = f_lowest(low, chopLen)
priceRange = highestHigh - lowestLow
chop = priceRange != 0 ? 100 * math.log(atrSum / priceRange) / math.log(chopLen) : 0
// ─── STRATEGY CONDITIONS ─────────────────────────────────────────────────────
// MA Crossover Signals
longCond = ta.crossover(ma9, ma21)
shortCond = ta.crossunder(ma9, ma21)
// Filter: Only trade if ADX > threshold and CHOP ≤ threshold.
filterCond = (adxValue > adxThresh) and (chop <= chopThresh)
// Entries and Exits
if longCond and filterCond
strategy.entry("Long", strategy.long)
if shortCond and filterCond
strategy.entry("Short", strategy.short)
if shortCond
strategy.close("Long")
if longCond
strategy.close("Short")
// ─── PLOTTING ──────────────────────────────────────────────────────────────
plot(ma9, color=color.red, title="MA 9")
plot(ma21, color=color.blue, title="MA 21")
plot(adxValue, title="ADX", color=color.purple)
hline(adxThresh, title="ADX Threshold", color=color.purple, linestyle=hline.style_dotted)
plot(chop, title="CHOP", color=color.orange)
hline(chopThresh, title="CHOP Threshold", color=color.orange, linestyle=hline.style_dotted)