গতিশীল সমর্থন এবং প্রতিরোধ এবং বলিঞ্জার ব্যান্ড মাল্টি-ইন্ডিকেটর ক্রসওভার কৌশল

SR BB EMA21 Pivot CROSS
সৃষ্টির তারিখ: 2025-01-17 14:24:33 অবশেষে সংশোধন করুন: 2025-01-17 14:24:33
অনুলিপি: 1 ক্লিকের সংখ্যা: 427
1
ফোকাস
1617
অনুসারী

গতিশীল সমর্থন এবং প্রতিরোধ এবং বলিঞ্জার ব্যান্ড মাল্টি-ইন্ডিকেটর ক্রসওভার কৌশল

ওভারভিউ

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

কৌশল নীতি

কৌশলটি মূলত নিম্নলিখিত মূল উপাদানগুলির উপর ভিত্তি করে:

  1. গতিশীল সমর্থন এবং প্রতিরোধের গণনা: বাজারের সমর্থন এবং প্রতিরোধের স্তরগুলি গতিশীলভাবে গণনা করতে পিভট পয়েন্ট পদ্ধতি ব্যবহার করুন এবং চ্যানেলের প্রস্থ এবং ন্যূনতম শক্তির প্রয়োজনীয়তা সেট করে কার্যকর মূল্যের ক্ষেত্রগুলি স্ক্রীন করুন৷
  2. বলিঙ্গার ব্যান্ড সূচক: 20 এবং 2 গুণ মান বিচ্যুতি সহ বলিঙ্গার ব্যান্ডগুলি মূল্যের ওঠানামা পরিসীমা নির্ধারণ করতে ব্যবহৃত হয়।
  3. EMA21 চলমান গড়: মধ্য-মেয়াদী প্রবণতা বিচারের জন্য একটি রেফারেন্স লাইন হিসাবে ব্যবহৃত হয়।
  4. ট্রেডিং সিগন্যাল জেনারেশন: যখন দাম সাপোর্ট এবং রেজিস্ট্যান্স লেভেল ভেঙ্গে যায় এবং বলিঙ্গার ব্যান্ড সিগন্যাল ট্রিগার করে তখন ট্রেড করুন।

কৌশলগত সুবিধা

  1. বহুমাত্রিক নিশ্চিতকরণ: একাধিক প্রযুক্তিগত সূচক একত্রিত করে ট্রেডিং সিগন্যালের নির্ভরযোগ্যতা উন্নত করুন।
  2. গতিশীল অভিযোজন: বাজারের কাঠামো পরিবর্তনের সাথে সাথে সমর্থন এবং প্রতিরোধের স্তরগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করবে।
  3. ঝুঁকি ব্যবস্থাপনা: বলিঙ্গার ব্যান্ডগুলি অতিরিক্ত কেনা এবং বেশি বিক্রি হওয়া এলাকার স্পষ্ট সংজ্ঞা প্রদান করে।
  4. প্রবণতা নিশ্চিতকরণ: EMA21 চলমান গড় মধ্যমেয়াদী প্রবণতা দিক নিশ্চিত করতে সাহায্য করে।
  5. ভিজ্যুয়ালাইজেশন: কৌশলগুলি সহজ বিশ্লেষণ এবং অপ্টিমাইজেশনের জন্য স্পষ্ট ভিজ্যুয়াল প্রতিক্রিয়া প্রদান করে।

কৌশলগত ঝুঁকি

  1. অস্থির বাজারের ঝুঁকি: একটি অস্থির বাজারে অনেকগুলি মিথ্যা যুগান্তকারী সংকেত তৈরি হতে পারে।
  2. পিছিয়ে পড়ার ঝুঁকি: প্রযুক্তিগত সূচকগুলির গণনার একটি নির্দিষ্ট ব্যবধান রয়েছে এবং সেরা প্রবেশের সুযোগ মিস হতে পারে।
  3. পরামিতি সংবেদনশীলতা: কৌশল প্রভাব প্যারামিটার সেটিংসের জন্য আরও সংবেদনশীল এবং বিভিন্ন বাজার পরিবেশের জন্য অপ্টিমাইজ করা প্রয়োজন।
  4. মিথ্যা অগ্রগতির ঝুঁকি: সমর্থন এবং প্রতিরোধের স্তরে একটি অগ্রগতি একটি মিথ্যা অগ্রগতি হতে পারে এবং নিশ্চিতকরণের জন্য অন্যান্য সূচকের সহযোগিতা প্রয়োজন।

কৌশল অপ্টিমাইজেশনের দিকনির্দেশনা

  1. ট্রেডিং ভলিউম ইন্ডিকেটর প্রবর্তন করুন: সিগন্যালের নির্ভরযোগ্যতা উন্নত করতে ব্রেকথ্রু নিশ্চিতকরণের সময় ট্রেডিং ভলিউম বিশ্লেষণ যোগ করুন।
  2. পরামিতি অভিযোজন অপ্টিমাইজ করুন: বিভিন্ন বাজারের পরিবেশের সাথে কৌশলটিকে আরও ভালভাবে মানিয়ে নিতে একটি অভিযোজিত পরামিতি সামঞ্জস্য প্রক্রিয়া বিকাশ করুন।
  3. স্টপ-লস মেকানিজম যোগ করুন: রিট্রেসমেন্ট ঝুঁকি নিয়ন্ত্রণের জন্য আরও সম্পূর্ণ স্টপ-লস কৌশল ডিজাইন করুন।
  4. ট্রেন্ড ফিল্টারিং যোগ করুন: প্রবণতা শক্তি বিচার বাড়ান এবং দুর্বল প্রবণতা পরিবেশে ট্রেডিং এড়িয়ে চলুন।
  5. টাইম ফ্রেম অপ্টিমাইজেশান: বিভিন্ন সময় ফ্রেম সংমিশ্রণের প্রভাবগুলি অধ্যয়ন করুন এবং সর্বোত্তম কনফিগারেশন খুঁজুন।

সারসংক্ষেপ

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

কৌশল সোর্স কোড
//@version=5
strategy("Support Resistance & Bollinger & EMA21", overlay=true)

// Parámetros de S/R
prd = input.int(defval=10, title='Pivot Period', minval=4, maxval=30, group='Setup')
ppsrc = input.string(defval='High/Low', title='Source', options=['High/Low', 'Close/Open'], group='Setup')
maxnumpp = input.int(defval=20, title='Maximum Number of Pivot', minval=5, maxval=100, group='Setup')
ChannelW = input.int(defval=10, title='Maximum Channel Width %', minval=1, group='Setup')
maxnumsr = input.int(defval=5, title='Maximum Number of S/R', minval=1, maxval=10, group='Setup')
min_strength = input.int(defval=2, title='Minimum Strength', minval=1, maxval=10, group='Setup')
labelloc = input.int(defval=20, title='Label Location', group='Colors', tooltip='Positive numbers reference future bars, negative numbers reference historical bars')
linestyle = input.string(defval='Solid', title='Line Style', options=['Solid', 'Dotted', 'Dashed'], group='Colors')
linewidth = input.int(defval=2, title='Line Width', minval=2, maxval=2, group='Colors')
resistancecolor = input.color(defval=color.black, title='Resistance Color', group='Colors')
supportcolor = input.color(defval=color.black, title='Support Color', group='Colors')
showpp = input(false, title='Show Point Points')

// Parámetros de Bandas de Bollinger y EMA21
periodo_bollinger = input.int(title="Periodo de Bollinger", defval=20)
multiplicador_bollinger = input.float(title="Multiplicador de Bollinger", defval=2.0)
periodo_ema21 = input.int(title="Periodo EMA21", defval=21)

// Cálculo de las Bandas de Bollinger y EMA21
[middle, superior, inferior] = ta.bb(close, periodo_bollinger, multiplicador_bollinger)
ema21 = ta.ema(close, periodo_ema21)

// Ploteo de las Bandas de Bollinger y EMA21
plot(middle, color=color.rgb(60, 60, 60), linewidth=2, title="Media Móvil de Bollinger")
plot(superior, color=color.rgb(184, 11, 8), linewidth=2, title="Banda Superior")
plot(inferior, color=color.rgb(6, 124, 4), linewidth=2, title="Banda Inferior")
plot(ema21, color=color.rgb(6, 150, 240), linewidth=1, style=plot.style_circles, title="EMA21")

// Condiciones para señales de compra y venta
senal_compra = close <= inferior
senal_venta = close >= superior

// Mostrar señales en el gráfico
plotshape(senal_compra, title="Compra", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(senal_venta, title="Venta", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")

// Código de soporte y resistencia
float src1 = ppsrc == 'High/Low' ? high : math.max(close, open)
float src2 = ppsrc == 'High/Low' ? low : math.min(close, open)
float ph = ta.pivothigh(src1, prd, prd)
float pl = ta.pivotlow(src2, prd, prd)

plotshape(ph and showpp, text='H', style=shape.labeldown, color=na, textcolor=color.new(color.red, 0), location=location.abovebar, offset=-prd)
plotshape(pl and showpp, text='L', style=shape.labelup, color=na, textcolor=color.new(color.lime, 0), location=location.belowbar, offset=-prd)

// Calcular ancho máximo del canal S/R
prdhighest = ta.highest(300)
prdlowest = ta.lowest(300)
cwidth = (prdhighest - prdlowest) * ChannelW / 100

var pivotvals = array.new_float(0)

if ph or pl
    array.unshift(pivotvals, ph ? ph : pl)
    if array.size(pivotvals) > maxnumpp  // Limitar el tamaño del array
        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  // Ajusta al ancho máximo del canal?
            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)
                ret
            else
                ret := false
            break
    ret

// var sr_lines = array.new_line(11, na)
// var sr_labels = array.new_label(11, na)

// for x = 1 to 10 by 1
//     rate = 100 * (label.get_y(array.get(sr_labels, x)) - close) / close
//     label.set_text(array.get(sr_labels, x), text=str.tostring(label.get_y(array.get(sr_labels, x))) + '(' + str.tostring(rate, '#.##') + '%)')
//     label.set_x(array.get(sr_labels, x), x=bar_index + labelloc)
//     label.set_color(array.get(sr_labels, x), color=label.get_y(array.get(sr_labels, x)) >= close ? color.red : color.lime)
//     label.set_textcolor(array.get(sr_labels, x), textcolor=label.get_y(array.get(sr_labels, x)) >= close ? color.white : color.black)
//     label.set_style(array.get(sr_labels, x), style=label.get_y(array.get(sr_labels, x)) >= close ? label.style_label_down : label.style_label_up)
//     line.set_color(array.get(sr_lines, x), color=line.get_y1(array.get(sr_lines, x)) >= close ? resistancecolor : supportcolor)

if ph or pl
    // Debido a los nuevos cálculos, eliminar niveles S/R antiguos
    array.clear(sr_up_level)
    array.clear(sr_dn_level)
    array.clear(sr_strength)
    // Encontrar zonas S/R
    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)
            // Si la fuerza está en los primeros maxnumsr sr, entonces insértala en los arrays
            if loc < maxnumsr and strength >= min_strength
                array.insert(sr_strength, loc, strength)
                array.insert(sr_up_level, loc, hi)
                array.insert(sr_dn_level, loc, lo)
                // Mantener el tamaño de los arrays = 5
                if array.size(sr_strength) > maxnumsr
                    array.pop(sr_strength)
                    array.pop(sr_up_level)
                    array.pop(sr_dn_level)

    // for x = 1 to 10 by 1
    //     line.delete(array.get(sr_lines, x))
    //     label.delete(array.get(sr_labels, x))

    for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        rate = 100 * (mid - close) / close
        // array.set(sr_labels, x + 1, label.new(x=bar_index + labelloc, y=mid, text=str.tostring(mid) + '(' + str.tostring(rate, '#.##') + '%)', color=mid >= close ? color.red : color.lime, textcolor=mid >= close ? color.white : color.black, style=mid >= close ? label.style_label_down : label.style_label_up))
        // array.set(sr_lines, x + 1, line.new(x1=bar_index, y1=mid, x2=bar_index - 1, y2=mid, extend=extend.both, color=mid >= close ? resistancecolor : supportcolor, style=line.style_solid, width=2))

f_crossed_over() =>
    ret = false
    for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if close[1] <= mid and close > mid
            ret := true
    ret

f_crossed_under() =>
    ret = false
    for x = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
        float mid = math.round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if close[1] >= mid and close < mid
            ret := true
    ret

crossed_over = f_crossed_over()
crossed_under = f_crossed_under()
alertcondition(crossed_over, title='Resistance Broken', message='Resistance Broken')
alertcondition(crossed_under, title='Support Broken', message='Support Broken')
alertcondition(crossed_over or crossed_under, title='Support or Resistance Broken', message='Support or Resistance Broken')

// Estrategia de compra y venta basada en el cruce de niveles S/R
if (crossed_over and senal_compra)
    strategy.entry("Compra", strategy.long)

if (crossed_under and senal_venta)
    strategy.close("Compra")