Documentazione e guide per l'utente

Imparate le basi o perfezionate le vostre abilità con le esercitazioni pensate per ispirarvi.

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:

/**
 * Example on how to retrieve symbol, TF and from-to date ranges from strategy.
 * You can then later use it to load history data.
 * @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 - Strategy last backtest setting: {} / {}, from: {}, to: {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to));
    } catch(Exception e) {
        Log.error("Exception", 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

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<ResultsGroup> processDatabank(String project, String task, String databankName, ArrayList<ResultsGroup> databankRG) throws Exception {
        // simple example of using HistoryDataLoader to load historical data for given symbol and timeframe
        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);

            // we use this to get the length of the data
            int dataLength = data.Time.length;

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

            Log.info("Printing out first 5 records: Index, Time, Open, High, Low, Close");
            // go through data
            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);
                }
            }

        } catch(HistoryDataNotAvailableExeption e) {
            Log.error("Error loading data.", e);
        }


        // another useful example - how to get symbol/TF from the strategy ?
        if(databankRG.size() > 0) {
            recognizeSymbolTFFromStrategyExample(databankRG.get(0));
        }

        return databankRG;
    }


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

    /**
     * Example on how to retrieve symbol, TF and from-to date ranges from strategy.
     * You can then later use it to load history data.
     * @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 - Strategy last backtest setting: {} / {}, from: {}, to: {}", symbol, tf, SQTime.toDateString(from), SQTime.toDateString(to));
        } catch(Exception e) {
            Log.error("Exception", e);
        }
    }	
}

 

 

 

 

 

 

 

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

0 Commenti
Vecchi
Più recenti Le più votate