Lewati ke isi

Dapatkan data simbol

Mendapatkan dan menafsirkan data simbol (misalnya, harga buka dan tutup semua bar untuk periode tertentu) sangat penting dalam aplikasi apa pun yang memiliki salah satu fungsi berikut:

  • Chart – untuk membuat chart bar atau garis, Anda perlu mengetahui data bar dan kutipan historis serta live.
  • Statistik pasar – jika Anda ingin menampilkan statistik pasar (seperti perubahan harga harian untuk simbol individu), Anda harus mendapatkan harga historis dan live.
  • Replay – dalam aplikasi Anda, Anda dapat memungkinkan trader untuk kembali ke periode sebelumnya dan trading berdasarkan data historis. Untuk melakukannya, Anda perlu mendapatkan dan memproses data bar dan tick masa lalu.

Dalam tutorial ini, kami akan menunjukkan bagaimana Anda bisa mendapatkan dan memproses data bar dan tick historis serta live, dan kutipan depth live.

Perhatikan bahwa tutorial ini hanya menyediakan cuplikan kode untuk mendapatkan data bar historis. Karena logika intinya tetap sama terlepas dari tindakan yang Anda lakukan, Anda dapat menyesuaikan cuplikan ini untuk mendapatkan jenis data lainnya.

Operasi dengan JSON

Saat beroperasi dengan JSON, Anda masih dapat menggunakan kembali kode dari tutorial ini; namun, Anda perlu sedikit memodifikasinya tergantung pada pendekatan Anda terhadap serialisasi dan deserialisasi.

Dapatkan data bar historis

Untuk menerima data bar historis, lakukan tindakan berikut:

  • Inisialisasi objek yang mewakili pesan ProtoOAGetTrendbarsReq.
  • Isi properti objek dengan ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, count dari trendbar yang akan dikembalikan, serta stempel waktu Unix toTimestamp dan fromTimestamp yang diperlukan.

Batasan stempel waktu

Perhatikan bahwa ada beberapa batasan pada jarak maksimum yang mungkin antara toTimestamp dan fromTimestamp. Batasan ini bergantung pada ProtoOATrendPeriod yang ditentukan. Untuk mempelajari lebih lanjut, klik di sini.

  • Kirim pesan yang baru dibuat dan terima respons dari jenis ProtoOAGetTrendbarsRes. Akses bidang trendbar untuk mendapatkan daftar trend bar.
  • Ubah data dari format relatif ke harga simbol aktual. Untuk melakukannya, pertama-tama dapatkan harga rendah dari trendbar dan bagi dengan 100000. Kemudian, bulatkan hasilnya ke digit simbol (misalnya, dua angka setelah pemisah). Untuk mendapatkan harga tinggi, buka, dan tutup dari trendbar, tambahkan delta trendbar dari masing-masing harga ini ke harga rendah trendbar. Setelah itu, bagi setiap angka dengan 100000 dan bulatkan hasilnya ke digit simbol.

Anda dapat menyelesaikan tindakan ini dengan menggunakan kembali kode di bawah ini.

 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 historis

Untuk menerima data tick historis, lakukan tindakan berikut:

  • Inisialisasi objek yang mewakili pesan ProtoOAGetTickDataReq.
  • Isi properti objek dengan ctidTraderAccountId, symbolId, jenis kutipan type, serta fromTimestamp dan toTimestamp yang diperlukan.

Batasan stempel waktu

Tidak mungkin meminta data tick historis untuk periode lebih dari satu minggu. Oleh karena itu, perbedaan antara toTimestamp dan fromTimestamp yang ditentukan tidak boleh lebih besar dari 604800000.

  • Kirim pesan yang baru dibuat dan terima respons dari jenis ProtoOAGetTickDataRes. Akses bidang tickData untuk mendapatkan daftar elemen dari jenis ProtoOATickData.
  • Ubah data dari format relatif ke harga simbol aktual. Untuk melakukannya, bagi setiap tick dengan 100000 dan bulatkan hasilnya ke digit simbol.

Meminta jumlah tick yang besar

Ada batasan pada jumlah tick yang dapat dikembalikan dalam pesan ProtoOAGetTickDataRes. Jika batasan ini terlampaui (misalnya, ada jumlah tick yang signifikan selama periode yang ditentukan), pesan ProtoOAGetTickDataRes hanya akan menyertakan X tick pertama, di mana X adalah angka yang lebih rendah dari batasan tick. Batasan tepatnya bergantung pada konfigurasi backend cTrader.

Untuk memeriksa apakah ada lebih banyak tick daripada yang dikembalikan dalam pesan yang diterima, gunakan flag hasMore.

Dapatkan data bar live

Untuk menerima bar live, lakukan tindakan berikut:

  • Inisialisasi variabel yang mewakili pesan ProtoOAGetTrendbarsReq.
  • Isi properti objek dengan ctidTraderAccountId, symbolId, ProtoOATrendbarPeriod, count dari trendbar yang akan dikembalikan, serta stempel waktu Unix toTimestamp dan fromTimestamp yang diperlukan.

Batasan stempel waktu

Ada beberapa batasan pada jarak maksimum yang mungkin antara toTimestamp dan fromTimestamp. Batasan ini bergantung pada ProtoOATrendPeriod yang ditentukan. Untuk mempelajari lebih lanjut, klik di sini.

  • Kirim pesan yang baru dibuat dan terima respons dari jenis ProtoOAGetTrendbarsRes. Akses bidang trendbar untuk mendapatkan daftar trend bar.

  • Ubah data dari format relatif ke harga simbol aktual. Untuk melakukannya, pertama-tama dapatkan harga rendah dari trendbar dan bagi dengan 100000. Kemudian, bulatkan hasilnya ke digit simbol (misalnya, dua angka setelah pemisah). Untuk mendapatkan harga tinggi, buka, dan tutup dari trendbar, tambahkan delta trendbar dari masing-masing harga ini ke harga rendah trendbar. Setelah itu, bagi setiap angka dengan 100000 dan bulatkan hasilnya ke digit simbol.

  • Inisialisasi objek yang mewakili pesan ProtoOASubscribeLiveTrendbarReq.

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

  • Lakukan hal yang sama untuk objek yang mewakili pesan ProtoOASubscribeSpotsReq.

  • Kirim pesan ProtoOASubscribeSpotsReq dan ProtoOASubscribeLiveTrendbarReq secara berurutan dan terima respons dari jenis ProtoOASubscribeSpotsRes dan jenis ProtoOASubscribeLiveTrenbarsRes. Pada titik ini, Anda telah berlangganan ke data bar live dan Anda seharusnya menerima pesan dari jenis ProtoOASpotEvent.

Berlangganan ke trendbar live

Berlangganan dengan sukses ke trendbar live pertama-tama memerlukan langganan ke acara spot.

  • Ketika Anda menerima pesan ProtoOASpotEvent baru, gunakan bidang trendbar-nya untuk mendapatkan data dari bar terakhir yang ditutup.
  • Transformasikan data dari format relatif ke harga simbol aktual. Untuk melakukannya, pertama-tama dapatkan harga rendah dari trendbar dan bagi dengan 100000. Kemudian, bulatkan hasilnya ke digit simbol (misalnya, dua angka setelah pemisah). Untuk mendapatkan harga tinggi, buka, dan tutup dari trendbar, tambahkan delta trendbar dari masing-masing harga ini ke harga rendah trendbar. Setelah itu, bagi setiap angka dengan 100000 dan bulatkan hasilnya ke digit simbol.

Untuk berhenti berlangganan data trendbar live, Anda selalu dapat mengirim pesan ProtoOAUnsubscribeLiveTrendbarsReq yang berisi symbolId, period, dan ctidTraderAccountId Anda. Jika permintaan Anda berhasil, Anda akan menerima respons dari tipe ProtoOAUnsubscribeLiveTrenbarRes. Langganan Anda ke spot event akan tetap aktif.

Dapatkan kuotasi live

Untuk menerima kuotasi Bid dan Ask live untuk sebuah simbol, lakukan tindakan berikut:

  • Inisialisasi objek yang mewakili pesan ProtoOASubscribeSpotsReq.
  • Isi properti objek dengan ctidTraderAccountId, symbolId, dan, opsional, bool subscribeToSpotTimestamp.
  • Kirim pesan yang baru dibuat dan terima respons dari tipe ProtoOASubscribeSpotsRes. Pada titik ini, Anda telah berlangganan data kuotasi live dan Anda akan menerima pesan dari tipe ProtoOASpotEvent.
  • Ketika Anda menerima pesan ProtoOASpotEvent baru, akses bidang bid dan ask-nya untuk mendapatkan kuotasi terbaru. Perhatikan bahwa Anda masih harus mengubah data tersebut menjadi nilai harga aktual dengan membaginya dengan 100000 dan membulatkannya ke digit simbol.

Bid dan ask fields

Karena bidang bid dan ask bersifat opsional, Anda mungkin tidak selalu melihat pesan ProtoOASpotEvent di mana keduanya ditentukan.

Untuk berhenti berlangganan data kuotasi, Anda selalu dapat mengirim pesan ProtoOAUnsubscribeSpotsReq yang berisi symbolId dan ctidTraderAccountId Anda. Jika permintaan Anda berhasil, Anda akan menerima respons dari tipe ProtoOAUnsubscribeSpotsRes. Pada titik ini, Anda seharusnya berhenti menerima spot event.

Kuotasi depth

Terakhir namun tidak kalah penting, Anda juga dapat menerima kuotasi depth atau Level II live untuk sebuah simbol. Untuk melakukannya, lakukan tindakan berikut.

Anda dapat berlangganan dan menerima kuotasi depth atau Level II live untuk sebuah simbol dari API.

  • Inisialisasi objek yang mewakili pesan ProtoOASubscribeDepthQuotesReq.
  • Isi properti objek dengan ctidTraderAccountId dan symbolId.
  • Kirim pesan yang baru dibuat dan terima respons dari tipe ProtoOASubscribeDepthQuotesRes. Pada titik ini, Anda telah berlangganan kuotasi depth, yang berarti Anda akan mulai menerima pesan ProtoOADepthEvent.
  • Ketika Anda menerima pesan ProtoOADepthEvent baru, Anda perlu menggunakan bidang newQuotes dan deletedQuotes-nya untuk mendapatkan data depth terbaru. Anda juga perlu mengubah data tersebut menjadi nilai harga aktual dengan membaginya dengan 100000 dan membulatkan hasilnya ke digit simbol. Anda juga perlu mengubah ukuran kuotasi depth menjadi unit dengan membaginya dengan 100.

Untuk berhenti berlangganan depth event, Anda selalu dapat menggunakan pesan ProtoOAUnsubscribeDepthQuotesReq dengan menentukan symbolId dan ctidTraderAccountId. Anda akan menerima pesan dari tipe ProtoOAUnsubscribeDepthQuotesRes; setelah itu, Anda seharusnya berhenti menerima depth event.