Documentación

Aplicaciones

Última actualización el 10. 8. 2022 by Mark Fric

Modificación programática de la configuración de tareas

Nota importante: este ejemplo sólo funcionará en la compilación 136 o posterior.

En este artículo mostraremos cómo puede modificar la configuración de las tareas de su proyecto personalizado mediante programación, utilizando el fragmento de análisis personalizado.

La idea es crear un bucle en el flujo de trabajo personalizado del proyecto, y tener un fragmento de CA como una de las tareas, que cambie la configuración de otra(s) tarea(s) de compilación/recomprobación/optimización en el proyecto con cada bucle.

De esta forma puede, por ejemplo, volver a probar o reoptimizar las estrategias en un rango móvil de datos.

De nuevo implementaremos esto como un fragmento de CustomAnalysis, la implementación estará en procesarBancoDeDatos() método.

 

Cómo se ve en la interfaz de usuario

Vea a continuación la captura de pantalla de un proyecto sencillo: sólo consta de dos tareas:

  1. Tarea CustomAnalysis - ejecuta nuestro nuevo fragmento de CA que cambia el intervalo de fechas de la siguiente tarea 'Construir estrategias'.
  2. Construir tarea de estrategias - esta es la tarea cuyos ajustes son cambiados por nuestro fragmento CA

Esto es sólo un ejemplo primitivo, una demostración de lo que se puede hacer.

Este proyecto personalizado de ejemplo se adjunta a este artículo.

 

Ahora vamos a echar un vistazo a nuestro fragmento de Ca que lo hace.

 

Obtener proyecto y tarea(s)

Así obtendrá su proyecto actual y la(s) tarea(s) que desee:

public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) throws Exception {

    // obtener el proyecto actual
    SQProject sqProject = ProjectEngine.get(project);

    // obtener tarea por nombre
    ISQTask buildTask = sqProject.getTaskByName("Construir estrategias");
    if(buildTask == null) {
        throw new Exception("¡No existe tal tarea!");
    }
    // Alternativamente, puede utilizar sqProject.getTasks() para obtener una lista de todas las tareas
    // y recorrerlas hasta obtener la que desea

 

Obtener configuración de la tarea

Obtener la configuración actual de esta tarea es de nuevo sencillo - sólo tienes que llamar a getConfig() de la tarea:

// así es como se obtiene el XML de configuración de tareas de la nueva forma (SQ 136 up)
// Devuelve el elemento XML JDOM con la configuración completa de la tarea
Elemento elConfig = buildTask.getConfig();

// crea una nueva config clonandola - es importante hacer un clon,
// de lo contrario no se aplicará la nueva configuración
Elemento elNewConfig = elConfig.clone();

 

Tenga en cuenta que getConfig() devolverá un elemento JDOM que contiene el XML de la configuración de la tarea. Tendremos que clonarlo en un nuevo elemento para poder modificarlo.

La estructura XML de la tarea está fuera del alcance de este artículo, pero puede ver fácilmente la configuración XML de cada tarea cuando la guarda en .cfx o puede consultar /usuario/proyectos/su_proyecto/proyecto.cfx

El archivo .cfx es un archivo ZIP y puede abrirse normalmente con WinZip o WinRar.

Cuando lo abra, verá que contiene un archivo XML independiente para cada tarea del proyecto.

Puede Ver para ver la estructura exacta del XML de la tarea.

 

Cambiar algo en la configuración de la tarea

Depende de lo que quieras, puedes modificar cualquier cosa en el XML - siempre y cuando siga siendo una estructura XML válida para una tarea determinada.

En nuestro ejemplo obtendremos el primer elemento - que es donde se almacenan los ajustes de los símbolos para el backtest principal - y modificaremos sus fechas de - a.

// ahora cambia cualquier cosa en la nueva config
Element datos = XMLUtil.getChildElem(elNuevoConfig, "Datos");
Elemento setups = data.getChild("Setups");
Lista setupList = setups.getChildren("Setup");

if (setupList.size() > 0) {
    Elemento firstSetup = (Elemento) setupList.get(0);

    DateTimeFormatter formatter = DateTimeFormat.forPattern("aaaa.MM.dd");

    firstSetup.setAttribute("dateFrom", SQTime.formatDate(SQTime.toLong(2007, 1, 1), formatter));
    firstSetup.setAttribute("dateTo",SQTime.formatDate(SQTime.toLong(2017, 1, 1), formatter));
}

 

Alternativa de cambiar la configuración cargándola desde un archivo preparado

Hay otra manera de aplicar una configuración diferente a una tarea - primero puede prepararla como un archivo, y luego simplemente cargarlo a Element en nuestro snippet:

// alternativamente puedes cargar la nueva configuración de la tarea desde un fichero preparado
Elemento elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

 

Aplicar la configuración a una tarea

l último paso es aplicar la configuración a una tarea, esto se hace simplemente llamando a setConfig() método

// Aplicar la configuración modificada a la tarea
buildTask.setConfig(elNuevoConfig, true);

 

Esto aplicará la configuración modificada a una tarea determinada, que la utilizará.

Todo funcionará, el único problema es que este cambio se hace sólo en el fondo, no verá su cambio en la interfaz de usuario.

Si quieres verlo también en la interfaz de usuario, tienes que hacer un paso más para solicitar la actualización de la configuración del proyecto:

// esto notifica a la UI para cargar la configuración cambiada y aplicarla a la UI.
// Sin esto seguiría funcionando pero no se verían los cambios en la UI
JSONObject jsonData = new JSONObject().put("projectConfig", sqProject.toJSON());
DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData);
SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

 

 

Código completo del fragmento CAChangeTaskConfig:

paquete SQ.CustomAnalysis;

import com.strategyquant.lib.SQTime;
import com.strategyquant.lib.XMLUtil;
import com.strategyquant.lib.constants.SQConst;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
import com.strategyquant.tradinglib.ResultsGroup;
import com.strategyquant.tradinglib.project.ProjectEngine;
import com.strategyquant.tradinglib.project.SQProject;
import com.strategyquant.tradinglib.project.websocket.DataToSend;
import com.strategyquant.tradinglib.project.websocket.SQWebSocketManager;
import com.strategyquant.tradinglib.project.websocket.WebSocketConst;
import com.strategyquant.tradinglib.taskImpl.ISQTask;
import org.jdom2.Element;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.json.JSONObject;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class CAChangeTaskConfig extends CustomAnalysisMethod {

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------

    public CAChangeTaskConfig() {
        super("CAChangeTaskConfig", TYPE_PROCESS_DATABANK);
    }

    //------------------------------------------------------------------------

    @Override
    public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) throws Exception {

        // obtener el proyecto actual
        SQProject sqProject = ProjectEngine.get(project);

        // obtener tarea por nombre
        ISQTask buildTask = sqProject.getTaskByName("Construir estrategias");
        if(buildTask == null) {
            throw new Exception("¡No existe tal tarea!");
        }
        // también puede utilizar sqProject.getTasks() para obtener una lista de todas las tareas
        // y recorrerlas hasta obtener la que desea


        // así es como se obtiene el XML de configuración de tareas de la nueva forma (SQ 136 up)
        // Devuelve el elemento XML JDOM con la configuración completa de la tarea
        Elemento elConfig = buildTask.getConfig();
        // crea una nueva config clonandola - es importante hacer un clon,
        // de lo contrario la nueva configuración no se aplicará
        Elemento elNewConfig = elConfig.clone();

        // ahora cambia cualquier cosa en la nueva configuración
        Elemento data = XMLUtil.getChildElem(elNuevoConfig, "Data");
        Elemento setups = data.getChild("Setups");
        Lista setupList = setups.getChildren("Setup");

        if (setupList.size() > 0) {
            Elemento firstSetup = (Elemento) setupList.get(0);

            DateTimeFormatter formatter = DateTimeFormat.forPattern("aaaa.MM.dd");

            firstSetup.setAttribute("dateFrom", SQTime.formatDate(SQTime.toLong(2007, 1, 1), formatter));
            firstSetup.setAttribute("dateTo",SQTime.formatDate(SQTime.toLong(2017, 1, 1), formatter));
        }

        // alternativamente se puede cargar la nueva configuración de la tarea desde un fichero preparado
        //Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

        // Aplicar la configuración modificada a la tarea
        buildTask.setConfig(elNuevoConfig, true);

        // esto notifica a la UI que cargue la configuración modificada y la aplique a la UI.
        // Sin esto seguiría funcionando pero no se verían los cambios en la UI
        JSONObject jsonData = new JSONObject().put("projectConfig", sqProject.toJSON());
        DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData);
        SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

        return databankRG;
    }
}

 

 

 

 

 

 

 

 

 

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

Suscríbase a
Notificar a
1 Comentario
Más antiguo
Más reciente Más votados
Feedbacks de Inline
Ver todos los comentarios
Emmanuel
10. 8. 2022 13:26

Gracias, excelente idea.

Puestos relacionados