RSI Bollinger Bands এবং Dynamic Support/Resistance Quantitative Strategy এর সাথে মিলিত

লেখক:চাওঝাং, তারিখঃ 2024-01-24 15:19:22
ট্যাগঃ

img

সারসংক্ষেপ

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

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

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

আরএসআই উপাদানটি ওভারকপড / ওভারসোল্ড স্তরগুলি বিচার করে। আরএসআই 30 এর নীচে নেমে গেলে ওভারসোল্ড শর্ত এবং ট্রিগারগুলি কিনতে সংকেত দেয়। আরএসআই 70 এর উপরে উঠলে ওভারকপড শর্ত এবং ট্রিগারগুলি বিক্রয় সংকেত দেয়।

বোলিংজার ব্যান্ড হল দামের চলমান গড় এবং স্ট্যান্ডার্ড ডিভিয়েশন থেকে হিসাব করা উপরের/নিচের ব্যান্ড, যা নির্ধারণ করে যে দাম স্বাভাবিক ওঠানামা পরিসীমা থেকে বেরিয়ে এসেছে কি না। দাম উপরের ব্যান্ডের কাছাকাছি যাওয়ার অর্থ বিক্রয় এবং নিম্ন ব্যান্ডের অর্থ ক্রয়।

এস / আর উপাদানটি নির্দিষ্ট লুকব্যাক সময়কাল এবং শতাংশ পরিসীমা, পাশাপাশি ঐতিহাসিক মূল্য বিপরীত পয়েন্টের মধ্যে ঐতিহাসিক উচ্চ / নিম্ন মূল্য (বা বন্ধ / খোলা মূল্য) এর উপর ভিত্তি করে একটি মূল এস / আর স্তর তৈরি করতে একটি গতিশীল গণনার পদ্ধতি ব্যবহার করে। এটি মূল্যের মূল প্রতিরোধের স্তরে উঠলে বিক্রয় সংকেত এবং মূল্য সমর্থন স্তরে নেমে গেলে ক্রয় সংকেত ট্রিগার করে।

সংক্ষেপে, এই কৌশলটি শুধুমাত্র যখন RSI overbought/oversold, Bollinger Bands থেকে দামের ভাঙ্গন, পাশাপাশি গতিশীল S/R স্তরের নিকটবর্তী হয় তখনই ক্রয়/বিক্রয় ট্রেড শুরু করে।

সুবিধা

  1. মৌলিক সূচক RSI প্রযুক্তিগত বিশ্লেষণ সূচক Bollinger Bands এর সাথে মিলিত। RSI মূলত ওভারকুপ/ওভারসোল্ড স্তরগুলিকে মূল্যায়ন করে যখন Bollinger Bands প্রযুক্তিগত মূল্যের নিদর্শনগুলি নির্ধারণ করে।

  2. ডায়নামিক এস/আর গণনা প্রকৃত এস/আর এর সাথে আরও ঘনিষ্ঠভাবে মেনে চলে যা মূল্যের গতিবিধিকে নিয়ন্ত্রণ করে।

  3. একটি প্রবণতা ফিল্টার যোগ করা RSI এবং Bollinger Bands এর সাথে সংযুক্ত হলে শব্দ ফিল্টার করে সংকেত নির্ভুলতা আরও উন্নত করে।

ঝুঁকি

  1. ভুল RSI পরামিতি সেটিং ভুল বিচার হতে পারে। খুব সংক্ষিপ্ত RSI দৈর্ঘ্য গোলমাল বৃদ্ধি করে। ভুল overbought / oversold থ্রেশহোল্ড সেটিং এছাড়াও ত্রুটির দিকে পরিচালিত করে।

  2. ভুল বোলিংজার ব্যান্ড প্যারামিটার যেমন দৈর্ঘ্য, StdDev গুণক বিচার সঠিকতা প্রভাবিত করে।

  3. ডায়নামিক এস/আর ঐতিহাসিক উচ্চ/নিম্ন মূল্যের উপর নির্ভর করে, তাই বিলম্বের প্রবণতা রয়েছে। ব্যবহারকারীদের বর্তমান মূল্যের সাথে আরও প্রাসঙ্গিকতার জন্য এস/আর পরামিতিগুলি অপ্টিমাইজ করা উচিত।

  4. এই কৌশলটির তুলনামূলকভাবে জটিল যুক্তি রয়েছে যার মধ্যে একাধিক সূচক সম্ভাব্য হস্তক্ষেপের কারণ হতে পারে। ব্যবহারকারীদের দ্বন্দ্ব হ্রাস করার জন্য পরামিতিগুলি পরীক্ষা করা উচিত। এন্ট্রি মানদণ্ডগুলি সরলীকরণ করা ত্রুটিগুলিকে হ্রাস করতে সহায়তা করে।

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

  1. লং, ওভারকপ/ওভারসোল্ড থ্রেশহোল্ড সহ আরএসআই পরামিতি পরীক্ষা এবং অপ্টিমাইজ করুন।

  2. দৈর্ঘ্য এবং StdDev গুণক সহ বোলিংজার ব্যান্ডের পরামিতিগুলি পরীক্ষা করুন এবং অনুকূলিত করুন।

  3. ডায়নামিক এস/আর প্যারামিটারগুলিকে মূল্যের কাছাকাছি এস/আর স্তরগুলিকে সারিবদ্ধ করার জন্য অপ্টিমাইজ করুন, যেমন স্বল্পতর পুনর্বিবেচনা সময়কাল বা কম ঐতিহাসিক উচ্চ / নিম্ন মূল্য ব্যবহার করে।

  4. সঠিকতা বৃদ্ধির জন্য RSI এর সাথে যুক্ত অতিরিক্ত সহায়ক সূচক যেমন KDJ, MACD ইত্যাদি পরীক্ষা করুন।

  5. টেস্ট এবং প্রবণতা ফিল্টার পরামিতি অপ্টিমাইজ, ফিল্টার দৈর্ঘ্য বিশেষ করে, হোল্ডিং সময়কাল প্রসারিত এবং অপ্রয়োজনীয় বিপরীত আদেশ কমাতে।

সিদ্ধান্ত

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


/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("RSI + BB + S/R Strategy with Trend Filter", shorttitle="RSI + BB + S/R + Trend Filter", overlay=true)

// RSI Settings
rsi_length = input.int(14, title="RSI Length")
overbought = input.int(70, title="Overbought Level")
oversold = input.int(30, title="Oversold Level")

// Bollinger Bands Settings
bb_length = input.int(20, title="BB Length")
bb_deviation = input.float(2.0, title="BB Deviation")

// Dynamic Support/Resistance Settings
pivot_period = input.int(10, title="Pivot Period")
pivot_source = input.string("High/Low", title="Pivot Source", options=["High/Low", "Close/Open"])
max_pivots = input.int(20, title="Maximum Number of Pivot", minval=5, maxval=100)
channel_width = input.int(10, title="Maximum Channel Width %", minval=1)
max_sr_levels = input.int(5, title="Maximum Number of S/R Levels", minval=1, maxval=10)
min_strength = input.int(2, title="Minimum Strength", minval=1, maxval=10)

// Trend Filter Settings
use_trend_filter = input.bool(false, title="Use Trend Filter")
trend_filter_length = input.int(50, title="Trend Filter Length")

// Calculate RSI and Bollinger Bands
rsi = ta.rsi(close, rsi_length)
basis = ta.sma(close, bb_length)
deviation = ta.stdev(close, bb_length)
upper_band = basis + bb_deviation * deviation
lower_band = basis - bb_deviation * deviation

// Plot Bollinger Bands on the chart
plot(upper_band, color=color.blue, title="Upper Bollinger Band")
plot(lower_band, color=color.red, title="Lower Bollinger Band")

// Dynamic Support/Resistance Calculation
float src1 = pivot_source == "High/Low" ? high : math.max(close, open)
float src2 = pivot_source == "High/Low" ? low : math.min(close, open)
float ph = ta.pivothigh(src1, pivot_period, pivot_period)
float pl = ta.pivotlow(src2, pivot_period, pivot_period)


// Calculate maximum S/R channel zone width
prdhighest = ta.highest(300)
prdlowest = ta.lowest(300)
cwidth = (prdhighest - prdlowest) * channel_width / 100

var pivotvals = array.new_float(0)

if ph or pl
    array.unshift(pivotvals, ph ? ph : pl)
    if array.size(pivotvals) > max_pivots
        array.pop(pivotvals)

get_sr_vals(ind) =>
    float lo = array.get(pivotvals, ind)
    float hi = lo
    int numpp = 0
    for y = 0 to array.size(pivotvals) - 1 by 1
        float cpp = array.get(pivotvals, y)
        float wdth = cpp <= lo ? hi - cpp : cpp - lo
        if wdth <= cwidth
            if cpp <= hi
                lo := math.min(lo, cpp)
            else
                hi := math.max(hi, cpp)
            numpp += 1
    [hi, lo, numpp]

var sr_up_level = array.new_float(0)
var sr_dn_level = array.new_float(0)
sr_strength = array.new_float(0)

find_loc(strength) =>
    ret = array.size(sr_strength)
    for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1
        if strength <= array.get(sr_strength, i)
            break
        ret := i
    ret

check_sr(hi, lo, strength) =>
    ret = true
    for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
            if strength >= array.get(sr_strength, i)
                array.remove(sr_strength, i)
                array.remove(sr_up_level, i)
                array.remove(sr_dn_level, i)
            else
                ret := false
            break
    ret

if ph or pl
    array.clear(sr_up_level)
    array.clear(sr_dn_level)
    array.clear(sr_strength)
    for x = 0 to array.size(pivotvals) - 1 by 1
        [hi, lo, strength] = get_sr_vals(x)
        if check_sr(hi, lo, strength)
            loc = find_loc(strength)
            if loc < max_sr_levels and strength >= min_strength
                array.insert(sr_strength, loc, strength)
                array.insert(sr_up_level, loc, hi)
                array.insert(sr_dn_level, loc, lo)
                if array.size(sr_strength) > max_sr_levels
                    array.pop(sr_strength)
                    array.pop(sr_up_level)
                    array.pop(sr_dn_level)

// Calculate the Trend Filter
trend_filter = use_trend_filter ? ta.sma(close, trend_filter_length) : close

// Buy Condition (RSI + Proximity to Support + Trend Filter)
buy_condition = ta.crossover(rsi, oversold) and close <= ta.highest(high, max_sr_levels) and close >= ta.lowest(low, max_sr_levels) and (not use_trend_filter or close > trend_filter)

// Sell Condition (RSI + Proximity to Resistance + Trend Filter)
sell_condition = ta.crossunder(rsi, overbought) and close >= ta.lowest(low, max_sr_levels) and close <= ta.highest(high, max_sr_levels) and (not use_trend_filter or close < trend_filter)

// Strategy Orders
strategy.entry("Buy", strategy.long, when = buy_condition)
strategy.entry("Sell", strategy.short, when = sell_condition)

আরো