4. 1. 2023

5 4

Devolução / Max Drawdown (Max Intraday Drawdown ou Trade Drawdown)


Às vezes o Drawdown calculado não reflete o Drawdown máximo que poderíamos ter e que desencadearia uma chamada de margem. Eu recebo muitas estratégias com uma ótima relação Ret/DD. Mas quando olho para as estratégias, posso ver que algumas delas têm um Drawdown Máximo Intraday muito maior (= Maximum Adverse Excursion). Veja a figura.
Este novo código escolhe o maior Drawdown (Max Intraday Drawdown ou Trade Drawdown).

Espero que não haja erros!

pacote SQ.Colunas.Bancos de dados;

import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;

//criado por Fabien 17/12/2022

classe pública ProfitMaxDDD estende Banco de DadosColuna {
    
    lucro públicoMaxDD() {
        super("Lucro/MaxDD",
          Decimal2, // formato de exibição de valores
          ValorTipos.Maximizar, // se o valor deve ser maximizado / minimizado / aproximado a um valor
          0, // valor-alvo se a aproximação foi escolhida
          0, // mínimo médio deste valor
          100); // máximo médio deste valor
        
    setWidth(80); // largura da coluna padrão em pixels
    
        setTooltip("NetProfit/ Max Intraday ou Trade DD Ratio");
    setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown");
    /* Se esta nova coluna depende de algumas outras colunas que têm de ser computadas primeiro, coloque-as aqui.
       Certifique-se de não criar dependência circular, tal como A depende de B e B depende de A.
       As colunas (= valores de estatísticas) são identificadas pelo nome da classe)
    */
    //setDependências("DrawdownPct", "NumberOfTrades");
    }
  
  //------------------------------------------------------------------------


    @Override
    duplo cálculo público(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) lança Exceção {
    
    double netProfit = stats.getDouble("NetProfit");
    double maxIntradayDrawdown = stats.getDouble("MaxIntradayDrawdown");
    duplo DD = Math.abs(stats.getDouble("Drawdown"));
    duplo MaxDDD = Math.max(maxIntradayDrawdown, DD);

        retorno round2( SQUtils.safeDivide(netProfit, MaxDDD));
    }
}

 

4 Comentários
mais antigos
mais recentes Mais votado
Emmanuel
15. 1. 2023 8:57 am

Obrigado Fabien !

Angel Talavera
24. 8. 2024 9:20 am

Como posso saber a perda máxima diária de abertura de um sistema que poderia adaptar esse código?

Patrick Stettler
29. 4. 2025 9:49 pm

Obrigado por esse código, muito apreciado.

Ainda tenho dificuldades com o problema que Fabien descreveu acima. Tenho muitas estratégias excelentes com ótimos índices de Ret/DD. Mas, do ponto de vista da Execução Máxima Adversa (MAE), muitas delas são inúteis (já que as chamadas de margem teriam matado a estratégia).

A equipe da SQX pode incluir as métricas MAE/MFE nos filtros de classificação?

forthekingforex
26. 10. 2025 5:07 da manhã

Coloquei-o em meu sqx com o code dieter e compilei o código com êxito.
e abrir a coluna no banco de dados, mas por que todos os dados ProfitMaxDD mostram 0?
Alguém poderia ajudar? Muito obrigado