O recurso está a ser carregado... Carregamento...

A estratégia de curto prazo crossover SMA com controlo de retirada de pico e terminação automática

Autora:ChaoZhang, Data: 2024-07-29 14:16:58
Tags:SMA

img

Resumo

Esta estratégia é um sistema de negociação longo-curto que combina sinais de cruzamento de média móvel simples (SMA) com controle de pico de retirada. Ele usa o cruzamento de SMAs de 14 períodos e 28 períodos para gerar sinais de negociação longos e curtos enquanto monitora simultaneamente o pico de retirada da estratégia. Quando o drawdown excede um limiar pré-definido, a estratégia para automaticamente a negociação. Além disso, a estratégia inclui um recurso detalhado de análise de ciclo de pico a limite para ajudar os traders a entender melhor as características de risco da estratégia.

Princípio da estratégia

  1. Geração de sinais comerciais:

    • Um sinal longo é gerado quando a SMA de 14 períodos cruza acima da SMA de 28 períodos.
    • Um sinal curto é gerado quando a SMA de 14 períodos cruza abaixo da SMA de 28 períodos.
  2. Controle de extracção máxima:

    • O acompanhamento em tempo real da curva de participação da estratégia, registando os picos históricos.
    • Quando o património líquido corrente cai abaixo do pico, entra num estado de absorção, registando o ponto mais baixo (fogo).
    • A percentagem de aproveitamento é calculada como: (Pico - Trough) / Peak * 100%.
    • Se a percentagem de utilização exceder o limiar máximo de utilização pré-estabelecido, a estratégia cessa de abrir novas posições.
  3. Análise do ciclo de pico a pico:

    • Defina uma percentagem mínima de extracção para definir ciclos válidos de pico a fundo.
    • Para cada ciclo válido concluído, registar o número do ciclo, a percentagem de execução anterior, a percentagem de utilização e a hora de término.
    • A análise de exibição resulta num formato de tabela que facilita a revisão dos resultados históricos da estratégia.

Vantagens da estratégia

  1. Combina o seguimento de tendências e o controlo de riscos: A estratégia de cruzamento da SMA é um método clássico de seguimento de tendências, enquanto o controle de retirada de pico fornece uma camada adicional de gestão de risco.

  2. Alta adaptabilidade: Ao parametrizar os limiares máximos e mínimos de utilização, a estratégia pode ser adaptada de forma flexível aos diferentes ambientes de mercado e às preferências pessoais em matéria de risco.

  3. Indicadores de risco transparentes: A análise do ciclo de pico a fundo fornece informações históricas detalhadas sobre o aproveitamento, permitindo que os operadores entendam intuitivamente as características de risco da estratégia, ajudando a tomar decisões de negociação mais informadas.

  4. Controle automatizado dos riscos: Quando a retirada excede o limiar pré-estabelecido, a estratégia para automaticamente as negociações.

  5. Análise abrangente do desempenho: Além das métricas de backtesting convencionais, a estratégia fornece dados detalhados do pico ao mínimo do ciclo, incluindo percentagens de início, percentagens de retirada e informações sobre o tempo, facilitando uma análise aprofundada do desempenho da estratégia.

Riscos estratégicos

  1. Sobreconfiança em dados históricos: A estratégia de cruzamento da SMA baseia-se em dados históricos de preços e pode reagir lentamente em mercados em rápida mudança, levando a sinais falsos.

  2. Negociação frequente: Em mercados oscilantes, as SMAs podem cruzar-se com frequência, resultando em negociações excessivas e custos elevados de transação.

  3. Potencial de grandes saques: Apesar do controlo máximo da retirada, uma única grande queda durante a forte volatilidade do mercado pode ainda resultar em perdas significativas.

  4. Sensibilidade do parâmetro: O desempenho da estratégia é altamente dependente da escolha dos períodos de SMA e dos limiares de retirada.

  5. Oportunidades perdidas de reversão: Quando a negociação para após atingir o limiar máximo de retirada, a estratégia pode perder oportunidades trazidas por reversões de mercado.

Orientações para a otimização da estratégia

  1. Introduzir Ajuste de Parâmetros Dinâmicos: Considerar o ajustamento dinâmico dos períodos de SMA e dos limiares de retirada com base na volatilidade do mercado para se adaptarem aos diferentes ambientes de mercado.

  2. Filtros de mercado adicionais: Incorporar outros indicadores técnicos ou fatores fundamentais, tais como RSI ou volume, para filtrar potenciais sinais falsos.

  3. Implementar a entrada e saída por fases: Em vez de operações de "tudo ou nada", implementar a construção e o encerramento de posições em fases para reduzir o risco de decisões únicas.

  4. Adicionar Mecanismo de Aproveitamento: Além do controle de retirada, adicione uma função dinâmica de lucro para bloquear os lucros e melhorar os retornos globais.

  5. Optimize a gestão do dinheiro: Implementar um dimensionamento dinâmico das posições com base no tamanho da conta e na volatilidade do mercado para um melhor controlo dos riscos.

  6. Introduzir algoritmos de aprendizagem de máquina: Usar técnicas de aprendizagem de máquina para otimizar os processos de seleção de parâmetros e geração de sinais, melhorando a adaptabilidade e precisão da estratégia.

Conclusão

A estratégia de curto-longo cruzamento da SMA combinada com controle de pico e terminação automática é um sistema de negociação quantitativo que equilibra o seguimento da tendência e a gestão de riscos. Captura as tendências do mercado através de cruzamento de médias móveis simples, enquanto gerencia o risco de queda usando controle de pico. A característica única da estratégia reside em sua análise detalhada do ciclo pico a pico, fornecendo aos traders uma ferramenta para entender profundamente as características de risco da estratégia.

Embora a estratégia tenha alguns riscos inerentes, como a dependência excessiva de dados históricos e sensibilidade de parâmetros, ela pode melhorar significativamente sua robustez e lucratividade através de otimização e melhorias apropriadas.

Em geral, esta estratégia fornece aos traders um bom ponto de partida que pode ser personalizado e otimizado para atender aos objetivos individuais de negociação e preferências de risco.


/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

capital = 10000

//@version=5
strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100)

// The code below is from Tradingwhale LLC
/// ==============================================================================
//  Peak-Trough Cycles with Date and Prev. RunUp
// Initialize variables
showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?")
min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.")
maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.")

var float equityPeak = na
var float equityTrough = na
var int cycleCount = 0
var bool inDrawdown = false
var float initialCapital = capital
var float prevTrough = initialCapital
var float prevRunUp = na
var bool useLighterGray = true
var int lastYear = na

// Variable to indicate whether the strategy should end
var bool end_strategy = false

// Table to display data
var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1)

// Function to convert float to percentage string
f_to_percent(value) =>
    str.tostring(value, "#.##") + "%"

// Function to get month/year string without commas
get_month_year_string() =>
    str.tostring(year) + "/" + str.tostring(month)

// Update the table headers
if (bar_index == 0 and showTable)
    table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal)

// Track peaks and troughs in equity
if (na(equityPeak) or strategy.equity > equityPeak)
    if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle
        drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
        if drawdownPercentage > min_trough
            cycleCount += 1
            prevRunUp := (equityPeak - prevTrough) / prevTrough * 100
            if cycleCount <= 20 and showTable
                currentYear = year
                if na(lastYear) or currentYear != lastYear
                    useLighterGray := not useLighterGray
                    lastYear := currentYear
                rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50)
                table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal)
            prevTrough := equityTrough
    equityPeak := strategy.equity
    equityTrough := na
    inDrawdown := false
else if (strategy.equity < equityPeak)
    equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity)
    inDrawdown := true

// Calculate if the strategy should end
if not na(equityPeak) and not na(equityTrough)
    drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
    if drawdownPercentage >= maxdraw
        end_strategy := true


// This code below is from Tradingview, but with additions where commented (see below)

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Short Entry Id", strategy.short)



Relacionados

Mais.