4. 1. 2023

5 1

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

 

Abbonarsi
Notificami
1 Commento
Il più vecchio
Più recente I più votati
Feedback in linea
Visualizza tutti i commenti
Emmanuel
15. 1. 2023 8:57

Grazie Fabien!