4. 1. 2023

5 4

Rentabilidad / Reducción máxima (Reducción máxima intradía o reducción por operación)


A veces el Drawdown calculado no refleja el Drawdown máximo que podríamos tener y que provocaría un margin call. Tengo muchas estrategias con gran relación Ret/DD. Pero cuando miro las estrategias puedo ver que algunas de ellas tienen un Max Intraday Drawdown mucho mayor (= Máxima Excursión Adversa). Ver imagen.
Este nuevo código elige el mayor Drawdown (Max Intraday Drawdown o Trade Drawdown).

Espero que no haya errores.

paquete SQ.Columns.Databanks;

import com.strategyquant.lib.*;
import com.strategyquant.datalib.*;
import com.strategyquant.tradinglib.*;

//creado por Fabien 17/12/2022

public class ProfitMaxDD extends DatabankColumna {
    
    public ProfitMaxDD() {
        super("Beneficio/MaxDD",
          DatabankColumn.Decimal2, // formato de visualización del valor
          ValueTypes.Maximize, // si el valor debe maximizarse / minimizarse / aproximarse a un valor
          0, // valor objetivo si se ha elegido la aproximación
          0, // mínimo medio de este valor
          100); // máximo medio de este valor
        
    setWidth(80); // ancho de columna por defecto en píxeles
    
        setTooltip("NetProfit/ Max Intraday o Trade DD Ratio");
    setDependencies("NetProfit", "MaxIntradayDrawdown", "Drawdown");
    /* Si esta nueva columna depende de otras columnas que tienen que calcularse primero, póngalas aquí.
       Asegúrese de no crear una dependencia circular, como A depende de B y B depende de A.
       Las columnas (=valores de estadísticas) se identifican por el nombre de la clase)
    */
    //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"));
    doble MaxDD = Math.max(maxIntradayDrawdown, DD);

        return round2( SQUtils.safeDivide(netProfit, MaxDD));
    }
}

 

4 Comentarios
Más antiguo
Más reciente Más votados
Emmanuel
15. 1. 2023 8:57 am

Gracias, Fabien.

Ángel Talavera
24. 8. 2024 9:20 am

¿Cómo puedo saber la pérdida máxima diaria abierta de un sistema que podría adaptar este código?

Patrick Stettler
29. 4. 2025 9:49 pm

Gracias por este código, muy apreciado.

Sigo luchando con el problema que Fabien describió anteriormente. Tengo muchas grandes estrategias con gran Ret / DD ratios. Pero desde un punto de vista de ejecución adversa máxima MAE muchos de ellos son inútiles (como llamadas de margen habría matado a la estrategia).

¿Podría el equipo SQX incluir las métricas MAE/MFE en los filtros de clasificación?

forthekingforex
26. 10. 2025 5:07 am

Lo pongo en mi sqx con code dieter,y compilo el codigo con exito.
y abrir la columna en el banco de datos, pero ¿por qué todos los datos ProfitMaxDD mostrar 0?
¿alguien me puede ayudar? muchas gracias