Documentação
Aplicações
Última atualização em 21. 6. 2022 por Mark Fric
Carregamento de dados do histórico em trechos
Conteúdo da página
Notas importantes
- Este exemplo funcionará somente no SQ Build 136 Dev 2 ou posterior
- O carregamento de dados não funcionará para dados protegidos (SQ Futuros e SQ Equities), onde não estamos autorizados a dar acesso aos dados brutos aos usuários por contrato com o fornecedor de dados.
Este exemplo mostrará como você pode acessar os dados históricos programmaticamente a partir de seus trechos. Isto é útil se você quiser comparar, por exemplo, as ordens resultantes com algumas tendências em dados históricos.
Esta funcionalidade utiliza um novo HistoryDataLoader que está disponível apenas desde o SQ Build 136 Dev2.
Este exemplo é feito sob a forma de snippet de Análise Personalizada, mas você pode usar esta funcionalidade em qualquer snippet. Basta perceber que o carregamento dos dados pode ser lento, a chamada da função de carregamento pode levar vários segundos.
Portanto, não é aconselhável utilizá-la em trechos que são chamados com muita freqüência e devem ser rápidos, por exemplo, métricas de colunas de banco de dados.
Como usar o HistoryDataLoader para carregar dados
O uso é muito simples. A classe HistoryDataLoader tem apenas um método get(símbolo, cronograma, dataDe, dataPara, sessão).
Você só tem que chamá-lo com os parâmetros corretos e ele retornará o objeto HistóriaOHLCData com os dados solicitados.
tente { Log.info("Carregamento iniciado ..."); HistoryDataLoader loader = novo HistoryDataLoader(); HistoryOHLCData data = loader.get("EURUSD_M1", TimeframeManager.TF_H1, SQTime.toLong(2007,1, 1), SQTime.toLong(2020, 12, 31), Session.NoSession); catch(HistoryDataNotAvailableExeption e) } { Log.error("Erro no carregamento de dados", e); }
É importante cercar este método com try-catch, pois ele pode retornar HistoryDataNotAvailable exceção.
Acesso aos dados no objeto HistoryOHLCData
Os dados são devolvidos em HistóriaOHLCData objeto. É um objeto simples, onde os dados são armazenados em arrays primitivos que normalmente se pode passar.
Um exemplo:
// usamos isto para obter o comprimento dos dados int dataLength = data.Time.length; Log.info("Comprimento dos dados carregados: {}", dataLength); Log.info("Imprimindo os 5 primeiros registros: Índice, Tempo, Aberto, Alto, Baixo, Fechado"); // passar pelos dados for(int i=0; i<dataLength; i++) { longo tempo = dados. Tempo[i]; float open = data.Open[i]; flutuar alto = data.Alto[i]; bóia baixa = data.Low[i]; bóia fechada = data.Close[i]; volume da bóia = data.Volume[i]; se(i<5) { Log.info("#{} - {}, {}, {}, {}, {}", i, SQTime.toDateMinuteString(tempo), abrir, alto, baixo, fechar); } }
Você pode ver que o objeto de dados tem matrizes para Tempo, Aberto, Alto, Baixo, Fechado e Volume. Todas as arrays são do mesmo tamanho.
E é isso - muito simples.
Como obter símbolo e cronograma da estratégia
Uma coisa útil a fazer é recuperar símbolos, prazos e datas que vão desde o último backtest da estratégia (ResultadosGrupo objeto) para que você saiba quais dados carregar.
É igualmente simples, um exemplo:
/** * Exemplo de como recuperar o símbolo, TF e de data para data varia de estratégia. * Você pode então usá-lo posteriormente para carregar os dados do histórico. * @param resultadosGrupo */ vazio privado reconheceSymbolTFFromStrategyExample(ResultsGroup resultsGroup) { if(resultadosGrupo === nulo) { retornar; } tente { ConfiguraçõesConfiguraçõesMapa = resultadosGrupo.valores especiais(); String symbol = resultsGroup.mainResultado().getString(SpecialValues.Symbol, "N/A"); String tf = resultadosGroup.mainResult().getString(SpecialValues.Timeframe, "N/A"); long from = settings.getLong(SpecialValues.HistoryFrom); long to = settings.getLong(SpecialValues.HistoryTo); Log.info("\nExemplo - Estratégia última configuração do backtest: {} / {}, de: {}, até: {}", símbolo, tf, SQTime.toDateString(from), SQTime.toDateString(to)); catch(Exceção e) {} catch(Exceção e) { Log.error("Exceção", e); } }
Você pode então usar estes valores no método HistoryDataLoader.get() para recuperar exatamente os dados que foram usados no backtest de estratégia.
Código completo de LoadHistoryData exemplo de snippet
pacote SQ.CustomAnalysis; import com.strategyquant.lib.*; importação java.util.ArrayList; import com.strategyquant.tradinglib.results.SpecialValues; importação org.slf4j.Logger; importação org.slf4j.LoggerFactory; import com.strategyquant.datalib.*; import com.strategyquant.tradinglib.*; import com.strategyquant.datalib.session.*; classe pública LoadHistoryData estende o CustomAnalysisMethod { //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ dados da história pública LoadHistoryData() { super("LoadHistoryData", TYPE_PROCESS_DATABANK); } //------------------------------------------------------------------------ @Override filtro booleano públicoEstratégia (projeto String, tarefa String, banco de dados StringName, ResultsGroup rg) lança Exceção { retornar verdadeiro; } //------------------------------------------------------------------------ @Override public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) lança Exceção { // exemplo simples de uso do HistoryDataLoader para carregar dados históricos para determinado símbolo e período de tempo tente { HistoryDataLoader loader = novo HistoryDataLoader(); Log.info("Carregamento iniciado ..."); HistoryOHLCData data = loader.get("EURUSD_M1", TimeframeManager.TF_H1, SQTime.toLong(2007,1, 1), SQTime.toLong(2020, 12, 31), Session.NoSession); // usamos isto para obter o comprimento dos dados int dataLength = data.Time.length; Log.info("Comprimento dos dados carregados: {}", dataLength); Log.info("Imprimindo os 5 primeiros registros: Índice, Tempo, Aberto, Alto, Baixo, Fechado"); // passar pelos dados for(int i=0; i<dataLength; i++) { longo tempo = dados. Tempo[i]; float open = data.Open[i]; flutuar alto = data.Alto[i]; bóia baixa = data.Low[i]; bóia fechada = data.Close[i]; volume da bóia = data.Volume[i]; se(i 0) { reconheçaSymbolTFFromStrategyExample(databankRG.get(0)); } banco de dados de retornoRG; } //------------------------------------------------------------------------ /** * Exemplo de como recuperar o símbolo, TF e de data para data varia de estratégia. * Você pode então usá-lo posteriormente para carregar os dados do histórico. * @param resultadosGrupo */ vazio privado reconheceSymbolTFFromStrategyExample(ResultsGroup resultsGroup) { if(resultadosGrupo === nulo) { retornar; } tente { ConfiguraçõesConfiguraçõesMapa = resultadosGrupo.valores especiais(); String symbol = resultsGroup.mainResultado().getString(SpecialValues.Symbol, "N/A"); String tf = resultadosGroup.mainResult().getString(SpecialValues.Timeframe, "N/A"); long from = settings.getLong(SpecialValues.HistoryFrom); long to = settings.getLong(SpecialValues.HistoryTo); Log.info("\nExemplo - Estratégia última configuração do backtest: {} / {}, de: {}, até: {}", símbolo, tf, SQTime.toDateString(from), SQTime.toDateString(to)); catch(Exceção e) {} catch(Exceção e) { Log.error("Exceção", e); } } }
Este artigo foi útil? O artigo foi útil O artigo não foi útil
Marca Fantástica.
Excelente!! nós realmente precisávamos disso!!!
Muito obrigado Mark !!!!