Aller au contenu

Obtenir les données des symboles

L'obtention et l'interprétation des données des symboles (par exemple, les prix d'ouverture et de clôture de toutes les barres pour une période spécifique) sont essentielles dans toute application qui possède l'une des fonctionnalités suivantes :

  • Graphiques – pour construire des graphiques en barres ou en lignes, vous devez connaître les données historiques et en temps réel des barres et des cotations.
  • Statistiques de marché – si vous souhaitez afficher des statistiques de marché (telles que les variations de prix quotidiennes pour des symboles individuels), vous devez obtenir à la fois les prix historiques et en temps réel.
  • Replays – dans votre application, vous pouvez permettre aux traders de revenir à une période précédente et de trader sur des données historiques. Pour ce faire, vous devrez obtenir et traiter les données passées des barres et des ticks.

Dans ce tutoriel, nous vous montrerons comment obtenir et traiter les données historiques et en temps réel des barres et des ticks, ainsi que les cotations de profondeur en temps réel.

Notez que le tutoriel ne fournit qu'un extrait de code pour obtenir des données historiques de barres. Comme la logique de base reste la même quelle que soit l'action que vous effectuez, vous pouvez adapter cet extrait pour obtenir d'autres types de données.

Travailler avec JSON

Lorsque vous opérez avec JSON, vous pouvez toujours réutiliser le code de ce tutoriel ; cependant, vous devrez le modifier légèrement en fonction de votre approche de sérialisation et de désérialisation.

Obtenir des données historiques de barres

Pour recevoir des données historiques de barres, effectuez les actions suivantes :

  • Initialisez un objet représentant le message ProtoOAGetTrendbarsReq.
  • Remplissez les propriétés de l'objet avec le ctidTraderAccountId requis, le symbolId, le ProtoOATrendbarPeriod, le count de trendbars à retourner et les horodatages Unix toTimestamp et fromTimestamp.

Contraintes d'horodatage

Notez qu'il existe des contraintes sur la distance maximale possible entre le toTimestamp et le fromTimestamp. Ces contraintes dépendent du ProtoOATrendPeriod spécifié. Pour en savoir plus, cliquez ici.

  • Envoyez le message nouvellement créé et recevez une réponse de type ProtoOAGetTrendbarsRes. Accédez à son champ trendbar pour obtenir une liste de barres de tendance.
  • Transformez les données du format relatif au prix réel du symbole. Pour ce faire, obtenez d'abord le prix bas d'une trendbar et divisez-le par 100000. Ensuite, arrondissez le résultat aux décimales du symbole (par exemple, deux chiffres après le séparateur). Pour obtenir les prix haut, ouverture et clôture d'une trendbar, ajoutez le delta de la trendbar de chacun de ces prix au prix bas de la trendbar. Ensuite, divisez chaque nombre par 100000 et arrondissez le résultat aux décimales du symbole.

Vous pouvez effectuer ces actions en réutilisant le code ci-dessous.

 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

Obtenir des données historiques de ticks

Pour recevoir des données historiques de ticks, effectuez les actions suivantes :

  • Initialisez un objet représentant le message ProtoOAGetTickDataReq.
  • Remplissez les propriétés de l'objet avec le ctidTraderAccountId requis, le symbolId, le type de cotation ainsi que le fromTimestamp et le toTimestamp.

Contraintes d'horodatage

Il est impossible de demander des données historiques de ticks pour une période supérieure à une semaine. Ainsi, la différence entre le toTimestamp et le fromTimestamp spécifiés ne doit pas être supérieure à 604800000.

  • Envoyez le message nouvellement créé et recevez une réponse de type ProtoOAGetTickDataRes. Accédez à son champ tickData pour obtenir une liste d'éléments de type ProtoOATickData.
  • Transformez les données du format relatif au prix réel du symbole. Pour ce faire, divisez chaque tick par 100000 et arrondissez le résultat aux décimales du symbole.

Demande d'un grand nombre de ticks

Il existe une limite sur le nombre de ticks qui peuvent être retournés dans un message ProtoOAGetTickDataRes. Si cette limite est dépassée (par exemple, s'il y a eu un nombre important de ticks pendant la période spécifiée), le message ProtoOAGetTickDataRes n'inclura que les X premiers ticks, où X est un nombre inférieur à la limite de ticks. La limite exacte dépend de la configuration du backend cTrader.

Pour vérifier s'il existe plus de ticks que ceux retournés dans le message reçu, utilisez le drapeau hasMore.

Obtenir des données de barres en temps réel

Pour recevoir des barres en temps réel, effectuez les actions suivantes :

  • Initialisez une variable représentant le message ProtoOAGetTrendbarsReq.
  • Remplissez les propriétés de l'objet avec le ctidTraderAccountId requis, le symbolId, le ProtoOATrendbarPeriod, le count de trendbars à retourner, les horodatages Unix toTimestamp et fromTimestamp.

Contraintes d'horodatage

Il existe des contraintes sur la distance maximale possible entre le toTimestamp et le fromTimestamp. Ces contraintes dépendent du ProtoOATrendPeriod spécifié. Pour en savoir plus, cliquez ici.

  • Envoyez le message nouvellement créé et recevez une réponse de type ProtoOAGetTrendbarsRes. Accédez à son champ trendbar pour obtenir une liste de barres de tendance.

  • Transformez les données du format relatif au prix réel du symbole. Pour ce faire, obtenez d'abord le prix bas d'une trendbar et divisez-le par 100000. Ensuite, arrondissez le résultat aux décimales du symbole (par exemple, deux chiffres après le séparateur). Pour obtenir les prix haut, ouverture et clôture d'une trendbar, ajoutez le delta de la trendbar de chacun de ces prix au prix bas de la trendbar. Ensuite, divisez chaque nombre par 100000 et arrondissez le résultat aux décimales du symbole.

  • Initialisez un objet représentant le message ProtoOASubscribeLiveTrendbarReq.

  • Remplissez les propriétés de l'objet avec le ctidTraderAccountId requis, le ProtoOATrendbarPeriod et le symbolId.

  • Faites de même pour un objet représentant le message ProtoOASubscribeSpotsReq.

  • Envoyez le message ProtoOASubscribeSpotsReq et le message ProtoOASubscribeLiveTrendbarReq dans cet ordre et recevez des réponses de types ProtoOASubscribeSpotsRes et ProtoOASubscribeLiveTrenbarsRes. À ce stade, vous êtes abonné aux données de barres en temps réel et vous devriez recevoir des messages de type ProtoOASpotEvent.

S'abonner aux trendbars en temps réel

Pour s'abonner avec succès aux trendbars en temps réel, il faut d'abord s'abonner aux événements spot.

  • Lorsque vous recevez un nouveau message ProtoOASpotEvent, utilisez son champ trendbar pour obtenir les données de la dernière barre fermée.
  • Transformez les données du format relatif aux prix réels du symbole. Pour ce faire, obtenez d'abord le prix bas d'une trendbar et divisez-le par 100000. Ensuite, arrondissez le résultat aux décimales du symbole (par exemple, deux chiffres après le séparateur). Pour obtenir les prix haut, ouverture et clôture d'une trendbar, ajoutez le delta de la trendbar de chacun de ces prix au prix bas de la trendbar. Ensuite, divisez chaque nombre par 100000 et arrondissez le résultat aux décimales du symbole.

Pour vous désabonner des données de trendbar en temps réel, vous pouvez toujours envoyer le message ProtoOAUnsubscribeLiveTrendbarsReq contenant le symbolId, la period et votre ctidTraderAccountId. Si votre demande est réussie, vous devriez recevoir une réponse de type ProtoOAUnsubscribeLiveTrendbarRes. Votre abonnement aux événements spot restera actif.

Obtenir des cotations en temps réel

Pour recevoir des cotations bid et ask en temps réel pour un symbole, effectuez les actions suivantes :

  • Initialisez un objet représentant le message ProtoOASubscribeSpotsReq.
  • Remplissez les propriétés de l'objet avec le ctidTraderAccountId, le symbolId, et, optionnellement, le booléen subscribeToSpotTimestamp.
  • Envoyez le message nouvellement créé et recevez une réponse de type ProtoOASubscribeSpotsRes. À ce stade, vous êtes abonné aux données de cotations en temps réel et vous devriez recevoir des messages de type ProtoOASpotEvent.
  • Lorsque vous recevez un nouveau message ProtoOASpotEvent, accédez à ses champs bid et ask pour obtenir les dernières cotations. Notez que vous devez toujours transformer les données en une valeur de prix réelle en les divisant par 100000 et en les arrondissant aux décimales du symbole.

Champs bid et ask

Comme les champs bid et ask sont facultatifs, il est possible que vous ne voyiez pas nécessairement de messages ProtoOASpotEvent où les deux sont spécifiés.

Pour vous désabonner des données de cotation, vous pouvez toujours envoyer le message ProtoOAUnsubscribeSpotsReq contenant le symbolId et votre ctidTraderAccountId. Si votre demande est réussie, vous devriez recevoir une réponse de type ProtoOAUnsubscribeSpotsRes. À ce stade, vous devriez cesser de recevoir des événements spot.

Cotations de profondeur

Enfin, vous pouvez également recevoir des cotations en direct de profondeur ou de niveau II pour un symbole. Pour ce faire, effectuez les actions suivantes.

Vous pouvez vous abonner et recevoir des cotations en direct de profondeur ou de niveau II pour un symbole à partir de l'API.

  • Initialisez un objet représentant le message ProtoOASubscribeDepthQuotesReq.
  • Remplissez les propriétés de l'objet avec le ctidTraderAccountId et le symbolId.
  • Envoyez le message nouvellement créé et recevez une réponse de type ProtoOASubscribeDepthQuotesRes. À ce stade, vous êtes abonné aux cotations de profondeur, ce qui signifie que vous devriez commencer à recevoir des messages ProtoOADepthEvent.
  • Lorsque vous recevez un nouveau message ProtoOADepthEvent, vous devrez utiliser ses champs newQuotes et deletedQuotes pour obtenir les dernières données de profondeur. Vous devrez également transformer les données en une valeur de prix réelle en les divisant par 100000 et en arrondissant le résultat aux décimales du symbole. Vous devrez également transformer la taille de la cotation de profondeur en unités en la divisant par 100.

Pour vous désabonner des événements de profondeur, vous pouvez toujours utiliser le message ProtoOAUnsubscribeDepthQuotesReq en spécifiant le symbolId et le ctidTraderAccountId. Vous devriez recevoir un message de type ProtoOAUnsubscribeDepthQuotesRes ; ensuite, vous devriez cesser de recevoir des événements de profondeur.