Zum Inhalt

Wie man Netzwerkzugriff verwendet

Der Zugriff auf das Internet ist ein häufiger Anwendungsfall für Plugins, cBots und Indikatoren. Früher mussten Algos spezielle Berechtigungen anfordern, um netzwerkbezogene Operationen durchzuführen, was bei Benutzern Bedenken hervorrufen konnte, insbesondere wenn diese Algos ohne Quellcode verteilt wurden. Glücklicherweise erlaubt cTrader jetzt allen Algos den Zugriff auf Webressourcen, ohne dass erhöhte Zugriffsrechte erforderlich sind.

In diesem Artikel und dem dazugehörigen Video zeigen wir, wie man Nachrichten von einer kostenlosen API abruft, die JSON für die Serialisierung und Deserialisierung verwendet.

Einen API-Endpunkt nutzen

In unserem Beispiel werden wir unseren cBot verwenden, um Nachrichteninformationen aus einer externen Quelle zu lesen und sie im Protokoll auszugeben. Zu diesem Zweck werden wir eine kostenlose API verwenden, die von NewsData angeboten wird.

Um zu sehen, wie die API in einem Browser aussieht, können wir einfach auf diesen Link zugreifen.

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

Wie wir sehen können, stellt der Endpunkt eine Sequenz von Schlüssel-Wert-Paaren bereit, die wir einfach mit einem cBot nutzen können. Wir beginnen damit, die Namespaces hinzuzufügen, die mehrere Klassen und Methoden zum Deserialisieren und Lesen von JSON-formatierten Daten enthalten.

 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;

Wir können dann einen einfachen HttpClient() deklarieren, der auf das Internet zugreift.

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

Danach können wir Daten in der OnStart()-Methode lesen.

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

Die Anfrage gibt eine Rohantwort im JSON-Format zurück. Wir können sehen, wie sie aussieht, indem wir eine MessageBox verwenden.

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

JSON-Daten deserialisieren

Um unsere JSON-Daten zu deserialisieren, werden wir die JsonSerialiser-Klasse verwenden. Bevor wir dies tun können, müssen wir jedoch die für die Deserialisierung erforderlichen Klassen definieren.

  • NewsItem – diese Klasse repräsentiert einen einzelnen Nachrichtenartikel.
  • News – diese Klasse enthält eine Sammlung von NewsItem-Objekten.
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; }
}

Wenn Sie vermeiden möchten, diesen Boilerplate-Code zu schreiben, können Sie auch einen Online-Konverter von JSON in C# verwenden.

Mit dem Konverter haben wir unsere Klassen wie folgt definiert:

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

Wir können jetzt unseren Deserialisierungscode schreiben.

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

Zusätzlich können wir den folgenden Code hinzufügen, um Nachrichtentitel im Protokoll auszugeben.

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

Wenn wir unseren cBot erstellen und ausführen, werden wir sehen, dass eine Ausnahme im Protokoll erscheint. Wenn wir jedoch die Zugriffsrechte des cBots auf AccessRights.FullAccess ändern, werden wir sehen, dass unser cBot wie beabsichtigt funktioniert.

Auf das Internet ohne erhöhte Zugriffsrechte zugreifen

Um eine Situation zu vermeiden, in der unser cBot erhöhte Zugriffsrechte anfordern muss, können wir unsere OnStart()-Methode wie folgt ändern.

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

Wenn wir die Zugriffsrechte auf AccessRights.None setzen und unseren cBot neu erstellen, sollten wir sehen, dass die Nachrichtentitel ohne Probleme im Protokoll ausgegeben werden. Mit etwas mehr Aufwand kann unser cBot in einen schicken Nachrichtenleser verwandelt werden, der direkt in jedem cTrader-Chart verfügbar ist!