Rendement / Max Drawdown (Max Intraday Drawdown ou Trade Drawdown)
Parfois, le Drawdown calculé ne reflète pas le Drawdown maximum que nous pourrions avoir et qui déclencherait un appel de marge. Je reçois de nombreuses stratégies avec un excellent ratio Ret/DD. Mais lorsque je regarde les stratégies, je peux voir que certaines d'entre elles ont un Max Intraday Drawdown (= Maximum Adverse Excursion) beaucoup plus important. Voir l'image.
Ce nouveau code choisit le plus grand Drawdown (Max Intraday Drawdown ou Trade Drawdown).
J'espère qu'il n'y a pas d'erreurs !
package SQ.Columns.Databanks ; import com.strategyquant.lib.* ; import com.strategyquant.datalib.* ; import com.strategyquant.tradinglib.* ; //créé par Fabien 17/12/2022 public class ProfitMaxDD extends DatabankColumn { public ProfitMaxDD() { super("Profit/MaxDD", DatabankColumn.Decimal2, // format d'affichage de la valeur ValueTypes.Maximize, // si la valeur doit être maximisée / minimisée / approchée d'une valeur 0, // valeur cible si l'approximation a été choisie 0, // minimum moyen de cette valeur 100) ; // moyenne du maximum de cette valeur setWidth(80) ; // largeur de colonne par défaut en pixels setTooltip("NetProfit/ Max Intraday or Trade DD Ratio") ; setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown") ; /* Si cette nouvelle colonne dépend d'autres colonnes qui doivent être calculées en premier, mettez-les ici. Assurez-vous de ne pas créer de dépendance circulaire, comme A dépend de B et B dépend de A. Les colonnes (=valeurs statistiques) sont identifiées par le nom de la 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)) ; } }
Merci Fabien !