Documentazione

Applicazioni

Ultimo aggiornamento il 21. 6. 2022 da Mark Fric

Caricamento dei dati della cronologia negli snippet

Note importanti

  • Questo esempio funzionerà solo con SQ Build 136 Dev 2 o successiva.
  • Il caricamento dei dati non funziona per i dati protetti (SQ Futures e SQ Equities), per i quali il contratto con il fornitore dei dati non ci consente di dare accesso ai dati grezzi agli utenti.

 

Questo esempio mostra come sia possibile accedere ai dati storici in modo programmatico dai propri snippet. Ciò è utile se si desidera confrontare, ad esempio, gli ordini risultanti con alcune tendenze dei dati storici.

Questa funzionalità utilizza un nuovo Caricatore di dati storici che è disponibile solo dalla build 136 Dev2 di SQ.

 

Questo esempio è stato realizzato in un frammento di analisi personalizzata, ma è possibile utilizzare questa funzionalità in qualsiasi frammento. Si tenga presente che il caricamento dei dati può essere lento: la chiamata della funzione di caricamento può richiedere diversi secondi.

Non è quindi consigliabile utilizzarlo in snippet che vengono richiamati molto spesso e che devono essere veloci, come ad esempio le metriche delle colonne della banca dati.

 

Come usare HistoryDataLoader per caricare i dati

L'utilizzo è molto semplice. La classe Caricatore di dati storici ha un solo metodo get(simbolo, timframe, dateFrom, dateTo, sessione).

Basta chiamarlo con i parametri corretti e restituirà l'oggetto StoriaOHLCData con i dati richiesti.

try {
    Log.info("Caricamento avviato ...");
    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("Errore nel caricamento dei dati.", e);
}

 

È importante circondare questo metodo con try-catch, perché può restituire StoriaDatiNonDisponibili eccezione.

 

Accesso ai dati nell'oggetto HistoryOHLCData

I dati vengono restituiti in StoriaOHLCData oggetto. Si tratta di un oggetto semplice, in cui i dati sono memorizzati in array primitivi che si possono normalmente scorrere.

Un esempio:

// Lo usiamo per ottenere la lunghezza dei dati
int dataLength = data.Time.length;

Log.info("Lunghezza dati caricati: {}", dataLength);

Log.info("Stampa dei primi 5 record: Index, Time, Open, High, Low, Close");
// scorrere i dati
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);
    }
}

 

Si può notare che l'oggetto dati ha array per ora, apertura, massimo, minimo, chiusura e volume. Tutti gli array hanno la stessa dimensione.

Tutto qui, molto semplice.

 

Come ottenere simbolo e timeframe dalla strategia

Una cosa utile da fare è recuperare gli intervalli di simboli, timeframe e date dall'ultimo backtest della strategia (Gruppo di risultati ), in modo da sapere quali dati caricare.

È altrettanto semplice, un esempio:

/**
 * Esempio di recupero di simboli, TF e intervalli di date da-a dalla strategia.
 * È possibile utilizzarlo in seguito per caricare i dati della cronologia.
 * @param resultsGroup
 */
private void recognizeSymbolTFFromStrategyExample(ResultsGroup resultsGroup) {
    if(resultsGroup == null) {
        return;
    }

    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("ónExample - Impostazione dell'ultimo backtest della strategia: {} / {}, da: {}, a: {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to));
    } catch(Exception e) {
        Log.error("Eccezione", e);
    }
}

 

È quindi possibile utilizzare questi valori nel metodo HistoryDataLoader.get() per recuperare esattamente i dati utilizzati nel backtest della strategia.

 

Codice completo dello snippet di esempio LoadHistoryData

pacchetto SQ.CustomAnalysis;

importare com.strategyquant.lib.*;

importare java.util.ArrayList;

import com.strategyquant.tradinglib.results.SpecialValues;
importare 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 {
        // semplice esempio di utilizzo di HistoryDataLoader per caricare i dati storici di un dato simbolo e di un dato timeframe
        try {
            HistoryDataLoader loader = new HistoryDataLoader();

            Log.info("Caricamento avviato ...");

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

            // utilizziamo questo dato per ottenere la lunghezza dei dati
            int dataLength = data.Time.length;

            Log.info("Lunghezza dati caricati: {}", dataLength);

            Log.info("Stampa dei primi 5 record: Index, Time, Open, High, Low, Close");
            // scorrere i dati
            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;
    }


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

    /**
     * Esempio di recupero di simboli, TF e intervalli di date da-a dalla strategia.
     * È possibile utilizzarlo in seguito per caricare i dati storici.
     * @param resultsGroup
     */
    private void recognizeSymbolTFFromStrategyExample(ResultsGroup resultsGroup) {
        if(resultsGroup == null) {
            return;
        }

        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("ónExample - Impostazione dell'ultimo backtest della strategia: {} / {}, da: {}, a: {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to));
        } catch(Exception e) {
            Log.error("Eccezione", e);
        }
    }
}

 

 

 

 

 

 

 

Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile

Abbonarsi
Notificami
3 Commenti
Il più vecchio
Più recente I più votati
Feedback in linea
Visualizza tutti i commenti
Commerciante di api
21. 6. 2022 12:02 pm

Fantastico Mark.

Emmanuel
22. 6. 2022 12:56 pm

Eccellente!!! ne avevamo davvero bisogno!!!

Emmanuel
22. 6. 2022 12:56 pm

Grazie mille Mark !!!!

Messaggi correlati