এই কৌশলটি একটি মাল্টি-ইন্ডিক্টর ক্রসিং ট্রেডিং পদ্ধতির জন্য বলিংজার ব্যান্ড এবং ইএমএ 21 এর সাথে গতিশীল সমর্থন / প্রতিরোধের স্তরগুলিকে একত্রিত করে। এটি ট্রেডিং সিদ্ধান্ত নেওয়ার জন্য প্রযুক্তিগত সূচক ক্রসওভার ব্যবহার করার সময় মূল মূল্য স্তরের ব্রেকআউটগুলি সনাক্ত করে। কৌশলটি কেবলমাত্র বাজারের কাঠামোর গুরুত্বপূর্ণ সমর্থন / প্রতিরোধের স্তরগুলিকে গতিশীলভাবে সনাক্ত করে না, তবে বলিংজার ব্যান্ড এবং চলমান গড়ের সমন্বয়ের মাধ্যমে ট্রেডিং সংকেতগুলিও নিশ্চিত করে।
কৌশলটি বেশ কয়েকটি মূল উপাদানগুলির উপর ভিত্তি করেঃ ১. ডায়নামিক সাপোর্ট/রেসিস্ট্যান্স ক্যালকুলেশনঃ চ্যানেলের প্রস্থ এবং ন্যূনতম শক্তির প্রয়োজনীয়তার মাধ্যমে কার্যকর মূল্য অঞ্চলগুলি ফিল্টার করে বাজারের সাপোর্ট/রেসিস্ট্যান্স স্তরগুলিকে গতিশীলভাবে গণনা করার জন্য পিভট পয়েন্ট পদ্ধতি ব্যবহার করে। ২. বোলিংজার ব্যান্ডঃ মূল্যের অস্থিরতার পরিসীমা নির্ধারণের জন্য ২০ পেরিওড, ২টি স্ট্যান্ডার্ড ডিভিয়েশন বোলিংজার ব্যান্ড ব্যবহার করে। ৩. EMA21: মধ্যমেয়াদী প্রবণতা মূল্যায়নের জন্য রেফারেন্স লাইন হিসেবে কাজ করে। ৪. ট্রেড সিগন্যাল জেনারেশনঃ বোলিংজার ব্যান্ড সিগন্যাল একযোগে ট্রিগার করার সময় যখন দাম সমর্থন / প্রতিরোধের স্তরগুলি ভেঙে যায় তখন ট্রেডগুলি সম্পাদন করে।
এই কৌশলটি গতিশীল সমর্থন / প্রতিরোধ, বলিংজার ব্যান্ড এবং ইএমএ21 একত্রিত করে একটি অপেক্ষাকৃত সম্পূর্ণ ট্রেডিং সিস্টেম তৈরি করে। এর শক্তিগুলি বহু-মাত্রিক সংকেত নিশ্চিতকরণ এবং গতিশীল বাজারের অভিযোজন, প্যারামিটার অপ্টিমাইজেশান এবং মিথ্যা ব্রেকআউট ঝুঁকির চ্যালেঞ্জের মুখোমুখি হওয়ার সময়। ঝুঁকি নিয়ন্ত্রণ প্রক্রিয়াগুলির অবিচ্ছিন্ন অপ্টিমাইজেশন এবং উন্নতির মাধ্যমে, কৌশলটি প্রকৃত ট্রেডিংয়ে আরও ভাল পারফরম্যান্সের প্রতিশ্রুতি দেখায়।
//@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")