Documentação

Aplicações

Última atualização em 21. 6. 2022 por Mark Fric

Carregamento de dados do histórico em trechos

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

Assine
Notificação de
3 Comentários
Mais antigo
Novidades Mais Votados
Feedbacks em linha
Ver todos os comentários
Comerciante de abelhas
21. 6. 2022 12:02 pm

Marca Fantástica.

Emmanuel
22. 6. 2022 12:56 pm

Excelente!! nós realmente precisávamos disso!!!

Emmanuel
22. 6. 2022 12:56 pm

Muito obrigado Mark !!!!

Postos relacionados