Rendite / Max Drawdown (Max Intraday Drawdown oder Trade Drawdown)
Manchmal spiegelt der berechnete Drawdown nicht den maximalen Drawdown wider, den wir haben könnten und der einen Margin Call auslösen würde. Ich erhalte viele Strategien mit einem hervorragenden Ret/DD-Verhältnis. Aber wenn ich mir die Strategien ansehe, kann ich feststellen, dass einige von ihnen einen viel größeren maximalen Intraday-Drawdown (= maximale negative Abweichung) haben. Siehe Bild.
Dieser neue Code wählt den größeren Drawdown (Max Intraday Drawdown oder Trade Drawdown).
Ich hoffe, dass es keine Fehler gibt!
Paket SQ.Columns.Databanks; import com.strategyquant.lib.*; import com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; //erstellt von Fabien 17/12/2022 public class ProfitMaxDD extends DatabankColumn { public GewinnMaxDD() { super("Gewinn/MaxDD", DatabankColumn.Decimal2, // Format der Wertanzeige ValueTypes.Maximize, // ob Wert maximiert / minimiert / auf einen Wert angenähert werden soll 0, // Zielwert, falls Annäherung gewählt wurde 0, // durchschnittliches Minimum dieses Wertes 100); // durchschnittliches Maximum dieses Wertes setWidth(80); // Standardspaltenbreite in Pixel setTooltip("NetProfit/ Max Intraday oder Trade DD Ratio"); setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown"); /* Wenn diese neue Spalte von anderen Spalten abhängig ist, die zuerst berechnet werden müssen, fügen Sie sie hier ein. Achten Sie darauf, dass Sie keine zirkulären Abhängigkeiten erstellen, wie z.B. A hängt von B und B hängt von A ab. Spalten (=Statistikwerte) werden durch den Namen der Klasse identifiziert) */ //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)); } }
Vielen Dank, Fabien!