Vai al contenuto

Come usare l'accesso alla rete

L'accesso a Internet è un caso d'uso comune per plugin, cBot e indicatori. In precedenza, gli algoritmi dovevano richiedere permessi speciali per eseguire qualsiasi operazione relativa alla rete, il che poteva sollevare alcune preoccupazioni da parte degli utenti, soprattutto se questi algoritmi venivano distribuiti senza alcun codice sorgente. Fortunatamente, cTrader ora consente a tutti gli algoritmi di accedere alle risorse web senza avere diritti di accesso elevati.

In questo articolo e nel video corrispondente dimostreremo come recuperare notizie da un'API gratuita che utilizza JSON per la serializzazione e la deserializzazione.

Utilizzare un endpoint API

Nel nostro esempio, useremo il nostro cBot per leggere informazioni sulle notizie da una fonte esterna e stamparle nel log. A questo scopo, useremo un'API gratuita offerta da NewsData.

Per vedere come appare l'API in un browser, possiamo semplicemente accedere a questo link.

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

Come possiamo vedere, l'endpoint fornisce una sequenza di coppie chiave-valore che possiamo facilmente utilizzare tramite un cBot. Inizieremo aggiungendo i namespace contenenti diverse classi e metodi per deserializzare e leggere dati in formato 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;

Possiamo quindi dichiarare un semplice HttpClient() che accederà a Internet.

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

Successivamente, saremo in grado di leggere i dati nel metodo 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 richiesta restituirà una risposta grezza in formato JSON. Possiamo vedere come appare usando un MessageBox.

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

Deserializzare i dati JSON

Per deserializzare i nostri dati JSON, useremo la classe JsonSerialiser. Tuttavia, prima di poterlo fare, dovremo definire le classi necessarie per la deserializzazione.

  • NewsItem - questa classe rappresenta un singolo articolo di notizie.
  • News - questa classe contiene una raccolta di oggetti 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; }
}

Se vuoi evitare di scrivere questo codice standard, puoi anche usare un convertitore online da JSON a C#.

Usando il convertitore, abbiamo definito le nostre classi come segue:

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

Ora possiamo scrivere il nostro codice di deserializzazione.

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

Inoltre, possiamo aggiungere il seguente codice per stampare i titoli delle notizie nel 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);
}

Se compiliamo ed eseguiamo il nostro cBot, vedremo apparire un'eccezione nel log. Tuttavia, se modifichiamo i diritti di accesso del cBot in AccessRights.FullAccess, vedremo che il nostro cBot funziona come previsto.

Accedere a Internet senza diritti di accesso elevati

Per evitare una situazione in cui il nostro cBot debba richiedere diritti di accesso elevati, possiamo modificare il nostro metodo OnStart() come segue.

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

Se impostiamo i diritti di accesso su AccessRights.None e ricompiliamo il nostro cBot, dovremmo vedere i titoli delle notizie stampati nel log senza alcun problema. Con un po' più di impegno, il nostro cBot può essere trasformato in un elegante lettore di notizie disponibile direttamente all'interno di qualsiasi grafico cTrader!