Estrategia de stop-profit y stop-loss de dos vías


Fecha de creación: 2024-01-08 11:58:21 Última modificación: 2024-01-08 11:58:21
Copiar: 0 Número de Visitas: 770
1
Seguir
1617
Seguidores

Estrategia de stop-profit y stop-loss de dos vías

Descripción general

Esta estrategia es una extensión de la estrategia de subida / bajada continua que se basa en TradingView. Tiene una configuración de dirección de estrategia flexible para el comercio inverso. Al mismo tiempo, integra varios métodos de parada, como paradas de alto / bajo, paradas ATR y paradas de seguimiento, y la configuración de paradas correspondiente. Esto permite que la estrategia se base en la señal de negociación original y obtenga una mejor gestión de riesgo.

Principio de estrategia

La estrategia se basa en el número de subidas y bajadas consecutivas de las líneas K para generar señales de compra y venta. El usuario puede configurar el número de subidas y bajadas consecutivas de las líneas K necesarias para generar una señal de compra, así como el número de subidas y bajadas consecutivas de las líneas K necesarias para generar una señal de venta.

Al mismo tiempo, la estrategia añade la configuración de si se invierte la operación. Una vez iniciada la inversión, la señal de compra original se convierte en una señal de venta, y la señal de venta se convierte en una señal de compra, completando así la inversión de la operación.

La estrategia apoya la inversión directa a la posición cerrada en las entradas y salidas, lo que reduce la imposibilidad de negociar cuando no hay posiciones.

En cuanto a los paros y paradas, la estrategia ofrece tres opciones de paradas para mover los máximos / mínimos, el ATR y la estrategia interna. El parón se combina con la dirección de la posición, elige automáticamente el valle más bajo o el pico más alto como punto de parada radical o determina el precio de parada en función de la dinámica del ATR. La configuración de paradas se basa en el precio de entrada de la estrategia y establece una distancia de parada de un múltiplo fijo.

Si se activa el seguimiento de las paradas, la estrategia puede aumentar el intervalo de paradas en caso de pérdidas y reducir el intervalo de paradas en caso de ganancias para lograr un seguimiento automático.

Análisis de las ventajas

La mayor ventaja de esta estrategia es su flexibilidad para adaptarse a las diferentes condiciones del mercado. Las ventajas concretas son:

  1. Parámetros de selección de compra y venta ajustables para adaptarse a tendencias y fluctuaciones
  2. Apoya el comercio inverso, puede elegir la dirección según sea necesario
  3. La configuración de la apertura inversa directa puede reducir el período sin posición
  4. Integración de varios métodos de deterioro, que se pueden elegir según sea necesario
  5. Se puede activar el seguimiento de la pérdida, la pérdida automática

Análisis de riesgos

El principal riesgo de esta estrategia reside en que el exceso de la configuración de la línea K continua puede conducir a oportunidades de negociación perdidas, y el riesgo de que la configuración de stop loss demasiado radical conlleve a la expansión de las pérdidas. Las recomendaciones para el riesgo son las siguientes:

  1. Ajuste el parámetro de la cantidad de líneas K ascendentes / descendentes, no demasiado radical
  2. Prueba diferentes métodos para detener el daño y elige el más adecuado
  3. El seguimiento del stop loss se debe establecer con precaución para evitar pérdidas excesivas.

Dirección de optimización

La estrategia tiene espacio para ser optimizada aún más:

  1. El número de líneas K ascendentes / descendentes se puede ajustar dinámicamente en función de indicadores como ATR o volatilidad
  2. Se puede probar el efecto de los parámetros del Stop Loss Ratio en diferentes períodos de tenencia de la posición
  3. Se puede configurar el filtro de apertura para evitar falsos accesos
  4. Se pueden agregar otros indicadores auxiliares para mejorar la calidad de la señal

Resumir

Esta estrategia es una extensión beneficiosa de la estrategia de referencia, que permite un mejor control de los riesgos y una forma más flexible de negociar. Es una estrategia de Momentum eficaz que es fácil de optimizar y poner en práctica.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-07 00:00:00
end: 2023-08-30 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// Extension of the built-in strategy by Tradingview. The strategy buys after an X amount of
// consecutive bullish bars and viceversa for selling. This logic can be reversed and a Stop Loss
// with Take Profit can be added. There's also an option to adapt the SL into a Trailing Stop.

//@version=4
strategy("Consecutive Up/Down Strategy with Reverse", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

consecutiveBarsUp = input(3)
consecutiveBarsDown = input(4)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(5, step=.1, title="ATR Multiple")
i_TPRRR = input(5, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(true, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

price = close
ups = 0.0
ups := price > price[1] ? nz(ups[1]) + 1 : 0
dns = 0.0
dns := price < price[1] ? nz(dns[1]) + 1 : 0

BUY=ups >= consecutiveBarsUp and bar_index > 40
SELL=dns >= consecutiveBarsDown and bar_index > 40

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)
        



SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////


plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)