Langkau tajuk talian

Akses rangkaian

Panduan ini menentukan cara anda boleh mencipta algoritma yang boleh mengakses Internet. Di bawah ialah ringkasan satu minit ciri API ini.

Akses rangkaian dalam satu minit!

  • Penyelesaian algo anda boleh mendapatkan maklumat daripada laman web berita dagangan atau API web berorientasikan Forex. Gunakan ciri ini untuk memastikan cBot, plugin dan indikator anda bertindak balas terhadap peristiwa dan maklumat semasa yang mendesak.
  • Dengan menggunakan kaedah dalam ruang nama System.Text.Json dan System.Text.Json.Serialization, anda boleh menyerialisasi atau menyahserialisasi objek dengan cepat kepada dan daripada fail JSON, membolehkan cBot menggunakan titik akhir dengan mudah dan memproses maklumat berharga.
  • Protokol WebSocket membolehkan penerimaan data daripada perkhidmatan dalam masa nyata tanpa perlu membuat permintaan HTTP setiap kali. Gunakan websocket untuk mengintegrasikan algo anda dengan sumber web dengan lancar. Kelas WebSocketClient mengandungi semua kaedah dan parameter yang diperlukan untuk menggunakan sambungan websocket.
  • Apabila menggunakan websocket, anda boleh menghantar dan menerima rentetan dan data bait mentah. Bekerja dengan struktur data yang berbeza dan menyerialisasikannya kepada bait untuk menggunakan perkhidmatan pihak ketiga yang berharga.
  • AccessRights.None adalah mencukupi untuk fungsi rangkaian.

HTTP

Antara muka Http baharu mengandungi beberapa kaedah yang, apabila dilaksanakan, sepatutnya membolehkan cBot dan jenis algoritma lain untuk mengakses Internet. Untuk ilustrasi, lihat yang berikut:

  • HttpResponse Http.Get(string uri). Melaksanakan permintaan GET kepada URI yang dinyatakan dalam rentetan uri yang dihantar dan mengembalikan objek HttpsResponse yang mengandungi hasil permintaan ini.

Kelas HttpsRequest membolehkan pelaksanaan permintaan yang lebih kompleks termasuk permintaan POST. Untuk melaksanakan permintaan ini, tetapkan sifat HttpsRequest.Method kepada salah satu nilai enum HttpMethod seperti HttpMethod.Put atau HttpMethod.Patch.

Seterusnya, sifat HttpsRequest.Uri mengandungi URI yang dihantar permintaan manakala sifat HttpsRequest.Body boleh digunakan untuk menetapkan badan permintaan. Lihat di bawah untuk contoh bagaimana anda boleh menggunakan objek HttpsRequest.

  • HttpResponse Http.Send(HttpRequest request). Melaksanakan permintaan kepada URI yang dinyatakan sebagai nilai sifat request.Uri objek HttpsRequest yang dihantar ke dalam kaedah ini. Selepas itu, mengembalikan objek HttpsResponse yang mengandungi hasil permintaan ini. Jenis permintaan ditetapkan sebagai nilai sifat equest.Method.

Akses rangkaian dalam pengujian balik dan pengoptimuman

Semua kaedah dalam antara muka Http berfungsi seperti yang dimaksudkan dalam pengujian balik dan pengoptimuman. Perhatikan bahawa, apabila mengakses sumber web dalam pengujian balik atau pengoptimuman, versi terkini sumber ini akan diminta dan bukannya yang bersejarah.

Cipta contoh cBot

Laksanakan permintaan GET

Kita akan mencipta cBot ringkas yang melaksanakan tindakan berikut:

  • Menghantar permintaan GET dan mengakses fail JSON melalui API di https://forexApiExample.com/v1/exchangerate (perhatikan bahawa API ini adalah palsu sepenuhnya).
  • Jika respons GET berjaya, cBot menyahserialisasi badan respons kepada objek kelas SymbolPrice tersuai (kami telah mencipta kelas ini untuk tujuan demonstrasi).
  • Meletakkan pesanan had jualan untuk simbol pada harga yang sedikit lebih tinggi daripada harga yang dinyatakan dalam API.

Perhatikan bahawa cBot ini adalah rekaan sepenuhnya. Walaupun kod akan dibina, ia tidak akan melaksanakan sebarang tindakan yang bermakna.

Cara menyerialisasi atau menyahserialisasi rentetan daripada fail JSON

Kod cBot kami merangkumi dua pernyataan using yang penting, iaitu System.Text.Json dan System.Text.Json.Serialization. Ruang nama ini mengandungi beberapa kaedah yang membolehkan penyerialisasian dan penyahserialisasian rentetan daripada fail JSON dengan mudah seperti JsonSerializer.Deserialize<T>().

Berikut ialah kod 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 sebenar, ia akan berjaya melakukannya.

Laksanakan permintaan POST

Kita juga boleh mencipta cBot yang lebih maju yang mencapai matlamat berikut:

  • Menghantar permintaan POST kepada API palsu yang sama di https://anotherForexApiExample.com/commodities/v1/getaccesstoken. Ini dilakukan untuk mendapatkan token akses untuk API ini.
  • Menyimpan token daripada badan respons dalam pemboleh ubah token.
  • Melaksanakan permintaan GET kepada API yang sama dengan nilai pemboleh ubah token dihantar sebagai parameter pertanyaan dalam URI (https://anotherForexApiExample.com/commodities/v1/getprices).
  • Menggunakan penyerialisasian JSON (dibincangkan di atas), meletakkan pesanan henti beli pada harga yang sedikit lebih rendah daripada harga yang diterima daripada API.

Sekali lagi, perhatikan bahawa cBot ini tidak akan melaksanakan sebarang tindakan yang bermakna apabila dikompil. Ia wujud untuk tujuan contoh sahaja.

 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; }
    }
}

Pelanggan WebSocket

API Algo membolehkan sesiapa sahaja menggunakan pelbagai perkhidmatan dan sumber web menggunakan sambungan websocket. Berbanding dengan protokol HTTP yang digunakan dalam ciri akses rangkaian, protokol WebSocket adalah lebih pantas dan membolehkan penerimaan data dalam masa nyata.

Gunakan pelanggan WebSocket

Menggunakan pelanggan WebSocket adalah mudah:

  1. Pilih perkhidmatan yang mendedahkan titik akhir untuk sambungan websocket
  2. Mulakan objek kelas WebSocketClientOptions dan tentukan parameternya untuk mengkonfigurasi pelanggan anda.
  3. Mulakan objek kelas WebSocketClient dan hantar pilihan yang dicipta sebelum ini ke pembina.
  4. Gunakan kaedah Connect() untuk menyambung ke sumber pilihan anda dan hantar data melalui kaedah Send().
  5. Gunakan pengendali acara TextReceived() dan BinaryReceived() untuk menetapkan apa yang perlu dilakukan oleh algo anda apabila pelanggan WebSocket menerima data baharu.

Di bawah, kita akan mencipta cBot ringkas yang menyambung ke perkhidmatan berita ekonomi khayalan melalui websocket. Apabila berita baharu disiarkan tentang simbol yang sedang dilampirkan cBot, algo akan menunjukkan kotak mesej yang mengandungi teks berita.

Nota

cBot ini adalah untuk tujuan contoh sahaja. Walaupun ia berjaya dibina, ia tidak melaksanakan sebarang tindakan apabila dilampirkan pada carta.

 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, kod kami agak padat kerana kita boleh mengendalikan acara WebSocketClient.TextReceived untuk menunjukkan kotak mesej. Perhatikan bahawa cBot kami tidak meminta maklumat secara aktif daripada perkhidmatan. Sebaliknya, ia bertindak balas secara dinamik terhadap maklumat baharu yang dibekalkan kepadanya.

Amaran

Apabila pelanggan websocket anda terputus sambungan atas sebarang sebab (seperti ralat di bahagian pelayan yang menyebabkan selang keep-alive melebihi had), anda perlu memanggil kaedah WebSocketClient.Connect() sekali lagi. Untuk mengendalikan kes sedemikian secara programatik, gunakan acara WebSocketClient.Disconnected.

Faedah WebSocket

Oleh kerana websocket membolehkan tindak balas terhadap data baharu daripada web dalam masa nyata, ia adalah sempurna untuk integrasi dengan perkhidmatan pihak ketiga yang boleh memaklumkan algo anda secara autonomi tentang sesuatu. Berikut ialah beberapa contoh sumber web yang boleh anda gunakan dengan pelanggan WebSocket.

  • Kalendar berita ekonomi. Apabila berita baharu dikeluarkan, algo anda boleh menunjukkan kotak mesej dengan maklumat utama.
  • Perkhidmatan AI generatif. Apabila perkhidmatan AI mula membekalkan respons kepada arahan, anda boleh menunjukkan hasilnya perkataan demi perkataan dan bukannya menunggu respons lengkap.
  • Aliran harga untuk semua simbol yang berkorelasi dengan yang dilampirkan algo. Apabila harga dikemas kini, ia ditunjukkan dengan segera dan tepat kepada pengguna algo.
  • Rangkaian media sosial yang fokus pada dagangan. Apabila mesej baharu disiarkan tentang simbol tertentu, algo boleh menunjukkan kandungannya kepada pengguna.

Secara umum, sambungan websocket menawarkan faedah berikut berbanding HTTPS biasa:

  • Sambungan WebSocket lebih cekap. Sebarang permintaan HTTP perlu mengandungi data tambahan seperti pengepala. Dengan websocket, sambungan anda ditubuhkan hanya sekali, selepas itu tiada keperluan untuk menghantar data berlebihan.
  • Sambungan WebSocket menawarkan keserentakan yang lebih baik. Tiada keperluan untuk menghentikan operasi algo sehingga anda menunggu respons selepas menghantar permintaan HTTP. Dengan websocket, anda boleh menghantar dan menerima data pada bila-bila masa dan mengendalikannya secara tak segerak.

Pelanggan WebSocket membolehkan semua jenis algo berinteraksi secara dinamik dengan sumber web; interaksi ini lebih pantas dan lebih cekap berbanding menggunakan HTTP. Gunakan pelanggan WebSocket untuk membina algo berkuasa yang diintegrasikan dengan perkhidmatan pihak ketiga.

Akses rangkaian dan sifat AccessRights

Secara ringkas, enum AccessRights menentukan sama ada algoritma mempunyai akses kepada data yang luaran kepada cTrader seperti sistem fail mesin tempatan anda. Anda boleh mengetahui lebih lanjut dalam tutorial ini.

Menetapkan AccessRights kepada AccessRights.FullAccess membolehkan algo melaksanakan operasi lanjutan (seperti mendapatkan maklumat daripada registry Windows). Walau bagaimanapun, pengguna akhir mungkin mendapati memberikan akses penuh kepada cBot atau indikator berisiko kerana ia boleh menyebabkan pelanggaran data.

Hasilnya, AccessRights.None biasanya merupakan pilihan yang paling masuk akal jika anda ingin berkongsi produk algo anda dengan orang lain. Walau bagaimanapun, walaupun anda memilih pilihan ini, produk cTrader anda bebas untuk mengakses web. Penambahan fungsi akses rangkaian kepada API cTrader Algo bermakna cBot tidak lagi memerlukan sifat AccessRights ditetapkan kepada AccessRights.FullAccess untuk bekerja dengan sumber di Internet.

Ini sangat mengembangkan peluang yang dimiliki oleh pembangun algo semasa mengekod produk cTrader yang mereka ingin edarkan kepada pedagang lain.

Ringkasan

Kesimpulannya, akses rangkaian adalah ciri yang berkuasa yang membolehkan pengembangan besar bilangan operasi yang boleh dilakukan oleh algoritma anda tanpa memperkenalkan risiko tambahan.