Dokumentation

Anwendungen

Zuletzt aktualisiert am 21. 6. 2022 von Mark Fric

Laden von Verlaufsdaten in Snippets

Wichtige Hinweise

  • Dieses Beispiel funktioniert nur in SQ Build 136 Dev 2 oder höher
  • Das Laden von Daten funktioniert nicht für geschützte Daten (SQ Futures und SQ Equities), bei denen wir den Nutzern aufgrund eines Vertrags mit dem Datenanbieter keinen Zugang zu den Rohdaten gewähren dürfen.

 

In diesem Beispiel wird gezeigt, wie Sie von Ihren Snippets aus programmatisch auf historische Daten zugreifen können. Dies ist nützlich, wenn Sie z. B. die resultierenden Aufträge mit einigen Trends in historischen Daten vergleichen möchten.

Diese Funktion verwendet eine neue HistoryDataLoader Klasse, die erst seit SQ Build 136 Dev2 verfügbar ist.

 

Dieses Beispiel wurde in Form eines benutzerdefinierten Analyse-Snippets erstellt, aber Sie können diese Funktionalität in jedem Snippet verwenden. Beachten Sie nur, dass das Laden der Daten langsam sein kann, der Aufruf der Ladefunktion kann mehrere Sekunden dauern.

Daher ist es nicht ratsam, sie in Snippets zu verwenden, die sehr häufig aufgerufen werden und schnell sein müssen, z. B. Datenbankspaltenmetriken.

 

Wie man HistoryDataLoader zum Laden von Daten verwendet

Die Verwendung ist sehr einfach. Die Klasse HistoryDataLoader hat nur eine Methode get(Symbol, Zeitrahmen, DatumVon, DatumBis, Sitzung).

Sie müssen es nur mit den richtigen Parametern aufrufen und es wird ein Objekt zurückgeben GeschichteOHLCDaten mit den angeforderten Daten.

try {
    Log.info("Laden gestartet ...");
    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("Fehler beim Laden von Daten.", e);
}

 

Es ist wichtig, diese Methode mit try-catch zu umgeben, da sie Folgendes zurückgeben kann HistoryDataNotAvailable Ausnahme.

 

Zugriff auf Daten im Objekt HistoryOHLCData

Die Daten werden zurückgegeben in GeschichteOHLCDaten Objekt. Es handelt sich um ein einfaches Objekt, bei dem die Daten in primitiven Arrays gespeichert sind, die Sie normalerweise durchgehen können.

Ein Beispiel:

// Wir verwenden dies, um die Länge der Daten zu ermitteln
int dataLength = data.Time.length;

Log.info("Geladene Datenlänge: {}", dataLength);

Log.info("Ausdruck der ersten 5 Datensätze: Index, Time, Open, High, Low, Close");
// Daten durchgehen
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);
    }
}

 

Sie können sehen, dass das Datenobjekt Arrays für Time, Open, High, Low, Close und Volume enthält. Alle Arrays haben die gleiche Größe.

Und das ist alles - ganz einfach.

 

Wie erhalte ich Symbol und Zeitrahmen aus der Strategie?

Eine nützliche Funktion ist das Abrufen von Symbolen, Zeitrahmen und Datumsbereichen aus dem letzten Backtest der Strategie (ErgebnisGruppe Objekt), damit Sie wissen, welche Daten Sie laden müssen.

Es ist ebenso einfach, ein Beispiel:

/**
 * Beispiel für das Abrufen von Symbolen, TF und von-bis-Datumsbereichen aus der Strategie.
 * Sie können es dann später zum Laden von Verlaufsdaten verwenden.
 * @param resultsGroup
 */
private void recognizeSymbolTFFromStrategyExample(ResultsGroup resultsGroup) {
    if(resultsGroup == null) {
        zurück;
    }

    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("\nBeispiel - Strategie letzte Backtest-Einstellung: {} / {}, from: {}, to: {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to));
    } catch(Exception e) {
        Log.error("Exception", e);
    }
}

 

Sie können diese Werte dann in der Methode HistoryDataLoader.get() verwenden, um genau die Daten abzurufen, die im Backtest der Strategie verwendet wurden.

 

Vollständiger Code des LoadHistoryData-Beispielausschnittes

Paket 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.*; 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 {
        // einfaches Beispiel für die Verwendung von HistoryDataLoader zum Laden historischer Daten für ein bestimmtes Symbol und einen bestimmten Zeitraum
        try {
            HistoryDataLoader loader = new HistoryDataLoader();

            Log.info("Loading started ...");

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

            // damit ermitteln wir die Länge der Daten
            int dataLength = data.Time.length;

            Log.info("Geladene Datenlänge: {}", dataLength);

            Log.info("Ausdruck der ersten 5 Datensätze: Index, Time, Open, High, Low, Close");
            // Daten durchgehen
            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;
    }


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

    /**
     * Beispiel für das Abrufen von Symbolen, TF und Von-Bis-Datumsbereichen aus der Strategie.
     * Sie können es dann später zum Laden von Verlaufsdaten verwenden.
     * @param resultsGroup
     */
    private void recognizeSymbolTFFromStrategyExample(ResultsGroup resultsGroup) {
        if(resultsGroup == null) {
            zurück;
        }

        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("\nBeispiel - Strategie letzte Backtest-Einstellung: {} / {}, from: {}, to: {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to));
        } catch(Exception e) {
            Log.error("Exception", e);
        }
    }
}

 

 

 

 

 

 

 

War dieser Artikel hilfreich? Der Artikel war nützlich Der Artikel war nicht nützlich

Abonnieren
Benachrichtigen Sie mich bei
3 Kommentare
Älteste
Neuestes Meistgewählt
Inline-Rückmeldungen
Alle Kommentare anzeigen
Bienenhändler
21. 6. 2022 12:02 Uhr

Fantastische Marke.

Emmanuel
22. 6. 2022 12:56 Uhr

Hervorragend! Wir haben es wirklich gebraucht!!!

Emmanuel
22. 6. 2022 12:56 Uhr

Herzlichen Dank, Mark !!!!

Verwandte Beiträge