
یہ حکمت عملی ایک ٹریڈنگ سسٹم ہے جس میں مساوی لائن کراس سگنل اور مارکیٹ کی حالت کے فلٹر کو جوڑ دیا گیا ہے۔ یہ مارکیٹ کے رجحانات کو پکڑنے کے لئے 9 دوروں اور 21 دوروں کی سادہ حرکت پذیری اوسط ((SMA) کے کراس کے ذریعے مارکیٹ کے رجحانات کو پکڑتا ہے ، جبکہ اوسط سمت اشاریہ ((ADX) اور افراتفری اشاریہ ((Choppiness Index ، CI) کا استعمال کرتے ہوئے مارکیٹ کے ماحول کو فلٹر کرتا ہے ، اس بات کو یقینی بناتا ہے کہ صرف رجحانات واضح اور اتار چڑھاؤ کی خصوصیات والی مارکیٹوں میں ہی تجارت کی جائے۔ یہ طریقہ کار روایتی رجحانات کی پیروی کرنے والی حکمت عملی کو جدید تکنیکی اشارے کے ساتھ مؤثر طریقے سے جوڑتا ہے ، اور ایک زیادہ مستحکم تجارتی فریم ورک مہیا کرتا ہے۔
اس حکمت عملی کی بنیادی منطق تین اہم اجزاء پر مشتمل ہے:
اس حکمت عملی میں بہتر تکنیکی اشارے کے حساب کتاب کے طریقوں کا استعمال کیا گیا ہے ، جس میں اپنی مرضی کے مطابق جمع فنکشن ، زیادہ سے زیادہ اور کم سے کم قیمت کے حساب کتاب ، اور معیاری اصلی طول موج ((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)