Estratégia de stop-profit e stop-loss de momentum bidirecional


Data de criação: 2024-01-08 11:58:21 última modificação: 2024-01-08 11:58:21
cópia: 0 Cliques: 770
1
focar em
1617
Seguidores

Estratégia de stop-profit e stop-loss de momentum bidirecional

Visão geral

Esta estratégia é uma extensão da estratégia de alta/baixa contínua embutida no TradingView. Ela possui uma configuração de direção de estratégia flexível para negociação reversa. Ao mesmo tempo, integra várias formas de parada, como alto/baixo de oscilação, stop loss ATR e stop loss de rastreamento, e as correspondentes configurações de parada. Isso permite que a estratégia permaneça baseada nos sinais de negociação originais e obtenha uma melhor gestão de risco.

Princípio da estratégia

A estratégia é baseada na determinação do número de subidas e descidas de K-linhas para gerar os sinais de compra e venda. O usuário pode configurar o número de subidas e descidas de K-linhas necessárias para gerar o sinal de compra e o número de subidas e descidas de K-linhas necessárias para gerar o sinal de venda.

Ao mesmo tempo, a estratégia adicionou a configuração de inverter ou não a negociação. Depois de iniciar a negociação invertida, o sinal de compra original se transforma em sinal de venda, e o sinal de venda também se transforma em sinal de compra, completando assim a reversão da negociação.

Na entrada e saída, a estratégia apoia a posição direta inversa de equilíbrio, o que reduz a impossibilidade de negociar quando não há posições.

Em termos de stop loss e stop loss, a estratégia oferece três opções de stop loss para oscilando entre o high/low, o ATR e a estratégia embutida. O stop loss combina com a direção da posição, selecionando automaticamente o vale mais baixo ou o pico mais alto como ponto de stop radical, ou determinando o preço de stop loss de acordo com a dinâmica do ATR. A configuração de stop loss é baseada no preço de entrada da estratégia e define uma distância de parada de um múltiplo fixo.

Se o rastreamento de stop loss for ativado, a estratégia pode aumentar o intervalo de stop loss quando houver prejuízos e reduzir o intervalo de stop loss quando houver lucros, permitindo o rastreamento automático.

Análise de vantagens

A principal vantagem desta estratégia é a sua flexibilidade de configuração, que pode ser adaptada a diferentes condições de mercado.

  1. Parâmetros de filtragem de compra e venda configuráveis para se adaptar a tendências e situações de turbulência
  2. Apoio a transações reversíveis, com opções de direção conforme necessário
  3. A configuração de abertura de posição reversa direta reduz o período sem posição
  4. Integração de vários métodos de redução de prejuízos, conforme necessário
  5. Pérdida de rastreamento e parada automática

Análise de Riscos

Os principais riscos desta estratégia são o excesso de configuração de linhas K consecutivas, que podem levar a oportunidades de negociação perdidas, e o risco de expansão de perdas com configurações de parada muito radicais. As recomendações para riscos são as seguintes:

  1. Ajustar os parâmetros do número de linhas K para cima/para baixo, não pode ser muito radical
  2. Testar diferentes formas de parar e escolher o mais adequado
  3. O “tracking stop loss” deve ser configurado com cautela para evitar perdas excessivas.

Direção de otimização

A estratégia ainda tem espaço para ser melhorada:

  1. Número de linhas K ascendentes / descendentes que podem ser ajustadas dinamicamente com base em indicadores como ATR ou volatilidade
  2. É possível testar o efeito dos parâmetros da Stop Loss Ratio em diferentes períodos de posse
  3. Pode-se configurar o filtro Open para evitar falsas invasões
  4. Pode-se adicionar outros indicadores auxiliares para melhorar a qualidade do sinal

Resumir

Esta estratégia é uma extensão benéfica da estratégia de referência, permitindo um melhor controle do risco e uma forma mais flexível de negociar. É uma estratégia de Momentum eficaz que é fácil de otimizar e implementar.

Código-fonte da estratégia
/*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)