Estratégias de saída de lucro com múltiplas porcentagens


Data de criação: 2023-12-01 15:22:29 última modificação: 2023-12-01 15:22:29
cópia: 0 Cliques: 639
1
focar em
1619
Seguidores

Estratégias de saída de lucro com múltiplas porcentagens

Visão geral

Esta estratégia permite a configuração de vários percentuais de stop loss exits. A estratégia julga primeiro as condições de comprimento e de curto, fazendo mais vazio. Em seguida, converte os percentuais em pontos de preço por meio de uma função percentAsPoints personalizada. O programa define 4 exits de acordo com a configuração de percentual de stop loss de 1%, 2%, 3% e 4%, além de definir uma saída de stop loss de 2%.

Princípio da estratégia

A estratégia é baseada no cruzamento dos espaços entre a linha média e a linha rápida. Concretamente, quando a linha rápida passa pela linha lenta (sma) acima da linha rápida (sma 14), a entrada é maior; quando a linha rápida passa pela linha lenta abaixo da linha rápida (sma 14) abaixo da linha lenta, a entrada é menor.

Então a questão é, como configurar um exito de parâmetros de percentual múltiplos? Aqui, uma função personalizada chamada percentAsPoints é usada para converter a porcentagem em pontos de preço, e a lógica é:

percentAsPoints(pcnt) => 
    strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)

A função obteve o número de pontos de preço usando a porcentagem multiplicada pelo preço médio da posição e dividido pelo preço mínimo de movimentação se a posição não for 0. Se a posição for 0, retornará na.

Com esta função, podemos facilmente converter o número de pontos percentuais. Então o programa segue a configuração de paradas de 1%, 2%, 3% e 4%, configurando 4 exits:

lossPnt = percentAsPoints(2)

strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)  

strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)

strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)

strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)  

Ao mesmo tempo, todas as saídas usam uma perda de parada de 2% geral. Isso permite o efeito de bloqueio de várias porcentagens.

Análise de vantagens

A estratégia de parar com várias percentagens tem as seguintes vantagens:

  1. A estratégia de fazer uma pausa no trabalho de acordo com o departamento, para evitar perder a oportunidade de ganhar mais dinheiro. Em geral, quanto mais você ficar para trás, maior será o risco. Esta estratégia pode equilibrar o risco com o lucro.

  2. O bloqueio de lotes pode devolver o capital, reduzindo o risco. Por exemplo, configurar 25% de lotes, quando o lucro atinge 1%, você pode recuperar o capital em 14, e as posições posteriores são operadas com lucro.

  3. Prevenção de perdas em situações anormais, uma perda de 2% pode evitar perdas enormes em situações extremas.

  4. O código é simples, claro, fácil de entender, fácil de modificar e otimizar. A função de configuração converte a porcentagem em pontos, e depois de algumas linhas de código, você pode definir várias pausas.

Análise de Riscos

A estratégia também traz alguns riscos:

  1. A parada percentual é propensa a oscilações horizontais, onde os preços oscilam de um lado para o outro perto do preço de parada. Isso frequentemente desencadeia a perda de parada, aumentando a frequência de negociação e a carga de taxas.

  2. O bloqueio de lotes aumenta o número de transações e aumenta a carga de comissões. Se as comissões forem muito altas, o bloqueio de lotes será compensado por uma parte dos lucros.

  3. A configuração inadequada do ponto de paragem também afeta a taxa de retorno. Se a configuração for muito conservadora, será difícil obter um retorno satisfatório; e se a configuração for muito radical, o risco será muito grande.

  4. A paragem de percentual fixo, sem levar em conta a volatilidade e a tendência do mercado. Em situações de turbulência, a paragem de paragem deve ser reduzida, e em situações de tendência, a paragem de paragem deve ser aumentada.

Direção de otimização

Considerando os riscos acima mencionados, pode-se continuar a otimizar em vários aspectos:

  1. Optimizar a estratégia de stop-loss, permitindo que ela se adapte automaticamente à volatilidade do mercado e à tendência. Por exemplo, adicionar um stop-loss ATR, apertar o stop-loss em um momento de turbulência e relaxar o stop-loss em uma tendência.

  2. Optimizar a proporção e a amplitude de bloqueio de lotes para obter a combinação ideal de risco e ganho. Adicionar a função de otimização de parâmetros para encontrar os parâmetros ideais.

  3. Reduzir o número de paradas e evitar transações muito frequentes. Por exemplo, configure uma zona de amortecimento de preços, só parando depois de exceder um certo margem.

  4. Considere o fator de comissões, quando o lucro de suspensão é esperado ser inferior ao custo de comissões. Ou otimizar o aumento de suspensão de acordo com a taxa de comissões.

  5. Utilize a lista de paradas de contabilidade. De acordo com a prioridade de profundidade, evite mover o preço de parada.

Resumir

Esta estratégia tem o efeito de vários percentuais de parada, com quatro saídas de parada de 1%, 2%, 3% e 4%, que podem ser fechadas por turno, enquanto a parada de 2% evita grandes perdas em situações anormais. Esta estratégia pode equilibrar o risco de ganhos e evitar a perda de oportunidades de lucro mais lucrativas.

Código-fonte da estratégia
/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 3h
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/
// © adolgov

//@version=4
strategy("Multiple %% profit exits example", overlay=false, default_qty_value = 10)

longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)

lossPnt = percentAsPoints(2)

strategy.exit("x1", qty_percent = 25, profit = percentAsPoints(1), loss = lossPnt)
strategy.exit("x2", qty_percent = 25, profit = percentAsPoints(2), loss = lossPnt)
strategy.exit("x3", qty_percent = 25, profit = percentAsPoints(3), loss = lossPnt)
strategy.exit("x4", profit = percentAsPoints(4), loss = lossPnt)

profitPercent(price) =>
    posSign = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
    (price - strategy.position_avg_price) / strategy.position_avg_price * posSign * 100

p1 = plot(profitPercent(high), style=plot.style_linebr, title = "open profit % upper bound")
p2 = plot(profitPercent(low), style=plot.style_linebr, title = "open profit % lower bound")
fill(p1, p2, color = color.red)