Bỏ qua

Cách làm việc với WebSocket trong cTrader Algo

API cTrader Algo cho phép các nhà giao dịch và nhà phát triển truy cập vào các dịch vụ và tài nguyên web khác nhau thông qua kết nối WebSocket. Giao thức WebSocket hiệu quả hơn HTTP cho việc truy cập mạng vì nó nhanh hơn và hỗ trợ truyền dữ liệu theo thời gian thực.

Trong bài viết này và video tương ứng, bạn sẽ học cách gửi và nhận tin nhắn thông qua WebSocket.

Tạo một cBot

Trong ví dụ của chúng ta, chúng ta dự định kết nối với một nguồn cấp dữ liệu TraderMade và sau đó in thông tin đến trong nhật ký cBot của chúng ta.

Đầu tiên, chúng ta điều hướng đến ứng dụng Algo để tạo một cBot mới. Trong tab cBots, nhấp vào nút New. Nhập tên cho cBot, chẳng hạn như Web Sockets Example, sau đó nhấp vào Create.

Bây giờ chúng ta có thể sửa đổi mã cBot cho mục đích của mình. Hãy bắt đầu bằng cách định nghĩa một WebSocketClient mới.

1
private WebSocketClient _webSocketClient = new WebSocketClient();

Sau đó, chúng ta khởi tạo Uri điểm cuối của mình, đó là vị trí mà chúng ta sẽ kết nối đến.

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

Chúng ta cần chỉnh sửa phương thức OnStart(), sử dụng Uri để kết nối với dịch vụ truyền phát và đăng ký sự kiện TextReceived. Sự kiện này được kích hoạt bất cứ khi nào văn bản đến ứng dụng của chúng ta thông qua kết nối.

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

Chúng ta muốn in tin nhắn nhận được trong TextReceived.

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

Bạn có thể sao chép toàn bộ mã bên dưới:

 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
        }
    }
}

Nhấp vào nút Build hoặc sử dụng phím tắt Ctrl+B để xây dựng cBot.

Nhấp vào nút Add instance cho cBot. Chọn tùy chọn Locally, chọn một ký hiệu và tài khoản, sau đó nhấp vào nút Add instance.

Điều hướng đến tab Logs. Bạn sẽ thấy một số tin nhắn cBot xác nhận kết nối.

Đăng ký nguồn cấp dữ liệu giá ký hiệu

Chúng ta quay lại trình chỉnh sửa mã cho cBot Web Sockets Example của chúng ta trong ứng dụng Algo. Ở đây, chúng ta muốn đăng ký nguồn cấp dữ liệu giá ký hiệu bằng cách sử dụng dịch vụ mà chúng ta vừa kết nối.

Viết mã để gửi tin nhắn đăng ký đến dịch vụ trong phương thức OnStart() của chúng ta.

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

_webSocketClient.Send(data);

Ghi chú

Chúng ta đã lấy mẫu mã và mã thông báo từ trang web TraderMade.

Sửa đổi lệnh Print để thay thế dấu ngoặc, không thể sử dụng trong phương thức Print() của API.

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

Cuối cùng, đóng kết nối trong phương thức OnStop().

1
_webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);

Bạn có thể sao chép toàn bộ mã bên dưới:

 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);
        }
    }
}

Xây dựng lại cBot và sau đó khởi động lại nó.

Điều hướng đến tab Logs như bạn đã làm trước đó. Bây giờ, bạn sẽ thấy giá ký hiệu được truyền phát theo thời gian thực.

Bài viết này đã chỉ cho bạn cách sử dụng WebSocket để gửi và nhận thông tin hoặc tin nhắn trong cTrader.