Ir para o conteúdo

Estabelecer uma ligação

Pode ligar-se a um proxy da Open API do cTrader usando o protocolo TCP ou o protocolo WebSocket. Este guia abrange ambas as opções.

Usando TCP

Utilização de SSL

A ligação do cliente TCP deve usar SSL, caso contrário não poderá estabelecer ligação ou interagir com a API.

Pode estabelecer uma ligação da seguinte forma usando os SDKs oficiais da Open API do cTrader.

1
2
_client = new OpenClient("live1.p.ctrader.com", 5035, TimeSpan.FromSeconds(10), useWebSocket: false);
await _client.Connect()

O método OpenClient.Connect() chama o método OpenClient.ConnectTcp().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private async Task ConnectTcp()
{
    _tcpClient = new TcpClient
    {
        LingerState = new LingerOption(enable: true, 10)
    };
    await _tcpClient.ConnectAsync(Host, Port).ConfigureAwait(continueOnCapturedContext: false);
    _sslStream = new SslStream(_tcpClient.GetStream(), leaveInnerStreamOpen: false);
    await _sslStream.AuthenticateAsClientAsync(Host).ConfigureAwait(continueOnCapturedContext: false);
    Task.Run(delegate
    {
        ReadTcp(_cancellationTokenSource.Token);
    });
}

O cliente Python da Open API tenta estabelecer automaticamente uma ligação quando é inicializado.

1
client = Client("live1.p.ctrader.com", 5035, TcpProtocol)

Via WebSocket

Ao ligar via protocolo WebSocket, o host e porta são os mesmos que ao ligar via protocolo TCP.

Aqui está como os SDKs oficiais da Open API do cTrader estabelecem uma ligação via WebSocket.

1
2
_client = new OpenClient("live1.p.ctrader.com", 5035, TimeSpan.FromSeconds(10), useWebSocket: true);
await _client.Connect()

O método OpenClient.Connect() chama o método OpenClient.ConnectWebSocket().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
private async Task ConnectWebScoket()
{
    DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(7, 2);
    defaultInterpolatedStringHandler.AppendLiteral("wss://");
    defaultInterpolatedStringHandler.AppendFormatted(Host);
    defaultInterpolatedStringHandler.AppendLiteral(":");
    defaultInterpolatedStringHandler.AppendFormatted(Port);
    Uri url = new Uri(defaultInterpolatedStringHandler.ToStringAndClear());
    _websocketClient = new WebsocketClient(url, () => new ClientWebSocket())
    {
        IsTextMessageConversionEnabled = false,
        ReconnectTimeout = null,
        IsReconnectionEnabled = false,
        ErrorReconnectTimeout = null
    };
    _webSocketMessageReceivedDisposable = _websocketClient.MessageReceived.Select((ResponseMessage msg) => ProtoMessage.Parser.ParseFrom(msg.Binary)).Subscribe(new Action<ProtoMessage>(OnNext));
    _webSocketDisconnectionHappenedDisposable = _websocketClient.DisconnectionHappened.Subscribe(new Action<DisconnectionInfo>(OnWebSocketDisconnectionHappened));
    await _websocketClient.StartOrFail();
}

O SDK Python não suporta o padrão WebSocket.

Para um exemplo de uma aplicação web .NET Blazor que usa o padrão WebSocket para estabelecer e manter uma ligação, clique aqui.

Melhores práticas

Aqui estão algumas diretrizes que deve ter em mente ao ligar-se à Open API do cTrader:

  • No máximo, deve criar duas ligações: uma para contas demo e outra para contas reais. Cada ligação pode suportar um número ilimitado de contas de um determinado tipo.
  • Depois de estabelecida uma ligação, deve passar pelo fluxo de autorização da aplicação. Se enviar quaisquer mensagens antes da sua aplicação estar autorizada, receberá um erro.
  • Para manter uma ligação ativa, continue a enviar um evento heartbeat (ProtoHeartbeatEvent) a cada 10 segundos.
  • Use uma fila de mensagens para enviar e receber dados para evitar eventos simultâneos de envio e receção.