Sokongan dan rintangan dinamik serta strategi silang berbilang penunjuk Bollinger Bands

SR BB EMA21 Pivot CROSS
Tarikh penciptaan: 2025-01-17 14:24:33 Akhirnya diubah suai: 2025-01-17 14:24:33
Salin: 1 Bilangan klik: 427
1
fokus pada
1617
Pengikut

Sokongan dan rintangan dinamik serta strategi silang berbilang penunjuk Bollinger Bands

Gambaran keseluruhan

Strategi ini ialah strategi dagangan silang berbilang penunjuk yang menggabungkan sokongan dan rintangan dinamik, Bollinger Bands dan purata bergerak EMA21. Strategi membuat keputusan perdagangan dengan mengenal pasti kejayaan tahap harga utama digabungkan dengan isyarat silang daripada penunjuk teknikal. Strategi ini bukan sahaja boleh mengenal pasti tahap sokongan dan rintangan penting dalam struktur pasaran secara dinamik, tetapi juga mengesahkan kebolehpercayaan isyarat dagangan melalui penyelarasan Bollinger Bands dan purata bergerak.

Prinsip Strategi

Strategi ini berdasarkan komponen teras berikut:

  1. Pengiraan sokongan dan rintangan dinamik: Gunakan kaedah titik pangsi untuk mengira tahap sokongan dan rintangan pasaran secara dinamik, dan tapis kawasan harga berkesan dengan menetapkan lebar saluran dan keperluan kekuatan minimum.
  2. Penunjuk Bollinger Band: Gunakan 20-tempoh, sisihan 2-standard Bollinger Band untuk menentukan julat turun naik harga.
  3. Purata bergerak EMA21: digunakan sebagai garis rujukan untuk pertimbangan arah aliran jangka sederhana.
  4. Penjanaan isyarat dagangan: Berdagang apabila harga menembusi tahap sokongan dan rintangan dan mencetuskan isyarat Bolin Band.

Kelebihan Strategik

  1. Pengesahan berbilang dimensi: Tingkatkan kebolehpercayaan isyarat dagangan dengan menggabungkan berbilang penunjuk teknikal.
  2. Penyesuaian Dinamik: Tahap sokongan dan rintangan akan diselaraskan secara automatik apabila struktur pasaran berubah.
  3. Pengurusan Risiko: Bollinger Bands memberikan definisi yang jelas tentang kawasan terlebih beli dan terlebih jual.
  4. Pengesahan arah aliran: Purata bergerak EMA21 membantu mengesahkan arah aliran jangka sederhana.
  5. Visualisasi: Strategi menyediakan maklum balas visual yang jelas untuk analisis dan pengoptimuman yang mudah.

Risiko Strategik

  1. Risiko pasaran yang tidak menentu: Terlalu banyak isyarat pemecahan palsu mungkin dijana dalam pasaran mendatar dan tidak menentu.
  2. Risiko ketinggalan: Pengiraan penunjuk teknikal mempunyai ketinggalan tertentu, dan anda mungkin terlepas peluang kemasukan terbaik.
  3. Kepekaan parameter: Keberkesanan strategi adalah sensitif kepada tetapan parameter dan perlu dioptimumkan untuk persekitaran pasaran yang berbeza.
  4. Risiko pecahan palsu: Penembusan tahap sokongan atau rintangan mungkin pecahan palsu dan memerlukan pengesahan daripada penunjuk lain.

Arah pengoptimuman strategi

  1. Memperkenalkan penunjuk volum: Tambahkan analisis volum apabila mengesahkan kejayaan untuk meningkatkan kebolehpercayaan isyarat.
  2. Optimumkan penyesuaian parameter: Membangunkan mekanisme pelarasan parameter penyesuaian untuk menjadikan strategi lebih baik menyesuaikan diri dengan persekitaran pasaran yang berbeza.
  3. Tambah mekanisme henti rugi: reka strategi henti rugi yang lebih lengkap untuk mengawal risiko pengeluaran.
  4. Tambah penapisan arah aliran: tingkatkan pertimbangan kekuatan arah aliran dan elakkan dagangan dalam persekitaran arah aliran yang lemah.
  5. Pengoptimuman rangka masa: Kaji kesan gabungan rangka masa yang berbeza untuk mencari konfigurasi optimum.

ringkaskan

Strategi ini membina sistem dagangan yang agak lengkap dengan menggabungkan sokongan dan rintangan dinamik, Bollinger Bands dan purata bergerak EMA21. Kelebihan strategi ini terletak pada pengesahan isyarat berbilang dimensi dan penyesuaian dinamik kepada perubahan pasaran, tetapi ia juga menghadapi risiko pengoptimuman parameter dan penemuan palsu. Dengan terus mengoptimumkan dan menambah baik mekanisme kawalan risiko, strategi ini dijangka mencapai prestasi yang lebih baik dalam urus niaga sebenar.

Kod sumber strategi
//@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")