Documentation
Applications
Dernière mise à jour le 10. 8. 2022 par Mark Fric
Modifier la configuration d'une tâche par programme
Contenu des pages
Note importante - cet exemple ne fonctionnera qu'avec la version 136 ou ultérieure.
Dans cet article, nous allons montrer comment vous pouvez modifier la configuration des tâches dans votre projet personnalisé de manière programmatique, en utilisant l'extrait d'analyse personnalisé.
L'idée est de créer une boucle dans le flux de travail d'un projet personnalisé, et d'avoir un extrait de CA comme l'une des tâches, qui modifie les paramètres d'une autre tâche de construction/retest/optimisation dans le projet à chaque boucle.
De cette façon, vous pouvez par exemple retester ou réoptimiser les stratégies sur des plages de données mobiles.
Nous allons à nouveau l'implémenter en tant que snippet CustomAnalysis, l'implémentation se fera dans le fichier processDatabank() méthode.
Présentation de l'interface utilisateur
Voir la capture d'écran d'un projet simple ci-dessous - il consiste en deux tâches seulement :
- Tâche CustomAnalysis - elle exécute notre nouveau snippet CA qui modifie la plage de dates de la prochaine tâche "Construire des stratégies".
- Build strategies task - il s'agit de la tâche dont les paramètres sont modifiés par notre extrait d'AC.
Il ne s'agit là que d'un exemple primitif - une démonstration de ce qui peut être fait.
Cet exemple de projet personnalisé est joint à cet article.
Nous allons maintenant jeter un coup d'œil à notre extrait de Ca qui le fait.
Obtenir le projet et les tâches
C'est ainsi que vous obtenez votre projet actuel et la ou les tâche(s) que vous souhaitez :
public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) throws Exception { // récupération du projet en cours SQProject sqProject = ProjectEngine.get(project) ; // Obtention d'une tâche par son nom ISQTask buildTask = sqProject.getTaskByName("Build strategies") ; if(buildTask == null) { throw new Exception("No such task exists !") ; } // vous pouvez également utiliser sqProject.getTasks() pour obtenir une liste de toutes les tâches // et les parcourir pour obtenir celle que vous voulez
Obtenir la configuration d'une tâche
Obtenir la configuration actuelle de cette tâche est à nouveau simple - il suffit d'appeler getConfig() de la tâche :
// voici comment obtenir le XML de configuration des tâches de la nouvelle manière (SQ 136 up) // Il renvoie un élément XML JDOM avec la configuration complète de la tâche Element elConfig = buildTask.getConfig() ; // créer une nouvelle configuration en la clonant - il est important de faire un clone, // sinon votre nouvelle configuration ne sera pas appliquée Elément elNewConfig = elConfig.clone() ;
Il convient de noter que getConfig() renverra un élément JDOM qui contient le XML de la configuration de la tâche. Nous devrons le cloner dans un nouvel élément afin de le modifier.
La structure XML des tâches dépasse le cadre de cet article, mais vous pouvez facilement voir la configuration XML de chaque tâche lorsque vous l'enregistrez dans .cfx ou vous pouvez jeter un coup d'œil à /utilisateur/projets/votre_projet/projet.cfx
Le fichier .cfx est une archive ZIP et peut être ouvert normalement à l'aide du logiciel WinZip ou WinRar.
Lorsque vous l'ouvrez, vous verrez qu'il contient un fichier XML distinct pour chaque tâche du projet.
Vous pouvez Voir pour voir la structure exacte du XML de la tâche.
Modifier quelque chose dans la configuration de la tâche
Cela dépend de ce que vous voulez, vous pouvez modifier n'importe quoi dans le XML - tant que la structure XML reste valide pour une tâche donnée.
Dans notre exemple, nous allons récupérer le premier élément - qui est l'endroit où les paramètres des symboles pour le backtest principal sont stockés - et modifier ses dates de - à.
// modifiez maintenant tout ce qui se trouve dans la nouvelle configuration Element data = XMLUtil.getChildElem(elNewConfig, "Data") ; Élément setups = data.getChild("Setups") ; Liste setupList = setups.getChildren("Setup") ; if (setupList.size() > 0) { Element firstSetup = (Element) setupList.get(0) ; DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd") ; firstSetup.setAttribute("dateFrom", SQTime.formatDate(SQTime.toLong(2007, 1, 1), formatter)) ; firstSetup.setAttribute("dateTo",SQTime.formatDate(SQTime.toLong(2017, 1, 1), formatter)) ; }
Alternative à la modification de la configuration en la chargeant à partir d'un fichier préparé
Il existe une autre façon d'appliquer une configuration différente à une tâche - vous pouvez d'abord la préparer sous forme de fichier, puis la charger dans Element comme dans notre extrait :
// vous pouvez également charger la nouvelle configuration de la tâche à partir d'un fichier préparé Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml")) ;
Appliquer la configuration à une tâche
a dernière étape consiste à appliquer la configuration à une tâche, en appelant simplement setConfig() méthode
// Appliquer la configuration modifiée à la tâche buildTask.setConfig(elNewConfig, true) ;
Cela permet d'appliquer la configuration modifiée à une tâche donnée, qui l'utilisera ensuite.
Tout fonctionnera, le seul problème est que ce changement est effectué uniquement en arrière-plan, vous ne verrez pas votre changement dans l'interface utilisateur.
Si vous voulez le voir également dans l'interface utilisateur, vous devez encore faire une demande de rafraîchissement de la configuration du projet :
// ceci notifie à l'interface utilisateur de charger la configuration modifiée et de l'appliquer à l'interface utilisateur. // Sans cela, cela fonctionnerait toujours mais vous ne verriez pas les changements dans l'interface utilisateur. JSONObject jsonData = new JSONObject().put("projectConfig", sqProject.toJSON()) ; DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData) ; SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER) ;
Code complet de l'extrait CAChangeTaskConfig :
package 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 { // récupération du projet en cours SQProject sqProject = ProjectEngine.get(project) ; // Obtention d'une tâche par son nom ISQTask buildTask = sqProject.getTaskByName("Build strategies") ; if(buildTask == null) { throw new Exception("No such task exists !") ; } // vous pouvez également utiliser sqProject.getTasks() pour obtenir une liste de toutes les tâches // et les parcourir pour obtenir celle que vous voulez // voici comment obtenir les paramètres XML des tâches de la nouvelle manière (SQ 136 up) // Il renvoie un élément XML JDOM avec la configuration complète de la tâche Element elConfig = buildTask.getConfig() ; // créer une nouvelle configuration en la clonant - il est important de faire un clone, // sinon votre nouvelle configuration ne sera pas appliquée Elément elNewConfig = elConfig.clone() ; // modifiez maintenant tout ce qui se trouve dans la nouvelle configuration Element data = XMLUtil.getChildElem(elNewConfig, "Data") ; Élément setups = data.getChild("Setups") ; Liste setupList = setups.getChildren("Setup") ; if (setupList.size() > 0) { Element firstSetup = (Element) setupList.get(0) ; DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd") ; firstSetup.setAttribute("dateFrom", SQTime.formatDate(SQTime.toLong(2007, 1, 1), formatter)) ; firstSetup.setAttribute("dateTo",SQTime.formatDate(SQTime.toLong(2017, 1, 1), formatter)) ; } // vous pouvez également charger la nouvelle configuration de la tâche à partir d'un fichier préparé //Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml")) ; // Appliquer la configuration modifiée à la tâche buildTask.setConfig(elNewConfig, true) ; // ceci notifie à l'interface utilisateur de charger la configuration modifiée et de l'appliquer à l'interface utilisateur. // Sans cela, cela fonctionnerait toujours mais vous ne verriez pas les changements dans l'interface utilisateur. JSONObject jsonData = new JSONObject().put("projectConfig", sqProject.toJSON()) ; DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData) ; SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER) ; return databankRG ; } }
Cet article a-t-il été utile ? L'article était utile L'article n'était pas utile
Merci ! Excellente idée !