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


تخلیق کی تاریخ: 2023-12-26 11:13:24 آخر میں ترمیم کریں: 2023-12-26 11:13:24
کاپی: 0 کلکس کی تعداد: 792
1
پر توجہ دیں
1621
پیروکار

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

جائزہ

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

حکمت عملی کا اصول

اس حکمت عملی کا بنیادی منطق یہ ہے کہ پوزیشن کھولنے کے اشارے کے لئے معیار کے طور پر سپر ٹرینڈ اشارے اور MACD اشارے کا استعمال کیا جائے۔

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

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

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

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

طاقت کا تجزیہ

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

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

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

خطرے کا تجزیہ

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

اس کے علاوہ ، آر ایس آئی اشارے کا استعمال وقت سے پہلے یا بعد میں بھی ہو سکتا ہے ، جس سے حکمت عملی کے لئے زیادہ سے زیادہ وقت نہیں مل سکتا ہے۔

آخر میں ، MACD اشارے میں زیادہ سے زیادہ اسکیلپنگ کی حد کو بھی ایک کمزور واپسی کا موقع ضائع کرنے کا سبب بن سکتا ہے۔

اصلاح کی سمت

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

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

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

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

  4. Testing MACD with volume and see if it improves signal reliability

  5. Trying automated parameter tuning to find optimal settings

خلاصہ کریں۔

اوور فٹنگ رجحان 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)