ネットワークアクセス

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

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

  • アルゴリズムソリューションは、トレーディングニュースウェブサイトやForex向けの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に対して「GET」リクエストを実行し、このリクエストの結果を含む「HttpsResponse」オブジェクトを返します。

HttpsRequest」クラスを使用すると、より複雑なリクエスト、例えば「POST」リクエストを実行できます。これらのリクエストを実行するには、「HttpsRequest.Method」プロパティを「HttpMethodenumの値、例えば「HttpMethod.Put」や「HttpMethod.Patch」に設定します。

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

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

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

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

例としてのcBotの作成

GET」リクエストの実行

以下のアクションを実行するシンプルなcBotを作成します。

  • GET」リクエストを送信し、https://forexApiExample.com/v1/exchangerateのAPI経由でJSONファイルにアクセスします(このAPIは完全に偽物です)。
  • GET」レスポンスが成功した場合、cBotはレスポンスボディをカスタム「SymbolPrice」クラスのオブジェクトにデシリアライズします(このクラスはデモ用に作成しました)。
  • APIで指定された価格より少し高い価格でシンボルの「Sell」リミットオーダーを出します。

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

JSONファイルからの文字列のシリアライズ/デシリアライズ方法

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

以下は、例としての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 を作成することもできます。

  • 同じ偽の API である POST リクエストを https://anotherForexApiExample.com/commodities/v1/getaccesstoken に送信します。これは、この API のアクセス トークンを取得するためです。
  • レスポンス ボディからトークンを取得し、それを token 変数に保存します。
  • 同じ API に対して GET リクエストを行い、token 変数の値を URI のクエリ パラメータとして渡します (https://anotherForexApiExample.com/commodities/v1/getprices の形式)。
  • 上記で説明した JSON シリアル化を使用して、API から受け取った価格より少し低い価格で Buy ストップ注文を出します。

再度注意してください。この 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 接続を使用してさまざまなウェブサービスやリソースにアクセスすることができます。HTTP プロトコル(ネットワークアクセス機能で使用される)と比較して、WebSocket プロトコルはより高速で、リアルタイムでデータを受信できます。

WebSocket クライアントの使用

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

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

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

注意

この cBot は例示のために提供されています。cTrader 内でビルドすることはできますが、チャートにアタッチしてもアクションは実行されません。

 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 イベントを処理するだけでメッセージボックスを表示することができます。私たちのボットはサービスから情報を積極的に要求するわけではなく、新しい情報が提供されると動的に反応します。

警告

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

WebSocket の利点

WebSocket はリアルタイムで新しいデータに反応することができるため、アルゴリズムに自動的に通知するサードパーティサービスと統合するのに最適です。以下は、WebSocket クライアントを使用できるウェブリソースの例です。

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

一般的に、WebSocket 接続は通常の HTTPS 接続と比較して以下の利点があります。

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

WebSocket クライアントは、すべてのタイプのアルゴリズムがウェブリソースと動的にインタラクションできるようにし、このインタラクションは HTTP を使用するよりも迅速かつ効率的です。サードパーティサービスと統合された強力なアルゴリズムを構築するために WebSocket クライアントを使用してください!

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

簡単に言うと、AccessRights enum は、アルゴリズムが cTrader の外部データ(例えばローカルマシンのファイルシステム)にアクセスできるかどうかを定義します。詳細は このチュートリアル をご覧ください。

AccessRightsAccessRights.FullAccess に設定すると、アルゴリズムは高度な操作(例:Windows レジストリからの情報取得)を行うことができます。しかし、エンドユーザーは cBots やインジケーターに完全なアクセスを許可することはリスクが高いと感じるかもしれません。

その結果、アルゴリズム製品を他の人と共有したい場合は、通常、AccessRights.None が最も理にかなっています。ただし、このオプションを選択した場合でも、cTrader 製品はウェブへのアクセスが可能です! cTrader Algo API にネットワークアクセス機能が追加されたことで、cBots がインターネット上のリソースと連携するために AccessRights プロパティを AccessRights.FullAccess に設定する必要がなくなりました。

これにより、他のトレーダーに配布することを意図した cTrader 製品をコーディングする際に、アルゴリズム開発者が持つ機会が大幅に広がります。

まとめ

結論として、ネットワークアクセスはアルゴリズムが実行できる操作の数を大幅に拡張し、追加のリスクを導入しません。