Documentação
Aplicações
Última atualização em 10. 8. 2022 por Mark Fric
Mudança de tarefa de forma programática
Conteúdo da página
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:
- CustomAnalysis task - executa nosso novo snippet CA que muda a faixa de datas da próxima tarefa 'Construir estratégias'.
- 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
Obrigado! excelente idéia!