Documentación

Última actualización el 5. 5. 2015 por Mark Fric

Añadir nuevo valor estadístico

en este ejemplo ampliaremos Quant Analyzer y añadiremos un nuevo valor estadístico.

Todos los valores estadísticos como Número de operaciones, Beneficio neto, Rentabilidad / DD, Ratio de Sharpe, CAGR, etc. se implementan como fragmentos - un trozo de código Java que implementa alguna funcionalidad, en nuestro caso calculará un nuevo valor en el programa.
Esto significa que el programa puede ampliarse fácilmente con nuevos valores.

En este ejemplo crearemos un nuevo valor estadístico denominado Ratio V.
Se calcula como una relación entre la reducción máxima en dinero y el beneficio medio mensual.
Esencialmente expresa cuántos meses de media se tarda en recuperarse de la reducción máxima, cuanto mayor sea el valor, mejor.

Por ejemplo, si la reducción máxima es de $500 y el beneficio medio mensual es de $100, el coeficiente V se calcula como sigue
100/500 = 0.2

En este ejemplo mostraremos cómo hacerlo:

  • 1. Trabajar con QuantEditor donde podemos crear nuevos snippets
  • 2. Crear nuevo valor estadístico Ratio Vque se calculará para cada informe cargado en el programa
  • 3. Añada este valor a las columnas disponibles de la base de datos, para que también sea visible en la base de datos.
  • 4. Cree una nueva vista personalizada del banco de datos con la nueva columna
  • 5. Cree una plantilla personalizada de la vista general del analizador que muestre el nuevo valor.

 

1. Trabajar con QuantEditor

QuantEditor es un editor integrado para fragmentos que puede utilizar para crear/modificar nuevos fragmentos y consultar el código fuente de los existentes.

 

Puede iniciarse desde el programa utilizando el icono QuantEditor de la barra de herramientas.

 

2. Creación de un nuevo valor estadístico

Como primer paso tenemos que crear un nuevo fragmento que calculará nuestro valor V Ratio.

Así que iniciemos Quant Editor, vayamos a su panel Navegador y busquemos /extend/Snippets/StatsValues. Allí haga clic en StatsValues con el botón derecho del ratón y elija la acción New File.

 

 

Nombre del nuevo fragmento VRatioValue.

QE (QuantEditor) creará un nuevo fragmento con la estructura requerida del código y los métodos por defecto.
Ahora sólo tenemos que añadir el cómputo en el lugar correcto y guardar el valor.


Repasemos los métodos del fragmento uno por uno:

dependeDe()

este método nos permite establecer dependencia - si el valor que estamos tratando de calcular depende de algunos otros valores de estadísticas que tienen que ser calculados antes. Este es nuestro caso, necesitamos valores para la reducción máxima y el beneficio mensual medio calculados de antemano, así que los añadiremos a este método:

public String dependsOn() {
	return StatsConst.join(StatsConst.DRAWDOWN, StatsConst.AVG_PROFIT_BY_MONTH);
}

 

initCompute()

este método se llama al principio del cálculo estadístico.
Podemos usarlo para establecer valores iniciales de algunos parámetros, pero no lo necesitamos en nuestro caso, así que lo dejaremos vacío:

public void initCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {

}

 

calcularParaOrden()

este método se llama para cada pedido de la lista de pedidos.
Se puede usar si calculamos estadísticas a partir de órdenes, pero en nuestro caso simplemente hacemos ratio de dos valores ya precalculados, así que también lo dejaremos vacío:

public void computeForOrder(SQStats stats, StatsTypeCombination combination, SQOrder order, SQSettings settings) throws Exception {
}

 

endCompute()

este método se llama al final del cálculo, establece los valores calculados en el objeto SQStats que se utiliza en el programa.
Todas las acciones están comentadas y son fáciles de entender.

public void endCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) throws Exception {
// obtener los valores de drawdown y avg profit por mes que ya fueron calculados en sus propios snippets
double drawdown = stats.getDouble(StatsConst.DRAWDOWN);
double avgProfitByMonth = stats.getDouble(StatsConst.AVG_PROFIT_BY_MONTH);

// calcula el ratio V - estamos usando el método safeDivide() para evitar
// dividiendo por cero errores en caso de que el beneficio medio mensual sea 0
double vRatio = SQUtils.safeDivide(avgProfitByMonth, drawdown);

// añade el nuevo valor a las estadísticas.
// Cada valor debe tener su propia clave, nosotros la llamamos "VRatio".
// también redondeamos este valor a dos decimales
stats.set("VRatio", SQUtils.round2( vRatio ));
}

Eso es todo. Hemos creado un nuevo valor de estadísticas que se calculará para cada informe cargado.

Ahora golpea Compile y el nuevo fragmento debería compilarse sin ningún error.

 

3. Añade este nuevo valor a las columnas de la base de datos

hemos creado un nuevo valor VRatio, y se calcula para cada informe, pero aún no es visible en ninguna parte.

Si compruebas el banco de datos o la vista general, no lo verás porque aún no se ha añadido a las columnas del banco de datos.

Las columnas del banco de datos también son fragmentos, hay un fragmento para cada columna. Esto significa que es fácil añadir nuevas columnas personalizadas al banco de datos.

Así que de nuevo, en QE Navigator abre /extend/Snippets/DatabankColumns. Allí haga clic con el botón derecho del ratón y elija Nuevo Archivo, nómbrelo VRatio.

Este fragmento de columna VRatio por defecto creado, podemos volver a pasar por sus métodos.

VRatio()

este es un constructor de clase, aquí puede especificar el nombre de la columna que será visible en el encabezado del banco de datos, ts tooltip y ancho.

public VRatio() {
   super();

   setName(L.t("VRatio"));

   setTooltip(L.t("VRatio"));

   setWidth(60);

}

 

getValue()

que se utiliza para recuperar el valor de esta columna. En nuestro caso, el valor se almacena en SQStats,
así que primero tenemos que obtener el resultado, y de ahí obtener las estadísticas. Entonces podemos obtener el valor de VRatio de las estadísticas.

public Object getValue(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // obtener el resultado de la cartera
    SQResult resultado = strategyResults.getResult(SQConst.SYMBOL_PORTFOLIO);
    
    // obtener las estadísticas de la cartera y la combinación correcta de dirección, tipo de pl, tipo de muestra
    SQStats stats = result.getStats(direction, getCorrectPlType(plType), sampleType);
    if(stats==null) lanzar nueva StatsMissingException();
    
    // devuelve el valor
    return stats.getDouble("VRatio", 0);
 }

 

mostrarCadena()

que muestra la cadena en la celda del banco de datos. Obtiene el valor utilizando nuestra función getValue() y lo muestra con el formato adecuado.

public String displayString(SQResultsGroup strategyResults, String dataType, String direction, String sampleType, String plType) throws Exception {
    // recupera el valor usando el método getValue()
    Double value = (Double) getValue(strategyResults, dataType, direction, sampleType, plType);
    
    return twoDecimalFormat(value); // muestra el número con dos decimales
}

 

Ese es todo el snippet. Podemos compilarlo, debería compilar de nuevo sin ningún error.
Al hacer todo esto añadimos una nueva columna a las columnas disponibles que se pueden mostrar en el banco de datos.

 

4. Cree una vista personalizada del banco de datos con la nueva columna

En la parte anterior hemos creado una nueva columna. Para verla realmente en el banco de datos tenemos que crear una vista que contenga esta columna.
Los bancos de datos de Quant Analyzer son totalmente personalizables, puede utilizar Vistas para controlar qué columnas deben mostrarse.

Tenemos que crear una nueva vista que contendrá nuestra nueva columna VRatio. Haga clic en el botón Gestionar situado junto a las vistas del banco de datos. No podemos editar la vista por defecto, así que tenemos que crear una nueva. La forma más fácil de hacerlo es clonar la vista por defecto existente.

Haga clic en el botón Clon esto creará una nueva vista con las mismas columnas que la vista por defecto. Llamémosla "€œ".Por defecto + VRatio”. En las columnas disponibles encontrar nuestra nueva columna VRatio.

En la lista de la derecha, seleccione Beneficio neto (para añadir la nueva columna justo después de Beneficio neto) y haga clic en > botón.

Esto añadirá la columna a las columnas de esta vista. Ahora no olvides hacer clic en Guardar cambios para guardar de forma segura nuestra nueva vista. Luego podemos cerrar este diálogo.

Ahora cuando vuelvas a abrir las vistas verás la nueva vista que acabamos de definir y podremos seleccionarla.

Ahora cuando carguemos algunas estrategias veremos nuestro nuevo VRatio correctamente calculada y visualizada.

5. Cree una plantilla personalizada de la vista general del analizador que muestre el nuevo valor.

ahora podemos ver nuestro nuevo valor VRatio en el banco de datos, pero ¿qué pasa si queremos verlo también en la ventana Análisis -> Visión general?

Esto también es posible. Como muchas otras cosas, la pestaña Overview está controlada por snippets. Cada plantilla se implementa como un fragmento que renderiza su propio archivo HTML.
Así que cada plantilla Overview consiste en un fragmento + una plantilla de archivo HTML.

Tenemos tres posibilidades para mostrar el valor en la pestaña Resumen:

Editar un fragmento de Visión general existente (no recomendado)
podemos modificar uno de los fragmentos de Overview por defecto del sistema y hacer que muestre el valor VRatio en lugar de algún otro valor que no necesitemos.
No es recomendable, porque los fragmentos predeterminados del sistema pueden cambiar en una actualización y sus cambios se perderían.


Creación de un nuevo fragmento de descripción general que utilizará la plantilla existente
la segunda opción es crear un nuevo fragmento de Vista general, pero utilizar el archivo de plantilla HTML existente. Esto tiene la ventaja de que nuestro nuevo fragmento no será modificado por alguna actualización futura.
La desventaja es que como usaremos el archivo de plantilla HTML existente, no podemos añadir nuevos valores allí. Sólo podemos mostrar VRatio en lugar de algún otro valor.


Creación de un nuevo fragmento de resumen con una nueva plantilla
en esta opción haremos un nuevo snippet y una nueva plantilla de renderizado HTML. Aquí somos libres de hacer lo que queramos, incluso podemos usar HTML que muestre nuestro propio diseño personalizado.

En nuestro ejemplo optaremos por la segunda opción: crear un nuevo fragmento que utilice una plantilla HTML existente.

De nuevo en QuantEditor iremos a /extend/Snippets/Esquema general y crear un nuevo fragmento llamado DefaultPlusVRatio.
Esto creará un nuevo snippet que implementará una nueva plantilla para la pestaña Overview.

Explicaremos de nuevo sus métodos, pero antes de nada, tenemos que hacer un cambio. Como básicamente lo que queremos es crear una copia de la plantilla SQDefault, con sólo un valor reemplazado, tendremos que cambiar la clase padre de nuestro nuevo snippet de OverviewTemplate a SQDefault.

Esto significa que nuestro nuevo snippet utilizará todos los métodos de SQDefault y nosotros tendremos que implementar sólo lo que sea diferente.

Si no hiciéramos esto tendríamos que escribir el código para reemplazar todos los valores tal y como se hace en el snippet SQDefault.

Así que editaremos la línea

public class DefaultPlusVRatio extends OverviewTemplate {

a

public clase DefaultPlusVRatio extends SQDefault {

 

Ahora podemos ver el resto de los métodos.

 

RelaciónPlusPorDefecto()

este es el constructor de la clase, es llamado cuando se crea el snippet. Aquí debemos definir el nombre de la plantilla, la imagen de la captura de pantalla y el archivo HTML de la plantilla.

public DefaultPlusVRatio() {
setName("DefaultPlusVRatio");

// copiaremos los valores de abajo del snippet SQDefault, nuestro nuevo snippet usará la misma plantilla HTML
// Estos archivos se encuentran en /settings/plugins/OverviewTab
setScreenshotName("sqdefault_screenshot.jpg");
setHtmlTemplateName("sqdefault_template.htm");

 

dibujarValores()

es la función principal. Carga el archivo de plantilla HTML, reemplaza las constantes allí con etiquetas y valores adecuados y lo devuelve al programa.
En nuestro caso no necesitamos cambiarlo en absoluto.

public String drawValues(SQResultsGroup strategyResult, String symbol, StatsTypeCombination combination) throws Exception {
plantilla = loadTemplate();
replaceValues(estrategiaResultado, símbolo, combinación);

devolver plantilla;
}

 

replaceValues()

esta función se llama desde drawValues() y reemplaza las constantes en la plantilla HTML con valores calculados por el programa - se almacenan en result -> stats

public void replaceValues(SQResultsGroup strategyResult, String symbol, StatsTypeCombination combination) {
   SQStats stats = null;
   SQResult resultado = null;

// este primer pars obtiene los valores stats apropiados del resultado
// podemos utilizar el código por defecto para esto
if(estrategiaResultado!=null) {
      resultado = strategyResult.getResult(symbol);

      if(resultado!=nulo) {
         stats = result.getStats(combinación);
      }
   }

// aquí sustituimos la constante 3_2 por nuestro valor V Ratio
// si compruebas el snippet SQDefault verás que sustituye 3_2 por R Expectancy
// por lo que en nuestra plantilla mostraremos V Ratio en lugar de expectancy

   replace("3_2", "Relación V", stats==null ? NA : d2(stats.getDouble("VRatio"));

// al final tenemos que llamar al método replaceValues() de la clase padre (SQDefault)
// para sustituir todos los valores restantes
   super.replaceValues(estrategiaResultado, símbolo, combinación);
}

 

Esto es todo. Ahora compile este snippet y verá la nueva plantilla en Análisis -> Visión General.

Cuando cambie a ella, verá que ahora muestra el Ratio V en el lugar donde la plantilla estándar SQDefault muestra la Expectativa R.

 

Este es un ejemplo de como crear una nueva plantilla que muestre nuestro valor personalizado.

Si tiene más de un valor personalizado, podría valer la pena crear una copia de la plantilla HTML y modificarla para que tenga una línea más de valores.

Recuerda, puedes establecer tu propio archivo en el constructor del snippet en setHtmlTemplateName()
Los archivos de plantilla HTML utilizados en Overview snippets se encuentran en /settings/plugins/OverviewTab/

 

Eso es todo en este tutorial.
Hemos demostrado lo fácil que es ampliar QuantAnalyzer con nuevos valores personalizados y cómo mostrarlos en el banco de datos y en Overview.

 

¿Le ha resultado útil este artículo? El artículo era útil El artículo no era útil

Suscríbase a
Notificar a
0 Comentarios
Feedbacks de Inline
Ver todos los comentarios