ネットワークアクセスを使用する方法

cBots (自動売買)

インターネットにアクセスすることは、プラグイン、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データをデシリアル化するために、JsonSerializerクラスを使用します。これを行う前に、デシリアル化に必要なクラスをいくつか定義する必要があります。

  • 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が管理者権限を要求する必要がある状況を回避するために、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のチャート内で利用できるおしゃれなニュースリーダーに変えることができます!

この記事とビデオが役に立つことを願っています。cTraderでのアルゴリズム取引に関する詳細を学びたい場合は、下のボタンをクリックしてYouTubeチャンネルを購読してください。

目次

このページについて