Documentation

Applications

Dernière mise à jour le 10. 8. 2022 par Mark Fric

Modifier la configuration d'une tâche par programme

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 :

  1. 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".
  2. 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

S'abonner
Notification pour
1 Commentaire
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Emmanuel
10. 8. 2022 1:26 pm

Merci ! Excellente idée !

Postes connexes