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));
}
}
Obrigado Fabien !
Como posso saber a perda máxima diária de abertura de um sistema que poderia adaptar esse código?
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?
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