Lewati ke isi

Akses jaringan

Panduan ini menjelaskan cara Anda dapat membuat algoritma yang dapat mengakses Internet. Berikut adalah ringkasan satu menit tentang fitur API ini.

Akses jaringan dalam satu menit!

  • Solusi algo Anda dapat mengambil informasi dari situs web berita trading atau API web yang berorientasi Forex. Gunakan fitur ini untuk memastikan bahwa cBot, plugin, dan indikator Anda bereaksi terhadap peristiwa dan informasi penting dalam kehidupan nyata.
  • Dengan menggunakan metode dalam namespace System.Text.Json dan System.Text.Json.Serialization, Anda dapat dengan cepat melakukan serialisasi atau deserialisasi objek ke dan dari file JSON, memungkinkan cBot untuk dengan mudah mengonsumsi endpoint dan memproses informasi berharga.
  • Protokol WebSocket memungkinkan untuk menerima data dari layanan secara real-time alih-alih harus membuat permintaan HTTP setiap kali. Gunakan websocket untuk mengintegrasikan algo Anda dengan sumber daya web secara mulus. Kelas WebSocketClient berisi semua metode dan parameter yang diperlukan untuk menggunakan koneksi websocket.
  • Saat menggunakan websocket, Anda dapat mengirim dan menerima string dan data byte mentah. Bekerja dengan struktur data yang berbeda dan serialisasikan menjadi byte untuk menggunakan layanan pihak ketiga yang berharga.
  • AccessRights.None sudah cukup untuk fungsi jaringan.

HTTP

Antarmuka Http yang baru berisi beberapa metode yang, ketika diimplementasikan, harus memungkinkan cBot dan jenis algoritma lainnya untuk mengakses Internet. Untuk ilustrasi, lihat berikut ini:

  • HttpResponse Http.Get(string uri). Melakukan permintaan GET ke URI yang ditentukan dalam string uri yang dilewatkan dan mengembalikan objek HttpsResponse yang berisi hasil dari permintaan ini.

Kelas HttpsRequest memungkinkan untuk melakukan permintaan yang lebih kompleks termasuk permintaan POST. Untuk melakukan permintaan ini, atur properti HttpsRequest.Method ke salah satu nilai dari enum HttpMethod seperti HttpMethod.Put atau HttpMethod.Patch.

Selanjutnya, properti HttpsRequest.Uri berisi URI ke mana permintaan dikirim sementara properti HttpsRequest.Body dapat digunakan untuk mengatur body permintaan. Lihat di bawah ini untuk contoh bagaimana Anda dapat menggunakan objek HttpsRequest.

  • HttpResponse Http.Send(HttpRequest request). Melakukan permintaan ke URI yang ditentukan sebagai nilai properti request.Uri dari objek HttpsRequest yang dilewatkan ke metode ini. Setelah itu, mengembalikan objek HttpsResponse yang berisi hasil dari permintaan ini. Jenis permintaan diatur sebagai nilai properti equest.Method.

Akses jaringan dalam backtesting dan optimisasi

Semua metode dalam antarmuka Http berfungsi sebagaimana dimaksud dalam backtesting dan optimisasi. Perhatikan bahwa, ketika mengakses sumber daya web dalam backtesting atau optimisasi, versi terbaru dari sumber daya ini akan diminta alih-alih yang historis.

Buat contoh cBot

Lakukan permintaan GET

Kita akan membuat cBot sederhana yang melakukan tindakan berikut:

  • Mengirim permintaan GET dan mengakses file JSON melalui API di https://forexApiExample.com/v1/exchangerate (perhatikan bahwa API ini sepenuhnya palsu).
  • Jika respons GET berhasil, cBot melakukan deserialisasi body respons menjadi objek dari kelas SymbolPrice kustom (kami telah membuat kelas ini untuk tujuan demonstrasi).
  • Menempatkan order limit jual untuk simbol pada harga yang sedikit lebih tinggi dari harga yang ditentukan dalam API.

Perhatikan bahwa cBot ini sepenuhnya dibuat-buat. Meskipun kodenya akan terkompilasi, itu tidak akan melakukan tindakan yang berarti.

Cara melakukan serialisasi atau deserialisasi string dari file JSON

Kode cBot kami mencakup dua pernyataan using penting, yaitu System.Text.Json dan System.Text.Json.Serialization. Namespace ini berisi beberapa metode yang memungkinkan untuk dengan mudah melakukan serialisasi dan deserialisasi string dari file JSON seperti JsonSerializer.Deserialize<T>().

Berikut adalah kode contoh cBot kami:

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTest : Robot
    {

        protected override void OnStart()
        {

            var responseToGet = Http.Get("https://forexApiExample.com/v1/exchangerate");

            if (responseToGet.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(responseToGet.Body);
                var result = PlaceLimitOrder(TradeType.Sell, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate + 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

Jika cBot ini mengakses API yang nyata, itu akan berhasil melakukannya.

Lakukan permintaan POST

Kita juga dapat membuat cBot yang lebih canggih yang mencapai tujuan berikut:

  • Mengirim permintaan POST ke API palsu yang sama di https://anotherForexApiExample.com/commodities/v1/getaccesstoken. Ini dilakukan untuk mendapatkan token akses untuk API ini.
  • Menyimpan token dari body respons dalam variabel token.
  • Melakukan permintaan GET ke API yang sama dengan nilai variabel token dilewatkan sebagai parameter query dalam URI (https://anotherForexApiExample.com/commodities/v1/getprices).
  • Menggunakan serialisasi JSON (dibahas di atas), menempatkan order stop beli pada harga yang sedikit lebih rendah dari harga yang diterima dari API.

Sekali lagi, perhatikan bahwa cBot ini tidak akan melakukan tindakan yang berarti ketika dikompilasi. Ini ada hanya untuk tujuan contoh.

 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
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTestTwo : Robot
    {

        protected override void OnStart()
        {
            var uriForAccessToken = new Uri("https://anotherForexApiExample.com/commodities/v1/getaccesstoken");

            var postRequest = new HttpRequest(uriForAccessToken);

            postRequest.Method = HttpMethod.Post;

            var responseToPost = Http.Send(postRequest);

            var token = responseToPost.Body;

            var response = Http.Get($"https://anotherForexApiExample.com/commodities/v1/getprices?token={token}");

            if (response.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(response.Body);

                var result = PlaceStopOrder(TradeType.Buy, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate - 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

Klien WebSocket

Algo API memungkinkan siapa saja untuk menggunakan berbagai layanan dan sumber daya web menggunakan koneksi websocket. Dibandingkan dengan protokol HTTP yang digunakan dalam fitur akses jaringan, protokol WebSocket lebih cepat dan memungkinkan untuk menerima data secara real-time.

Gunakan klien WebSocket

Menggunakan klien WebSocket itu sederhana:

  1. Pilih layanan yang mengekspos endpoint untuk koneksi websocket
  2. Inisialisasi objek dari kelas WebSocketClientOptions dan tentukan parameternya untuk mengonfigurasi klien Anda.
  3. Inisialisasi objek dari kelas WebSocketClient dan lewatkan opsi yang sebelumnya dibuat ke konstruktor.
  4. Gunakan metode Connect() untuk terhubung ke sumber daya yang Anda pilih dan kirim data melalui metode Send().
  5. Gunakan penangan acara TextReceived() dan BinaryReceived() untuk mengatur apa yang harus dilakukan algo Anda ketika klien WebSocket menerima data baru.

Di bawah ini, kita akan membuat cBot sederhana yang terhubung ke layanan berita ekonomi imajiner melalui websocket. Ketika sebuah berita baru diposting tentang simbol yang saat ini terpasang pada cBot, algo akan menampilkan kotak pesan yang berisi teks berita.

Catatan

cBot ini hanya untuk tujuan contoh. Meskipun berhasil dikompilasi, itu tidak melakukan tindakan apa pun ketika dipasang pada grafik.

 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
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class ExampleWebSocketBot : Robot
    {

        private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions 
        {
            KeepAliveInterval = new TimeSpan(0, 1, 30),
            UseDefaultCredentials = true,
        };
        private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions);
        private readonly Uri _targetUri = new Uri("ws://amazingnews.com:8000");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);
            _webSocketClient.Send("Hello");
            _webSocketClient.TextReceived += NewsReceived;
        }

        protected override void OnStop()
        {
            _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);
        }

        private void NewsReceived(WebSocketClientTextReceivedEventArgs args) 
        {
            if (args.Text.Contains(SymbolName)) 
            {
                MessageBox.Show(args.Text, "News!", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
            }
        }
    }
}

Seperti yang Anda lihat, kode kita cukup ringkas karena kita dapat menangani acara WebSocketClient.TextReceived untuk menampilkan kotak pesan. Perhatikan bahwa cBot kita tidak secara aktif meminta informasi dari layanan. Sebaliknya, ia secara dinamis bereaksi terhadap informasi baru yang diberikan kepadanya.

Peringatan

Ketika klien websocket Anda terputus karena alasan apa pun (seperti kesalahan sisi server yang menyebabkan interval keep-alive terlampaui), Anda perlu memanggil metode WebSocketClient.Connect() lagi. Untuk menangani kasus seperti itu secara programatik, gunakan acara WebSocketClient.Disconnected.

Manfaat WebSocket

Karena websocket memungkinkan untuk bereaksi terhadap data baru dari web secara real-time, ini sangat cocok untuk integrasi dengan layanan pihak ketiga yang dapat secara otonom memberi tahu algo Anda tentang sesuatu. Berikut beberapa contoh sumber daya web yang dapat Anda gunakan dengan klien WebSocket.

  • Kalender berita ekonomi. Ketika sebuah berita baru dirilis, algo Anda dapat menampilkan kotak pesan dengan informasi kunci.
  • Layanan AI generatif. Ketika layanan AI mulai memberikan respons terhadap prompt, Anda dapat menampilkan hasilnya kata demi kata daripada harus menunggu respons lengkap.
  • Aliran harga untuk semua simbol yang berkorelasi dengan simbol yang terhubung dengan algo. Ketika harga diperbarui, mereka segera dan akurat ditampilkan kepada pengguna algo.
  • Jaringan media sosial yang berfokus pada trading. Ketika pesan baru diposting tentang simbol tertentu, algo dapat menampilkan isinya kepada pengguna.

Secara umum, koneksi websocket menawarkan manfaat berikut dibandingkan dengan HTTPS biasa:

  • Koneksi WebSocket lebih efisien. Setiap permintaan HTTP harus berisi data tambahan seperti header. Dengan websocket, koneksi Anda hanya dibuat sekali, setelah itu tidak perlu mengirim data yang berlebihan.
  • Koneksi WebSocket menawarkan konkurensi yang lebih baik. Tidak perlu menghentikan operasi algo sampai Anda menunggu respons setelah mengirim permintaan HTTP. Dengan websocket, Anda dapat mengirim dan menerima data kapan saja dan menanganinya secara asinkron.

Klien WebSocket memungkinkan semua jenis algo untuk berinteraksi secara dinamis dengan sumber daya web; interaksi ini lebih cepat dan lebih efisien dibandingkan dengan menggunakan HTTP. Gunakan klien WebSocket untuk membangun algo yang kuat yang terintegrasi dengan layanan pihak ketiga.

Akses jaringan dan properti AccessRights

Singkatnya, enum AccessRights menentukan apakah algoritma memiliki akses ke data yang eksternal terhadap cTrader seperti sistem file mesin lokal Anda. Anda dapat mempelajari lebih lanjut di tutorial ini.

Mengatur AccessRights ke AccessRights.FullAccess memungkinkan algo untuk melakukan operasi lanjutan (seperti mencari informasi dari registry Windows). Namun, pengguna akhir mungkin menganggap memberikan akses penuh kepada cBot atau indikator berisiko karena dapat menyebabkan kebocoran data.

Akibatnya, AccessRights.None biasanya merupakan opsi yang paling masuk akal jika Anda ingin berbagi produk algo Anda dengan orang lain. Namun, bahkan jika Anda memilih opsi ini, produk cTrader Anda bebas mengakses web. Penambahan fungsi akses jaringan ke API Algo cTrader berarti cBot tidak lagi memerlukan properti AccessRights diatur ke AccessRights.FullAccess untuk bekerja dengan sumber daya di Internet.

Ini sangat memperluas peluang yang dimiliki pengembang algo saat mengkodekan produk cTrader yang mereka ingin distribusikan ke trader lain.

Ringkasan

Kesimpulannya, akses jaringan adalah fitur yang kuat yang memungkinkan untuk sangat memperluas jumlah operasi yang dapat dilakukan algoritma Anda tanpa menimbulkan risiko tambahan.