Vai al contenuto

Ottenere i dati del simbolo

Ottenere e interpretare i dati del simbolo (ad esempio, i prezzi di apertura e chiusura di tutte le barre per un periodo specifico) è essenziale in qualsiasi applicazione che abbia una delle seguenti funzionalità:

  • Grafici – per costruire grafici a barre o a linee, è necessario conoscere i dati storici e in tempo reale delle barre e delle quotazioni.
  • Statistiche di mercato – se si desidera visualizzare le statistiche di mercato (come le variazioni giornaliere dei prezzi per i singoli simboli), è necessario ottenere sia i prezzi storici che quelli in tempo reale.
  • Replay – nella vostra applicazione, potreste consentire ai trader di tornare a un periodo precedente e fare trading sui dati storici. Per farlo, sarebbe necessario ottenere ed elaborare i dati passati delle barre e dei tick.

In questo tutorial, mostreremo come ottenere ed elaborare i dati storici e in tempo reale delle barre e dei tick, e le quotazioni di profondità in tempo reale.

Si noti che il tutorial fornisce solo uno snippet di codice per ottenere i dati storici delle barre. Poiché la logica di base rimane la stessa indipendentemente dall'azione che si sta eseguendo, è possibile adattare questo snippet per ottenere altri tipi di dati.

Operare con JSON

Quando si opera con JSON, è comunque possibile riutilizzare il codice di questo tutorial; tuttavia, sarà necessario modificarlo leggermente a seconda dell'approccio alla serializzazione e deserializzazione.

Ottenere dati storici delle barre

Per ricevere i dati storici delle barre, eseguire le seguenti azioni:

  • Inizializzare un oggetto che rappresenta il messaggio ProtoOAGetTrendbarsReq.
  • Compilare le proprietà dell'oggetto con il ctidTraderAccountId richiesto, lo symbolId, il ProtoOATrendbarPeriod, il count delle trendbars da restituire e i timestamp Unix toTimestamp e fromTimestamp.

Vincoli dei timestamp

Si noti che ci sono alcuni vincoli sulla distanza massima possibile tra il toTimestamp e il fromTimestamp. Questi vincoli dipendono dal ProtoOATrendPeriod specificato. Per saperne di più, clicca qui.

  • Inviare il messaggio appena creato e ricevere una risposta di tipo ProtoOAGetTrendbarsRes. Accedere al suo campo trendbar per ottenere un elenco di barre di tendenza.
  • Trasformare i dati dal formato relativo al prezzo effettivo del simbolo. Per farlo, prima ottenere il prezzo basso di una trendbar e dividerlo per 100000. Quindi, arrotondare il risultato alle cifre del simbolo (ad esempio, due numeri dopo il delimitatore). Per ottenere i prezzi alto, di apertura e di chiusura di una trendbar, aggiungere il delta della trendbar di ciascuno di questi prezzi al prezzo basso della trendbar. Successivamente, dividere ciascun numero per 100000 e arrotondare il risultato alle cifre del simbolo.

È possibile completare queste azioni riutilizzando il codice sottostante.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private static async void TrendbarRequest(ProtoOATrendbarPeriod period, int accountId, int symbolId, int days)
{
    Console.WriteLine("Sending ProtoOAGetTrendbarsReq...");

    var request = new ProtoOAGetTrendbarsReq
    {
        CtidTraderAccountId = accountId,
        SymbolId = symbolId,
        Period = period,
        FromTimestamp = DateTimeOffset.UtcNow.AddDays(-days).ToUnixTimeMilliseconds(),
        ToTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
    };

    Console.WriteLine($"FromTimestamp: {request.FromTimestamp} | ToTimestamp: {request.ToTimestamp}");

    await _client.SendMessage(request);
}

public static double GetPriceFromRelative(ProtoOASymbol symbol, long relative) => Math.Round(relative / 100000.0, symbol.Digits);

private List<Trendbar> OnHistoricalTrendbarsReceived(ProtoOAGetTrendbarsRes message) 
{
    var trendbars = message.Trendbar;

    var data = new List<Trendbar>();

    foreach (var trendbar in trendbars) 
    {
        data.Add(new Trendbar
        {
            Low = GetPriceFromRelative(symbol, trendbar.Low),
            High = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaHigh),
            Open = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaOpen),
            Close = GetPriceFromRelative(symbol, trendbar.Low + (int)trendbar.DeltaClose),
        }
        );
    }

    return data;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
def sendProtoOAGetTrendbarsReq(ctidTraderAccountId, weeks, period, symbolId, clientMsgId = None):
    request = ProtoOAGetTrendbarsReq()
    request.ctidTraderAccountId = ctidTraderAccountId
    request.period = ProtoOATrendbarPeriod.Value(period)
    request.fromTimestamp = int(calendar.timegm((datetime.datetime.utcnow() - datetime.timedelta(weeks=int(weeks))).utctimetuple())) * 1000
    request.toTimestamp = int(calendar.timegm(datetime.datetime.utcnow().utctimetuple())) * 1000
    request.symbolId = int(symbolId)
    deferred = client.send(request, clientMsgId = clientMsgId)

def getPriceFromRelative(symbol, relative): round(relative / 100000.0, symbol.digits)

def onHistoricalTrendbarsReceived(message):

    trendbars = message.trendbars

    data = []

    for trendbar in trenbars:
        data.append(Trendbar(low=getPriceFromRelative(symbol, trendbar.low), high=getPriceFromRelative(symbol, trendbar.low + int(trendbar.deltaHigh)), open=getPriceFromRelative(symbol, trendbar.low + int(trendbar.deltaHigh)), close=getPriceFromRelative(symbol, trendbar.low +int(trendbar.deltaClose))))

    return data

Ottenere dati storici dei tick

Per ricevere i dati storici dei tick, eseguire le seguenti azioni:

  • Inizializzare un oggetto che rappresenta il messaggio ProtoOAGetTickDataReq.
  • Compilare le proprietà dell'oggetto con il ctidTraderAccountId richiesto, lo symbolId, il type di quotazione, nonché il fromTimestamp e il toTimestamp.

Vincoli dei timestamp

È impossibile richiedere dati storici dei tick per un periodo superiore a una settimana. Pertanto, la differenza tra il toTimestamp e il fromTimestamp specificati non deve essere superiore a 604800000.

  • Inviare il messaggio appena creato e ricevere una risposta di tipo ProtoOAGetTickDataRes. Accedere al suo campo tickData per ottenere un elenco di elementi di tipo ProtoOATickData.
  • Trasformare i dati dal formato relativo al prezzo effettivo del simbolo. Per farlo, dividere ogni tick per 100000 e arrotondare il risultato alle cifre del simbolo.

Richiesta di un gran numero di tick

Esiste un limite al numero di tick che possono essere restituiti in un messaggio ProtoOAGetTickDataRes. Se questo limite viene superato (ad esempio, c'è stato un numero significativo di tick durante il periodo specificato), il messaggio ProtoOAGetTickDataRes includerà solo i primi X tick, dove X è un numero inferiore al limite dei tick. Il limite esatto dipende dalla configurazione del backend di cTrader.

Per verificare se esistono più tick di quelli restituiti nel messaggio ricevuto, utilizzare il flag hasMore.

Ottenere dati delle barre in tempo reale

Per ricevere le barre in tempo reale, eseguire le seguenti azioni:

  • Inizializzare una variabile che rappresenta il messaggio ProtoOAGetTrendbarsReq.
  • Compilare le proprietà dell'oggetto con il ctidTraderAccountId richiesto, lo symbolId, il ProtoOATrendbarPeriod, il count delle trendbars da restituire, i timestamp Unix toTimestamp e fromTimestamp.

Vincoli dei timestamp

Ci sono alcuni vincoli sulla distanza massima possibile tra il toTimestamp e il fromTimestamp. Questi vincoli dipendono dal ProtoOATrendPeriod specificato. Per saperne di più, clicca qui.

  • Inviare il messaggio appena creato e ricevere una risposta di tipo ProtoOAGetTrendbarsRes. Accedere al suo campo trendbar per ottenere un elenco di barre di tendenza.

  • Trasformare i dati dal formato relativo al prezzo effettivo del simbolo. Per farlo, prima ottenere il prezzo basso di una trendbar e dividerlo per 100000. Quindi, arrotondare il risultato alle cifre del simbolo (ad esempio, due numeri dopo il delimitatore). Per ottenere i prezzi alto, di apertura e di chiusura di una trendbar, aggiungere il delta della trendbar di ciascuno di questi prezzi al prezzo basso della trendbar. Successivamente, dividere ciascun numero per 100000 e arrotondare il risultato alle cifre del simbolo.

  • Inizializzare un oggetto che rappresenta il messaggio ProtoOASubscribeLiveTrendbarReq.

  • Compilare le proprietà dell'oggetto con il ctidTraderAccountId richiesto, il ProtoOATrendbarPeriod e lo symbolId.

  • Fare lo stesso per un oggetto che rappresenta il messaggio ProtoOASubscribeSpotsReq.

  • Inviare il messaggio ProtoOASubscribeSpotsReq e il messaggio ProtoOASubscribeLiveTrendbarReq in questo ordine e ricevere risposte di tipo ProtoOASubscribeSpotsRes e ProtoOASubscribeLiveTrenbarsRes. A questo punto, si è abbonati ai dati delle barre in tempo reale e si dovrebbero ricevere messaggi di tipo ProtoOASpotEvent.

Abbonamento alle trendbars in tempo reale

Per abbonarsi con successo alle trendbars in tempo reale è necessario prima sottoscrivere gli eventi spot.

  • Quando si riceve un nuovo messaggio ProtoOASpotEvent, utilizzare il suo campo trendbar per ottenere i dati dell'ultima barra chiusa.
  • Trasformare i dati dal formato relativo ai prezzi effettivi del simbolo. Per farlo, prima ottenere il prezzo basso di una trendbar e dividerlo per 100000. Quindi, arrotondare il risultato alle cifre del simbolo (ad esempio, due numeri dopo il delimitatore). Per ottenere i prezzi alto, di apertura e di chiusura di una trendbar, aggiungere il delta della trendbar di ciascuno di questi prezzi al prezzo basso della trendbar. Successivamente, dividere ciascun numero per 100000 e arrotondare il risultato alle cifre del simbolo.

Per annullare l'abbonamento ai dati delle trendbar in tempo reale, è sempre possibile inviare il messaggio ProtoOAUnsubscribeLiveTrendbarsReq contenente lo symbolId, il period e il proprio ctidTraderAccountId. Se la richiesta ha successo, si dovrebbe ricevere una risposta di tipo ProtoOAUnsubscribeLiveTrenbarRes. L'abbonamento agli eventi spot rimarrà comunque attivo.

Ottenere quotazioni in tempo reale

Per ricevere quotazioni bid e ask in tempo reale per un simbolo, eseguire le seguenti azioni:

  • Inizializzare un oggetto che rappresenta il messaggio ProtoOASubscribeSpotsReq.
  • Compilare le proprietà dell'oggetto con il ctidTraderAccountId, lo symbolId e, opzionalmente, il bool subscribeToSpotTimestamp.
  • Inviare il messaggio appena creato e ricevere una risposta di tipo ProtoOASubscribeSpotsRes. A questo punto, si è abbonati ai dati delle quotazioni in tempo reale e si dovrebbero ricevere messaggi di tipo ProtoOASpotEvent.
  • Quando si riceve un nuovo messaggio ProtoOASpotEvent, accedere ai suoi campi bid e ask per ottenere le ultime quotazioni. Si noti che è ancora necessario trasformare i dati in un valore di prezzo effettivo dividendolo per 100000 e arrotondandolo alle cifre del simbolo.

Campi bid e ask

Poiché i campi bid e ask sono opzionali, è possibile che non si vedano necessariamente messaggi ProtoOASpotEvent in cui entrambi sono specificati.

Per annullare l'iscrizione ai dati delle quotazioni, puoi sempre inviare il messaggio ProtoOAUnsubscribeSpotsReq contenente il symbolId e il tuo ctidTraderAccountId. Se la tua richiesta ha esito positivo, dovresti ricevere una risposta di tipo ProtoOAUnsubscribeSpotsRes. A questo punto, dovresti smettere di ricevere eventi spot.

Quotazioni di profondità

Infine, puoi anche ricevere quotazioni di profondità o di Livello II in tempo reale per un simbolo. Per farlo, esegui le seguenti azioni.

Puoi sottoscrivere e ricevere quotazioni di profondità o di Livello II in tempo reale per un simbolo dall'API.

  • Inizializza un oggetto che rappresenta il messaggio ProtoOASubscribeDepthQuotesReq.
  • Compila le proprietà dell'oggetto con il ctidTraderAccountId e il symbolId.
  • Invia il messaggio appena creato e ricevi una risposta di tipo ProtoOASubscribeDepthQuotesRes. A questo punto, sei iscritto alle quotazioni di profondità, il che significa che dovresti iniziare a ricevere messaggi ProtoOADepthEvent.
  • Quando ricevi un nuovo messaggio ProtoOADepthEvent, dovrai utilizzare i suoi campi newQuotes e deletedQuotes per ottenere i dati di profondità più recenti. Dovrai anche trasformare i dati in un valore di prezzo effettivo dividendoli per 100000 e arrotondando il risultato alle cifre del simbolo. Dovrai anche trasformare la dimensione della quotazione di profondità in unità dividendola per 100.

Per annullare l'iscrizione agli eventi di profondità, puoi sempre utilizzare il messaggio ProtoOAUnsubscribeDepthQuotesReq specificando il symbolId e il ctidTraderAccountId. Dovresti ricevere un messaggio di tipo ProtoOAUnsubscribeDepthQuotesRes; successivamente, dovresti smettere di ricevere eventi di profondità.