Przejdź do treści

Custom Frame Sample

Przegląd

Wtyczka Custom Frame Sample umożliwia podstawowe zarządzanie ramkami w interfejsie wykresów cTrader. Kontroluje sposób wyświetlania niestandardowych ramek na wykresie, oferując prosty sposób organizowania elementów wizualnych i dostosowywania obszaru roboczego poprzez następujące kluczowe funkcje:

  • Dodaje niestandardową ramkę do interfejsu wykresu jednym kliknięciem.
  • Odłącza lub ponownie dołącza ramkę, aby wspierać układy wieloekranowe i elastyczne konfiguracje obszaru roboczego.
  • Usuwa ramkę, gdy nie jest już potrzebna, aby zachować przejrzystość i skupienie obszaru wykresu.
  • Wyświetla niestandardowy blok tekstowy w ramce, aby wspierać dostosowywanie wykresu w czasie rzeczywistym i wizualną informację zwrotną.

Ta wtyczka tworzy prosty interfejs w Panelu aktywnego symbolu, który umożliwia dodawanie, usuwanie, dołączanie lub odłączanie niestandardowej ramki wykresu. Każdy przycisk uruchamia określoną akcję, ułatwiając zarządzanie elementami wizualnymi bezpośrednio na wykresie. Wtyczka działa tylko wtedy, gdy cTrader Windows lub Mac jest otwarty i zatrzymuje się automatycznie po zamknięciu platformy.

Tworzenie wtyczki

Dowiedz się, jak tworzyć wtyczki, używając C# lub Pythona, w naszych krok po kroku przewodnikach.

Kod wtyczki Custom Frame Sample jest dostępny w naszych publicznych repozytoriach C# i Python. Ten sam kod jest dostarczany jako szablon w kreatorze tworzenia algorytmu w cTrader Windows lub Mac, lub możesz po prostu skopiować i użyć poniższego fragmentu:

 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

Opcje dostosowywania

Custom Frame Sample zawiera przyciski sterujące, które pozwalają dodawać, usuwać i wchodzić w interakcję z niestandardową ramką bezpośrednio na wykresie. Poniższa tabela przedstawia jej kluczowe komponenty i ich funkcje:

Parametr Opis Możliwe wartości
panel Dodaje lub zmienia kolejność przycisków dla dodatkowych akcji ramki lub opcji interfejsu użytkownika. stackpanel [panel]
Text Edytuje tekst przycisku dla przejrzystości. Add custom frame, Remove custom frame, Detach custom frame, Attach custom frame
Margin Zmienia marginesy dla wizualnej równowagi. 5, 8, 12 itd.
AddCustomFrame Modyfikuje tytuł ramki, aby odzwierciedlał cel lub symbol. chartmanager.addcustomframe(Custom frame)
TextBlock.Text Zmienia komunikat, aby odzwierciedlał kontekst lub identyfikator. Custom frame sample
FontSize Dostosowuje rozmiar dla przejrzystości i dopasowania układu. 32, 36, 40 itd.
HorizontalAlignment Dostosowuje wyrównanie, aby zmienić poziomą prezentację treści. horizontalalignment.center
VerticalAlignment Dostosowuje wyrównanie, aby zmienić pionową prezentację treści. verticalalignment.center
Attach() Dodaje komunikat, gdy ramka jest ponownie dołączana do wykresu. customframe.attach()
Detach() Dodaje komunikat, gdy ramka jest odłączana od wykresu. customframe.detach()
RemoveFrame Zmienia nazwę przycisku, aby odzwierciedlał jego cel. chartmanager.removeframe(customframe.id)

Przypadki użycia

Custom Frame Sample umożliwia interaktywne zarządzanie wykresem bez konieczności korzystania z usług zewnętrznych. Poniższe przypadki użycia pokazują, jak wtyczka może ulepszyć doświadczenie handlowe.

Przypadek użycia Scenariusz Wartość
Podświetlanie sygnałów handlowych Dodaj ramkę z komunikatem takim jak Obserwuj przełamanie na EURUSD. Zwraca uwagę na alerty specyficzne dla wykresu lub notatki użytkownika.
Zarządzanie wieloekranowe Odłącz ramki i przenieś je na inne ekrany. Rozszerza widoczność wykresu i wspiera wieloekranowe konfiguracje handlowe.
Niestandardowa organizacja obszaru roboczego Organizuj obszar wykresu za pomocą ramek, aby dopasować go do osobistego przepływu pracy handlowej. Pomaga organizować obszar wykresu w oparciu o osobisty przepływ pracy handlowej.
Niestandardowe znaczniki wizualne Ręcznie dodawaj ramki z notatkami, aby podświetlić zdarzenia na wykresie, takie jak wpisy zleceń. Zapewnia elastyczny sposób oznaczania kluczowych punktów na wykresie bez trwałych rysunków.

Podsumowanie

Ta wtyczka oferuje praktyczny sposób zarządzania niestandardowymi ramkami bezpośrednio na wykresach cTrader. Dzięki prostym kontrolkom umożliwiającym dodawanie, usuwanie, dołączanie lub odłączanie ramek pomaga spersonalizować obszar roboczy, wyróżnić kluczowe informacje i łatwo uporządkować układy wykresów.

Aby uzyskać więcej szczegółów dotyczących rozwoju, zapoznaj się z naszą dokumentacją wtyczek.