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

Пользовательские уведомления

API пользовательских уведомлений включает типы, которые позволяют торговым алгоритмам доставлять всплывающие оповещения в реальном времени непосредственно в cTrader. Эти всплывающие окна позволяют сиБотам, индикаторам и плагинам визуально и контекстно сообщать пользователям о прогрессе, успехе, ошибках или общей информации.

Благодаря поддержке API пользовательских уведомлений сиБотам больше не нужно полагаться на вкладку Лог, объекты графика или внешние мосты Telegram для коммуникации. Алгоритмы просто сообщают трейдерам о том, что происходит, напрямую через стандартную систему уведомлений в cTrader. Разработчики алгоритмов и пользователи получают преимущества в виде скорости, надежности и ясности без каких-либо сложных настроек.

Соответствующие интерфейсы API включают:

  • INotifications.ShowPopup(caption, message, state) для отображения всплывающего уведомления с заданным заголовком, сообщением и состоянием (PopupNotificationState).
  • Интерфейс PopupNotification для программного управления длительными или прогрессивными уведомлениями путем вызова .Complete() для обновления их конечного состояния.

Сообщения, доставляемые через API пользовательских уведомлений, появляются мгновенно, имеют цветовую кодировку по состоянию и могут быть завершены позже. Состояния уведомлений определяются с помощью перечисления PopupNotificationState:

  • InProgress для представления длительных процессов или состояний ожидания. Пример:

  • Success для указания на то, что операция была успешно завершена. Пример:

  • Error для сигнализации о сбое или исключении. Пример:

  • Partial для сообщения о частично успешном результате (например, некоторые ордера были успешными). Пример:

  • Information для общих оповещений, обновлений или обратной связи. Пример:

Совет

Используйте всплывающие уведомления для отслеживания торговой активности, отладки логических потоков, оповещения пользователей о рыночных событиях или ошибках данных и предоставления динамической обратной связи через UI во время работы стратегии в реальном времени или в ручном режиме.

Объекты API уведомлений можно использовать для следующего:

Функция или операция Примеры
Отслеживание ордеров и обратная связь Отображение обратной связи по исполнению ордера
Подтверждение выходов по ТП/СЛ
Отслеживание изменений скользящего стопа
Оповещения о рисках и на основе правил Предупреждение о низких уровнях маржи
Отображение оповещений о заблокированных сделках
Прогресс и диагностика Отображение прогресса анализа с помощью всплывающих окон
Взаимодействия при ручной торговле Предоставление обратной связи по торговым действиям
Предупреждение о ручных переопределениях или вмешательствах
Рыночные события и сигнальные оповещения Сигнализация о пересечениях индикаторов
Объявление об открытии сессий или скачках цен
Отладка стратегии и прозрачность Визуальное отслеживание шагов стратегии/логики
Отчет о сбоях логики

Базовый пример

Когда экземпляр этого сиБота добавляется на график, он предоставляет пять кнопок, по одной на каждое состояние уведомления. Нажатие на кнопку вызывает всплывающее уведомление.

 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class PopupNotificationStatesDemo : Robot
    {
        protected override void OnStart()
        {
            var panel = new StackPanel
            {
                Orientation = Orientation.Vertical,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center
            };

            // InProgress
            var inProgressBtn = new Button { Text = "Show: InProgress", Margin = 5 };
            inProgressBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "In progress",
                    "Starting a long-running task…",
                    PopupNotificationState.InProgress
                );
            };
            panel.AddChild(inProgressBtn);

            // Success
            var successBtn = new Button { Text = "Show: Success", Margin = 5 };
            successBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Success",
                    "The operation completed successfully.",
                    PopupNotificationState.Success
                );
            };
            panel.AddChild(successBtn);

            // Error
            var errorBtn = new Button { Text = "Show: Error", Margin = 5 };
            errorBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Error",
                    "Something went wrong. Please check the logs or try again.",
                    PopupNotificationState.Error
                );
            };
            panel.AddChild(errorBtn);

            // Partial
            var partialBtn = new Button { Text = "Show: Partial", Margin = 5 };
            partialBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Partial result",
                    "Completed with partial success (e.g. some orders filled).",
                    PopupNotificationState.Partial
                );
            };
            panel.AddChild(partialBtn);

            // Information
            var infoBtn = new Button { Text = "Show: Information", Margin = 5 };
            infoBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Information",
                    "General update: your settings were saved.",
                    PopupNotificationState.Information
                );
            };
            panel.AddChild(infoBtn);

            Chart.AddControl(panel);
        }

        protected override void OnTick()
        {
            // Handle price updates here if needed
        }

        protected override void OnStop()
        {
            // Cleanup if needed
        }
    }
}

Отслеживание ордеров и обратная связь

Отображение обратной связи по исполнению ордера

Используйте всплывающие уведомления, чтобы мгновенно увидеть, был ли ваш рыночный ордер успешным или нет. Например, после того как ваш сиБот размещает ордер на покупку, он показывает всплывающее окно об успехе, если ваша сделка была исполнена, или всплывающее окно об ошибке, если ваш брокер отклонил ее.

1
2
3
var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
var state = result.IsSuccessful ? PopupNotificationState.Success : PopupNotificationState.Error;
Notifications.ShowPopup("Order Execution", $"Order result: {result.Error}", state);

Подтверждение выходов по ТП или СЛ

Получайте уведомления, когда сделка вашего сиБота закрывается из-за тейк-профита или стоп-лосса. Всплывающее окно показывает причину выхода вместе с прибылью или убытком от закрытой позиции. Эта обратная связь в реальном времени в момент выхода помогает вам отслеживать сделки и быть в курсе результатов ваших активных позиций.

1
2
3
4
5
6
protected override void OnPositionClosed(PositionClosedEventArgs args)
{
    var pos = args.Position;
    var reason = pos.ClosingReason.ToString();
    Notifications.ShowPopup("Position Closed", $"Closed due to {reason}. PnL: {pos.GrossProfit}", PopupNotificationState.Information);
}

Отслеживание изменений скользящего стопа

Видите всплывающее окно каждый раз, когда скользящий стоп обновляет стоп-лосс для вашей позиции. Уведомление включает новое значение стоп-лосса и показывает, как скользящий стоп отслеживает ценовое движение. Эти оповещения позволяют вам отслеживать, как корректируется защита вашей сделки, без открытия какой-либо панели.

1
2
3
4
5
6
7
protected override void OnPositionModified(PositionModifiedEventArgs args)
{
    if (args.Reason == PositionModificationReason.TrailingStop)
    {
        Notifications.ShowPopup("Trailing Stop Moved", $"New SL: {args.Position.StopLoss}", PopupNotificationState.Information);
    }
}

Оповещения о рисках и на основе правил

Предупреждение о низких уровнях маржи

Получайте всплывающее оповещение, когда уровень маржи вашего счета падает ниже критического порога (например, 80%). Предупреждение помогает вам своевременно принять меры, такие как закрытие позиций или добавление средств, чтобы избежать принудительной ликвидации или маржин-колла. Всплывающее окно действует как автоматическая защита на основе данных о рисках в реальном времени.

1
2
3
4
5
6
7
protected override void OnTick()
{
    if (Account.MarginLevel < 80)
    {
        Notifications.ShowPopup("Low Margin Warning", $"Current margin level: {Account.MarginLevel:0.00}%", PopupNotificationState.Error);
    }
}

Показывать оповещения о заблокированных сделках

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnBar()
{
    if (Account.Equity < 100)
    {
        Notifications.ShowPopup("Trade Blocked", "Equity too low to place trade", PopupNotificationState.Error);
        return;
    }

    ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000);
}

Прогресс и диагностика

Показывать прогресс анализа с помощью всплывающих окон

Используйте всплывающее окно InProgress, чтобы указать на начало длительного процесса, такого как проверка данных или подготовка к бэктестингу. После завершения операции обновите всплывающее окно до состояния Success или Error. Отображаемый отчет о прогрессе держит вас в курсе событий без необходимости проверять логи или отладочные сообщения.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
private PopupNotification _progressPopup;

protected override void OnStart()
{
    _progressPopup = Notifications.ShowPopup("Analysis Started", "Running analysis...", PopupNotificationState.InProgress);
    Timer.Start(4); // Simulate 4-second task
}

protected override void OnTimer()
{
    _progressPopup.Complete(PopupNotificationState.Success);
    Timer.Stop();
}

Взаимодействия при ручной торговле

Уведомлять пользователей после сделок, инициированных кнопкой

После того как вы нажмете на пользовательский элемент управления или кнопку, ваш сиБот может разместить ордер и сразу же показать всплывающее окно с результатом. Уведомление подтверждает, было ли ваше ручное действие успешным или неудачным, и отображает любую ошибку, возвращенную брокером. Эта визуальная обратная связь уменьшает неопределенность и повышает вашу уверенность при ручных вмешательствах.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
protected override void OnStart()
{
    var panel = new StackPanel();
    var button = new Button { Text = "Manual Buy" };

    button.Click += args =>
    {
        var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
        var status = result.IsSuccessful ? PopupNotificationState.Success : PopupNotificationState.Error;
        Notifications.ShowPopup("Manual Trade", $"Buy order result: {result.Error}", status);
    };

    panel.AddChild(button);
    Chart.AddControl(panel);
}

Предупреждать о ручных переопределениях или вмешательствах

Когда вы переопределяете автоматическую логику или выполняете ручное переопределение (например, принудительно совершаете сделку в заблокированном состоянии), всплывающее окно может подтвердить это действие.

1
2
3
4
5
button.Click += args =>
{
    Notifications.ShowPopup("Manual Override", "User manually triggered a trade", PopupNotificationState.Information);
    ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000);
};

Рыночные события и оповещения о сигналах

Пересечения индикаторов сигналов

Отслеживайте ключевые технические события, такие как пересечения скользящих средних или пороговые значения RSI, и показывайте всплывающее оповещение при их возникновении. Уведомление выделяет индикатор и выполненное условие, например бычье пересечение. Это держит вас в курсе технических сигналов и делает вашу стратегию более прозрачной и отслеживаемой.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
private MovingAverage _fast, _slow;

protected override void OnStart()
{
    _fast = Indicators.MovingAverage(MarketSeries.Close, 5, MovingAverageType.Exponential);
    _slow = Indicators.MovingAverage(MarketSeries.Close, 20, MovingAverageType.Exponential);
}

protected override void OnBar()
{
    int i = MarketSeries.Close.Count - 1;
    if (_fast.Result[i] > _slow.Result[i] && _fast.Result[i - 1] <= _slow.Result[i - 1])
    {
        Notifications.ShowPopup("MA Crossover", "Fast MA crossed above Slow MA", PopupNotificationState.Information);
    }
}

Оповещать об открытии сессий или скачках цен

Создавайте всплывающие окна, которые срабатывают при возникновении важных рыночных событий, таких как открытие лондонской сессии или резкое движение цены за короткий период. Эти уведомления выступают в качестве инструментов ситуационной осведомленности и помогают вам реагировать на потенциальную волатильность или готовиться к рыночной активности.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBar()
{
    var time = Server.Time;
    if (time.TimeOfDay.Hours == 8 && time.TimeOfDay.Minutes == 0)
    {
        Notifications.ShowPopup("London Session Open", "London market has opened", PopupNotificationState.Information);
    }

    if (Math.Abs(Symbol.Bid - Symbol.Ask) / Symbol.PipSize > 15)
    {
        Notifications.ShowPopup("Spread Spike", "Spread exceeded 15 pips!", PopupNotificationState.Warning);
    }
}

Отладка и прозрачность стратегии

Визуально отслеживать шаги стратегии

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBar()
{
    Notifications.ShowPopup("Step 1", "Checking market condition", PopupNotificationState.Information);

    if (MarketSeries.Close.Last(1) > MarketSeries.Open.Last(1))
    {
        Notifications.ShowPopup("Step 2", "Bullish candle detected", PopupNotificationState.Information);
    }

    Notifications.ShowPopup("Step 3", "Trade logic complete", PopupNotificationState.Success);
}

Сообщать о сбоях логики или неожиданных данных

Когда ваша стратегия сталкивается с ошибкой или недействительными данными, такими как несоответствие цены или недоступный индикатор, используйте всплывающее окно для отображения точной проблемы. Эта настройка помогает выявлять ошибки или пробелы в данных во время разработки и демо/реальной торговли, что приводит к более быстрой отладке и более устойчивой логике.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
protected override void OnBar()
{
    try
    {
        // Assume some strategy logic
        if (Symbol.Bid < 0) throw new Exception("Invalid price feed");

        Notifications.ShowPopup("Logic OK", "Price validation passed", PopupNotificationState.Success);
    }
    catch (Exception ex)
    {
        Notifications.ShowPopup("Logic error", ex.Message, PopupNotificationState.Error);
    }
}