Estrategia de seguimiento de oscilaciones de banda libre


Fecha de creación: 2024-02-04 10:28:24 Última modificación: 2024-02-04 10:28:24
Copiar: 0 Número de Visitas: 614
1
Seguir
1617
Seguidores

Estrategia de seguimiento de oscilaciones de banda libre

Descripción general

La idea principal de esta estrategia es calcular los puntos de parada para las líneas largas y cortas basándose en el indicador ATR, generando una señal de negociación cuando el precio rompe estas líneas de parada. Tiene funciones de seguimiento de tendencias y captura de shocks a la vez.

Principio de estrategia

La estrategia utiliza el índice ATR de N períodos ATR multiplicado por un factor para calcular la línea de parada de largo y largo a ambos lados. La fórmula de cálculo es la siguiente:

长线止损 = 最高价 - ATR * 系数
短线止损 = 最低价 + ATR * 系数

Cuando el precio sube, haga más para romper la línea de parada larga, y cuando el precio baje, haga más para romper la línea de parada corta. Después de hacer más, siga en tiempo real la fluctuación del precio para mover la línea de parada.

Este método, que utiliza la banda ATR como punto de parada, puede capturar adecuadamente la tendencia de los precios, siempre que se garantice el riesgo de parada. Cuando se produce una señal de ruptura significativa en los precios, se puede eliminar eficazmente la falsa ruptura.

Análisis de las ventajas

La mayor ventaja de esta estrategia es que se puede ajustar automáticamente el stop loss, capturar la tendencia de los precios y controlar el riesgo. Las ventajas específicas son las siguientes:

  1. La configuración de stop-loss flotante basada en el indicador ATR permite ajustar el stop-loss en función de la volatilidad del mercado y controlar eficazmente las pérdidas individuales.

  2. La señal se genera de manera penetrante, eliminando parte del ruido y evitando el repunte y el repunte.

  3. Ajuste de la línea de parada en tiempo real para seguir la fluctuación de los precios, evitar que la parada se relaje demasiado y bloquear más ganancias.

Análisis de riesgos

La estrategia también tiene algunos riesgos, que se centran principalmente en la configuración de los puntos de parada y la forma en que se generan las señales. Los puntos de riesgo específicos son los siguientes:

  1. El ciclo y el coeficiente incorrectos de ATR pueden causar pérdidas demasiado amplias o demasiado estrechas.

  2. La brecha de señales puede perder la oportunidad de una tendencia temprana.

  3. El seguimiento de pérdidas al final de la tendencia puede estar retrasado y no se puede salir perfectamente.

La respuesta consiste principalmente en ajustar los parámetros para que el stop loss sea más razonable, o ayudar a otros indicadores a juzgar las tendencias y señales.

Dirección de optimización

La estrategia puede seguir optimizándose en los siguientes aspectos:

  1. Establecer un segundo nivel de pérdidas para controlar aún más el riesgo.

  2. En combinación con otros indicadores para juzgar tendencias, mejorar la calidad de la señal.

  3. Añadir una estrategia de parada móvil para aumentar los beneficios si la tendencia continúa.

  4. Optimización de los parámetros ATR y de los ciclos y coeficientes para que el stop loss esté más cerca de las fluctuaciones reales de los precios.

Resumir

Esta estrategia es muy práctica en su conjunto, ya que permite ajustar automáticamente los puntos de parada para controlar eficazmente el riesgo, mientras que se obtiene una buena ganancia mediante el seguimiento de tendencias. Podemos optimizar y mejorar la estrategia aún más junto con otros métodos de análisis sobre la base original, para que sea más estable e inteligente.

Código Fuente de la Estrategia
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
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/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)

length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)

atr = mult * atr(length)

longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop) 
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red

longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)


long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")

start     = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish    = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")   
window()  => true

slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")

lastBuyPrice = strategy.position_avg_price

diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0

s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0

strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")

if long_short
    strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
    strategy.close("SHORT", when = window() and buySignal)
    strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
    strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
    strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")