Ir para o conteúdo

Como trabalhar com WebSockets no cTrader Algo

A API do cTrader Algo permite que traders e programadores acedam a vários serviços e recursos web através de uma ligação WebSocket. O protocolo WebSocket é mais eficiente do que o HTTP para acesso à rede porque é mais rápido e suporta transferência de dados em tempo real.

Neste artigo e no vídeo correspondente, irá aprender a enviar e receber mensagens através de WebSockets.

Criar um cBot

No nosso exemplo, pretendemos ligar-nos a um feed da TraderMade e depois imprimir as informações recebidas no nosso registo de cBot.

Primeiro, navegamos para a aplicação Algo para criar um novo cBot. No separador cBots, clique no botão Novo. Escreva um nome para o cBot, como Exemplo de Web Sockets, e depois clique em Criar.

Agora podemos modificar o código do cBot para os nossos fins. Vamos começar por definir um novo WebSocketClient.

1
private WebSocketClient _webSocketClient = new WebSocketClient();

Depois, inicializamos o nosso Uri do ponto final, que é o local ao qual nos iremos ligar.

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

Precisamos de editar o método OnStart(), usar o Uri para nos ligarmos ao serviço de streaming e subscrever o evento TextReceived. Este evento é acionado sempre que o texto chega à nossa aplicação através da ligação.

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

Queremos imprimir a mensagem recebida em TextReceived.

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

Pode copiar o código completo abaixo:

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

Clique no botão Compilar ou use o atalho Ctrl+B para compilar o cBot.

Clique no botão Adicionar instância para o cBot. Selecione a opção Localmente, escolha um símbolo e uma conta e, em seguida, clique no botão Adicionar instância.

Navegue até ao separador Registos. Deverá ver algumas mensagens do cBot que confirmam a ligação.

Subscrever um feed de preços de símbolo

Voltamos ao editor de código para o nosso cBot Exemplo de Web Sockets na aplicação Algo. Aqui, queremos subscrever um feed de preços de símbolo usando o serviço ao qual nos ligámos recentemente.

Escreva o código para enviar uma mensagem de subscrição para o serviço no nosso método OnStart().

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

_webSocketClient.Send(data);

Nota

Obtivemos o exemplo de código e o token no website da TraderMade.

Modifique o comando Print para substituir os parênteses retos, que não podem ser usados no método Print() da API.

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

Por fim, feche a ligação no método OnStop().

1
_webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);

Pode copiar o código completo abaixo:

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

Recompile o cBot e, em seguida, inicie-o novamente.

Navegue até ao separador Registos como fez anteriormente. Agora, deverá ver o preço do símbolo transmitido em tempo real.

Este artigo mostrou-lhe como usar WebSockets para enviar e receber informações ou mensagens no cTrader.