コンテンツにスキップ

ネットワークアクセス

このガイドでは、インターネットにアクセスできるアルゴリズムを作成する方法を定義します。 以下は、このAPI機能の1分間の概要です。

1分でわかるネットワークアクセス!

  • あなたのアルゴリズムソリューションは、取引ニュースウェブサイトや外国為替指向のWeb APIから情報を取得することができます。 この機能を使用して、cBot、プラグイン、インジケーターが緊急の現実世界のイベントや情報に反応するようにします。
  • System.Text.JsonおよびSystem.Text.Json.Serialization名前空間のメソッドを使用して、オブジェクトをJSONファイルにシリアライズまたはデシリアライズすることができます。これにより、cBotがエンドポイントを簡単に消費し、貴重な情報を処理することができます。
  • WebSocketプロトコルを使用すると、毎回HTTPリクエストを行う代わりに、サービスからリアルタイムでデータを受信することができます。 WebSocketを使用して、アルゴリズムをWebリソースとスムーズに統合します。 WebSocketClientクラスには、WebSocket接続を使用するために必要なすべてのメソッドとパラメータが含まれています。
  • WebSocketを使用する場合、文字列と生のバイトデータを送受信することができます。 異なるデータ構造を操作し、それらをバイトにシリアライズして、貴重なサードパーティサービスを使用します。
  • AccessRights.Noneはネットワーク機能に十分です。

HTTP

新しいHttpインターフェースには、実装されるとcBotや他のタイプのアルゴリズムがインターネットにアクセスできるようにするいくつかのメソッドが含まれています。 例として、以下を参照してください:

  • HttpResponse Http.Get(string uri)。 渡された文字列uriで指定されたURIに対してGETリクエストを実行し、このリクエストの結果を含むHttpsResponseオブジェクトを返します。

HttpsRequestクラスを使用すると、POSTリクエストを含むより複雑なリクエストを実行することができます。 これらのリクエストを実行するには、HttpsRequest.MethodプロパティをHttpMethod enumの値の1つ(HttpMethod.PutHttpMethod.Patchなど)に設定します。

一方、HttpsRequest.Uriプロパティにはリクエストが送信されるURIが含まれ、HttpsRequest.Bodyプロパティを使用してリクエストボディを設定することができます。 以下に、HttpsRequestオブジェクトの使用方法の例を示します。

  • HttpResponse Http.Send(HttpRequest request)HttpsRequestオブジェクトのrequest.Uriプロパティの値として指定されたURIに対してリクエストを実行します。 その後、このリクエストの結果を含むHttpsResponseオブジェクトを返します。 リクエストタイプはequest.Methodプロパティの値として設定されます。

バックテストと最適化におけるネットワークアクセス

Httpインターフェースのすべてのメソッドは、バックテストと最適化で意図した通りに動作します。 バックテストまたは最適化でWebリソースにアクセスする場合、そのリソースの最新バージョンがリクエストされ、履歴バージョンはリクエストされないことに注意してください。

例のcBotを作成

GETリクエストを実行

次のアクションを実行する簡単なcBotを作成します:

  • GETリクエストを送信し、https://forexApiExample.com/v1/exchangerateにあるAPI経由でJSONファイルにアクセスします(このAPIは完全に架空のものです)。
  • GETレスポンスが成功した場合、cBotはレスポンスボディをカスタムSymbolPriceクラスのオブジェクトにデシリアライズします(このクラスはデモンストレーション目的で作成しました)。
  • APIで指定された価格よりもわずかに高い価格でシンボルの売り指値注文を実行します。

このcBotは完全に架空のものです。 コードはビルドされますが、意味のあるアクションは実行しません。

JSONファイルから文字列をシリアライズまたはデシリアライズする方法

このcBotのコードには、System.Text.JsonSystem.Text.Json.Serializationという2つの重要なusingステートメントが含まれています。 これらの名前空間には、JsonSerializer.Deserialize<T>()などのJSONファイルから文字列を簡単にシリアライズおよびデシリアライズするためのいくつかのメソッドが含まれています。

以下に、この例のcBotのコードを示します:

 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
27
28
29
30
31
32
33
34
35
36
37
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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTest : Robot
    {

        protected override void OnStart()
        {

            var responseToGet = Http.Get("https://forexApiExample.com/v1/exchangerate");

            if (responseToGet.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(responseToGet.Body);
                var result = PlaceLimitOrder(TradeType.Sell, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate + 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

このcBotが実際のAPIにアクセスする場合、成功するでしょう。

POSTリクエストを実行

次の目標を達成するより高度なcBotを作成することもできます:

  • 同じ架空のAPIhttps://anotherForexApiExample.com/commodities/v1/getaccesstokenPOSTリクエストを送信します。 これは、このAPIのアクセストークンを取得するためです。
  • レスポンスボディからトークンをtoken変数に保存します。
  • token変数の値をURIのクエリパラメータとして渡して、同じAPIにGETリクエストを実行します(https://anotherForexApiExample.com/commodities/v1/getprices)。
  • 上記で説明したJSONシリアライズを使用して、APIから受信した価格よりもわずかに低い価格で買い逆指値注文を実行します。

繰り返しますが、このcBotはコンパイル時に意味のあるアクションを実行しません。 これは例としてのみ存在します。

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTestTwo : Robot
    {

        protected override void OnStart()
        {
            var uriForAccessToken = new Uri("https://anotherForexApiExample.com/commodities/v1/getaccesstoken");

            var postRequest = new HttpRequest(uriForAccessToken);

            postRequest.Method = HttpMethod.Post;

            var responseToPost = Http.Send(postRequest);

            var token = responseToPost.Body;

            var response = Http.Get($"https://anotherForexApiExample.com/commodities/v1/getprices?token={token}");

            if (response.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(response.Body);

                var result = PlaceStopOrder(TradeType.Buy, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate - 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

WebSocketクライアント

Algo APIを使用すると、誰でもWebSocket接続を利用してさまざまなWebサービスやリソースを使用できます。 ネットワークアクセス機能で使用されるHTTPプロトコルと比較して、WebSocketプロトコルはより高速で、リアルタイムでデータを受信することが可能です。

WebSocketクライアントを使用する

WebSocketクライアントの使用は簡単です:

  1. WebSocket接続のエンドポイントを公開するサービスを選択します。
  2. WebSocketClientOptionsクラスのオブジェクトを初期化し、そのパラメーターを指定してクライアントを設定します。
  3. WebSocketClientクラスのオブジェクトを初期化し、先に作成したオプションをコンストラクターに渡します。
  4. Connect()メソッドを使用して選択したリソースに接続し、Send()メソッドを使用してデータを送信します。
  5. TextReceived()BinaryReceived()イベントハンドラーを使用して、WebSocketクライアントが新しいデータを受信したときにalgoが何を行うかを設定します。

以下では、WebSocketを介して架空の経済ニュースサービスに接続する簡単なcBotを作成します。 cBotが現在接続されているシンボルに関する新しいニュースが投稿されると、algoはニュースのテキストを含むメッセージボックスを表示します。

注意

このcBotは例示のみを目的としています。 正常にビルドされますが、チャートに接続しても何もアクションを実行しません。

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class ExampleWebSocketBot : Robot
    {

        private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions 
        {
            KeepAliveInterval = new TimeSpan(0, 1, 30),
            UseDefaultCredentials = true,
        };
        private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions);
        private readonly Uri _targetUri = new Uri("ws://amazingnews.com:8000");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);
            _webSocketClient.Send("Hello");
            _webSocketClient.TextReceived += NewsReceived;
        }

        protected override void OnStop()
        {
            _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);
        }

        private void NewsReceived(WebSocketClientTextReceivedEventArgs args) 
        {
            if (args.Text.Contains(SymbolName)) 
            {
                MessageBox.Show(args.Text, "News!", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
            }
        }
    }
}

ご覧の通り、WebSocketClient.TextReceivedイベントを処理してメッセージボックスを表示できるため、コードは非常にコンパクトです。 cBotはサービスから積極的に情報を要求しないことに注意してください。 代わりに、新しい情報が提供されたときに動的に反応します。

警告

WebSocketクライアントが何らかの理由で切断された場合(例えば、サーバー側のエラーによりキープアライブ間隔が超過した場合)、WebSocketClient.Connect()メソッドを再度呼び出す必要があります。 このようなケースをプログラムで処理するには、WebSocketClient.Disconnectedイベントを使用します。

WebSocketの利点

WebSocketはWebからの新しいデータにリアルタイムで反応できるため、algoに何かを自律的に通知できるサードパーティサービスとの統合に最適です。 以下は、WebSocketクライアントを使用できるWebリソースのいくつかの例です。

  • 経済ニュースカレンダー。 新しいニュースがリリースされると、algoはキー情報を含むメッセージボックスを表示できます。
  • 生成AIサービス。 AIサービスがプロンプトに対する応答を提供し始めると、完全な応答を待つことなく、結果を単語ごとに表示できます。
  • algoが接続されているシンボルと相関するすべてのシンボルの価格ストリーム。 価格が更新されると、algoユーザーに即座に正確に表示されます。
  • 取引に特化したソーシャルメディアネットワーク。 特定のシンボルに関する新しいメッセージが投稿されると、algoはその内容をユーザーに表示できます。

一般的に、WebSocket接続は通常のHTTPSと比較して以下の利点を提供します:

  • WebSocket接続はより効率的です。 HTTPリクエストにはヘッダーなどの追加データが含まれる必要があります。 WebSocketでは、接続が一度確立されると、冗長なデータを送信する必要はありません。
  • WebSocket接続は並行性が向上します。 HTTPリクエストを送信した後に応答を待つまでalgoの操作を停止する必要はありません。 WebSocketでは、いつでもデータを送受信し、非同期に処理できます。

WebSocketクライアントを使用すると、すべてのタイプのalgoがWebリソースと動的にやり取りできます。このやり取りはHTTPを使用する場合よりも高速で効率的です。 WebSocketクライアントを使用して、サードパーティサービスと統合された強力なalgoを構築してください。

ネットワークアクセスとAccessRightsプロパティ

簡単に言うと、AccessRights enumは、algoがcTrader外部のデータ(ローカルマシンのファイルシステムなど)にアクセスできるかどうかを定義します。 詳細はこのチュートリアルで学ぶことができます。

AccessRightsAccessRights.FullAccessに設定すると、algoは高度な操作(Windowsレジストリからの情報の取得など)を実行できます。 ただし、エンドユーザーはcBotやインジケーターにフルアクセスを与えることをリスクと感じる場合があり、データ漏洩につながる可能性があります。

その結果、algo製品を他の人と共有したい場合、AccessRights.Noneが通常最も賢明なオプションです。 ただし、このオプションを選択しても、cTrader製品はWebに自由にアクセスできます。 cTrader Algo APIにネットワークアクセス機能が追加されたことで、cBotはインターネット上のリソースを操作するためにAccessRightsプロパティをAccessRights.FullAccessに設定する必要がなくなりました。

これにより、他のトレーダーに配布する予定のcTrader製品をコーディングする際にalgo開発者が持つ機会が大幅に拡大しました。

概要

結論として、ネットワークアクセスは、追加のリスクを導入することなく、algoが実行できる操作の数を大幅に拡大する強力な機能です。