Estrategia de ruptura de SR


Fecha de creación: 2024-05-15 16:30:14 Última modificación: 2024-05-15 16:30:14
Copiar: 1 Número de Visitas: 568
1
Seguir
1617
Seguidores

Estrategia de ruptura de SR

Descripción general

SR Breakout Strategy es una estrategia de ruptura de soporte y resistencia desarrollada por LonesomeTheBlue basado en el indicador Breakout Finder. La idea principal de la estrategia es generar señales de venta o venta libre al determinar si el precio de cierre ha roto soporte o resistencia. La configuración predeterminada se basa en la línea K de 8 horas, pero tiene una configuración de parámetros más adecuada en la línea K de 4 horas.

Principio de estrategia

  1. Utiliza las funciones pivothigh y pivotlow para calcular los máximos y mínimos de los últimos períodos, respectivamente, y los almacena en una matriz.
  2. Determine si el precio de cierre actual está por encima de la resistencia, y si lo está, considere una ruptura de los pronósticos y genere una señal de pluralidad.
  3. Determine si el precio de cierre actual está por debajo del nivel de soporte, y si lo está, considere que se trata de una ruptura a la baja, lo que genera una señal de corto plazo.
  4. Una vez generada la señal de negociación, se calculan el precio de parada y el precio de parada de acuerdo con la proporción de parada y parada establecida, y se establecen las órdenes de parada y parada correspondientes.
  5. Se traza el intervalo de ruptura correspondiente según la dirección de la ruptura.

Ventajas estratégicas

  1. La ruptura de soporte por resistencia es una clásica estrategia de negociación con un cierto fundamento bélico.
  2. Se puede capturar con mayor precisión la situación de ruptura mediante el cálculo de la posición de soporte y la posición de resistencia utilizando las funciones pivothigh y pivotlow.
  3. La estructura del código de la estrategia es clara y se puede rastrear y optimizar fácilmente almacenando los puntos altos y bajos en una matriz.
  4. La configuración de stop loss y stop stop permite un mejor control del riesgo.

Riesgo estratégico

  1. Las estrategias de ruptura de la resistencia de soporte no funcionan bien en situaciones de agitación y son propensas a la aparición frecuente de breakouts falsos.
  2. La proporción fija de stop-loss puede no adaptarse a diferentes situaciones, lo que genera un desequilibrio de riesgo-beneficio.
  3. La estrategia solo tiene en cuenta el factor precio y no tiene en cuenta otros indicadores importantes como el volumen de transacciones, lo que podría perder algunas señales importantes.

Dirección de optimización de la estrategia

  1. Se puede considerar la introducción de más indicadores técnicos, como el volumen de tráfico, MACD, etc., para mejorar la precisión y la fiabilidad de la señal.
  2. Para el stop loss y el stop stop, se puede considerar el uso de stop loss móvil o stop stop ratio dinámico para adaptarse mejor a diferentes situaciones.
  3. Se puede considerar la introducción de condiciones de filtración, como filtros de tendencia, filtros de fluctuación, etc., para reducir los breakouts falsos en situaciones de crisis.
  4. Se puede considerar la optimización de la posición de soporte y resistencia, como el uso de ciclos de adaptación, la introducción de escalas de Fibonacci, etc.

Resumir

SR Breakout Strategy es una estrategia de negociación basada en la idea clásica de soporte y resistencia, que calcula los niveles de soporte y resistencia mediante el uso de las funciones pivothigh y pivotlow, y genera una señal de negociación al determinar si el precio de cierre rompe estas posiciones. La ventaja de esta estrategia es que la idea es clara, fácil de implementar y optimizar; pero también hay algunos riesgos, como el mal desempeño en situaciones de volatilidad y el riesgo que puede suponer una proporción de stop loss fija.

Código Fuente de la Estrategia
/*backtest
start: 2024-05-07 00:00:00
end: 2024-05-14 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue © chanu_lev10k

//@version=5
strategy('SR Breakout Strategy', overlay=true, max_bars_back=500, max_lines_count=400)
prd = input.int(defval=5, title='Period', minval=2)
bo_len = input.int(defval=71, title='Max Breakout Length', minval=30, maxval=300)
cwidthu = input.float(defval=3., title='Threshold Rate %', minval=1., maxval=10) / 100
mintest = input.int(defval=2, title='Minimum Number of Tests', minval=1)
bocolorup = input.color(defval=color.blue, title='Breakout Colors', inline='bocol')
bocolordown = input.color(defval=color.red, title='', inline='bocol')
// lstyle = input.string(defval=line.style_solid, title='Line Style')
issl = input.bool(title='SL', inline='linesl1', group='Stop Loss / Take Profit:', defval=false)
slpercent = input.float(title=', %', inline='linesl1', group='Stop Loss / Take Profit:', defval=18.0, minval=0.0, step=0.1)
istp = input.bool(title='TP', inline='linetp1', group='Stop Loss / Take Profit:', defval=false)
tppercent = input.float(title=', %', inline='linetp1', group='Stop Loss / Take Profit:', defval=18.0, minval=0.0, step=0.1)

//width
lll = math.max(math.min(bar_index, 300), 1)
float h_ = ta.highest(lll)
float l_ = ta.lowest(lll)
float chwidth = (h_ - l_) * cwidthu

// check if PH/PL
ph = ta.pivothigh(prd, prd)
pl = ta.pivotlow(prd, prd)

//keep Pivot Points and their locations in the arrays
var phval = array.new_float(0)
var phloc = array.new_int(0)
var plval = array.new_float(0)
var plloc = array.new_int(0)

// keep PH/PL levels and locations
if bool(ph)
    array.unshift(phval, ph)
    array.unshift(phloc, bar_index - prd)
    if array.size(phval) > 1  // cleanup old ones
        for x = array.size(phloc) - 1 to 1 by 1
            if bar_index - array.get(phloc, x) > bo_len
                array.pop(phloc)
                array.pop(phval)

if bool(pl)
    array.unshift(plval, pl)
    array.unshift(plloc, bar_index - prd)
    if array.size(plval) > 1  // cleanup old ones
        for x = array.size(plloc) - 1 to 1 by 1
            if bar_index - array.get(plloc, x) > bo_len
                array.pop(plloc)
                array.pop(plval)

// check bullish cup
float bomax = na
int bostart = bar_index
num = 0
hgst = ta.highest(prd)[1]
if array.size(phval) >= mintest and close > open and close > hgst
    bomax := array.get(phval, 0)
    xx = 0
    for x = 0 to array.size(phval) - 1 by 1
        if array.get(phval, x) >= close
            break
        xx := x
        bomax := math.max(bomax, array.get(phval, x))
        bomax
    if xx >= mintest and open <= bomax
        for x = 0 to xx by 1
            if array.get(phval, x) <= bomax and array.get(phval, x) >= bomax - chwidth
                num += 1
                bostart := array.get(phloc, x)
                bostart
        if num < mintest or hgst >= bomax
            bomax := na
            bomax

// if not na(bomax) and num >= mintest
//     line.new(x1=bar_index, y1=bomax, x2=bostart, y2=bomax, color=bocolorup)
//     line.new(x1=bar_index, y1=bomax - chwidth, x2=bostart, y2=bomax - chwidth, color=bocolorup)
//     line.new(x1=bostart, y1=bomax - chwidth, x2=bostart, y2=bomax, color=bocolorup)
//     line.new(x1=bar_index, y1=bomax - chwidth, x2=bar_index, y2=bomax, color=bocolorup)

plotshape(not na(bomax) and num >= mintest, location=location.belowbar, style=shape.triangleup, color=bocolorup, size=size.small)
//alertcondition(not na(bomax) and num >= mintest, title='Breakout', message='Breakout')

// check bearish cup
float bomin = na
bostart := bar_index
num1 = 0
lwst = ta.lowest(prd)[1]
if array.size(plval) >= mintest and close < open and close < lwst
    bomin := array.get(plval, 0)
    xx = 0
    for x = 0 to array.size(plval) - 1 by 1
        if array.get(plval, x) <= close
            break
        xx := x
        bomin := math.min(bomin, array.get(plval, x))
        bomin
    if xx >= mintest and open >= bomin
        for x = 0 to xx by 1
            if array.get(plval, x) >= bomin and array.get(plval, x) <= bomin + chwidth
                num1 += 1
                bostart := array.get(plloc, x)
                bostart
        if num1 < mintest or lwst <= bomin
            bomin := na
            bomin

// if not na(bomin) and num1 >= mintest
//     line.new(x1=bar_index, y1=bomin, x2=bostart, y2=bomin, color=bocolordown)
//     line.new(x1=bar_index, y1=bomin + chwidth, x2=bostart, y2=bomin + chwidth, color=bocolordown)
//     line.new(x1=bostart, y1=bomin + chwidth, x2=bostart, y2=bomin, color=bocolordown)
//     line.new(x1=bar_index, y1=bomin + chwidth, x2=bar_index, y2=bomin, color=bocolordown)

plotshape(not na(bomin) and num1 >= mintest, location=location.abovebar, style=shape.triangledown, color=bocolordown, size=size.small)

//alertcondition(not na(bomin) and num1 >= mintest, title='Breakdown', message='Breakdown')
//alertcondition(not na(bomax) and num >= mintest or not na(bomin) and num1 >= mintest, title='Breakout or Breakdown', message='Breakout or Breakdown')

// Long Short conditions
longCondition = not na(bomax) and num >= mintest
if longCondition
    strategy.entry('Long', strategy.long)
shortCondition = not na(bomin) and num1 >= mintest
if shortCondition
    strategy.entry('Short', strategy.short)

// Entry price / Take Profit / Stop Loss
//entryprice = strategy.position_avg_price
entryprice = ta.valuewhen(condition=longCondition or shortCondition, source=close, occurrence=0)
pm = longCondition ? 1 : shortCondition ? -1 : 1 / math.sign(strategy.position_size)
takeprofit = entryprice * (1 + pm * tppercent * 0.01)
stoploss = entryprice * (1 - pm * slpercent * 0.01)
strategy.exit(id='Exit Long', from_entry='Long', stop=issl ? stoploss : na, limit=istp ? takeprofit : na, alert_message='Exit Long')
strategy.exit(id='Exit Short', from_entry='Short', stop=issl ? stoploss : na, limit=istp ? takeprofit : na, alert_message='Exit Short')