Przejdź do treści

Jak pracować z WebSockets w cTrader Algo

Interfejs cTrader Algo API umożliwia traderom i deweloperom dostęp do różnych usług i zasobów internetowych za pośrednictwem połączenia WebSocket. Protokół WebSocket jest bardziej wydajny niż HTTP w przypadku dostępu do sieci, ponieważ jest szybszy i obsługuje przesyłanie danych w czasie rzeczywistym.

W tym artykule i odpowiadającym mu filmie dowiesz się, jak wysyłać i odbierać wiadomości za pośrednictwem WebSockets.

Tworzenie cBota

W naszym przykładzie zamierzamy połączyć się z kanałem TraderMade, a następnie wyświetlić przychodzące informacje w dzienniku naszego cBota.

Najpierw przechodzimy do aplikacji Algo, aby utworzyć nowego cBota. W zakładce cBots kliknij przycisk New. Wpisz nazwę cBota, taką jak Web Sockets Example, a następnie kliknij Create.

Możemy teraz zmodyfikować kod cBota dla naszych celów. Zacznijmy od zdefiniowania nowego WebSocketClient.

1
private WebSocketClient _webSocketClient = new WebSocketClient();

Następnie inicjalizujemy nasz punkt końcowy Uri, który jest lokalizacją, z którą się połączymy.

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

Musimy edytować metodę OnStart(), użyć Uri do połączenia z usługą strumieniową i zasubskrybować zdarzenie TextReceived. To zdarzenie jest wywoływane za każdym razem, gdy tekst dociera do naszej aplikacji przez połączenie.

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

Chcemy wyświetlić otrzymaną wiadomość w TextReceived.

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

Możesz skopiować pełny kod poniżej:

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

Kliknij przycisk Build lub użyj skrótu Ctrl+B, aby zbudować cBota.

Kliknij przycisk Add instance dla cBota. Wybierz opcję Locally, wybierz symbol i konto, a następnie kliknij przycisk Add instance.

Przejdź do zakładki Logs. Powinieneś zobaczyć kilka komunikatów cBota potwierdzających połączenie.

Subskrybuj kanał cen symbolu

Wracamy do edytora kodu dla naszego cBota Web Sockets Example w aplikacji Algo. Tutaj chcemy zasubskrybować kanał cen symbolu za pomocą usługi, z którą niedawno się połączyliśmy.

Napisz kod, aby wysłać wiadomość subskrypcyjną do usługi w naszej metodzie OnStart().

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

_webSocketClient.Send(data);

Uwaga

Uzyskaliśmy przykładowy kod i token ze strony internetowej TraderMade.

Zmodyfikuj polecenie Print, aby zastąpić nawiasy, których nie można używać w metodzie API Print().

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

Na koniec zamknij połączenie w metodzie OnStop().

1
_webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);

Możesz skopiować pełny kod poniżej:

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

Przebuduj cBota, a następnie uruchom go ponownie.

Przejdź do zakładki Logi, tak jak wcześniej. Teraz powinieneś zobaczyć cenę symbolu przesyłaną w czasie rzeczywistym.

Ten artykuł pokazał, jak używać WebSockets do wysyłania i odbierania informacji lub wiadomości w cTrader.