Ana içeriğe geç

Sembol verilerini alın

Sembol verilerini (örneğin belirli bir dönemdeki tüm barların açılış ve kapanış fiyatlarını) almak ve yorumlamak, aşağıdaki işlevlerden herhangi birini içeren uygulamalar için temel öneme sahiptir:

  • Grafikler – bar veya çizgi grafikleri oluşturmak için hem geçmiş hem de canlı bar ve kotasyon verilerini bilmeniz gerekir.
  • Piyasa istatistikleri – piyasa istatistiklerini (örneğin her sembol için günlük fiyat değişikliklerini) göstermek istiyorsanız hem geçmiş hem de canlı fiyatları almanız gerekir.
  • Yeniden oynatmalar – uygulamanızda trader'ların önceki bir döneme dönerek geçmiş veriler üzerinde alım satım yapmasına olanak tanıyabilirsiniz. Bunun için geçmiş bar ve tick verilerini alıp işlemeniz gerekir.

Bu eğitimde geçmiş ve canlı bar ve tick verilerinin yanı sıra canlı derinlik kotasyonlarını nasıl alıp işleyebileceğinizi göstereceğiz.

Bu eğitimin yalnızca geçmiş bar verilerini almaya yönelik bir kod parçacığı sunduğunu unutmayın. Temel mantık gerçekleştirdiğiniz işlemden bağımsız olarak aynı kaldığından bu kod parçacığını diğer veri türlerini almak için uyarlayabilirsiniz.

JSON ile çalışma

JSON ile çalışırken bu eğitimdeki kodu yine kullanabilirsiniz; ancak serileştirme ve seriden çıkarma yaklaşımınıza bağlı olarak kodu biraz değiştirmeniz gerekir.

Geçmiş bar verilerini alın

Geçmiş bar verilerini almak için aşağıdaki işlemleri gerçekleştirin:

  • ProtoOAGetTrendbarsReq mesajını temsil eden bir nesne başlatın.
  • Nesne özelliklerini gerekli ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, döndürülecek trend barlarının count değeri ve toTimestamp ile fromTimestamp Unix zaman damgalarıyla doldurun.

Zaman damgası kısıtlamaları

toTimestamp ile fromTimestamp arasındaki mümkün olan en büyük mesafeye ilişkin bazı kısıtlamalar olduğunu unutmayın. Bu kısıtlamalar belirtilen ProtoOATrendPeriod değerine bağlıdır. Daha fazla bilgi için buraya tıklayın.

  • Yeni oluşturulan mesajı gönderin ve ProtoOAGetTrendbarsRes türünde bir yanıt alın. Trend barlarının listesini almak için trendbar alanına erişin.
  • Verileri göreli formattan gerçek sembol fiyatına dönüştürün. Bunun için önce bir trend barının düşük fiyatını alın ve 100000'e bölün. Ardından sonucu sembolün basamak sayısına göre yuvarlayın (örneğin ayırıcıdan sonra iki basamak). Bir trend barının yüksek, açılış ve kapanış fiyatlarını almak için bu fiyatların her birinin trend barı deltasını trend barının düşük fiyatına ekleyin. Ardından her sayıyı 100000'e bölün ve sonucu sembolün basamak sayısına göre yuvarlayın.

Aşağıdaki kodu yeniden kullanarak bu işlemleri tamamlayabilirsiniz.

 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

Geçmiş tick verilerini alın

Geçmiş tick verilerini almak için aşağıdaki işlemleri gerçekleştirin:

  • ProtoOAGetTickDataReq mesajını temsil eden bir nesne başlatın.
  • Nesne özelliklerini gerekli ctidTraderAccountId, symbolId, kotasyon type değeri ile fromTimestamp ve toTimestamp değerleriyle doldurun.

Zaman damgası kısıtlamaları

Bir haftadan uzun bir dönem için geçmiş tick verileri talep edilemez. Bu nedenle belirtilen toTimestamp ile fromTimestamp arasındaki fark 604800000 değerinden büyük olmamalıdır.

  • Yeni oluşturulan mesajı gönderin ve ProtoOAGetTickDataRes türünde bir yanıt alın. ProtoOATickData türündeki öğelerin listesini almak için tickData alanına erişin.
  • Verileri göreli formattan gerçek sembol fiyatına dönüştürün. Bunun için her tick'i 100000'e bölün ve sonucu sembolün basamak sayısına göre yuvarlayın.

Çok sayıda tick talep etme

Bir ProtoOAGetTickDataRes mesajında döndürülebilecek tick sayısı sınırlıdır. Bu sınır aşılırsa (örneğin belirtilen dönemde çok sayıda tick oluşmuşsa) ProtoOAGetTickDataRes mesajı yalnızca ilk X tick'i içerir; burada X, tick sınırından düşük bir sayıdır. Kesin sınır cTrader arka ucunun yapılandırmasına bağlıdır.

Alınan mesajda döndürülenden daha fazla tick olup olmadığını kontrol etmek için hasMore işaretini kullanın.

Canlı bar verilerini alın

Canlı barları almak için aşağıdaki işlemleri gerçekleştirin:

  • ProtoOAGetTrendbarsReq mesajını temsil eden bir değişken başlatın.
  • Nesne özelliklerini gerekli ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, döndürülecek trend barlarının count değeri ile toTimestamp ve fromTimestamp Unix zaman damgalarıyla doldurun.

Zaman damgası kısıtlamaları

toTimestamp ile fromTimestamp arasındaki mümkün olan en büyük mesafeye ilişkin bazı kısıtlamalar vardır. Bu kısıtlamalar belirtilen ProtoOATrendPeriod değerine bağlıdır. Daha fazla bilgi için buraya tıklayın.

  • Yeni oluşturulan mesajı gönderin ve ProtoOAGetTrendbarsRes türünde bir yanıt alın. Trend barlarının listesini almak için trendbar alanına erişin.

  • Verileri göreli formattan gerçek sembol fiyatına dönüştürün. Bunun için önce bir trend barının düşük fiyatını alın ve 100000'e bölün. Ardından sonucu sembolün basamak sayısına göre yuvarlayın (örneğin ayırıcıdan sonra iki basamak). Bir trend barının yüksek, açılış ve kapanış fiyatlarını almak için bu fiyatların her birinin trend barı deltasını trend barının düşük fiyatına ekleyin. Ardından her sayıyı 100000'e bölün ve sonucu sembolün basamak sayısına göre yuvarlayın.

  • ProtoOASubscribeLiveTrendbarReq mesajını temsil eden bir nesne başlatın.

  • Nesne özelliklerini gerekli ctidTraderAccountId, ProtoOATrendbarPeriod ve symbolId değerleriyle doldurun.

  • ProtoOASubscribeSpotsReq mesajını temsil eden bir nesne için de aynısını yapın.

  • Sırasıyla ProtoOASubscribeSpotsReq ve ProtoOASubscribeLiveTrendbarReq mesajlarını gönderin ve ProtoOASubscribeSpotsRes ile ProtoOASubscribeLiveTrenbarsRes türlerinde yanıtlar alın. Bu aşamada canlı bar verilerine abone olmuş olursunuz ve ProtoOASpotEvent türünde mesajlar almaya başlamanız gerekir.

Canlı trend barlarına abone olma

Canlı trend barlarına başarılı şekilde abone olmak için önce spot olaylarına abone olmanız gerekir.

  • Yeni bir ProtoOASpotEvent mesajı aldığınızda son kapanan barın verilerini almak için trendbar alanını kullanın.
  • Verileri göreli formattan gerçek sembol fiyatlarına dönüştürün. Bunun için önce bir trend barının düşük fiyatını alın ve 100000'e bölün. Ardından sonucu sembolün basamak sayısına göre yuvarlayın (örneğin ayırıcıdan sonra iki basamak). Bir trend barının yüksek, açılış ve kapanış fiyatlarını almak için bu fiyatların her birinin trend barı deltasını trend barının düşük fiyatına ekleyin. Ardından her sayıyı 100000'e bölün ve sonucu sembolün basamak sayısına göre yuvarlayın.

Canlı trend barı verileri aboneliğini iptal etmek için symbolId, period ve ctidTraderAccountId değerlerinizi içeren ProtoOAUnsubscribeLiveTrendbarsReq mesajını istediğiniz zaman gönderebilirsiniz. İsteğiniz başarılı olursa ProtoOAUnsubscribeLiveTrenbarRes türünde bir yanıt almanız gerekir. Spot olayları aboneliğiniz devam eder.

Canlı kotasyonları alın

Bir sembol için canlı satış ve alış kotasyonlarını almak üzere aşağıdaki işlemleri gerçekleştirin:

  • ProtoOASubscribeSpotsReq mesajını temsil eden bir nesne başlatın.
  • Nesne özelliklerini ctidTraderAccountId, symbolId ve isteğe bağlı olarak subscribeToSpotTimestamp bool değeriyle doldurun.
  • Yeni oluşturulan mesajı gönderin ve ProtoOASubscribeSpotsRes türünde bir yanıt alın. Bu aşamada canlı kotasyon verilerine abone olmuş olursunuz ve ProtoOASpotEvent türünde mesajlar almaya başlamanız gerekir.
  • Yeni bir ProtoOASpotEvent mesajı aldığınızda en güncel kotasyonları almak için bid ve ask alanlarına erişin. Verileri gerçek fiyat değerine dönüştürmek için yine de 100000'e bölmeniz ve sembolün basamak sayısına göre yuvarlamanız gerektiğini unutmayın.

Satış ve alış alanları

bid ve ask alanları isteğe bağlı olduğundan her ikisinin de belirtildiği ProtoOASpotEvent mesajlarını her zaman görmeyebilirsiniz.

Kotasyon verileri aboneliğini iptal etmek için symbolId ve ctidTraderAccountId değerlerinizi içeren ProtoOAUnsubscribeSpotsReq mesajını istediğiniz zaman gönderebilirsiniz. İsteğiniz başarılı olursa ProtoOAUnsubscribeSpotsRes türünde bir yanıt almanız gerekir. Bu noktadan sonra spot olaylarını almamanız gerekir.

Derinlik kotasyonları

Ayrıca bir sembol için canlı derinlik veya Level II kotasyonları da alabilirsiniz. Bunun için aşağıdaki işlemleri gerçekleştirin.

API'den bir sembol için canlı derinlik veya Level II kotasyonlarına abone olabilir ve bunları alabilirsiniz.

  • ProtoOASubscribeDepthQuotesReq mesajını temsil eden bir nesne başlatın.
  • Nesne özelliklerini ctidTraderAccountId ve symbolId değerleriyle doldurun.
  • Yeni oluşturulan mesajı gönderin ve ProtoOASubscribeDepthQuotesRes türünde bir yanıt alın. Bu aşamada derinlik kotasyonlarına abone olmuş olursunuz; dolayısıyla ProtoOADepthEvent mesajlarını almaya başlamanız gerekir.
  • Yeni bir ProtoOADepthEvent mesajı aldığınızda en güncel derinlik verilerini almak için newQuotes ve deletedQuotes alanlarını kullanmanız gerekir. Ayrıca verileri 100000'e bölüp sonucu sembolün basamak sayısına göre yuvarlayarak gerçek fiyat değerine dönüştürmeniz gerekir. Derinlik kotasyonu büyüklüğünü de 100'e bölerek birimlere dönüştürmeniz gerekir.

Derinlik olayları aboneliğini iptal etmek için symbolId ve ctidTraderAccountId değerlerini belirterek ProtoOAUnsubscribeDepthQuotesReq mesajını istediğiniz zaman kullanabilirsiniz. ProtoOAUnsubscribeDepthQuotesRes türünde bir mesaj almanız gerekir; ardından derinlik olaylarını almamaya başlamanız gerekir.