Bỏ qua

Cách sử dụng truy cập mạng

Truy cập internet là một trường hợp sử dụng phổ biến cho các plugin, cBot và chỉ báo. Trước đây, các thuật toán phải yêu cầu quyền đặc biệt để thực hiện bất kỳ hoạt động liên quan đến mạng nào, điều này có thể gây ra một số lo ngại từ người dùng, đặc biệt là nếu các thuật toán này được phân phối mà không có bất kỳ mã nguồn nào. May mắn thay, cTrader hiện cho phép tất cả các thuật toán truy cập tài nguyên web mà không cần có quyền truy cập nâng cao.

Trong bài viết này và video tương ứng, chúng ta sẽ minh họa cách truy xuất tin tức từ một API miễn phí sử dụng JSON để tuần tự hóa và giải tuần tự hóa.

Tiêu thụ một điểm cuối API

Trong ví dụ của chúng ta, chúng ta sẽ sử dụng cBot để đọc thông tin tin tức từ một nguồn bên ngoài và in nó vào nhật ký. Để phục vụ mục đích này, chúng ta sẽ sử dụng API miễn phí do NewsData cung cấp.

Để xem API trông như thế nào trong trình duyệt, chúng ta có thể đơn giản truy cập liên kết này.

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

Như chúng ta có thể thấy, điểm cuối cung cấp một chuỗi các cặp khóa-giá trị mà chúng ta có thể dễ dàng tiêu thụ bằng cách sử dụng cBot. Chúng ta sẽ bắt đầu bằng cách thêm các không gian tên chứa một số lớp và phương thức để giải tuần tự hóa và đọc dữ liệu định dạng 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;

Sau đó, chúng ta có thể khai báo một HttpClient() đơn giản để truy cập Internet.

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

Sau đó, chúng ta sẽ có thể đọc dữ liệu trong phương thức 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;
}

Yêu cầu sẽ trả về một phản hồi thô ở định dạng JSON. Chúng ta có thể xem nó trông như thế nào bằng cách sử dụng MessageBox.

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

Giải tuần tự hóa dữ liệu JSON

Để giải tuần tự hóa dữ liệu JSON của chúng ta, chúng ta sẽ sử dụng lớp JsonSerialiser. Tuy nhiên, trước khi có thể làm điều này, chúng ta sẽ phải định nghĩa các lớp cần thiết cho việc giải tuần tự hóa.

  • NewsItem- lớp này đại diện cho một bài báo tin tức duy nhất.
  • News - lớp này chứa một bộ sưu tập các đối tượng 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; }
}

Nếu bạn muốn tránh viết mã mẫu này, bạn cũng có thể sử dụng một công cụ chuyển đổi trực tuyến từ JSON sang C#.

Sử dụng công cụ chuyển đổi, chúng ta đã định nghĩa các lớp của mình như sau:

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

Bây giờ chúng ta có thể viết mã giải tuần tự hóa của mình.

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

Ngoài ra, chúng ta có thể thêm mã sau để in tiêu đề tin tức vào nhật ký.

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

Nếu chúng ta xây dựng và chạy cBot của mình, chúng ta sẽ thấy một ngoại lệ xuất hiện trong nhật ký. Tuy nhiên, nếu chúng ta thay đổi quyền truy cập của cBot thành AccessRights.FullAccess, chúng ta sẽ thấy rằng cBot của chúng ta hoạt động như dự định.

Truy cập internet mà không cần quyền truy cập nâng cao

Để tránh tình huống cBot của chúng ta cần yêu cầu quyền truy cập nâng cao, chúng ta có thể sửa đổi phương thức OnStart() của mình như sau.

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

Nếu chúng ta đặt quyền truy cập thành AccessRights.None và xây dựng lại cBot của mình, chúng ta sẽ thấy các tiêu đề tin tức được in trong nhật ký mà không gặp bất kỳ vấn đề nào. Với một chút nỗ lực nữa, cBot của chúng ta có thể được biến đổi thành một trình đọc tin tức tinh tế có sẵn ngay trong bất kỳ biểu đồ cTrader nào!