4. 1. 2023

5 2

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));
    }
}

 

Inscrever-se
Notificar de
2 Comentários
mais antigos
mais recentes Mais votado
Feedbacks embutidos
Ver todos os comentários
Emmanuel
15. 1. 2023 8:57 am

Obrigado Fabien !

Angel Talavera
24. 8. 2024 9:20 am

How can I know the maximum daily open loss of a system that could adapt this code?