Langkau tajuk talian

Dapatkan data simbol

Mendapatkan dan mentafsir data simbol (contohnya, harga buka dan tutup semua bar untuk tempoh tertentu) adalah penting dalam mana-mana aplikasi yang mempunyai mana-mana fungsi berikut:

  • Carta – untuk membina carta bar atau garis, anda perlu mengetahui data bar dan sebut harga sejarah dan langsung.
  • Statistik pasaran – jika anda ingin memaparkan statistik pasaran (seperti perubahan harga harian untuk simbol individu), anda perlu mendapatkan harga sejarah dan langsung.
  • Ulang tayang – dalam aplikasi anda, anda mungkin membenarkan pedagang kembali ke tempoh sebelumnya dan berdagang berdasarkan data sejarah. Untuk berbuat demikian, anda perlu mendapatkan dan memproses data bar dan tik lalu.

Dalam tutorial ini, kami akan menunjukkan bagaimana anda boleh mendapatkan dan memproses data bar dan tik sejarah dan langsung, dan sebut harga kedalaman langsung.

Perhatikan bahawa tutorial ini hanya menyediakan coretan kod untuk mendapatkan data bar sejarah. Oleh kerana logik teras tetap sama tanpa mengira tindakan yang anda lakukan, anda boleh menyesuaikan coretan ini untuk mendapatkan jenis data lain.

Operasi dengan JSON

Apabila beroperasi dengan JSON, anda masih boleh menggunakan semula kod dari tutorial ini; walau bagaimanapun, anda perlu mengubahnya sedikit bergantung pada pendekatan anda terhadap serialisasi dan penyahserialan.

Dapatkan data bar sejarah

Untuk menerima data bar sejarah, lakukan tindakan berikut:

  • Mulakan objek yang mewakili mesej ProtoOAGetTrendbarsReq.
  • Isi sifat objek dengan ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, count trendbar untuk dikembalikan dan cap waktu Unix toTimestamp dan fromTimestamp.

Kekangan Timestamp

Perhatikan bahawa terdapat beberapa kekangan pada jarak maksimum yang mungkin antara toTimestamp dan fromTimestamp. Kekangan ini bergantung pada ProtoOATrendPeriod yang ditentukan. Untuk mengetahui lebih lanjut, klik di sini.

  • Hantar mesej yang baru dibuat dan terima respons jenis ProtoOAGetTrendbarsRes. Akses medan trendbar untuk mendapatkan senarai bar trend.
  • Tukar data dari format relatif kepada harga simbol sebenar. Untuk melakukannya, pertama, dapatkan harga rendah trendbar dan bahagikannya dengan 100000. Kemudian, bulatkan hasil kepada digit simbol (contohnya, dua nombor selepas pemisah). Untuk mendapatkan harga tinggi, buka dan tutup trendbar, tambahkan delta trendbar bagi setiap harga ini kepada harga rendah trendbar. Selepas itu, bahagikan setiap nombor dengan 100000 dan bulatkan hasil kepada digit simbol.

Anda boleh melengkapkan tindakan ini dengan menggunakan semula kod di bawah.

 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

Dapatkan data tick sejarah

Untuk menerima data tick sejarah, lakukan tindakan berikut:

  • Mulakan objek yang mewakili mesej ProtoOAGetTickDataReq.
  • Isi sifat objek dengan ctidTraderAccountId, symbolId, jenis petikan type serta fromTimestamp dan toTimestamp yang diperlukan.

Kekangan Timestamp

Adalah mustahil untuk meminta data tick sejarah untuk tempoh lebih daripada satu minggu. Oleh itu, perbezaan antara toTimestamp dan fromTimestamp yang ditentukan tidak boleh lebih besar daripada 604800000.

  • Hantar mesej yang baru dibuat dan terima respons jenis ProtoOAGetTickDataRes. Akses medan tickData untuk mendapatkan senarai elemen jenis ProtoOATickData.
  • Tukar data dari format relatif kepada harga simbol sebenar. Untuk melakukannya, bahagikan setiap tick dengan 100000 dan bulatkan hasil kepada digit simbol.

Meminta bilangan tick yang besar

Terdapat had pada bilangan tick yang boleh dikembalikan dalam mesej ProtoOAGetTickDataRes. Jika had ini dilampaui (contohnya, terdapat bilangan tick yang signifikan dalam tempoh yang ditentukan), mesej ProtoOAGetTickDataRes hanya akan termasuk X tick pertama, di mana X ialah nombor yang lebih rendah daripada had tick. Had tepat bergantung pada konfigurasi sistem bahagian belakang cTrader.

Untuk menyemak jika terdapat lebih banyak tick daripada yang telah dikembalikan dalam mesej yang diterima, gunakan bendera hasMore.

Dapatkan data bar langsung

Untuk menerima bar langsung, lakukan tindakan berikut:

  • Mulakan pembolehubah yang mewakili mesej ProtoOAGetTrendbarsReq.
  • Isi sifat objek dengan ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, count bar trend untuk dikembalikan, serta toTimestamp dan fromTimestamp timestamp Unix.

Kekangan Timestamp

Terdapat beberapa kekangan pada jarak maksimum yang mungkin antara toTimestamp dan fromTimestamp. Kekangan ini bergantung pada ProtoOATrendPeriod yang ditentukan. Untuk mengetahui lebih lanjut, klik di sini.

  • Hantar mesej yang baru dibuat dan terima respons jenis ProtoOAGetTrendbarsRes. Akses medan trendbar untuk mendapatkan senarai bar trend.

  • Tukar data dari format relatif kepada harga simbol sebenar. Untuk melakukannya, pertama dapatkan harga rendah trendbar dan bahagikannya dengan 100000. Kemudian, bulatkan hasil kepada digit simbol (contohnya, dua nombor selepas pemisah). Untuk mendapatkan harga tinggi, buka dan tutup trendbar, tambahkan delta trendbar bagi setiap harga ini kepada harga rendah trendbar. Selepas itu, bahagikan setiap nombor dengan 100000 dan bulatkan hasil kepada digit simbol.

  • Mulakan objek yang mewakili mesej ProtoOASubscribeLiveTrendbarReq.

  • Isi sifat objek dengan ctidTraderAccountId, ProtoOATrendbarPeriod dan symbolId yang diperlukan.

  • Lakukan perkara yang sama untuk objek yang mewakili mesej ProtoOASubscribeSpotsReq.

  • Hantar mesej ProtoOASubscribeSpotsReq dan mesej ProtoOASubscribeLiveTrendbarReq dalam urutan itu dan terima respons jenis ProtoOASubscribeSpotsRes dan ProtoOASubscribeLiveTrenbarsRes. Pada ketika ini, anda telah melanggan data bar langsung dan anda sepatutnya menerima mesej jenis ProtoOASpotEvent.

Langgan bar trend langsung

Berjaya melanggan bar trend langsung memerlukan langganan terlebih dahulu kepada peristiwa spot.

  • Apabila anda menerima mesej ProtoOASpotEvent yang baru, gunakan medan trendbar untuk mendapatkan data bagi bar terakhir yang ditutup.
  • Tukar data daripada format relatif kepada harga simbol sebenar. Untuk melakukannya, pertama, dapatkan harga rendah trendbar dan bahagikannya dengan 100000. Kemudian, bulatkan hasil kepada digit simbol (contohnya, dua nombor selepas pemisah). Untuk mendapatkan harga tinggi, buka dan tutup trendbar, tambahkan delta trendbar bagi setiap harga ini kepada harga rendah trendbar. Selepas itu, bahagikan setiap nombor dengan 100000 dan bulatkan hasil kepada digit simbol.

Untuk berhenti melanggan data trendbar langsung, anda boleh menghantar mesej ProtoOAUnsubscribeLiveTrendbarsReq yang mengandungi symbolId, period dan ctidTraderAccountId anda. Jika permintaan anda berjaya, anda sepatutnya menerima respons jenis ProtoOAUnsubscribeLiveTrenbarRes. Langganan anda kepada acara spot akan kekal.

Dapatkan sebut harga langsung

Untuk menerima sebut harga bida dan tanya langsung bagi sesuatu simbol, lakukan tindakan berikut:

  • Mulakan objek yang mewakili mesej ProtoOASubscribeSpotsReq.
  • Isi sifat objek dengan ctidTraderAccountId, symbolId, dan, secara pilihan, bool subscribeToSpotTimestamp.
  • Hantar mesej yang baru dibuat dan terima respons jenis ProtoOASubscribeSpotsRes. Pada ketika ini, anda telah melanggan data sebut harga langsung dan anda sepatutnya menerima mesej jenis ProtoOASpotEvent.
  • Apabila anda menerima mesej ProtoOASpotEvent yang baru, akses medan bid dan ask untuk mendapatkan sebut harga terkini. Perhatikan bahawa anda masih perlu menukar data kepada nilai harga sebenar dengan membahagikannya dengan 100000 dan membulatkannya kepada digit simbol.

Medan bida dan tanya

Memandangkan medan bid dan ask adalah pilihan, anda mungkin tidak semestinya melihat mesej ProtoOASpotEvent di mana kedua-duanya dinyatakan.

Untuk berhenti melanggan data sebut harga, anda boleh menghantar mesej ProtoOAUnsubscribeSpotsReq yang mengandungi symbolId dan ctidTraderAccountId anda. Jika permintaan anda berjaya, anda sepatutnya menerima respons jenis ProtoOAUnsubscribeSpotsRes. Pada ketika ini, anda sepatutnya berhenti menerima acara spot.

Sebut harga kedalaman

Akhir sekali, anda juga boleh menerima sebut harga kedalaman atau Level II langsung bagi sesuatu simbol. Untuk melakukannya, lakukan tindakan berikut.

Anda boleh melanggan dan menerima sebut harga kedalaman atau Level II langsung bagi sesuatu simbol daripada API.

  • Mulakan objek yang mewakili mesej ProtoOASubscribeDepthQuotesReq.
  • Isi sifat objek dengan ctidTraderAccountId dan symbolId.
  • Hantar mesej yang baru dibuat dan terima respons jenis ProtoOASubscribeDepthQuotesRes. Pada ketika ini, anda telah melanggan sebut harga kedalaman, bermakna anda sepatutnya mula menerima mesej ProtoOADepthEvent.
  • Apabila anda menerima mesej ProtoOADepthEvent yang baru, anda perlu menggunakan medan newQuotes dan deletedQuotes untuk mendapatkan data kedalaman terkini. Anda juga perlu menukar data kepada nilai harga sebenar dengan membahagikannya dengan 100000 dan membulatkan hasil kepada digit simbol. Anda juga perlu menukar saiz sebut harga kedalaman kepada unit dengan membahagikannya dengan 100.

Untuk berhenti melanggan acara kedalaman, anda boleh menggunakan mesej ProtoOAUnsubscribeDepthQuotesReq sambil menyatakan symbolId dan ctidTraderAccountId. Anda sepatutnya menerima mesej jenis ProtoOAUnsubscribeDepthQuotesRes; selepas itu, anda sepatutnya berhenti menerima acara kedalaman.