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

WebSocket Sample

Обзор

Плагин WebSocket Sample обеспечивает интеграцию данных в режиме реального времени в cTrader с помощью следующих ключевых функций:

  • Подключает cTrader к внешнему серверу WebSocket для получения потоков данных в режиме реального времени.
  • Отображает актуальный контент, такой как новости или торговые оповещения, непосредственно на Панели активного инструмента с помощью пользовательского текстового блока.
  • Автоматически обновляет панель новыми сообщениями при их получении, обеспечивая своевременную информацию.

Плагин работает через настраиваемую пользователем панель. Он остается активным, пока запущен cTrader Windows или Mac, и автоматически освобождает системные ресурсы при остановке.

Создание плагина

Узнайте, как создавать плагины на C# или Python, в наших пошаговых руководствах.

Код плагина WebSocket Sample доступен в наших публичных репозиториях на C# и Python. Тот же код предоставляется в качестве шаблона в мастере создания алгоритмов в cTrader Windows или Mac, или вы можете просто скопировать и использовать фрагмент ниже:

 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class WebSocketSample : Plugin
    {
        // Declaring our TextBlock that will display the news contents
        private TextBlock _textBlock = new TextBlock
        {
            Text = "Starting news feed...",
            FontSize = 20,
            FontWeight = FontWeight.ExtraBold,
            TextAlignment = TextAlignment.Center,
            Padding = new Thickness(5, 5, 5, 5),
        };

        // _webSocketClientOptions allow us to define several settings
        // such as the keep-alive interval of the WebSocket connection
        private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions 
        {
            KeepAliveInterval = new TimeSpan(0, 1, 30),
            UseDefaultCredentials = true,
        };

        // Passing our _webSocketClientOptions to the WebSocketClient
        // constructor
        private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions);

        // This API is entirely fictional
        private readonly Uri _targetUri = new Uri("ws://amazingnews.com:8000");

        protected override void OnStart()
        {
            // Connecting to the API and sending the initial message
            _webSocketClient.Connect(_targetUri);
            _webSocketClient.Send("Hello");

            // Declaring a custom handler for the TextReceived event
            _webSocketClient.TextReceived += NewsReceived;

            // Adding our TextBlock as a child of a custom
            // AspBlock
            var aspBlock = Asp.SymbolTab.AddBlock("News");
            aspBlock.Height = 300;
            aspBlock.Child = _textBlock;
        }

        protected override void OnStop()
        {
            // The WebSocketClient must be disposed of in OnStop,
            // otherwise it will consume system resources
            _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);
        }

        private void NewsReceived(WebSocketClientTextReceivedEventArgs args) 
        {
            // Updading the text inside the TextBlock on every
            // piece of news received
            if (args.Text.Length != 0) 
            {
                _textBlock.Text = args.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
38
39
40
41
42
43
44
import clr
clr.AddReference("cAlgo.API")

from cAlgo.API import *
from System import TimeSpan, Uri

TARGET_URI = Uri("ws://localhost:1337")

class WebSocketClientSample():
    def on_start(self):
        webSocketClientOptions = WebSocketClientOptions()
        webSocketClientOptions.KeepAliveInterval = TimeSpan(0, 1, 30)
        webSocketClientOptions.UseDefaultCredentials = True

        self.webSocketClient = WebSocketClient(webSocketClientOptions)

        # Connecting to the API and sending the initial message
        self.webSocketClient.Connect(TARGET_URI)
        self.webSocketClient.Send("Hello")

        # Declaring a custom handler for the TextReceived event
        self.webSocketClient.TextReceived += self.on_text_received

        # Adding our TextBlock as a child of a custom AspBlock
        aspBlock = api.Asp.SymbolTab.AddBlock("WebSocket Client Sample");
        aspBlock.Height = 300;

        self.textBlock = TextBlock()
        self.textBlock.Text = "Listening..."
        self.textBlock.FontSize = 20
        self.textBlock.FontWeight = FontWeight.ExtraBold
        self.textBlock.TextAlignment = TextAlignment.Center
        self.textBlock.Padding = Thickness(5, 5, 5, 5)

        aspBlock.Child = self.textBlock;

    def on_text_received(self, args):
        # Updading the text inside the TextBlock on every piece of text received
        if len(args.Text) > 0: 
            self.textBlock.Text = f"Received: {args.Text}"

    def on_stop(self):
        # The WebSocketClient must be disposed of in OnStop,  otherwise it will consume system resources
        self.webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure)

Параметры настройки

Плагин объединяет настройки WebSocket с элементами интерфейса для доставки текстового контента в режиме реального времени. Ниже приведено описание его основных компонентов и их функций:

Параметр Описание Возможные значения
Text Отображает начальный контент в текстовом блоке. Starting news feed…
AddBlock Добавляет блок на Панель активного инструмента. asp.symboltab.addblock(news)
_textBlock.Text Обновляет текстовый блок полученным сообщением WebSocket. args.text
FontSize Задает размер текста. 16, 18, 20 и т. д.
FontWeight Определяет толщину текста. regular, bold, extrabold и т. д.
TextAlignment Выравнивает текст внутри текстового блока. left, centre и т. д.
Padding Задает пространство вокруг текстового блока. (5, 5, 5, 5), (8, 8, 8, 8) и т. д.
aspBlock.Height Устанавливает высоту пользовательского блока в пользовательском интерфейсе. 300px, 350px и т. д.
_targetUri Предоставляет конечную точку WebSocket для потока данных. wss://marketdata.tradermade.com/feedadv
KeepAliveInterval Определяет интервал для пингов поддержания активности WebSocket. (0, 1, 30) (часы, минуты, секунды)
_webSocketClient.Send Отправляет начальное сообщение подписки на сервер WebSocket. {userkey:..., symbol:eurusd}
UseDefaultCredentials Настраивает параметр аутентификации для соединения WebSocket. true или false

Примечание

Убедитесь, что сервер WebSocket поддерживает протокол и форматы сообщений, ожидаемые вашей реализацией.

Варианты использования

WebSocket Sample предоставляет мощный и гибкий способ расширения cTrader с помощью потоков данных в реальном времени. Он поддерживает широкий спектр интеграций, адаптированных к различным торговым потребностям. Ниже приведены практические примеры использования, которые демонстрируют, как плагин может улучшить торговый опыт.

Пример использования Сценарий Значение
Новостные ленты Просматривайте экономические новости в реальном времени, заголовки, влияющие на рынок, и важные события прямо в платформе. Держит вас в курсе важных новостей, которые могут повлиять на движения рынка.
Данные криптовалютных бирж Транслируйте обновления сделок в реальном времени, ценовые тикеры, изменения книги заявок или оповещения о волатильности криптовалютных активов. Повышает осведомленность о состоянии крипторынка и резких изменениях цен в реальном времени.
Волатильность и макропоказатели Отображайте уровни волатильности в реальном времени или индикаторы необычной активности для целевых инструментов на Панели активного инструмента. Поддерживает осведомленность на макроуровне и помогает выявлять торговые возможности во время экстремальных рыночных условий.
Просмотр результатов количественной модели Просматривайте динамический вывод модели (например, увеличение моментума по EURUSD). Связывает количественный анализ с торговыми решениями в визуально доступной форме.
Потоки внешних торговых сигналов Транслируйте автоматизированные сигналы от внешних сервисов моделей машинного обучения (ML), передаваемые через WebSocket. Обеспечивает немедленную доставку сигналов для пользователей, следующих алгоритмическим стратегиям или сторонним ботам.

Обзор

Этот пример плагина показывает, как интегрировать внешний контент в реальном времени в cTrader с помощью соединения WebSocket. Хотя пример демонстрирует новостную ленту в реальном времени на Панели активного инструмента, тот же подход поддерживает сигналы, оповещения, аналитику и многое другое.

Для получения дополнительной информации о разработке обратитесь к нашей документации по плагинам.