Estratégia de baixa-alta tendência

Autora:ChaoZhang, Data: 2023-11-23 11:03:18
Tags:

img

Resumo

Esta estratégia é projetada com base no princípio de mercado de comprar baixo e vender alto. Ele rastreia os preços mais altos e mais baixos durante um determinado período, estabelece uma posição longa quando o preço atravessa o preço mais baixo e fecha a posição quando o preço cai abaixo do preço mais alto ou a condição de lucro é atendida. Ao mesmo tempo, esta estratégia adiciona um filtro de tendência opcional que só permite comprar quando o preço está em uma tendência de alta.

Estratégia lógica

Cálculo do preço mais alto e mais baixo

  • Preço mais baixo (lowcriteria): Chamar a função ta.lowest para calcular o preço mais baixo durante o período de consulta definido pelo utilizador (default 20 bars) e traçar a linha de preço mais baixa.

  • Preço mais elevado (critérios mais elevados): a função ta.highest é chamada para calcular o preço mais elevado durante o período de observação definido pelo utilizador (10 barras por defeito) e traçar a linha de preço mais elevada.

Sinal de entrada

Quando o preço atual atravessa a linha de preço mais baixa, um sinal de compra é acionado para estabelecer uma posição longa.

Sinalização de saída

Dois métodos de saída são previstos para opção:

  1. Profitos fixos: fechar a posição para obter lucro quando o preço atingir o nível de lucro fixado (por exemplo, 8% acima do preço de entrada).

  2. Desagregação do preço mais alto: fechar a posição para reduzir as perdas quando o preço cair abaixo da linha de preço mais alta, julgando uma inversão de tendência.

Filtro de tendência

Adicionar uma linha EMA para determinar a direção da tendência. Permitir a compra apenas quando o preço está acima da linha EMA (uma tendência de alta).

Análise das vantagens

  • Adotar a estratégia clássica de comprar baixo e vender alto, alinhado com os fundamentos do mercado.

  • Adicionar o julgamento da tendência para evitar a abertura frequente durante as flutuações de preços.

  • Fornecer duas opções de saída para obter lucros elevados ou reduzir perdas.

  • Os parâmetros personalizáveis adaptam-se a mais ambientes de mercado.

  • Grande espaço para otimização da estratégia através de ajuste de parâmetros, design de filtros, etc.

Análise de riscos

  • O nível de lucro fixo não se ajusta em função dos movimentos reais do mercado, o que resulta numa obtenção prematura de lucro ou num objetivo de lucro insuficiente.

  • A venda à desagregação do preço mais elevado já pode gerar perdas enormes, incapaz de controlar efetivamente as perdas.

  • O julgamento da tendência da EMA refere-se apenas a um determinado período, possivelmente atrasado em relação à mudança de tendência real.

  • Os resultados dos testes anteriores não podem representar o futuro.

Orientações de otimização

  • Adicionar métodos de captação de lucro como trailing stop, saída parcial, etc. para ajustar dinamicamente o nível de captação de lucro.

  • Otimizar os sinais de saída, por exemplo, saídas parciais, acrescentando outros indicadores.

  • Melhorar o julgamento da tendência incorporando mais indicadores ou aprendizado de máquina.

  • Otimizar parâmetros por backtests mais extensos para encontrar conjuntos ideais.

  • Adicionar métodos de stop loss para controlar melhor as perdas.

Resumo

Esta estratégia geralmente aplica o clássico princípio de baixa compra alta venda e pode funcionar bem sob certas condições. Mas ainda há espaço para melhoria através de ajuste de parâmetros, otimização de saída, mecanismos de stop loss, etc. Este artigo fornece uma análise aprofundada sobre a lógica da estratégia, prós, contras e direções de otimização, com o objetivo de compartilhar a idéia da estratégia, bem como lembrar os investidores dos riscos e negociar com cautela com estratégias quantitativas.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
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/
// @version=5
// Author = TradeAutomation


strategy(title="Low-High-Trend Strategy", shorttitle="Low-High-Trend Strategy", process_orders_on_close=true, overlay=true, commission_type=strategy.commission.cash_per_order, commission_value=1, slippage=3, initial_capital = 25000, margin_long=50, margin_short=50, default_qty_type=strategy.percent_of_equity, default_qty_value=110)


// Backtest Date Range Inputs // 
StartTime = input(defval=timestamp('01 Jan 2000 05:00 +0000'), title='Start Time')
EndTime = input(defval=timestamp('01 Jan 2099 00:00 +0000'), title='End Time')
InDateRange = true

// Strategy Calculations //
lowcriteria = ta.lowest(close, input(20, "Lowest Price Lookback", tooltip="The strategy will BUY when the price crosses over the lowest it has been in the last X amount of bars"))[1]
highcriteria = ta.highest(close, input(10, "Highest Price Lookback", tooltip="If Take-Profit is not checked, the strategy will SELL when the price crosses under the highest it has been in the last X amount of bars"))[1]
plot(highcriteria, color=color.green)
plot(lowcriteria, color=color.red)

// Take Profit //
TakeProfitInput = input(true, "Sell with Take-Profit % intead of highest price cross?")
TakeProfit = ta.crossover(close,strategy.position_avg_price*(1+(.01*input.float(8, title="Take Profit %", step=.25))))

// Operational Functions //
TrendFilterInput = input(true, "Only buy when price is above EMA trend?")
ema = ta.ema(close, input(200, "EMA Length"))
TrendisLong = (close>ema)
plot(ema)

// Entry & Exit Functions//
if (InDateRange and TrendFilterInput==true)
    strategy.entry("Long", strategy.long, when = ta.crossover(close, lowcriteria) and TrendisLong)
if (InDateRange and TrendFilterInput==false)
    strategy.entry("Long", strategy.long, when = ta.crossover(close, lowcriteria))
if (InDateRange and TakeProfitInput==true)
    strategy.close("Long", when = TakeProfit)
if (InDateRange and TakeProfitInput==false)
    strategy.close("Long", when = ta.crossunder(close, highcriteria))
if (not InDateRange)
    strategy.close_all()
    

Mais.