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 !!!!