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

Установите соединение

Вы можете подключиться к прокси cTrader Open API, используя либо протокол TCP, либо протокол WebSocket. Это руководство охватывает оба этих варианта.

Использование TCP

Использование SSL

Клиентское соединение TCP должно использовать SSL, в противном случае вы не сможете подключиться или взаимодействовать с API.

Вы можете установить соединение следующим образом, используя официальные SDK cTrader Open API.

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

Метод OpenClient.Connect() вызывает метод 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);
    });
}

Клиент Python Open API автоматически пытается установить соединение при инициализации.

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

Через WebSocket

При подключении через протокол WebSocket хост и порт такие же, как при подключении через протокол TCP.

Вот как официальные SDK cTrader Open API устанавливают соединение через WebSocket.

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

Метод OpenClient.Connect() вызывает метод 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();
}

SDK для Python не поддерживает стандарт WebSocket.

Пример веб-приложения .NET Blazor, которое использует стандарт WebSocket для установки и поддержания соединения, можно найти, нажав здесь.

Лучшие практики

Вот несколько рекомендаций, которые следует учитывать при подключении к cTrader Open API:

  • Максимум вы должны создать два соединения: одно для демо-счетов и одно для реальных счетов. Каждое соединение может поддерживать неограниченное количество счетов определенного типа.
  • После установления соединения вы должны пройти процесс авторизации приложения. Если вы отправите какие-либо сообщения до авторизации вашего приложения, вы получите ошибку.
  • Чтобы поддерживать соединение активным, продолжайте отправлять событие heartbeat (ProtoHeartbeatEvent) каждые 10 секунд.
  • Используйте очередь сообщений для отправки и получения данных, чтобы избежать одновременных событий отправки и получения.