Langkau tajuk talian

Cara menggunakan akses rangkaian

Mengakses internet adalah kes penggunaan biasa untuk plugin, cBot dan indikator. Sebelum ini, algo perlu meminta keizinan khas untuk melaksanakan sebarang operasi berkaitan rangkaian, yang boleh menimbulkan beberapa kebimbangan daripada pengguna, terutamanya jika algo ini diedarkan tanpa sebarang kod sumber. Nasib baik, cTrader kini membenarkan semua algo untuk mengakses sumber web tanpa memerlukan hak akses yang lebih tinggi.

Dalam artikel ini dan video yang berkaitan, kita akan menunjukkan cara mendapatkan berita daripada API percuma yang menggunakan JSON untuk penyerialan dan penyahserialan.

Guna titik akhir API

Dalam contoh kita, kita akan menggunakan cBot kita untuk membaca maklumat berita daripada sumber luar dan mencetaknya ke log. Untuk tujuan ini, kita akan menggunakan API percuma yang ditawarkan oleh NewsData.

Untuk melihat bagaimana API kelihatan dalam pelayar, kita boleh mengakses pautan ini.

https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&&language=en

Seperti yang kita lihat, titik akhir menyediakan urutan pasangan kunci-nilai yang boleh kita gunakan dengan mudah menggunakan cBot. Kita akan bermula dengan menambah ruang nama yang mengandungi beberapa kelas dan kaedah untuk menyahserialkan dan membaca data berformat JSON.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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;
using System.Net.Http.Json;
using System.Net.Http;

Kemudian kita boleh mengisytiharkan HttpClient() ringkas yang akan mengakses Internet.

1
private static readonly HttpClient client = new HttpClient();

Selepas itu, kita akan dapat membaca data dalam kaedah OnStart().

1
2
3
4
protected override void OnStart()
{
    HttpResponseMessage responseToGet = client.GetAsync("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en").Result;
}

Permintaan akan mengembalikan respons mentah dalam format JSON. Kita boleh melihat bagaimana ia kelihatan menggunakan MessageBox.

1
2
3
var stream = responseToGet.Content.ReadAsStream();
var reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());

Nyahserialkan data JSON

Untuk menyahserialkan data JSON kita, kita akan menggunakan kelas JsonSerialiser. Walau bagaimanapun, sebelum kita boleh melakukan ini, kita perlu menentukan kelas yang diperlukan untuk penyahserialan.

  • NewsItem- kelas ini mewakili satu artikel berita.
  • News - kelas ini mengandungi koleksi objek NewsItem.
1
2
3
4
5
6
7
8
9
public class NewsItem
{
    public string title { get; set; }   
}

public class News
{
    public List<NewsItem> results { get; set; }
}

Jika anda mahu mengelakkan menulis kod boilerplate ini, anda juga boleh menggunakan penukar dalam talian daripada JSON kepada C#.

Menggunakan penukar, kita telah menentukan kelas kita seperti berikut:

 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
public class NewsItem
{
    public string article_id { get; set; }
    public string title { get; set; }
    public string link { get; set; }
    public List<string> keywords { get; set; }
    public List<string> creator { get; set; }
    public object video_url { get; set; }
    public string description { get; set; }
    public string content { get; set; }
    public string pubDate { get; set; }
    public string image_url { get; set; }
    public string source_id { get; set; }
    public int source_priority { get; set; }
    public List<string> country { get; set; }
    public List<string> category { get; set; }
    public string language { get; set; }
}

public class News
{
    public string status { get; set; }
    public int totalResults { get; set; }
    public List<NewsItem> results { get; set; }
    public string nextPage { get; set; }
}

Kita kini boleh menulis kod penyahserialan kita.

1
News news = JsonSerializer.Deserialize<News>(responseToGet.Content.ReadAsStream());

Selain itu, kita boleh menambah kod berikut untuk mencetak tajuk berita dalam log.

1
2
3
4
5
6
7
if (responseToGet.IsSuccessful)
{
    News news = JsonSerializer.Deserialize<News>(responseToGet.Body);

    foreach (var item in news.results)
            Print(item.title);
}

Jika kita membina dan menjalankan cBot kita, kita akan melihat pengecualian muncul dalam log. Walau bagaimanapun, jika kita menukar hak akses cBot kepada AccessRights.FullAccess, kita akan melihat bahawa cBot kita berfungsi seperti yang dimaksudkan.

Akses internet tanpa hak akses yang lebih tinggi

Untuk mengelakkan situasi di mana cBot kita perlu meminta hak akses yang lebih tinggi, kita boleh mengubah suai kaedah OnStart() kita seperti berikut.

1
2
3
4
protected override void OnStart()
{
    var responseToGet = Http.Get("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en");
}

Jika kita menetapkan hak akses kepada AccessRights.None dan membina semula cBot kita, kita sepatutnya melihat tajuk berita dicetak dalam log tanpa sebarang masalah. Dengan sedikit usaha lagi, cBot kita boleh diubah menjadi pembaca berita menarik yang tersedia terus di dalam mana-mana carta cTrader!