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

লেখক:চাওঝাং, তারিখঃ ২০২৩-১২-২৬ ১১ঃ১৩ঃ২৪
ট্যাগঃ

img

সারসংক্ষেপ

এই কৌশলটি সুপারট্রেন্ড সূচক এবং এমএসিডি সূচক থেকে সম্ভাব্য প্রবণতা বিপরীত সংকেতগুলিকে আরএসআই সূচক থেকে অতিরিক্ত ক্রয় / অতিরিক্ত বিক্রয় সংকেতগুলির সাথে একত্রিত করে প্রবেশ এবং প্রস্থান সংকেতগুলির জন্য একটি অপেক্ষাকৃত স্থিতিশীল এবং দক্ষ সিস্টেম গঠন করে। কৌশলটির নাম সুপারট্রেন্ড এমএসিডি পরিমাণগত কৌশল

কৌশলগত যুক্তি

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

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

এমএসিডি অংশে, কৌশলটি সম্ভাব্য বিপরীতমুখী সুযোগগুলি সনাক্ত করার জন্য নিম্ন সময়সীমার (দৈনিক) এমএসিডি সূচকের ঢাল এবং শূন্য রেখার ক্রসওভার ব্যবহার করে। যখন এমএসিডি ঢালের পরম মান বড় হয় (সীমানার উপরে) এবং ঢালটি ঊর্ধ্বমুখী প্রবণতা বজায় রাখে, তখন একটি সংকেত উত্পন্ন হয়। যদি এমএসিডি লাইন শূন্য রেখা অতিক্রম করে, একটি সহায়ক সংকেত উত্পন্ন হয়। এমএসিডি সংকেতগুলি সাধারণত সুপারট্রেন্ডের তুলনায় মসৃণ হয়।

এন্ট্রি সিগন্যালের জন্য, কৌশলটি সুপারট্রেন্ড সিগন্যাল এবং এমএসিডি সিগন্যালকে ট্রেডিং অর্ডার পাঠানোর আগে একই দিকের হতে বলে।

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

সুবিধা বিশ্লেষণ

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

সুপারট্রেন্ড বিপরীতমুখী সংকেতগুলি তুলনামূলকভাবে শক্তিশালী স্বল্পমেয়াদী প্রবণতা ক্যাপচার করতে পারে; মিথ্যা বিপরীতমুখী দ্বারা বিভ্রান্ত হওয়া এড়ানোর জন্য এমএসিডি ঢাল মাঝারি-দীর্ঘমেয়াদী প্রবণতার শক্তি বিচার করতে পারে; আরএসআই ওভারকপ/ওভারসোল্ড স্তরগুলি নির্দেশ করে পরিসীমা-সীমাবদ্ধ বাজারে সেরা প্রবেশ এবং প্রস্থান সময় সরবরাহ করতে পারে। একাধিক সূচক থেকে সংকেতগুলি স্ট্যাকিং কিছু গোলমাল ট্রেড ফিল্টার করতে পারে এবং উচ্চতর জয় হার অর্জন করতে পারে।

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

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

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

এছাড়াও, প্রস্থান টাইমিং নির্ধারণের জন্য RSI খুব তাড়াতাড়ি বা খুব দেরিতে হতে পারে, সর্বোচ্চ ধরে রাখার সময়কালকে বাধা দেয়।

অবশেষে, খুব বড় ম্যাকডি ঢালের প্রান্তিক মাত্রা দুর্বল বিপরীতমুখী সুযোগগুলিও মিস করতে পারে।

অপ্টিমাইজেশান নির্দেশাবলী

এই কৌশল নিম্নলিখিত দিক থেকে আরও অপ্টিমাইজ করা যেতে পারেঃ

  1. স্টপ লস মেশিন চালু করুন, যখন হারের হার একটা নির্দিষ্ট শতাংশ অতিক্রম করবে।

  2. MACD পল্ট বিচারের জন্য গতিশীল থ্রেশহোল্ড যুক্ত করুন। যখন বাজারের অস্থিরতা বেশি হয় তখন পল্ট থ্রেশহোল্ড বাড়ান এবং যখন বাজার স্থিতিশীল হয় তখন থ্রেশহোল্ড কম করুন।

  3. RSI প্রস্থান বিচারের জন্য pullback শর্ত যোগ করুন। বন্ধ পজিশন বিবেচনা করার আগে RSI 80 অতিক্রম করার পরে একটি উল্লেখযোগ্য কলব্যাক প্রয়োজন।

  4. ভলিউমের সাথে ম্যাকডি পরীক্ষা করুন এবং দেখুন এটি সংকেত নির্ভরযোগ্যতা উন্নত করে কিনা

  5. সর্বোত্তম সেটিংস খুঁজে পেতে স্বয়ংক্রিয় পরামিতি টিউনিং চেষ্টা

সিদ্ধান্ত

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


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


আরো