اس حکمت عملی میں سپر ٹرینڈ اشارے اور ایم اے سی ڈی اشارے سے ممکنہ رجحان کی تبدیلی کے اشاروں کو ، آر ایس آئی اشارے سے زیادہ خرید / فروخت کے اشاروں کے ساتھ مل کر ، انٹری اور آؤٹ سگنلز کے لئے نسبتا stable مستحکم اور موثر نظام تشکیل دیا گیا ہے۔ حکمت عملی کا نام ہے
اس حکمت عملی کا بنیادی منطق سپر ٹرینڈ اشارے اور ایم اے سی ڈی اشارے کے مشترکہ استعمال میں داخلہ سگنل کے لئے معیار کے طور پر ہے.
سپر ٹرینڈ حصے پر ، حکمت عملی سپر ٹرینڈ اشارے کی سمت کی تبدیلی کو ممکنہ الٹ سگنل کے طور پر اپناتی ہے۔ جب سپر ٹرینڈ سمت اوپر سے نیچے کی طرف موڑتی ہے تو ، خرید کا اشارہ پیدا ہوتا ہے۔ جب سمت نیچے سے اوپر کی طرف موڑتی ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔
ایم اے سی ڈی کے حصے پر ، حکمت عملی ممکنہ الٹ جانے کے مواقع کی نشاندہی کرنے کے لئے کم ٹائم فریم (روزانہ) پر ایم اے سی ڈی اشارے کے ڈھلوان اور صفر لائن کراس اوور کا استعمال کرتی ہے۔ جب ایم اے سی ڈی ڈھلوان مطلق قیمت بڑی ہے (حد سے اوپر) اور ڈھلوان اوپر کی طرف رجحان برقرار رکھتا ہے تو ، ایک سگنل تیار کیا جاتا ہے۔ اگر ایم اے سی ڈی لائن صفر لائن کو عبور کرتی ہے تو ، ایک معاون سگنل تیار کیا جاتا ہے۔ ایم اے سی ڈی سگنل عام طور پر سپر ٹرینڈ سے زیادہ ہموار ہوتے ہیں۔
انٹری سگنلز کے لئے، حکمت عملی کی ضرورت ہوتی ہے کہ سپر ٹرینڈ سگنل اور ایم اے سی ڈی سگنل ایک ہی سمت میں ہوں، تجارتی احکامات بھیجنے سے پہلے.
اس کے علاوہ ، باہر نکلنے کے اشاروں کے ل the ، حکمت عملی RSI اشارے سے اوور بک / اوور سیل سگنل کو بھی اپناتی ہے۔ جب RSI 80 سے اوپر جاتا ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔ جب RSI 20 سے نیچے گرتا ہے تو ، خرید کا اشارہ پیدا ہوتا ہے۔ یہ الٹ ٹائمنگ کا تعین کرنے میں مدد کرتے ہیں۔
اس حکمت عملی کا سب سے بڑا فائدہ اشارے کے اشاروں کی تنوع ہے۔ مختلف اشارے ایک دوسرے کی تکمیل کرسکتے ہیں اور مجموعی طور پر سگنل کو زیادہ مستحکم اور قابل اعتماد بناتے ہیں۔
سپر ٹرینڈ الٹ سگنل نسبتا strong مضبوط قلیل مدتی رجحانات کو پکڑ سکتے ہیں۔ ایم اے سی ڈی ڈھلوان غلط الٹ سے گمراہ ہونے سے بچنے کے لئے درمیانی طویل مدتی رجحان کی طاقت کا فیصلہ کرسکتا ہے۔ آر ایس آئی حد سے زیادہ خرید / فروخت کی سطح کی نشاندہی کرکے رینج سے منسلک مارکیٹ میں بہترین اندراج اور باہر نکلنے کا وقت فراہم کرسکتا ہے۔ متعدد اشارے سے اسٹیکنگ سگنل کچھ شور مچانے والی تجارت کو فلٹر کرسکتے ہیں اور جیت کی شرح کو زیادہ حاصل کرسکتے ہیں۔
اس کے علاوہ ، ٹائم فریم ڈیزائن بھی معقول ہے۔ سپر ٹرینڈ گھنٹہ وار ٹائم فریم کا استعمال کرتا ہے جبکہ ایم اے سی ڈی روزانہ کے ٹائم فریم کا استعمال کرتا ہے۔ اس سے تجارت کی تعدد اور ٹرینڈ فیصلے میں استحکام دونوں کو یقینی بنایا جاتا ہے۔
اس حکمت عملی کا بنیادی خطرہ مختلف اشارے کے مابین سگنلز کو الجھانے کا اعلی امکان ہے۔ مثال کے طور پر ، سپر ٹرینڈ غلط الٹ دے سکتا ہے جبکہ ایم اے سی ڈی سگنل مطابقت پذیر نہیں ہوتا ہے۔ اس سے غیر ضروری نقصانات ہوسکتے ہیں۔
اس کے علاوہ، باہر نکلنے کے وقت کا تعین کرنے کے لئے RSI بھی بہت جلدی یا بہت دیر ہو سکتا ہے، زیادہ سے زیادہ ہولڈنگ مدت کو روکنے کے.
آخر میں، MACD جھکاو کی حد سے زیادہ حد بھی کمزور الٹ کے مواقع سے محروم ہوسکتی ہے۔
اس حکمت عملی کو مندرجہ ذیل پہلوؤں سے مزید بہتر بنایا جاسکتا ہے:
سٹاپ نقصان کا طریقہ کار متعارف کروانا۔ نقصان کو روکنا جب نقصان ایک خاص فیصد سے زیادہ ہو۔
ایم اے سی ڈی ڈیلپ فیصلے کے لئے متحرک حد شامل کریں۔ جب مارکیٹ میں اتار چڑھاؤ زیادہ ہو تو ڈیلپ کی حد بڑھانا ، اور جب مارکیٹ مستحکم ہو تو کم حد۔
آر ایس آئی سے باہر نکلنے کے فیصلے کے لئے پل بیک کی شرط شامل کریں۔ پوزیشن بند کرنے پر غور کرنے سے پہلے آر ایس آئی 80 سے زیادہ ہونے کے بعد ایک اہم کال بیک کی ضرورت ہے۔
حجم کے ساتھ MACD کی جانچ اور یہ سگنل کی وشوسنییتا کو بہتر بنانے کے لئے اگر دیکھیں
بہترین ترتیبات تلاش کرنے کے لئے خودکار پیرامیٹر ٹیوننگ کی کوشش کر رہا ہے
/*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)