Rendimento / Max Drawdown (Max Intraday Drawdown o Trade Drawdown)
A volte il Drawdown calcolato non riflette il Drawdown massimo che potremmo avere e che farebbe scattare una richiesta di margine. Ricevo molte strategie con un ottimo rapporto Ret/DD. Ma quando esamino le strategie, vedo che alcune di esse hanno un Drawdown massimo intraday molto più elevato (= massima escursione avversa). Vedere l'immagine.
Questo nuovo codice sceglie il Drawdown maggiore (Max Intraday Drawdown o Trade Drawdown).
Spero che non ci siano errori!
pacchetto SQ.Columns.Databanks; importare com.strategyquant.lib.*; importare com.strategyquant.datalib.*; importare com.strategyquant.tradinglib.*; //creato da Fabien 17/12/2022 public class ProfitMaxDD extends DatabankColumn { public ProfitMaxDD() { super("Profit/MaxDD", DatabankColumn.Decimal2, // formato di visualizzazione del valore ValueTypes.Maximize, // se il valore deve essere massimizzato / minimizzato / approssimato a un valore 0, // valore target se è stata scelta l'approssimazione 0, // minimo medio di questo valore 100); // massimo medio di questo valore setWidth(80); // larghezza predefinita della colonna in pixel setTooltip("NetProfit/ Max Intraday o Trade DD Ratio"); setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown"); /* Se questa nuova colonna dipende da altre colonne che devono essere calcolate prima, inserirle qui. Assicurarsi di non creare dipendenze circolari, come ad esempio A dipende da B e B dipende da A. Le colonne (=valori statistici) sono identificate dal nome della classe) */ //setDependencies("DrawdownPct", "NumberOfTrades"); } //------------------------------------------------------------------------ @Override public double compute(SQStats stats, StatsTypeCombination combination, OrdersList ordersList, SettingsMap settings, SQStats statsLong, SQStats statsShort) throws Exception { double netProfit = stats.getDouble("NetProfit"); double maxIntradayDrawdown = stats.getDouble("MaxIntradayDrawdown"); double DD = Math.abs(stats.getDouble("Drawdown")); double MaxDD = Math.max(maxIntradayDrawdown, DD); return round2( SQUtils.safeDivide(netProfit, MaxDD)); } }
Grazie Fabien!