Documentazione

Applicazioni

Ultimo aggiornamento il 10. 8. 2022 da Mark Fric

Modifica della configurazione dell'attività in modo programmatico

Nota importante: questo esempio funziona solo con la build 136 o successiva.

In questo articolo mostreremo come è possibile modificare la configurazione dei task nel progetto personalizzato in modo programmatico, utilizzando lo snippet Analisi personalizzata.

L'idea è quella di creare un ciclo nel flusso di lavoro di un progetto personalizzato e di avere uno snippet CA come uno dei task, che modifica le impostazioni di un altro task di compilazione/retest/ottimizzazione nel progetto a ogni ciclo.

In questo modo è possibile, ad esempio, testare nuovamente o riottimizzare le strategie su un intervallo di dati in movimento.

Lo implementeremo di nuovo come frammento di CustomAnalysis, l'implementazione sarà in elaboraBancaDati() metodo.

 

Come appare nell'interfaccia utente

Di seguito è riportata la schermata di un semplice progetto, composto da due soli compiti:

  1. Task CustomAnalysis: esegue il nostro nuovo snippet CA che cambia l'intervallo di date del prossimo task 'Build strategies'.
  2. Task strategie di costruzione: è il task le cui impostazioni sono modificate dal nostro snippet CA

Questo è solo un esempio primitivo, una dimostrazione di ciò che si può fare.

Questo progetto personalizzato di esempio è allegato a questo articolo.

 

Diamo ora un'occhiata al nostro snippet Ca che lo esegue.

 

Ottenere il progetto e i compiti

In questo modo si ottiene il progetto corrente e le attività desiderate:

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

    // ottenere il progetto corrente
    SQProject sqProject = ProjectEngine.get(project);

    // ottenere l'attività per nome
    ISQTask buildTask = sqProject.getTaskByName("Build strategies");
    if(buildTask == null) {
        lancia una nuova eccezione("Non esiste un task di questo tipo!");
    }
    // In alternativa, si può usare sqProject.getTasks() per ottenere un elenco di tutti i task
    // e scorrerli per ottenere quello che si desidera

 

Ottenere la configurazione dall'attività

Ottenere la configurazione corrente di questo task è ancora una volta semplice: è sufficiente chiamare getConfig() del metodo del compito:

// questo è il modo in cui si ottiene l'XML delle impostazioni dei task nel nuovo modo (SQ 136 up)
// Restituisce l'elemento XML JDOM con la configurazione completa dell'attività
Element elConfig = buildTask.getConfig();

// creare una nuova configurazione clonandola - è importante fare un clone,
// altrimenti la nuova configurazione non verrà applicata
Element elNewConfig = elConfig.clone();

 

Si noti che getConfig() restituirà l'elemento JDOM che contiene l'XML della configurazione dell'attività. Dovremo clonarlo in un nuovo elemento per poterlo modificare.

La struttura XML dei task va oltre lo scopo di questo articolo, ma si può facilmente vedere la configurazione XML di ogni task quando lo si salva in .cfx oppure si può dare un'occhiata a /user/projects/il_tuo_progetto/project.cfx

Il file .cfx è un archivio ZIP e può essere aperto normalmente utilizzando WinZip o WinRar.

Quando lo si apre, si vedrà che contiene un file XML separato per ogni attività del progetto.

È possibile Vista per vedere l'esatta struttura dell'XML del task.

 

Modificare qualcosa nella configurazione dell'attività

Dipende da ciò che si vuole, si può modificare qualsiasi cosa nell'XML, purché la struttura XML sia ancora valida per un determinato compito.

Nel nostro esempio prenderemo il primo elemento - dove sono memorizzate le impostazioni dei simboli per il backtest principale - e ne modificheremo le date da - a.

// ora cambiare qualsiasi cosa nella nuova configurazione
Element data = XMLUtil.getChildElem(elNewConfig, "Data");
Element setups = data.getChild("Setups");
List setupList = setups.getChildren("Setup");

se (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));
}

 

Alternativa per modificare la configurazione caricandola da un file preparato

C'è un altro modo per applicare una configurazione diversa a un task: si può prima prepararla come file e poi caricarla in Element nel nostro snippet:

// In alternativa, si può caricare la configurazione del nuovo task da un file preparato
Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

 

Applicazione della configurazione a un'attività

l'ultimo passo è l'applicazione della configurazione a un'attività, che avviene semplicemente chiamando setConfig() metodo

// Applicare la configurazione modificata al task
buildTask.setConfig(elNewConfig, true);

 

Questo applica la configurazione modificata a un determinato task, che la utilizzerà.

Funzionerà tutto, l'unico problema è che questa modifica viene effettuata solo in background, non si vedrà la modifica nell'interfaccia utente.

Se si desidera vederla anche nell'interfaccia utente, è necessario eseguire un ulteriore passaggio per richiedere l'aggiornamento della configurazione del progetto:

// questo notifica all'interfaccia utente il caricamento della configurazione modificata e la sua applicazione all'interfaccia utente.
// Senza questa funzione funzionerebbe comunque, ma non si vedrebbero le modifiche nell'interfaccia utente.
JSONObject jsonData = new JSONObject().put("projectConfig", sqProject.toJSON());
DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData);
SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

 

 

Codice completo dello snippet CAChangeTaskConfig:

pacchetto SQ.CustomAnalysis;

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

importare java.io.File;
importare java.util.ArrayList;
importare 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 {

        // ottenere il progetto corrente
        SQProject sqProject = ProjectEngine.get(project);

        // ottenere l'attività per nome
        ISQTask buildTask = sqProject.getTaskByName("Build strategies");
        if(buildTask == null) {
            lancia una nuova eccezione("Non esiste un task di questo tipo!");
        }
        // In alternativa, è possibile utilizzare sqProject.getTasks() per ottenere un elenco di tutti i task
        // e scorrerli per ottenere quello che si desidera


        // questo è il modo in cui si ottiene l'XML delle impostazioni delle attività nel nuovo modo (SQ 136 up)
        // Restituisce l'elemento XML JDOM con la configurazione completa dell'attività
        Element elConfig = buildTask.getConfig();
        // creare una nuova configurazione clonandola - è importante fare un clone,
        // altrimenti la nuova configurazione non verrà applicata
        Element elNewConfig = elConfig.clone();

        // ora cambiare qualsiasi cosa nella nuova configurazione
        Element data = XMLUtil.getChildElem(elNewConfig, "Data");
        Element setups = data.getChild("Setups");
        List setupList = setups.getChildren("Setup");

        se (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));
        }

        // in alternativa, è possibile caricare la configurazione del nuovo task da un file preparato
        //Elemento elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

        // Applicare la configurazione modificata all'attività
        buildTask.setConfig(elNewConfig, true);

        // questo notifica l'interfaccia utente per caricare la configurazione modificata e applicarla all'interfaccia utente.
        // Senza questa operazione funzionerebbe comunque, ma non si vedrebbero le modifiche nell'interfaccia utente.
        JSONObject jsonData = new JSONObject().put("projectConfig", sqProject.toJSON());
        DataToSend dataToSend = new DataToSend(WebSocketConst.UpdateProject, jsonData);
        SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

        restituire databankRG;
    }
}

 

 

 

 

 

 

 

 

 

Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile

Abbonarsi
Notificami
1 Commento
Il più vecchio
Più recente I più votati
Feedback in linea
Visualizza tutti i commenti
Emmanuel
10. 8. 2022 1:26 pm

Grazie! Ottima idea!

Messaggi correlati