跳转至

如何在 cTrader Algo 中使用 WebSockets

cTrader Algo API 允许交易者和开发者通过 WebSocket 连接访问各种网络服务和资源。 WebSocket 协议比 HTTP 更高效,因为它更快并且支持实时数据传输。

在本文及其对应的视频中,您将学习如何通过 WebSockets 发送和接收消息。

创建 cBot

在我们的示例中,我们打算连接到 TraderMade 数据源,然后在 cBot 日志中打印传入的信息。

首先,我们导航到 Algo 应用程序以创建一个新的 cBot。 在 cBots 选项卡中,点击 新建 按钮。 输入 cBot 的名称,例如 Web Sockets 示例,然后点击 创建

我们现在可以修改 cBot 代码以满足我们的需求。 让我们首先定义一个新的 WebSocketClient

1
private WebSocketClient _webSocketClient = new WebSocketClient();

然后我们初始化我们的端点 Uri,这是我们将要连接的位置。

1
private readonly Uri _targetUri = new Uri("wss://marketdata.tradermade.com/feedadv");

我们需要编辑 OnStart() 方法,使用 Uri 连接到流媒体服务并订阅 TextReceived 事件。 每当文本通过连接到达我们的应用程序时,都会引发此事件。

1
2
3
4
5
protected override void OnStart()
{
    _webSocketClient.Connect(_targetUri);
    _webSocketClient.TextReceived += _webSocketClient_TextReceived;
}

我们希望在 TextReceived 中打印收到的消息。

1
2
3
4
private void TextReceived(WebSocketClientTextReceivedEventArgs obj)
{
    Print(obj.Text);
}

您可以复制以下完整代码:

 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 cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class WebSocketsExample : Robot
    {
        private WebSocketClient _webSocketClient = new WebSocketClient();
        private readonly Uri _targetUri = new Uri("wss://marketdata.tradermade.com/feedadv");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);

            _webSocketClient.TextReceived += _webSocketClient_TextReceived;
        }

        private void _webSocketClient_TextReceived(WebSocketClientTextReceivedEventArgs obj)
        {
            Print(obj.Text);
        }

        protected override void OnTick()
        {
            // Handle price updates here
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

点击 构建 按钮或使用 Ctrl+B 快捷键来构建 cBot。

点击 cBot 的 添加实例 按钮。 选择 本地 选项,选择一个交易品种和账户,然后点击 添加实例 按钮。

导航到 日志 选项卡。 您应该看到一些确认连接的 cBot 消息。

订阅交易品种价格数据源

我们返回到 Algo 应用程序中 Web Sockets 示例 cBot 的代码编辑器。 在这里,我们希望使用我们最近连接的服务订阅交易品种价格数据源。

OnStart() 方法中编写代码以向服务发送订阅消息。

1
2
3
var data = "{\"userKey\":\"wsI4foSciCjMyCuoc2xw\", \"symbol\":\"EURUSD\"}";

_webSocketClient.Send(data);

注意

我们从 TraderMade 网站获取了代码示例和令牌。

修改 Print 命令以替换括号,这些括号不能在 API Print() 方法中使用。

1
Print(obj.Text.Replace("{", "").Replace("}","").ToString()); 

最后,在 OnStop() 方法中关闭连接。

1
_webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);

您可以复制以下完整代码:

 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
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class WebSocketsExample : Robot
    {
        private WebSocketClient _webSocketClient = new WebSocketClient();
        private readonly Uri _targetUri = new Uri("wss://marketdata.tradermade.com/feedadv");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);

            _webSocketClient.TextReceived += _webSocketClient_TextReceived;

            var data = "{\"userKey\":\"wsI4foSciCjMyCuoc2xw\", \"symbol\":\"EURUSD\"}";

            _webSocketClient.Send(data);
        }

        private void _webSocketClient_TextReceived(WebSocketClientTextReceivedEventArgs obj)
        {
            Print(obj.Text.Replace("{", "").Replace("}", "").ToString());
        }

        protected override void OnTick()
        {
            // Handle price updates here
        }

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

重新构建 cBot,然后再次启动它。

像之前一样导航到 日志 选项卡。 现在,您应该看到交易品种价格实时流式传输。

本文向您展示了如何使用 WebSockets 在 cTrader 中发送和接收信息或消息。