Lewati ke isi

Cara menggunakan akses jaringan

Mengakses internet adalah kasus penggunaan umum untuk plugin, cBot, dan indikator. Sebelumnya, algo harus meminta izin khusus untuk melakukan operasi terkait jaringan apa pun, yang dapat menimbulkan beberapa kekhawatiran dari pengguna, terutama jika algo ini didistribusikan tanpa kode sumber. Untungnya, cTrader sekarang memungkinkan semua algo untuk mengakses sumber daya web tanpa memiliki hak akses yang ditingkatkan.

Dalam artikel ini dan video terkaitnya, kami akan mendemonstrasikan cara mengambil berita dari API gratis yang menggunakan JSON untuk serialisasi dan deserialisasi.

Konsumsi endpoint API

Dalam contoh kita, kita akan menggunakan cBot kita untuk membaca informasi berita dari sumber eksternal dan mencetaknya ke log. Untuk tujuan ini, kita akan menggunakan API gratis yang ditawarkan oleh NewsData.

Untuk melihat bagaimana API terlihat di browser, kita dapat mengakses tautan ini.

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

Seperti yang kita lihat, endpoint menyediakan urutan pasangan kunci-nilai yang dapat kita konsumsi dengan mudah menggunakan cBot. Kita akan mulai dengan menambahkan namespace yang berisi beberapa kelas dan metode untuk mendeserialkan 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 dapat mendeklarasikan HttpClient() sederhana yang akan mengakses Internet.

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

Setelah itu, kita akan dapat membaca data dalam metode 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 dapat melihat bagaimana tampilannya menggunakan MessageBox.

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

Deserialkan data JSON

Untuk mendeserialkan data JSON kita, kita akan menggunakan kelas JsonSerialiser. Namun, sebelum kita dapat melakukan ini, kita harus mendefinisikan kelas-kelas yang diperlukan untuk deserialisasi.

  • NewsItem - kelas ini mewakili satu artikel berita.
  • News - kelas ini berisi 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 ingin menghindari menulis kode boilerplate ini, Anda juga dapat menggunakan konverter online dari JSON ke C#.

Menggunakan konverter, kita telah mendefinisikan kelas-kelas kita sebagai 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 sekarang dapat menulis kode deserialisasi kita.

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

Selain itu, kita dapat menambahkan kode berikut untuk mencetak judul berita di 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 membangun dan menjalankan cBot kita, kita akan melihat pengecualian muncul di log. Namun, jika kita mengubah hak akses cBot menjadi AccessRights.FullAccess, kita akan melihat bahwa cBot kita bekerja sesuai yang diinginkan.

Akses internet tanpa hak akses tingkat tinggi

Untuk menghindari situasi di mana cBot kita perlu meminta hak akses tingkat tinggi, kita dapat memodifikasi metode OnStart() kita menjadi 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 mengatur hak akses ke AccessRights.None dan membangun ulang cBot kita, kita seharusnya dapat melihat judul berita tercetak di log tanpa masalah. Dengan sedikit usaha lebih, cBot kita dapat diubah menjadi pembaca berita canggih yang tersedia langsung di dalam grafik cTrader mana pun!