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 !
Comment puis-je connaître la perte maximale journalière d'un système qui pourrait adapter ce code ?
Merci pour ce code, très apprécié.
Je suis toujours confronté au problème décrit par Fabien ci-dessus. J'obtiens beaucoup d'excellentes stratégies avec d'excellents ratios Ret/DD. Mais du point de vue du MAE (Maximum Adverse Execution), beaucoup d'entre elles sont inutiles (car les appels de marge auraient tué la stratégie).
L'équipe SQX peut-elle inclure les mesures MAE/MFE dans les filtres de classement ?
Je l'ai mis dans mon sqx avec code dieter, et j'ai compilé le code avec succès.
J'ai ouvert la colonne dans la banque de données, mais pourquoi toutes les données ProfitMaxDD affichent-elles 0 ?
Quelqu'un peut-il m'aider ? Merci beaucoup.