Eksekusi order paralel di cTrader
Salah satu fitur yang membuat cTrader menonjol adalah kemampuan untuk menggunakan pemrograman sinkron dan asinkron untuk mengeksekusi order Anda. Anda dapat menggunakan pemrograman sinkron untuk mengimplementasikan strategi yang perlu menunggu hasil eksekusi order sebelum melanjutkan lebih jauh; sebaliknya, pemrograman asinkron paling baik digunakan saat membuat strategi berkecepatan tinggi yang dapat mengirimkan beberapa order secara bersamaan.
Dalam video ini dan artikel terkaitnya, kami akan menjelaskan perbedaan antara eksekusi sinkron dan asinkron dan kami akan menunjukkan kepada Anda cara menggunakan kedua pendekatan ini untuk menempatkan order baru.
Eksekusi order sinkron vs asinkron
Alur dasar
Eksekusi order sinkron dapat dijelaskan dengan menggunakan diagram sederhana. Saat menempatkan order baru secara sinkron, cBot harus menunggu satu order dieksekusi sebelum mengikuti instruksi lainnya. Dengan kata lain, cTrader mengirimkan order ke server, menunggu respons, dan baru kemudian mulai mengeksekusi baris kode berikutnya.
flowchart LR
A([Order 1, 100 ms]) --> B([Order 2, 70 ms]) --> C([Order 3, 80 ms]) --> D([Instruksi berikutnya]) Saat menempatkan order di atas secara sinkron, cBot Anda harus menghabiskan total 250 ms sebelum melanjutkan ke instruksi apa pun yang ditentukan setelah Order 3.
Di sisi lain, eksekusi asinkron memungkinkan cTrader untuk mengirim beberapa order secara paralel tanpa mengharapkan respons dari server. Dengan menggunakan pemrograman asinkron, strategi dapat meminimalkan total waktu yang diperlukan untuk mengeksekusi beberapa order.
flowchart LR
subgraph Orders
direction TB
A([Order 1, 100 ms]) --- B([Order 2, 70 ms]) --- C([Order 3, 80 ms])
end
D([Instruksi berikutnya])
Orders --> D Dalam diagram di atas, ketiga order dikirimkan pada waktu yang sama persis dan cBot tidak menunggu hasil eksekusinya sebelum melanjutkan ke instruksi berikutnya.
Contoh kode
Kita juga dapat menggunakan kode untuk mendemonstrasikan cara kerja eksekusi sinkron.
1 2 3 4 5 6 7 8 9 | |
Jika kita menjalankan cBot dengan kode ini, log akan menunjukkan bahwa jumlah posisi hanya meningkat setelah setiap posisi dieksekusi. Kode tersebut menunggu setiap order dieksekusi sebelum mengirimkan permintaan untuk mengeksekusi order berikutnya.
Untuk beralih ke eksekusi order asinkron, kita dapat menggunakan metode ExecuteMarketOrderAsync.
1 2 3 4 5 6 7 8 9 | |
Kita juga akan menambahkan penangan event untuk mendengarkan event Positions.Opened.
1 2 3 4 5 6 7 8 9 10 | |
Dalam penangan event kita, kita akan mencetak pesan di log segera setelah posisi dibuka serta jumlah posisi terbuka pada saat itu.
Jika kita menjalankan cBot dengan kode ini dan melihat log, kita akan melihat bahwa semua order telah dikirim tanpa menerima konfirmasi tentang hasil instruksi sebelumnya. Penghitung posisi tetap berada di 0 sepanjang waktu. Konfirmasi tiba dan dicetak di log beberapa milidetik setelah semua order dikirim ke server.
Gunakan callback orders
Sekarang kita dapat kembali ke kode sumber kita dan mendemonstrasikan fitur berharga lain dari eksekusi asinkron, yaitu opsi untuk menggunakan metode callback yang dipanggil segera setelah eksekusi order selesai. Kita akan menghapus handler event Positions.Opened kita dan mengimplementasikan metode callback yang mencetak konfirmasi setelah order dieksekusi.
1 2 3 4 5 6 7 8 9 10 11 | |
Kemudian kita akan melewatkan metode ini sebagai argumen ke metode ExecuteMarketOrderAsync.
1 | |
Berbeda dengan pendekatan kita sebelumnya, metode callback akan dipanggil terlepas dari apakah perdagangan berhasil atau tidak, yang juga berarti Anda diberi tahu tentang perdagangan yang tidak berhasil dan dapat bertindak sesuai.
Memantau status eksekusi asinkron
cTrader juga menyediakan alat yang mudah digunakan untuk melacak status perdagangan asinkron. Metode ExecuteMarketOrderAsync mengembalikan objek TradeOperation yang berisi informasi tentang apakah order masih dieksekusi.
Kita dapat mulai dengan mendeklarasikan field baru.
1 | |
Kemudian kita akan menghapus loop for kita, dan menetapkan hasil eksekusi order ke field baru.
1 | |
Kita juga akan menambahkan timer ke cBot kita. Timer akan memeriksa status operasi setiap 100 milidetik.
1 2 | |
Jika operasi masih dieksekusi, timer akan mencetaknya di log.
1 2 3 4 5 6 7 8 | |
Setelah cBot dibangun, kita dapat menguji cara kerjanya pada akun demo. Di log, timer harus mencetak pembaruan rutin tentang status eksekusi asinkron.
Ringkasan
Eksekusi asinkron adalah alat yang kuat yang dapat membuat penempatan order otomatis jauh lebih cepat dibandingkan dengan pemrograman sinkron. Namun, eksekusi sinkron masih dapat digunakan jika Anda perlu mengetahui hasil perdagangan sebelum melanjutkan ke langkah berikutnya. Eksekusi asinkron, di sisi lain, paling baik digunakan ketika Anda perlu mengirim beberapa order secara paralel tanpa penundaan.