Documentación
Aplicaciones
Última actualización el 10. 8. 2022 by Mark Fric
Modificación programática de la configuración de tareas
Contenido de la página
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:
- Tarea CustomAnalysis - ejecuta nuestro nuevo fragmento de CA que cambia el intervalo de fechas de la siguiente tarea 'Construir estrategias'.
- 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
Gracias, excelente idea.