如何在 cTrader Algo 中使用 WebSockets
cTrader Algo API 允许交易者和开发者通过 WebSocket 连接访问各种网络服务和资源。 WebSocket 协议比 HTTP 更高效,因为它更快并且支持实时数据传输。
在本文及其对应的视频中,您将学习如何通过 WebSockets 发送和接收消息。
创建 cBot
在我们的示例中,我们打算连接到 TraderMade 数据源,然后在 cBot 日志中打印传入的信息。
首先,我们导航到 Algo 应用程序以创建一个新的 cBot。 在 cBots 选项卡中,点击 新建 按钮。 输入 cBot 的名称,例如 Web Sockets 示例,然后点击 创建。

我们现在可以修改 cBot 代码以满足我们的需求。 让我们首先定义一个新的 WebSocketClient。
| private WebSocketClient _webSocketClient = new WebSocketClient();
|
然后我们初始化我们的端点 Uri,这是我们将要连接的位置。
| private readonly Uri _targetUri = new Uri("wss://marketdata.tradermade.com/feedadv");
|
我们需要编辑 OnStart() 方法,使用 Uri 连接到流媒体服务并订阅 TextReceived 事件。 每当文本通过连接到达我们的应用程序时,都会引发此事件。
| protected override void OnStart()
{
_webSocketClient.Connect(_targetUri);
_webSocketClient.TextReceived += _webSocketClient_TextReceived;
}
|
我们希望在 TextReceived 中打印收到的消息。
| 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() 方法中编写代码以向服务发送订阅消息。
| var data = "{\"userKey\":\"wsI4foSciCjMyCuoc2xw\", \"symbol\":\"EURUSD\"}";
_webSocketClient.Send(data);
|
注意
我们从 TraderMade 网站获取了代码示例和令牌。
修改 Print 命令以替换括号,这些括号不能在 API Print() 方法中使用。
| Print(obj.Text.Replace("{", "").Replace("}","").ToString());
|
最后,在 OnStop() 方法中关闭连接。
| _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 中发送和接收信息或消息。