Estratégia de stop-loss baseada em diferenças de preços

Autora:ChaoZhang, Data: 2023-11-28 13:53:16
Tags:

img

Resumo

Esta estratégia adota o princípio da diferença de preço para ir longo quando o preço quebra baixas recentes, com ordens de stop loss e take profit para seguir o preço mais baixo para obter lucro.

Estratégia lógica

Ele identifica lacunas quando o preço quebra abaixo do preço mais baixo nas últimas N horas, vai longo com base em porcentagem configurada, com ordens de stop loss e take profit.

  1. Calcular o preço mais baixo nas últimas N horas como preço vinculativo
  2. Ir longo quando o preço em tempo real está abaixo do preço vinculativo * compra por cento
  3. Set take profit baseado no preço de entrada * percentagem de venda
  4. Preço de entrada - Preço de entrada * Percentagem de stop loss
  5. Tamanho da posição em percentagem do capital próprio da estratégia
  6. Linha de perda de parada de trilha com o menor preço
  7. Posições fechadas quando se desencadeia a tomada de lucro ou a suspensão da perda

Análise das vantagens

As vantagens desta estratégia:

  1. Utilizar o conceito de diferença de preços, melhorar a taxa de ganho
  2. Stop-loss automático para bloquear a maioria dos lucros
  3. Percentagem de stop loss e take profit personalizável para diferentes mercados
  4. Funciona bem para instrumentos com rebotes óbvios
  5. Lógica simples e fácil de implementar

Análise de riscos

Há também alguns riscos:

  1. A ruptura de brechas pode falhar com mínimos mais baixos
  2. Configurações inadequadas de stop loss ou take profit podem causar uma saída prematura
  3. Exigir ajustes periódicos dos parâmetros para as alterações do mercado
  4. Instrumentos limitados de aplicação, podem não funcionar para alguns
  5. Intervenção manual necessária ocasionalmente

Orientações de otimização

A estratégia pode ser melhorada nos seguintes aspectos:

  1. Adicionar modelos de aprendizagem de máquina para ajuste automático de parâmetros
  2. Adicionar mais tipos de ordens de stop loss/take profit, por exemplo, trailing stop loss, bracket orders
  3. Otimizar a lógica stop loss/take profit para saídas mais inteligentes
  4. Incorporar mais indicadores para filtrar sinais falsos
  5. Aumentar o número de instrumentos para melhorar a universalidade

Conclusão

Em conclusão, esta é uma estratégia de stop loss simples e eficaz baseada em lacunas de preço. reduz as entradas falsas e bloqueia os lucros de forma eficaz. Ainda há muito espaço para melhorias no ajuste de parâmetros e filtragem de sinal. Vale a pena mais pesquisa e refinamento.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



Mais.