Aller au contenu

Comment utiliser l'accès réseau

L'accès à Internet est un cas d'utilisation courant pour les plug-ins, les cBots et les indicateurs. Auparavant, les algorithmes devaient demander des autorisations spéciales pour effectuer toute opération liée au réseau, ce qui pouvait susciter certaines inquiétudes de la part des utilisateurs, en particulier si ces algorithmes étaient distribués sans code source. Heureusement, cTrader permet désormais à tous les algorithmes d'accéder aux ressources web sans avoir de droits d'accès élevés.

Dans cet article et la vidéo correspondante, nous allons démontrer comment récupérer des actualités à partir d'une API gratuite qui utilise JSON pour la sérialisation et la désérialisation.

Consommer un point de terminaison d'API

Dans notre exemple, nous utiliserons notre cBot pour lire des informations d'actualités à partir d'une source externe et les imprimer dans le journal. À cette fin, nous utiliserons une API gratuite proposée par NewsData.

Pour voir à quoi ressemble l'API dans un navigateur, nous pouvons simplement accéder à ce lien.

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

Comme nous pouvons le voir, le point de terminaison fournit une séquence de paires clé-valeur que nous pouvons facilement consommer en utilisant un cBot. Nous commencerons par ajouter les espaces de noms contenant plusieurs classes et méthodes pour désérialiser et lire les données au format 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;

Nous pouvons ensuite déclarer un simple HttpClient() qui accédera à Internet.

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

Ensuite, nous pourrons lire les données dans la méthode 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;
}

La requête renverra une réponse brute au format JSON. Nous pouvons voir à quoi elle ressemble en utilisant une MessageBox.

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

Désérialiser les données JSON

Pour désérialiser nos données JSON, nous utiliserons la classe JsonSerialiser. Cependant, avant de pouvoir le faire, nous devrons définir les classes requises pour la désérialisation.

  • NewsItem - cette classe représente un seul article d'actualité.
  • News - cette classe contient une collection d'objets 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; }
}

Si vous souhaitez éviter d'écrire ce code standard, vous pouvez également utiliser un convertisseur en ligne de JSON vers C#.

À l'aide du convertisseur, nous avons défini nos classes comme suit :

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

Nous pouvons maintenant écrire notre code de désérialisation.

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

De plus, nous pouvons ajouter le code suivant pour imprimer les titres des actualités dans le journal.

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

Si nous construisons et exécutons notre cBot, nous verrons qu'une exception apparaît dans le journal. Cependant, si nous modifions les droits d'accès du cBot en AccessRights.FullAccess, nous verrons que notre cBot fonctionne comme prévu.

Accéder à Internet sans droits d'accès élevés

Pour éviter une situation où notre cBot doit demander des droits d'accès élevés, nous pouvons modifier notre méthode OnStart() comme suit.

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

Si nous définissons les droits d'accès sur AccessRights.None et reconstruisons notre cBot, nous devrions voir les titres des actualités s'imprimer dans le journal sans aucun problème. Avec un peu plus d'efforts, notre cBot peut être transformé en un lecteur d'actualités sophistiqué disponible directement dans n'importe quel graphique cTrader !