Documentação

Aplicações

Última atualização em 10. 8. 2022 por Mark Fric

Mudança de tarefa de forma programática

Nota importante - este exemplo só funcionará no Build 136 ou posterior

Neste artigo mostraremos como você pode modificar programticamente a configuração de tarefas em seu projeto personalizado, usando o trecho de Análise Personalizada.

A idéia é que você crie algum loop no fluxo de trabalho do projeto personalizado, e você terá um snippet CA como uma das tarefas, que muda as configurações de outra(s) tarefa(s) de construção/reteste/optimização no projeto com cada loop.

Desta forma, é possível, por exemplo, re-testar ou re-otimizar as estratégias de movimentação de dados.

Implementaremos isto novamente como um snippet da CustomAnalysis, a implementação estará em processDatabank() método.

 

Como fica na IU

Veja abaixo a captura de tela de um projeto simples - ele consiste de apenas duas tarefas:

  1. CustomAnalysis task - executa nosso novo snippet CA que muda a faixa de datas da próxima tarefa 'Construir estratégias'.
  2. Construir estratégias tarefa - esta é a tarefa cujas configurações são alteradas pelo nosso snippet CA

Este é apenas um exemplo primitivo - uma demonstração do que pode ser feito.

Este exemplo de projeto personalizado está anexado a este artigo.

 

Agora, vamos dar uma olhada em nosso trecho de Ca que o faz.

 

Obter projeto e tarefa(s)

É assim que você obtém seu projeto atual e a(s) tarefa(s) desejada(s):

public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) lança Exceção {

    // obter projeto atual
    SQProject sqProject = ProjectEngine.get(projeto);

    // obter tarefa pelo nome
    ISQTask buildTask = sqProject.getTaskByName("Construir estratégias");
    if(buildTask == nulo) {
        lançar nova Exceção ("Não existe tal tarefa!");
    }
    // alternativamente, você pode usar sqProject.getTasks() para obter uma lista de todas as tarefas
    // e passe por eles para conseguir aquele que você quer

 

Obtendo configuração da tarefa

Obter a configuração atual desta tarefa é novamente simples - basta ligar getConfig() método da tarefa:

// é assim que você obtém as configurações de tarefas XML da nova maneira (SQ 136 acima)
// Devolve o JDOM XML Element com configuração de tarefa completa
Element elConfig = buildTask.getConfig();

// criar uma nova configuração através da clonagem - é importante fazer um clone,
// caso contrário, sua nova configuração não será aplicada
Element elNewConfig = elConfig.clone();

 

Note que getConfig() irá retornar JDOM Elemento que contém XML da configuração da tarefa. Teremos que cloná-lo para um novo elemento a fim de modificá-lo.

A estrutura XML da tarefa está além do escopo deste artigo, mas você pode facilmente ver a configuração XML de cada tarefa quando você a salva para .cfx formato, ou você pode dar uma olhada em /usuário/projetos/seu_projeto/projeto.cfx

.cfx é um arquivo ZIP, e normalmente pode ser aberto usando WinZip ou WinRar.

Quando você o abre, verá que contém um arquivo XML separado para cada tarefa no projeto.

Você pode Ver para ver a estrutura exata da tarefa XML.

 

Mudando algo na configuração da tarefa

Depende do que você quiser, você pode modificar qualquer coisa no XML - desde que ainda seja uma estrutura XML válida para uma determinada tarefa.

Em nosso exemplo, vamos obter o primeiro elemento - que é onde as configurações do símbolo para o backtest principal são armazenadas - e modificar suas datas de - até as datas.

// agora mudar qualquer coisa na nova configuração
Elemento dados = XMLUtil.getChildElem(elNewConfig, "Dados");
Elemento setups = data.getChild("Setups");
Lista setupList = setups.getChildren("Setup");

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

    DateTimeFormatter = 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 de alterar a configuração carregando-a do arquivo preparado

Há outra maneira de aplicar uma configuração diferente a uma tarefa - você pode primeiro prepará-la como um arquivo e depois simplesmente carregá-la para a Element em nosso snippet:

// alternativamente, você pode carregar a nova configuração de tarefa a partir do arquivo preparado
Element elNewConfig = XMLUtil.fileToXmlElement(novo arquivo ("c:/BuildTask2009_2019.xml"));

 

Aplicando a configuração a uma tarefa

último passo é aplicar a configuração a uma tarefa, ela é feita simplesmente chamando setConfig() método

// Aplicar a configuração modificada à tarefa
buildTask.setConfig(elNewConfig, true);

 

Isto aplicará a configuração modificada a uma determinada tarefa, que então a utilizará.

Tudo funcionará, a única questão é que esta mudança é feita apenas em segundo plano, você não verá sua mudança na IU.

Se você quiser vê-lo também na IU, você tem que fazer uma etapa restante para solicitar a atualização da configuração do projeto:

// isto notifica a IU para carregar che mudou de configuração e aplicá-la à IU.
// Sem isto ainda funcionaria, mas você não verá as mudanças na IU
JSONObject jsonData = novo JSONObject().put("projectConfig", sqProject.toJSON());
DataToSend dataToSend = novo DataToSend(WebSocketConst.UpdateProject, jsonData);
SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

 

 

Código completo do snippet da CAChangeTaskConfig:

pacote SQ.CustomAnalysis;

import com.strategyquant.lib.SQTime;
importar com.strategyquant.lib.XMLUtil;
importar com.strategyquant.lib.constants.SQConst;
import com.strategyquant.tradinglib.CustomAnalysisMethod;
importar com.strategyquant.tradinglib.ResultsGroup;
importar com.strategyquant.tradinglib.project.projectEngine;
importar com.strategyquant.tradinglib.project.SQProject;
importar com.strategyquant.tradinglib.project.websocket.DataToSend;
importar com.strategyquant.tradinglib.project.websocket.SQWebSocketManager;
importar com.strategyquant.tradinglib.project.websocket.WebSocketConst;
import com.strategyquant.tradinglib.taskImpl.ISQTask;
import org.jdom2.Element;
importação org.joda.time.format.DateTimeFormat;
importação org.joda.time.format.DateTimeFormat;
importação org.json.JSONObject;

importação java.io.file;
importação java.util.ArrayList;
importar java.util.List;

classe pública CAChangeTaskConfig estende o método CustomAnalysisMethod {

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

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

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

    @Override
    public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) lança Exceção {

        // obter projeto atual
        SQProject sqProject = ProjectEngine.get(projeto);

        // obter tarefa pelo nome
        ISQTask buildTask = sqProject.getTaskByName("Construir estratégias");
        if(buildTask == nulo) {
            lançar nova Exceção ("Não existe tal tarefa!");
        }
        // alternativamente, você pode usar sqProject.getTasks() para obter uma lista de todas as tarefas
        // e passe por eles para conseguir aquele que você quer


        // é assim que você obtém as configurações de tarefas XML da nova maneira (SQ 136 acima)
        // Devolve o JDOM XML Element com configuração de tarefa completa
        Element elConfig = buildTask.getConfig();
        // criar uma nova configuração através da clonagem - é importante fazer um clone,
        // caso contrário, sua nova configuração não será aplicada
        Element elNewConfig = elConfig.clone();

        // agora mudar qualquer coisa na nova configuração
        Elemento dados = XMLUtil.getChildElem(elNewConfig, "Dados");
        Elemento setups = data.getChild("Setups");
        Lista setupList = setups.getChildren("Setup");

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

            DateTimeFormatter = 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)));
        }

        // alternativamente, você pode carregar a nova configuração de tarefa a partir do arquivo preparado
        //Element elNewConfig = XMLUtil.fileToXmlElement(new File("c:/BuildTask2009_2019.xml"));

        // Aplicar a configuração modificada à tarefa
        buildTask.setConfig(elNewConfig, true);

        // isto notifica a IU para carregar che mudou de configuração e aplicá-la à IU.
        // Sem isto ainda funcionaria, mas você não verá as mudanças na IU
        JSONObject jsonData = novo JSONObject().put("projectConfig", sqProject.toJSON());
        DataToSend dataToSend = novo DataToSend(WebSocketConst.UpdateProject, jsonData);
        SQWebSocketManager.addToDataQueue(dataToSend, SQConst.CODE_TASKMANAGER);

        banco de dados de retornoRG;
    }
}

 

 

 

 

 

 

 

 

 

Este artigo foi útil? O artigo foi útil O artigo não foi útil

Assine
Notificação de
1 Comentário
Mais antigo
Novidades Mais Votados
Feedbacks em linha
Ver todos os comentários
Emmanuel
10. 8. 2022 1:26 pm

Obrigado! excelente idéia!

Postos relacionados