وسائل لوڈ ہو رہے ہیں... لوڈنگ...

سپر ٹرینڈ MACD مقداری حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-26 11:13:24
ٹیگز:

img

جائزہ

اس حکمت عملی میں سپر ٹرینڈ اشارے اور ایم اے سی ڈی اشارے سے ممکنہ رجحان کی تبدیلی کے اشاروں کو ، آر ایس آئی اشارے سے زیادہ خرید / فروخت کے اشاروں کے ساتھ مل کر ، انٹری اور آؤٹ سگنلز کے لئے نسبتا stable مستحکم اور موثر نظام تشکیل دیا گیا ہے۔ حکمت عملی کا نام ہے سپر ٹرینڈ ایم اے سی ڈی مقداری حکمت عملی۔

حکمت عملی منطق

اس حکمت عملی کا بنیادی منطق سپر ٹرینڈ اشارے اور ایم اے سی ڈی اشارے کے مشترکہ استعمال میں داخلہ سگنل کے لئے معیار کے طور پر ہے.

سپر ٹرینڈ حصے پر ، حکمت عملی سپر ٹرینڈ اشارے کی سمت کی تبدیلی کو ممکنہ الٹ سگنل کے طور پر اپناتی ہے۔ جب سپر ٹرینڈ سمت اوپر سے نیچے کی طرف موڑتی ہے تو ، خرید کا اشارہ پیدا ہوتا ہے۔ جب سمت نیچے سے اوپر کی طرف موڑتی ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔

ایم اے سی ڈی کے حصے پر ، حکمت عملی ممکنہ الٹ جانے کے مواقع کی نشاندہی کرنے کے لئے کم ٹائم فریم (روزانہ) پر ایم اے سی ڈی اشارے کے ڈھلوان اور صفر لائن کراس اوور کا استعمال کرتی ہے۔ جب ایم اے سی ڈی ڈھلوان مطلق قیمت بڑی ہے (حد سے اوپر) اور ڈھلوان اوپر کی طرف رجحان برقرار رکھتا ہے تو ، ایک سگنل تیار کیا جاتا ہے۔ اگر ایم اے سی ڈی لائن صفر لائن کو عبور کرتی ہے تو ، ایک معاون سگنل تیار کیا جاتا ہے۔ ایم اے سی ڈی سگنل عام طور پر سپر ٹرینڈ سے زیادہ ہموار ہوتے ہیں۔

انٹری سگنلز کے لئے، حکمت عملی کی ضرورت ہوتی ہے کہ سپر ٹرینڈ سگنل اور ایم اے سی ڈی سگنل ایک ہی سمت میں ہوں، تجارتی احکامات بھیجنے سے پہلے.

اس کے علاوہ ، باہر نکلنے کے اشاروں کے ل the ، حکمت عملی RSI اشارے سے اوور بک / اوور سیل سگنل کو بھی اپناتی ہے۔ جب RSI 80 سے اوپر جاتا ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔ جب RSI 20 سے نیچے گرتا ہے تو ، خرید کا اشارہ پیدا ہوتا ہے۔ یہ الٹ ٹائمنگ کا تعین کرنے میں مدد کرتے ہیں۔

فوائد کا تجزیہ

اس حکمت عملی کا سب سے بڑا فائدہ اشارے کے اشاروں کی تنوع ہے۔ مختلف اشارے ایک دوسرے کی تکمیل کرسکتے ہیں اور مجموعی طور پر سگنل کو زیادہ مستحکم اور قابل اعتماد بناتے ہیں۔

سپر ٹرینڈ الٹ سگنل نسبتا strong مضبوط قلیل مدتی رجحانات کو پکڑ سکتے ہیں۔ ایم اے سی ڈی ڈھلوان غلط الٹ سے گمراہ ہونے سے بچنے کے لئے درمیانی طویل مدتی رجحان کی طاقت کا فیصلہ کرسکتا ہے۔ آر ایس آئی حد سے زیادہ خرید / فروخت کی سطح کی نشاندہی کرکے رینج سے منسلک مارکیٹ میں بہترین اندراج اور باہر نکلنے کا وقت فراہم کرسکتا ہے۔ متعدد اشارے سے اسٹیکنگ سگنل کچھ شور مچانے والی تجارت کو فلٹر کرسکتے ہیں اور جیت کی شرح کو زیادہ حاصل کرسکتے ہیں۔

اس کے علاوہ ، ٹائم فریم ڈیزائن بھی معقول ہے۔ سپر ٹرینڈ گھنٹہ وار ٹائم فریم کا استعمال کرتا ہے جبکہ ایم اے سی ڈی روزانہ کے ٹائم فریم کا استعمال کرتا ہے۔ اس سے تجارت کی تعدد اور ٹرینڈ فیصلے میں استحکام دونوں کو یقینی بنایا جاتا ہے۔

خطرے کا تجزیہ

اس حکمت عملی کا بنیادی خطرہ مختلف اشارے کے مابین سگنلز کو الجھانے کا اعلی امکان ہے۔ مثال کے طور پر ، سپر ٹرینڈ غلط الٹ دے سکتا ہے جبکہ ایم اے سی ڈی سگنل مطابقت پذیر نہیں ہوتا ہے۔ اس سے غیر ضروری نقصانات ہوسکتے ہیں۔

اس کے علاوہ، باہر نکلنے کے وقت کا تعین کرنے کے لئے RSI بھی بہت جلدی یا بہت دیر ہو سکتا ہے، زیادہ سے زیادہ ہولڈنگ مدت کو روکنے کے.

آخر میں، MACD جھکاو کی حد سے زیادہ حد بھی کمزور الٹ کے مواقع سے محروم ہوسکتی ہے۔

اصلاح کی ہدایات

اس حکمت عملی کو مندرجہ ذیل پہلوؤں سے مزید بہتر بنایا جاسکتا ہے:

  1. سٹاپ نقصان کا طریقہ کار متعارف کروانا۔ نقصان کو روکنا جب نقصان ایک خاص فیصد سے زیادہ ہو۔

  2. ایم اے سی ڈی ڈیلپ فیصلے کے لئے متحرک حد شامل کریں۔ جب مارکیٹ میں اتار چڑھاؤ زیادہ ہو تو ڈیلپ کی حد بڑھانا ، اور جب مارکیٹ مستحکم ہو تو کم حد۔

  3. آر ایس آئی سے باہر نکلنے کے فیصلے کے لئے پل بیک کی شرط شامل کریں۔ پوزیشن بند کرنے پر غور کرنے سے پہلے آر ایس آئی 80 سے زیادہ ہونے کے بعد ایک اہم کال بیک کی ضرورت ہے۔

  4. حجم کے ساتھ MACD کی جانچ اور یہ سگنل کی وشوسنییتا کو بہتر بنانے کے لئے اگر دیکھیں

  5. بہترین ترتیبات تلاش کرنے کے لئے خودکار پیرامیٹر ٹیوننگ کی کوشش کر رہا ہے

نتیجہ

سپر ٹرینڈ ایم اے سی ڈی مقداری حکمت عملی متعدد اشارے کے سگنل کو یکجا کرکے انٹری اور ایگزٹ سگنل فراہم کرتی ہے۔ اس کے فوائد مستحکم سگنل اور نسبتا high اعلی جیت کی شرح میں ہیں۔ پیرامیٹر کی اصلاح کے ذریعے مزید بہتری حاصل کی جاسکتی ہے۔ خطرات اور اصلاح کی سمت بنیادی طور پر پیرامیٹر اوور فٹنگ کے امور کے گرد مرکوز ہیں۔ مجموعی طور پر ، اس حکمت عملی کی براہ راست تجارت کے لئے مضبوط عملی قدر ہے۔


/*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)


مزید