Documentation

Applications

Dernière mise à jour le 21. 6. 2022 par Mark Fric

Chargement des données historiques dans les snippets

Remarques importantes

  • Cet exemple ne fonctionnera qu'avec SQ Build 136 Dev 2 ou une version ultérieure.
  • Le chargement des données ne fonctionnera pas pour les données protégées (SQ Futures et SQ Equities), pour lesquelles nous ne sommes pas autorisés à donner accès aux données brutes aux utilisateurs en vertu d'un contrat avec le fournisseur de données.

 

Cet exemple montre comment vous pouvez accéder aux données historiques de manière programmatique à partir de vos snippets. C'est utile si vous voulez comparer, par exemple, les ordres résultants avec certaines tendances dans les données historiques.

Cette fonctionnalité utilise un nouveau Chargeur de données historiques qui n'est disponible que depuis SQ Build 136 Dev2.

 

Cet exemple est réalisé sous la forme d'un extrait d'analyse personnalisée, mais vous pouvez utiliser cette fonctionnalité dans n'importe quel extrait. Il faut savoir que le chargement des données peut être lent, l'appel de la fonction de chargement pouvant prendre plusieurs secondes.

Il n'est donc pas conseillé de l'utiliser dans les extraits qui sont appelés très souvent et qui doivent être rapides, par exemple les métriques des colonnes de la banque de données.

 

Comment utiliser HistoryDataLoader pour charger des données ?

L'utilisation est très simple. La classe Chargeur de données historiques n'a qu'une seule méthode get(symbol, timframe, dateFrom, dateTo, session).

Il suffit de l'appeler avec les bons paramètres et il renverra l'objet HistoriqueOHLCData avec les données demandées.

try {
    Log.info("Le chargement a commencé ...") ;
    HistoryDataLoader loader = new 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("Error loading data.", e) ;
}

 

Il est important d'entourer cette méthode d'un try-catch, car elle peut renvoyer Données historiques indisponibles exception.

 

Accès aux données de l'objet HistoryOHLCData

Les données sont renvoyées dans HistoriqueOHLCData objet. Il s'agit d'un objet simple, dans lequel les données sont stockées dans des tableaux primitifs que vous pouvez normalement parcourir.

Un exemple :

// nous l'utilisons pour obtenir la longueur des données
int dataLength = data.Time.length ;

Log.info("Longueur des données chargées : {}", dataLength) ;

Log.info("Impression des 5 premiers enregistrements : Index, Time, Open, High, Low, Close") ;
// parcourir les données
for(int i=0 ; i<dataLength ; i++) {
    long time = data.Time[i] ;
    float open = data.Open[i] ;
    float high = data.High[i] ;
    float low = data.Low[i] ;
    float close = data.Close[i] ;
    float volume = data.Volume[i] ;

    if(i<5) {
        Log.info("#{} - {}, {}, {}, {}, {}", i, SQTime.toDateMinuteString(time), open, high, low, close) ;
    }
}

 

Vous pouvez voir que l'objet de données comporte des tableaux pour le temps, l'ouverture, le haut, le bas, la clôture et le volume. Tous les tableaux ont la même taille.

Et c'est tout - très simple.

 

Comment obtenir un symbole et une période de temps à partir d'une stratégie ?

Une chose utile à faire est de récupérer le symbole, l'horizon temporel et les plages de dates du dernier backtest de la stratégie (Groupe de résultats ) afin de savoir quelles données charger.

C'est tout aussi simple, un exemple :

/**
 * Exemple sur la façon de récupérer le symbole, le TF et les plages de dates de la stratégie.
 * Vous pouvez ensuite l'utiliser pour charger les données de l'historique.
 * @param resultsGroup
 */
private void recognizeSymbolTFFromStrategyExample(ResultsGroup resultsGroup) {
    if(resultsGroup == null) {
        retour ;
    }

    try {
        SettingsMap settings = resultsGroup.specialValues() ;

        String symbol = resultsGroup.mainResult().getString(SpecialValues.Symbol, "N/A") ;
        String tf = resultsGroup.mainResult().getString(SpecialValues.Timeframe, "N/A") ;

        long from = settings.getLong(SpecialValues.HistoryFrom) ;
        long to = settings.getLong(SpecialValues.HistoryTo) ;

        Log.info("\NExemple - Paramètres du dernier backtest de la stratégie : {} / {}, from : {}, to : {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to)) ;
    } catch(Exception e) {
        Log.error("Exception", e) ;
    }
}

 

Vous pouvez ensuite utiliser ces valeurs dans la méthode HistoryDataLoader.get() pour récupérer exactement les données utilisées dans le backtest de la stratégie.

 

Code complet de l'exemple LoadHistoryData

package SQ.CustomAnalysis ;

import com.strategyquant.lib.* ;

import java.util.ArrayList ;

import com.strategyquant.tradinglib.results.SpecialValues ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;

import com.strategyquant.datalib.* ;
import com.strategyquant.tradinglib.* ;
import com.strategyquant.datalib.session.* ;

public class LoadHistoryData extends CustomAnalysisMethod {

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    
    public LoadHistoryData() {
        super("LoadHistoryData", TYPE_PROCESS_DATABANK) ;
    }
    
    //------------------------------------------------------------------------
    
    @Override
    public boolean filterStrategy(String project, String task, String databankName, ResultsGroup rg) throws Exception {
        return true ;
    }
    
    
    //------------------------------------------------------------------------
    
    @Override
    public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) throws Exception {
        // exemple simple d'utilisation de HistoryDataLoader pour charger des données historiques pour un symbole et une période donnés
        try {
            HistoryDataLoader loader = new HistoryDataLoader() ;

            Log.info("Le chargement a commencé...") ;

            HistoryOHLCData data = loader.get("EURUSD_M1", TimeframeManager.TF_H1, SQTime.toLong(2007,1, 1), SQTime.toLong(2020, 12, 31), Session.NoSession) ;

            // nous utilisons ceci pour obtenir la longueur des données
            int dataLength = data.Time.length ;

            Log.info("Loaded data length : {}", dataLength) ;

            Log.info("Impression des 5 premiers enregistrements : Index, Time, Open, High, Low, Close") ;
            // parcourir les données
            for(int i=0 ; i<dataLength ; i++) {
                long time = data.Time[i] ;
                float open = data.Open[i] ;
                float high = data.High[i] ;
                float low = data.Low[i] ;
                float close = data.Close[i] ;
                float volume = data.Volume[i] ;

                if(i 0) {
            recognizeSymbolTFFromStrategyExample(databankRG.get(0)) ;
        }

        return databankRG ;
    }


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

    /**
     * Exemple de récupération d'un symbole, d'une cible et d'une plage de dates à partir d'une stratégie.
     * Vous pouvez ensuite l'utiliser pour charger les données de l'historique.
     * @param resultsGroup
     */
    private void recognizeSymbolTFFromStrategyExample(ResultsGroup resultsGroup) {
        if(resultsGroup == null) {
            retour ;
        }

        try {
            SettingsMap settings = resultsGroup.specialValues() ;

            String symbol = resultsGroup.mainResult().getString(SpecialValues.Symbol, "N/A") ;
            String tf = resultsGroup.mainResult().getString(SpecialValues.Timeframe, "N/A") ;

            long from = settings.getLong(SpecialValues.HistoryFrom) ;
            long to = settings.getLong(SpecialValues.HistoryTo) ;

            Log.info("\NExemple - Paramètres du dernier backtest de la stratégie : {} / {}, from : {}, to : {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to)) ;
        } catch(Exception e) {
            Log.error("Exception", e) ;
        }
    }
}

 

 

 

 

 

 

 

Cet article a-t-il été utile ? L'article était utile L'article n'était pas utile

S'abonner
Notification pour
3 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Négociant en abeilles
21. 6. 2022 12:02 pm

Fantastique Mark.

Emmanuel
22. 6. 2022 12:56 pm

Excellent ! ! nous en avions vraiment besoin ! !!

Emmanuel
22. 6. 2022 12:56 pm

Merci beaucoup Mark ! !!!

Postes connexes