সুপার ট্রেন্ড MACD পরিমাণগত কৌশল


সৃষ্টির তারিখ: 2023-12-26 11:13:24 অবশেষে সংশোধন করুন: 2023-12-26 11:13:24
অনুলিপি: 0 ক্লিকের সংখ্যা: 792
1
ফোকাস
1621
অনুসারী

সুপার ট্রেন্ড MACD পরিমাণগত কৌশল

ওভারভিউ

এই কৌশলটি ওভারট্রেন্ডিং এবং MACD সূচকগুলির সম্ভাব্য ট্রেন্ড রিভার্সনের সংকেতগুলিকে সংযুক্ত করে, আরএসআই সূচকের ওভার-বিক্রয় ও ওভার-বিক্রয় সংকেতগুলির সাথে মিলিত হয়, যা একটি স্থিতিশীল এবং দক্ষ খোলা এবং বন্ধ অবস্থানের সংকেত সিস্টেম গঠন করে। কৌশলটির নাম ওভারট্রেন্ডিং MACD কোয়ান্টিফিকেশন কৌশল।

কৌশল নীতি

এই কৌশলটির মূল যুক্তি হল পজিশন খোলার সংকেত হিসেবে সুপারট্রেন্ডিং এবং MACD সূচককে সমন্বিতভাবে ব্যবহার করা।

ওভারট্রেন্ডিং অংশে, কৌশলটি ওভারট্রেন্ডিং সূচকের দিক পরিবর্তনকে সম্ভাব্য বিপরীত সিগন্যাল হিসাবে ব্যবহার করে। ওভারট্রেন্ডিং সূচকের দিকটি উপরে থেকে নীচে যাওয়ার সময় এটি একটি কেনার সংকেত দেয়; ওভারট্রেন্ডিং সূচকের দিকটি নীচে থেকে উপরে যাওয়ার সময় এটি একটি বিক্রয় সংকেত দেয়।

MACD অংশে, কৌশলটি সম্ভাব্য বিপরীতমুখী সুযোগের বিচার করতে MACD সূচকটি নিম্ন সময়ের ফ্রেমে ((সূর্যের রেখা) এর স্লাইড এবং শূন্য-অক্ষের ক্রস ব্যবহার করে। যখন MACD স্লাইডের নিখুঁত মানটি বড় (উপরিসরের চেয়ে বড়) এবং স্লাইডটি একইভাবে উপরে উঠতে থাকে তখন একটি সংকেত উত্পন্ন হয়। যদি MACD সূচকটি শূন্য-অক্ষটি অতিক্রম করে তবে একটি সহায়ক সংকেতও উত্পন্ন হয়। MACD অংশে সংকেতটি প্রবণতা অতিক্রমের চেয়ে মসৃণ।

পজিশন খোলার সংকেতে, কৌশলটি সুপার ট্রেন্ডিং সিগন্যাল এবং এমএসিডি সিগন্যালের সাথে একমত হওয়ার জন্য পজিশন খোলার নির্দেশ জারি করে।

এছাড়া, প্লেইন পজিশনের অংশে কৌশলটি আরএসআই সূচকটির ওভার-বই ওভার-সেল সংকেতও প্রবর্তন করে। যখন আরএসআই সূচকটি 80 এর চেয়ে বড় হয় তখন বিক্রয় সংকেত উত্পন্ন হয়, যখন 20 এর চেয়ে কম হয় তখন ক্রয় সংকেত উত্পন্ন হয়, যখন বিপরীত সময় নির্ধারণে সহায়তা করে।

সামর্থ্য বিশ্লেষণ

এই কৌশলটির সবচেয়ে বড় সুবিধা হল সূচক সংকেতের বৈচিত্র্য। বিভিন্ন সূচকগুলির মধ্যে সমন্বয় তৈরি করা যায়, যা সামগ্রিক সংকেতকে আরও স্থিতিশীল এবং নির্ভরযোগ্য করে তোলে।

সুপার ট্রেন্ডিং সূচকগুলির বিপরীত সংকেতগুলি তুলনামূলকভাবে শক্তিশালী স্বল্পমেয়াদী প্রবণতাগুলি ধরতে পারে; ম্যাকড স্কেলটি মিডিয়াম-লম্বা সময়ের প্রবণতার শক্তি নির্ধারণ করতে পারে এবং মিথ্যা বিপরীতের দ্বারা বিভ্রান্ত হওয়া এড়াতে পারে। আরএসআই সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে সুপারকে

উপরন্তু, কৌশলটির সময় ফ্রেম সেট করাও যুক্তিসঙ্গত। সুপারট্রেন্ডস ঘন্টা ভিত্তিক সময় ফ্রেম ব্যবহার করে এবং এমএসিডি সূচকটি দিবালোক ব্যবহার করে, যা ট্রেডিং ফ্রিকোয়েন্সি নিশ্চিত করে এবং প্রবণতার বিচারের স্থিতিশীলতাও বিবেচনা করে।

ঝুঁকি বিশ্লেষণ

এই কৌশলটির প্রধান ঝুঁকি হ’ল সূচকগুলির মধ্যে বিভ্রান্তির সংকেত তৈরির উচ্চ সম্ভাবনা রয়েছে। উদাহরণস্বরূপ, একটি সুপারট্রেন্ড একটি মিথ্যা বিপর্যয় সৃষ্টি করে এবং ম্যাকড সংকেতটি অ-সমন্বিতভাবে তৈরি হয়। এটি অপ্রয়োজনীয় ক্ষতির কারণ হতে পারে।

এছাড়াও, RSI সূচকটি স্থির অবস্থানের সময় নির্ধারণের জন্য খুব তাড়াতাড়ি বা খুব দেরী হতে পারে, যার ফলে কৌশলটির অবস্থানকালের সময়টি সর্বাধিকতর করা যায় না।

অবশেষে, 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)