如何使用网络访问
访问互联网是插件、cBot 和指标的常见用例。 以前,算法必须请求特殊权限才能执行任何与网络相关的操作,这可能会引起用户的一些担忧,尤其是如果这些算法在没有源代码的情况下分发。 幸运的是,cTrader 现在允许所有算法访问网络资源,而无需提升访问权限。
在本文及其对应的视频中,我们将演示如何从使用 JSON 进行序列化和反序列化的免费 API 中检索新闻。
使用 API 端点
在我们的示例中,我们将使用 cBot 从外部来源读取新闻信息并将其打印到日志中。 为此,我们将使用 NewsData 提供的免费 API。
要查看 API 在浏览器中的样子,我们可以直接访问此链接。
https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&&language=en
如我们所见,该端点提供了一系列键值对,我们可以轻松地使用 cBot 来使用这些数据。 我们将首先添加包含多个类和方法的命名空间,用于反序列化和读取 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;
|
然后,我们可以声明一个简单的 HttpClient(),它将访问互联网。
| private static readonly HttpClient client = new HttpClient();
|
之后,我们将能够在 OnStart() 方法中读取数据。
| protected override void OnStart()
{
HttpResponseMessage responseToGet = client.GetAsync("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en").Result;
}
|
请求将返回 JSON 格式的原始响应。 我们可以使用 MessageBox 查看它的样子。
| var stream = responseToGet.Content.ReadAsStream();
var reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());
|
反序列化 JSON 数据
为了反序列化我们的 JSON 数据,我们将使用 JsonSerialiser 类。 然而,在此之前,我们必须定义反序列化所需的类。
NewsItem - 这个类代表一篇新闻文章。 News - 这个类包含 NewsItem 对象的集合。
| public class NewsItem
{
public string title { get; set; }
}
public class News
{
public List<NewsItem> results { get; set; }
}
|
如果你想避免编写这些样板代码,你也可以使用 在线 JSON 转 C# 转换器。
使用转换器,我们定义了如下类:
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; }
}
|
现在我们可以编写反序列化代码。
| News news = JsonSerializer.Deserialize<News>(responseToGet.Content.ReadAsStream());
|
此外,我们可以添加以下代码以在日志中打印新闻标题。
| if (responseToGet.IsSuccessful)
{
News news = JsonSerializer.Deserialize<News>(responseToGet.Body);
foreach (var item in news.results)
Print(item.title);
}
|
如果我们构建并运行我们的 cBot,我们将在日志中看到一个异常。 然而,如果我们将 cBot 的访问权限更改为 AccessRights.FullAccess,我们将看到我们的 cBot 按预期工作。
在没有提升访问权限的情况下访问互联网
为了避免我们的 cBot 需要请求提升访问权限的情况,我们可以将 OnStart() 方法修改为以下内容。
| protected override void OnStart()
{
var responseToGet = Http.Get("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en");
}
|
如果我们将访问权限设置为 AccessRights.None 并重新构建我们的 cBot,我们应该看到新闻标题在日志中打印出来,没有任何问题。 通过一些额外的努力,我们的 cBot 可以变成一个精美的新闻阅读器,直接在任何 cTrader 图表中使用!