4. 1. 2023

5 1

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

 

S'abonner
Notification pour
1 Commentaire
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Emmanuel
15. 1. 2023 8:57 am

Merci Fabien !