Estratégia de rastreamento do impulso do preço Stop Loss

Autora:ChaoZhang, Data: 2023-11-27 11:45:04
Tags:

img

Resumo

Esta estratégia calcula o momento do preço para determinar a direção da tendência e define paradas bidirecionais de rastreamento para bloquear lucros, realizando stop loss seguindo a tendência.

Estratégia lógica

Ele calcula o momento do preço de 12 períodos e calcula ainda o momento do momento de 1 período. Quando o momento rápido (1 momento do momento do preço) é maior que 0, ele vai longo. Quando menor que 0, ele vai curto. Isso julga a mudança de direção do momento do preço para determinar a tendência do preço.

O nível de ativação significa que o trailing stop começa apenas após atingir uma certa taxa de lucro.

A estratégia bloqueia os lucros rastreando o preço mais alto ou o preço mais baixo, enviando ordens de fechamento quando o preço retira-se para além da distância de parada definida.

Análise das vantagens

  1. A determinação de impulso duplo julga com precisão a direção da tendência, reduz os negócios e evita ficar preso.

  2. A distância flexível de parada reduz o risco e bloqueia o lucro.

  3. O nível de ativação impede a perda prematura do stop, permitindo o trailing apenas após atingir um determinado objetivo de lucro.

  4. As paradas bidirecionais controlam de forma abrangente os riscos tanto para longs como para shorts.

  5. Cálculo simples e eficiente, fácil de compreender e implementar.

Análise de riscos

  1. O impulso duplo pode gerar sinais reversos, necessitando de um filtro de tendência.

  2. A distância de parada excessiva pode causar perdas significativas.

  3. Um nível de ativação elevado pode perder oportunidades de parada.

  4. São necessários mais testes de parâmetros e otimização para encontrar paradas ideais.

Pode reduzir sinais falsos através de julgamento de tendências e otimização de parâmetros.

Orientações de otimização

  1. Combinar o reconhecimento da estrutura de mercado para a tendência, evitando a negociação reversa.

  2. Adicionar mais condições de tempo como alterações de volume, apertar breakouts para melhorar a precisão do sinal.

  3. Otimizar os parâmetros testando diferentes distâncias de parada e níveis de ativação.

  4. Considere a parada de trail de rotação dinâmica em função da volatilidade do mercado.

  5. Estabelecer paradas parciais ou paradas em movimento para um melhor controlo do risco.

Conclusão

A estratégia possui uma estrutura clara, julgando a tendência com impulso duplo e bloqueando lucros com paradas flexíveis, controlando efetivamente os riscos de negociação. É fácil de entender e implementar, com espaço otimizável. Adicionar mais indicadores técnicos e testes de parâmetros pode melhorar ainda mais o desempenho da estratégia. A estratégia fornece idéias e referências para realizar o gerenciamento de stop loss.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trailing Stop Snippet", overlay=true)

length = input(12)
price = close
momentum(seria, length) =>
	mom = seria - seria[length]
	mom
mom0 = momentum(price, length)
mom1 = momentum( mom0, 1)

tsact = input.float(0.0, "Trailing Stop Activation |", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100
tsact := tsact ? tsact : na
ts = input.float(0.0, "Position Trailing Stop |", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100
ts := ts ? ts : na

in_long = strategy.position_size > 0
in_short = strategy.position_size < 0

var ts_ = array.new_float()
ts_size = array.size(ts_)
ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0

if in_long
    if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
    if not tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
if in_short
    if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    if not tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    
trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na

if (mom0 > 0 and mom1 > 0)
	strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE")
else
	strategy.cancel("MomLE")
if (mom0 < 0 and mom1 < 0)
	strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE")
else
	strategy.cancel("MomSE")

tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na
if trail    
    strategy.close_all()
if not strategy.opentrades
	array.clear(ts_)

//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

plotchar(ts_get, "GET", "")
plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross)
plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross)
plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)

Mais.