
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%.
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.
A estratégia de parar com várias percentagens tem as seguintes vantagens:
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.
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 1⁄4, e as posições posteriores são operadas com lucro.
Prevenção de perdas em situações anormais, uma perda de 2% pode evitar perdas enormes em situações extremas.
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.
A estratégia também traz alguns riscos:
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.
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.
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.
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.
Considerando os riscos acima mencionados, pode-se continuar a otimizar em vários aspectos:
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.
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.
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.
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.
Utilize a lista de paradas de contabilidade. De acordo com a prioridade de profundidade, evite mover o preço de parada.
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.
/*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)