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

Custom Frame Sample

Обзор

Плагин Custom Frame Sample обеспечивает базовое управление фреймами в интерфейсе графиков cTrader. Он контролирует, как пользовательские фреймы отображаются на графике, предлагая простой способ организации визуальных элементов и настройки рабочего пространства с помощью следующих ключевых функций:

  • Добавляет пользовательский фрейм в интерфейс графика одним нажатием.
  • Отсоединяет или присоединяет фрейм для поддержки многоэкранных макетов и гибких конфигураций рабочего пространства.
  • Удаляет фрейм, когда он больше не нужен, чтобы область графика оставалась чистой и сфокусированной.
  • Отображает пользовательский текстовый блок внутри фрейма для поддержки настройки графика в реальном времени и визуальной обратной связи.

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

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

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

Код плагина Custom Frame 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
using System.Linq; 
using cAlgo.API;

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class CustomFrameSample : Plugin
    {
        protected override void OnStart()
        {
            var aspBlock = Asp.SymbolTab.AddBlock("Custom Frame Sample");

            var panel = new StackPanel();

            var addCustomFrameButton = new Button { Text = "Add Custom Frame", Margin = 5 };
            addCustomFrameButton.Click += OnAddCustomFrameButtonClick;
            panel.AddChild(addCustomFrameButton);

            var removeCustomFrameButton = new Button { Text = "Remove Custom Frame", Margin = 5 };
            removeCustomFrameButton.Click += OnRemoveCustomFrameButtonClick;
            panel.AddChild(removeCustomFrameButton);

            var detachCustomFrameButton = new Button { Text = "Detach Custom Frame", Margin = 5 };
            detachCustomFrameButton.Click += OnDetachCustomFrameButtonClick;
            panel.AddChild(detachCustomFrameButton);

            var attachCustomFrameButton = new Button { Text = "Attach Custom Frame", Margin = 5 };
            attachCustomFrameButton.Click += OnAttachCustomFrameButtonClick;
            panel.AddChild(attachCustomFrameButton);

            aspBlock.Child = panel;
        }

        private void OnAttachCustomFrameButtonClick(ButtonClickEventArgs obj)
        {
            if (ChartManager.OfType<CustomFrame>().FirstOrDefault(c => !c.IsAttached) is not {} customFrame)
                return;

            customFrame.Attach();
        }

        private void OnDetachCustomFrameButtonClick(ButtonClickEventArgs obj)
        {
            if (ChartManager.OfType<CustomFrame>().FirstOrDefault(c => c.IsAttached) is not {} customFrame)
                return;

            customFrame.Detach();
        }

        private void OnRemoveCustomFrameButtonClick(ButtonClickEventArgs obj)
        {
            if (ChartManager.OfType<CustomFrame>().FirstOrDefault() is not {} customFrame)
                return;

            ChartManager.RemoveFrame(customFrame.Id);
        }

        private void OnAddCustomFrameButtonClick(ButtonClickEventArgs obj)
        {
            var customFrame = ChartManager.AddCustomFrame("Custom Frame");

            customFrame.Child = new TextBlock
            {
                Text = $"Custom Frame {customFrame.Id} Child Control",
                FontSize = 32,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center
            };
        }
    }        
}
 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
import clr
clr.AddReference("cAlgo.API")

from cAlgo.API import *

class CustomFrameSample():
    def on_start(self):
        aspBlock = api.Asp.SymbolTab.AddBlock("Custom Frame Sample");

        panel = StackPanel()

        addCustomFrameButton = Button()
        addCustomFrameButton.Text = "Add Custom Frame"
        addCustomFrameButton.Margin = Thickness(5)    
        addCustomFrameButton.Click += self.on_add_custom_frame_button_click

        panel.AddChild(addCustomFrameButton)

        removeCustomFrameButton = Button()
        removeCustomFrameButton.Text = "Remove Custom Frame"
        removeCustomFrameButton.Margin = Thickness(5) 
        removeCustomFrameButton.Click += self.on_remove_custom_frame_button_click

        panel.AddChild(removeCustomFrameButton)

        detachCustomFrameButton = Button()
        detachCustomFrameButton.Text = "Detach Custom Frame"
        detachCustomFrameButton.Margin = Thickness(5) 
        detachCustomFrameButton.Click += self.on_detach_custom_frame_button_click

        panel.AddChild(detachCustomFrameButton);

        attachCustomFrameButton = Button()
        attachCustomFrameButton.Text = "Attach Custom Frame"
        attachCustomFrameButton.Margin = Thickness(5) 
        attachCustomFrameButton.Click += self.on_attach_custom_frame_button_click

        panel.AddChild(attachCustomFrameButton)

        aspBlock.Child = panel

    def on_add_custom_frame_button_click(self, args):
        customFrame = api.ChartManager.AddCustomFrame("Custom Frame");

        textBlock = TextBlock()
        textBlock.Text = f"Custom Frame {customFrame.Id} Child Control"
        textBlock.FontSize = 32
        textBlock.HorizontalAlignment = HorizontalAlignment.Center
        textBlock.VerticalAlignment = VerticalAlignment.Center

        customFrame.Child = textBlock

    def on_remove_custom_frame_button_click(self, args):
        for frame in api.ChartManager:
            if isinstance(frame.__implementation__, CustomFrame) == False:
                continue
            customFrame = CustomFrame(frame)
            api.ChartManager.RemoveFrame(customFrame.Id)
            break

    def on_detach_custom_frame_button_click(self, args):
        for frame in api.ChartManager:
            if isinstance(frame.__implementation__, CustomFrame) == False:
                continue
            customFrame = CustomFrame(frame)
            if customFrame.IsAttached == False:
                continue
            customFrame.Detach()
            break

    def on_attach_custom_frame_button_click(self, args):
        for frame in api.ChartManager:
            if isinstance(frame.__implementation__, CustomFrame) == False:
                continue
            customFrame = CustomFrame(frame)
            if customFrame.IsAttached == True:
                continue
            customFrame.Attach()
            break

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

Custom Frame Sample включает кнопки управления, которые позволяют добавлять, удалять и взаимодействовать с пользовательским фреймом прямо на графике. В таблице ниже описаны его ключевые компоненты и их функции:

Параметр Описание Возможные значения
panel Добавляет или переупорядочивает кнопки для дополнительных действий с фреймом или параметров интерфейса. stackpanel [panel]
Text Редактирует текст кнопки для ясности. Add custom frame, Remove custom frame, Detach custom frame, Attach custom frame
Margin Изменяет поля для визуального баланса. 5, 8, 12 и т. д.
AddCustomFrame Изменяет заголовок фрейма, чтобы отразить назначение или инструмент. chartmanager.addcustomframe(Custom frame)
TextBlock.Text Изменяет сообщение, чтобы отразить контекст или идентификатор. Custom frame sample
FontSize Настраивает размер для ясности и соответствия макету. 32, 36, 40 и т. д.
HorizontalAlignment Настраивает выравнивание для изменения горизонтального представления контента. horizontalalignment.center
VerticalAlignment Настраивает выравнивание для изменения вертикального представления контента. verticalalignment.center
Attach() Добавляет сообщение при повторном присоединении фрейма к графику. customframe.attach()
Detach() Добавляет сообщение при отсоединении фрейма от графика. customframe.detach()
RemoveFrame Переименовывает кнопку, чтобы отразить ее назначение. chartmanager.removeframe(customframe.id)

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

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

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

Обзор

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

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