Перейти к содержанию

Как работать с WebSockets в cTrader Algo

cTrader Algo API позволяет трейдерам и разработчикам получать доступ к различным веб-сервисам и ресурсам через соединение WebSocket. Протокол WebSocket более эффективен, чем HTTP для доступа к сети, поскольку он быстрее и поддерживает передачу данных в реальном времени.

В этой статье и соответствующем видео вы узнаете, как отправлять и получать сообщения через WebSockets.

Создание сиБота

В нашем примере мы намерены подключиться к фиду TraderMade, а затем вывести входящую информацию в журнал нашего сиБота.

Сначала мы переходим в приложение Algo, чтобы создать новый сиБот. На вкладке сиБоты нажмите кнопку Создать. Введите имя сиБота, например Web Sockets Example, а затем нажмите Создать.

Теперь мы можем изменить код сиБота для наших целей. Начнем с определения нового 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, чтобы собрать сиБота.

Нажмите кнопку Добавить экземпляр для сиБота. Выберите опцию Локально, выберите инструмент и счет, а затем нажмите кнопку Добавить экземпляр.

Перейдите на вкладку Журналы. Вы должны увидеть несколько сообщений сиБота, подтверждающих соединение.

Подписка на фид цены инструмента

Мы возвращаемся к редактору кода для нашего сиБота Web Sockets Example в приложении Algo. Здесь мы хотим подписаться на фид цены инструмента, используя сервис, к которому мы недавно подключились.

Напишите код для отправки сообщения о подписке на сервис в нашем методе 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);
        }
    }
}

Пересоберите сиБота, а затем запустите его снова.

Перейдите на вкладку Журналы, как вы делали раньше. Теперь вы должны увидеть цену инструмента, транслируемую в реальном времени.

В этой статье показано, как использовать WebSockets для отправки и получения информации или сообщений в cTrader.