コンテンツにスキップ

ネットワークアクセスの使用方法

インターネットへのアクセスは、プラグイン、cBot、インジケーターにとって一般的な使用例です。 以前は、アルゴリズムがネットワーク関連の操作を実行するために特別な権限を要求する必要がありましたが、特にソースコードなしで配布される場合、ユーザーに懸念を引き起こす可能性がありました。 幸いなことに、cTraderでは現在、すべてのアルゴリズムが昇格したアクセス権なしにWebリソースにアクセスできるようになりました。

この記事と対応するビデオでは、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()を宣言します。

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

その後、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;
}

リクエストはJSON形式の生のレスポンスを返します。 MessageBoxを使用して、どのように表示されるかを確認できます。

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

JSONデータのデシリアライズ

JSONデータをデシリアライズするために、JsonSerialiserクラスを使用します。 ただし、これを行う前に、デシリアライズに必要なクラスを定義する必要があります。

  • NewsItem - このクラスは単一のニュース記事を表します。
  • News - このクラスは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; }
}

このボイラープレートコードを書くのを避けたい場合は、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; }
}

これで、デシリアライズコードを書くことができます。

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

さらに、ログにニュースのタイトルを表示するために以下のコードを追加できます。

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

cBotをビルドして実行すると、ログに例外が表示されます。 しかし、cBotのアクセス権をAccessRights.FullAccessに変更すると、cBotが意図した通りに動作することがわかります。

昇格されたアクセス権なしでインターネットにアクセスする

cBotが昇格されたアクセス権を要求する状況を避けるために、OnStart()メソッドを以下のように変更できます。

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

アクセス権をAccessRights.Noneに設定してcBotをリビルドすると、ログにニュースのタイトルが問題なく表示されるはずです。 さらに努力を加えることで、cBotをcTraderチャート内で利用できるファンシーなニュースリーダーに変えることができます!