Análise de desempenho de tempo Estratégia de otimização SuperTrend

ATR supertrend Profit Factor Winrate Performance Analytics Strategy Optimization
Data de criação: 2025-07-25 13:30:18 última modificação: 2025-07-25 13:30:18
cópia: 2 Cliques: 280
2
focar em
319
Seguidores

Análise de desempenho de tempo Estratégia de otimização SuperTrend Análise de desempenho de tempo Estratégia de otimização SuperTrend

Visão geral

A estratégia é um sistema de negociação baseado em indicadores SuperTrend, combinado com uma estrutura de análise de desempenho diária abrangente, capaz de rastrear e analisar o desempenho da estratégia em diferentes períodos de tempo. A estratégia gera sinais de negociação através do ATR e do indicador SuperTrend, além de uma ferramenta de análise de desempenho robusta, que permite a análise estatística do desempenho das negociações em diferentes dias de negociação por semana e por mês, fornecendo suporte à decisão baseada em dados para os comerciantes, ajudando a identificar os melhores momentos de negociação e a otimizar as estratégias de negociação.

Princípio da estratégia

O núcleo da estratégia é composto por duas partes: o mecanismo de geração de sinais de negociação e o sistema de análise de desempenho.

  1. Mecanismo de geração de sinais de negociação

    • Geração de sinais de entrada com base no indicador SuperTrend
    • O SuperTrend é um indicador de acompanhamento de tendências que combina o ATR com o cálculo de fatores personalizados
    • Acionamento de sinais de negociação quando o indicador SuperTrend muda de direção
    • Quando a direção é invertida para o lado negativo, execute várias operações
    • Executar a operação de vazio quando a direção passa de positivo para negativo
  2. Sistema de análise de desempenho

    • Criou uma estrutura de dados especial (DayStats) para registrar as estatísticas de cada dia de negociação
    • Indicadores de acompanhamento incluem: número de transações positivas/negativas, lucro bruto, perda bruta
    • Calcule os derivados: lucro líquido, fator de lucro, taxa de vitória
    • Indicadores de desempenho de sete dias por semana (de segunda a domingo)
    • Monitorar o desempenho das transações de 1 a 31 de cada mês
    • Apresentação de dados de desempenho através de tabelas de visualização, incluindo o estado de perda de identificação de cores diferentes

A estratégia utiliza as características de orientação a objetos do Pine Script para criar a classe DayStats para armazenar e atualizar as estatísticas de transação, permitindo uma gestão eficiente dos dados e computação. A função update_all_stats (()) atualiza as estatísticas relevantes no final de cada transação, garantindo que os dados de desempenho reflitam os resultados de transação mais recentes em tempo real.

Vantagens estratégicas

  1. Análise da dimensão temporal globalA vantagem mais notável da estratégia é a capacidade de analisar o desempenho das negociações em profundidade a partir da dimensão do tempo, ajudando os comerciantes a identificar quais dias ou dias da semana os melhores para a negociação, fornecendo uma base sólida de dados para a estratégia de filtragem de tempo.

  2. Apoio à tomada de decisões baseada em dadosAo estudar detalhadamente os indicadores-chave, como a taxa de ganho, perda e lucro líquido de cada dia de negociação, os comerciantes podem tomar decisões de negociação com base em dados objetivos e não em sentimentos subjetivos, reduzindo a interferência de fatores emocionais.

  3. Gestão de Riscos reforçadaAo identificar dias de negociação com um histórico de mau desempenho, os operadores podem optar por evitar a negociação ou ajustar o tamanho da posição nesses dias, reduzindo efetivamente o risco sistemático.

  4. Visualização de desempenhoA estratégia embutida no gráfico mostra o desempenho das negociações em diferentes períodos de tempo, usando diferentes cores para identificar a situação de perdas e perdas, permitindo que os comerciantes tenham uma visão clara do desempenho da estratégia.

  5. Alta customizaçãoA estratégia fornece vários parâmetros de entrada, incluindo o ciclo ATR, o fator SuperTrend, a posição da tabela e a configuração de cores, permitindo que o comerciante ajuste de acordo com as preferências pessoais e as características do mercado.

  6. Capacidade de integração flexívelO código da parte de análise de desempenho foi projetado para ser facilmente integrado em outras estratégias de negociação, aumentando a utilidade e a extensibilidade da estratégia.

Risco estratégico

  1. Risco de dados insuficientesA solução é garantir um ciclo de retorno suficientemente longo e obter mais amostras de transações para aumentar a confiabilidade estatística.

  2. Risco de sobreajusteO excesso de dependência do desempenho histórico em datas específicas pode levar a estratégias de superalimento de dados históricos, que falham quando as condições do mercado mudam no futuro. O comerciante deve usar a análise de tempo como um fator de referência, e não como a única base de decisão, e verificar periodicamente a estabilidade dos resultados da análise.

  3. Mecanismo de geração de sinaisO indicador SuperTrend pode gerar falsos sinais frequentes em mercados turbulentos, resultando em overtrading e perdas desnecessárias. Recomenda-se o uso em mercados de forte tendência ou em combinação com outros indicadores de confirmação para filtrar falsos sinais.

  4. Calcular o consumo de recursosCom o aumento do número de transações, a quantidade de dados que o sistema de análise de desempenho precisa armazenar e processar também aumenta, o que pode afetar a eficiência de operação da estratégia. Deve-se ter atenção ao uso de recursos em operações de retrospectiva ou de disco rígido.

  5. Influência dos fatores sazonaisAlguns mercados apresentam uma regularidade sazonal, e a análise simplesmente baseada em data semanal ou mensal pode ignorar os efeitos sazonais de períodos mais longos. Pode-se considerar o aumento da análise a nível trimestral ou anual para capturar padrões de períodos mais longos.

Direção de otimização da estratégia

  1. Análise de múltiplos quadros temporaisA estratégia atual analisa o desempenho em apenas um único período de tempo, mas pode ser ampliada para analisar o desempenho de transações em vários períodos de tempo, como a análise simultânea de diferenças de desempenho na linha diária, na linha de 4 horas e na linha de 1 hora, para obter uma visão mais abrangente da dimensão do tempo.

  2. Aumento da classificação de condições de mercadoA inclusão de classificações de condições de mercado na análise de desempenho, como o desempenho em mercados de tendência e mercados de turbulência, ou as diferenças entre ambientes de alta e baixa volatilidade, ajuda a descobrir as vantagens e desvantagens da estratégia em um determinado ambiente de mercado.

  3. Sistema de classificação de qualidade de sinalIntrodução de um mecanismo de classificação de qualidade do sinal, com base em fatores como a consistência dos indicadores técnicos, estrutura de preços, confirmação de volume de transação, e a inclusão de dimensões de qualidade do sinal na análise de desempenho, que ajudam a identificar as características de um sinal de alta qualidade.

  4. Optimização de parâmetros de adaptaçãoA estratégia pode ser adaptada a diferentes condições de mercado, aumentando a adaptabilidade e a robustez da estratégia.

  5. Integração dos dados do calendário económicoO objetivo é: integrar informações de eventos como a publicação de dados econômicos importantes e as decisões do banco central na análise de desempenho, estudar as leis do desempenho das transações antes e depois de um evento econômico específico e fornecer suporte a decisões baseadas em eventos para os comerciantes.

  6. Ampliação dos indicadores estatísticosA adição de mais indicadores estatísticos, como o máximo número de ganhos/perdas consecutivos, a taxa média de ganhos/perdas, a taxa de Sharpe, entre outros, fornece uma avaliação mais profunda do desempenho e ajuda os comerciantes a ter uma compreensão mais abrangente das características da estratégia.

  7. Identificação de padrões de aprendizado de máquinaIntrodução de algoritmos simples de aprendizagem de máquina que identificam automaticamente padrões e regularidades de tempo potenciais a partir de dados de desempenho histórico, prevendo o possível desempenho do dia de negociação futuro e fornecendo orientação prospectiva para decisões de negociação.

Resumir

A estratégia de otimização do SuperTrend é uma combinação inovadora de um sistema de negociação de rastreamento de tendências com uma análise de desempenho de dimensão temporal abrangente. A estratégia não apenas fornece sinais de negociação baseados em indicadores do SuperTrend, mas, mais importante, constrói uma estrutura de análise robusta capaz de avaliar sistematicamente as diferenças de desempenho da estratégia em diferentes períodos de tempo.

Ao rastrear detalhadamente os resultados de negociação em diferentes datas da semana e do mês, os comerciantes podem identificar padrões de tempo com vantagens estatísticas e otimizar estratégias de negociação de forma direcionada. O valor desta estrutura analítica não se limita apenas à estratégia SuperTrend atual, mas também pode ser facilmente integrada a outros sistemas de negociação, fornecendo uma visão de otimização da dimensão do tempo para todos os tipos de estratégias.

Esta abordagem orientada por dados eleva a negociação intuitiva ao nível da análise quantitativa, permitindo que os operadores tomem decisões mais racionais com base em dados estatísticos objetivos. O valor da estratégia será ainda maior à medida que a amostra de transações se acumule e a dimensão da análise se expanda, fornecendo aos operadores orientações de otimização de tempo cada vez mais precisas.

Código-fonte da estratégia
/*backtest
start: 2024-07-25 00:00:00
end: 2025-07-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("Daily Performance Analysis [Mr_Rakun]", overlay=true)

atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)

[st, direction] = ta.supertrend(factor, atrPeriod)

if ta.change(direction) < 0
    strategy.entry("My Long Entry Id", strategy.long)

if ta.change(direction) > 0
    strategy.entry("My Short Entry Id", strategy.short)

plot(st, title="SuperTrend", color=st < close ? color.green : color.red, linewidth=2)

//-------------------------------------------------------------
// Copy the rest of this line and add it to your own strategy.

// Daily Performance
type DayStats
    int wins = 0
    int losses = 0
    float gross_profit = 0.0
    float gross_loss = 0.0

update(DayStats ds, float profit) =>
    if profit > 0
        ds.wins += 1
        ds.gross_profit += profit
    else
        ds.losses += 1
        ds.gross_loss += math.abs(profit)

net_profit(DayStats ds) => ds.gross_profit - ds.gross_loss
profit_factor(DayStats ds) => ds.gross_loss > 0 ? ds.gross_profit / ds.gross_loss : na
winrate(DayStats ds) =>
    total = ds.wins + ds.losses
    total > 0 ? (ds.wins / total) * 100 : na

// ================== GLOBAL OBJECTS ==================

var DayStats monday    = DayStats.new()
var DayStats tuesday   = DayStats.new()
var DayStats wednesday = DayStats.new()
var DayStats thursday  = DayStats.new()
var DayStats friday    = DayStats.new()
var DayStats saturday  = DayStats.new()
var DayStats sunday    = DayStats.new()
var array<DayStats> monthStats = array.new<DayStats>()

// ================== UPDATE METHOD ==================
update_all_stats() =>
    if barstate.isfirst
        for i = 0 to 30
            array.push(monthStats, DayStats.new())

    if strategy.closedtrades > strategy.closedtrades[1]
        idx = strategy.closedtrades - 1
        profit = strategy.closedtrades.profit(idx)
        poz_time = strategy.closedtrades.entry_time(idx)
        dom = dayofmonth(poz_time)
        day = dayofweek(poz_time)

        DayStats day_stats = switch day
            dayofweek.sunday    => sunday
            dayofweek.monday    => monday
            dayofweek.tuesday   => tuesday
            dayofweek.wednesday => wednesday
            dayofweek.thursday  => thursday
            dayofweek.friday    => friday
            dayofweek.saturday  => saturday

        if na(day_stats) == false
            update(day_stats, profit)

        if dom >= 1 and dom <= 31
            DayStats mstats = array.get(monthStats, dom - 1)
            update(mstats, profit)
        day_stats

update_all_stats()

 
// Table positioning inputs
weekly_position = input.string("Top Center", "Weekly Table Position", 
     options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])
monthly_position = input.string("Top Right", "Monthly Table Position", 
     options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"])

// Color inputs
header_bg_color = input.color(color.gray, "Header Background Color")
profit_color = input.color(color.lime, "Profit Color")
loss_color = input.color(color.red, "Loss Color")
neutral_color = input.color(color.gray, "Neutral Color")
row_bg_color = input.color(color.new(color.gray, 60), "Row Background Color")

// Function to get table position
get_table_position(string pos) =>
    switch pos
        "Top Left" => position.top_left
        "Top Center" => position.top_center
        "Top Right" => position.top_right
        "Middle Left" => position.middle_left
        "Middle Center" => position.middle_center
        "Middle Right" => position.middle_right
        "Bottom Left" => position.bottom_left
        "Bottom Center" => position.bottom_center
        "Bottom Right" => position.bottom_right
        => position.top_center

// TABLE PRINTING 
draw_table_headers(table weekly, table monthly) =>
    table.cell(weekly, 0, 0, "DAY",          text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 1, 0, "W/L (Count)",  text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 2, 0, "NET PROFIT",   text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(weekly, 4, 0, "WINRATE",      text_color=color.white, text_size=size.small, bgcolor = header_bg_color)

    table.cell(monthly, 0, 0, "DAY",          text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 1, 0, "W/L (Count)",  text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 2, 0, "NET PROFIT",   text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 3, 0, "PROFIT FACTOR",text_color=color.white, text_size=size.small, bgcolor = header_bg_color)
    table.cell(monthly, 4, 0, "WINRATE",      text_color=color.white, text_size=size.small, bgcolor = header_bg_color)

fill_weekly_row(table tbl, int row, string day_name, DayStats ds) =>
    net_p = net_profit(ds)
    pf = profit_factor(ds)
    wr = winrate(ds)
    status_color = net_p > 0 ? profit_color: (net_p < 0 ? loss_color : neutral_color)

    table.cell(tbl, 0, row, day_name, text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)
    table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, text_size=size.small, bgcolor = row_bg_color)

fill_monthly_row(table tbl, int row, int day, DayStats ds) =>
    net_p = net_profit(ds)
    pf = profit_factor(ds)
    wr = winrate(ds)
    status_color = net_p > 0 ? profit_color : (net_p < 0 ? loss_color : neutral_color)

    table.cell(tbl, 0, row, str.tostring(day), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 1, row, str.tostring(ds.wins) + "/" + str.tostring(ds.losses), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 2, row, str.tostring(net_p, '#,###.##'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 3, row, str.tostring(pf, '0.00'), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)
    table.cell(tbl, 4, row, str.tostring(wr, format.percent), text_color=status_color, bgcolor=row_bg_color, text_size=size.tiny)

var table weekly_table = table.new(get_table_position(weekly_position), 5, 8)
var table monthly_table = table.new(get_table_position(monthly_position), 5, 32)

if barstate.isconfirmed
    draw_table_headers(weekly_table, monthly_table)

    fill_weekly_row(weekly_table, 1, "MON", monday)
    fill_weekly_row(weekly_table, 2, "TUE", tuesday)
    fill_weekly_row(weekly_table, 3, "WED", wednesday)
    fill_weekly_row(weekly_table, 4, "THU", thursday)
    fill_weekly_row(weekly_table, 5, "FRI", friday)
    fill_weekly_row(weekly_table, 6, "SAT", saturday)
    fill_weekly_row(weekly_table, 7, "SUN", sunday)

    for i = 0 to 30
        DayStats ms = array.get(monthStats, i)
        if ms.wins + ms.losses > 0
            fill_monthly_row(monthly_table, i + 1, i + 1, ms)