Kontrolki umożliwiają pewne interakcje z udziałem cBotów, wskaźników i wtyczek. Korzystając z poniższego przewodnika, możesz łatwo tworzyć podstawowe i zaawansowane kontrolki interfejsu użytkownika bezpośrednio na wykresie.
Istnieje kilka wbudowanych klas reprezentujących popularne kontrolki, takie jak przyciski, bloki tekstowe, pola tekstowe i kształty. Możesz jednak również tworzyć kontrolki niestandardowe.
Jeśli zbudujesz powyższy wskaźnik i utworzysz instancję, powinieneś zobaczyć szary przycisk Kliknij mnie dokładnie na środku wykresu.
Różnica między kontrolkami a obiektami wykresu
We wcześniejszej sekcji omówiliśmy już obiekty wykresu. Kontrolki umożliwiają użytkownikom interakcję z cBotami i wskaźnikami. Z kolei obiekty wykresu dają możliwość narysowania czegoś na wykresie handlowym lub w odłączonym oknie wyjściowym wskaźnika.
Kontrolki wykresu pochodzą z klasy ControlBase, podczas gdy obiekty wykresu pochodzą z klasy ChartObject.
Kontrolki wykresu są pozycjonowane statycznie przy użyciu różnych opcji wyrównania. Chociaż obiekty wykresu mogą być pozycjonowane dokładnie w ten sam sposób, ich pozycja może również zmieniać się dynamicznie w zależności od określonych współrzędnych X i Y.
Podobnie jak obiekty wykresu, kontrolki wykresu mogą być dodawane zarówno do głównego wykresu, jak i do dowolnych okien wyjściowych wskaźnika (jeśli istnieją). Przykład takiego pozycjonowania podano poniżej:
Po utworzeniu instancji wskaźnika powinieneś zobaczyć przycisk Kliknij mnie w oknie wyjściowym wskaźnika.
ColorPicker
Kontrolka ColorPicker umożliwia traderom wybór preferowanego koloru dla kluczowych elementów lub obiektów w cTrader. Na przykład programista może zintegrować kontrolkę ColorPicker z cBotem, który rysuje linie trendu, aby użytkownicy mogli wybrać preferowany kolor dla każdej linii trendu. Takie rozwiązanie ułatwia traderom rozróżnianie między różnymi typami linii trendu.
Wtyczka dodająca wskaźniki do wykresów może również implementować kontrolkę ColorPicker, ponieważ ta funkcja pozwala użytkownikom wybrać kolor dla różnych linii wskaźnika.
Gdy użytkownicy klikną kwadrat koloru, pojawia się selektor kolorów. Użytkownicy mogą następnie wybierać między kolorami standardowymi a niestandardowymi.
Kontrolka DropZone umożliwia traderom wykonywanie akcji typu „przeciągnij i upuść" z udziałem cBotów, wskaźników lub wtyczek. Aby zaimplementować tę kontrolkę w swoim algorytmie, użyj klasy DropZone. Kontrolką DropZone można manipulować jak każdą inną kontrolką.
Gdy użytkownik upuści kompatybilny plik lub folder w polu, generowane jest zdarzenie Dropped. Gdy użytkownik upuści folder lub wiele folderów w polu, przetwarzane i kopiowane są tylko kompatybilne pliki z określonymi rozszerzeniami w FilterExtensions.
Uwaga
Upuszczone pliki są zwykle kopiowane i zapisywane w tej lokalizacji: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected Files\
Lokalizacja dla instancji cBota różni się od powyższej: ..\Documents\cAlgo\Data\cBots\{cBotName}\{unique-instance-number}\Selected files\
Ten kod wtyczki pokazuje, jak dodać kontrolkę DropZone do Trade Watch:
usingSystem;usingSystem.Drawing;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;namespacecAlgo.Plugins{[Plugin(AccessRights = AccessRights.None)]publicclassTradeWatchTabSample:Plugin{protectedoverridevoidOnStart(){vartab=TradeWatch.AddTab("DropZone");var_border=newBorder{BorderThickness=3,BorderColor=Color.DarkGray,Opacity=0.7,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center,Height=200,Width=350,BackgroundColor=Color.LightGray};var_textBlock=newTextBlock{Text="Drag your files here",Opacity=1,ForegroundColor=Color.DarkGray,FontSize=16,VerticalAlignment=VerticalAlignment.Center,HorizontalAlignment=HorizontalAlignment.Center};var_dropzone=newDropZone{FilterExtensions=newstring[]{"txt","algo","csv"},IsDirectoryDropAllowed=true,IsVisible=true,IsEnabled=true};_border.Child=_textBlock;_dropzone.Child=_border;// _dropzone.Child = _textBlock;tab.Child=_dropzone;_dropzone.Dropped+=Dropped_file;}privatevoidDropped_file(DroppedEventArgsobj){Print("File has been added!");}}}
ProgressBar
Kontrolka ProgressBar wyświetla postęp trwającej operacji. Paski postępu sprawiają, że algorytmy są bardziej przyjazne dla użytkownika i pomagają zarządzać oczekiwaniami traderów dotyczącymi czasu oczekiwania na określone operacje.
cTrader Algo API pozwala programistom dodawać dwa typy kontrolek ProgressBar: kontrolkę nieskończoną i kontrolkę określoną.
Kontrolka nieskończona
Możesz chcieć użyć kontrolki nieskończonej w następujących sytuacjach:
Nie możesz określić czasu oczekiwania na operację.
Nie możesz wykryć postępu operacji.
Nie chcesz wskazywać, jak długo potrwa operacja.
Kontrolka określona
Możesz chcieć użyć tej kontrolki, gdy możesz określić czas oczekiwania na operację i chcesz, aby użytkownicy widzieli wskaźnik oparty na tym czasie.
Aby wyświetlić postęp operacji, użyj właściwości Value, aby ustawić wartość. Aby ustawić procent paska postępu, użyj właściwości Minimum i Maximum.
Poniższy kod wtyczki pokazuje, jak utworzyć pasek postępu przy użyciu zarówno kontrolek nieskończonych, jak i określonych (zielonych):
cTrader Algo API udostępnia interfejs OpenFileDialog, aby umożliwić użytkownikom wybór pliku dla algorytmu. Gdy użytkownik wybierze plik w wynikowym oknie, plik jest kopiowany do folderu Selected files algorytmu. Algorytm może pracować z plikami w swoim folderze Selected files bez ograniczeń.
Wskazówka
Użyj funkcjonalności OpenFileDialog, gdy musisz załadować ważne pliki danych, pliki kopii zapasowych lub konfiguracyjne, wskaźniki niestandardowe lub skrypty.
Poniższy kod pokazuje, jak użyć okna dialogowego OpenFileDialog we wskaźniku:
cTrader Algo API udostępnia interfejs OpenFolderDialog, aby umożliwić użytkownikom określenie folderu dla algorytmu. Gdy użytkownik wybierze folder w wynikowym oknie, wszystkie pliki i foldery z plikami wewnątrz wybranego folderu są kopiowane do folderu Selected files algorytmu.
Wskazówka
Użyj funkcjonalności OpenFolderDialog, gdy musisz załadować folder zawierający krytyczne pliki danych, pliki kopii zapasowych lub konfiguracyjne, wskaźniki niestandardowe lub skrypty.
Wybrane pliki i foldery są zwykle kopiowane do folderu Selected files, ponieważ algorytm może pracować z elementami w tym folderze nawet wtedy, gdy jego AccessRights jest ustawione na None.
Uwaga
Folder Selected files algorytmu znajduje się zwykle w tej ścieżce: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected files\
Folder Selected files dla instancji cBota różni się od powyższego: ..\Documents\cAlgo\Data\cBots\{cBotName}\{Instance-Id}\Selected files\
Poniższy kod pokazuje, jak użyć okna dialogowego OpenFolderDialog we wskaźniku:
usingSystem;usingcAlgo.API;namespacecAlgo{[Indicator(AccessRights = AccessRights.None, IsOverlay = true)]publicclassOpenFolderDialogExample:Indicator{privateOpenFolderDialog_openFolderDialog;protectedoverridevoidInitialize(){_openFolderDialog=newOpenFolderDialog(){InitialDirectory=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),Title="My Open Folder Dialog Title"};varshowOpenFolderDialog=newButton{Text="Show Open Folder Dialog"};showOpenFolderDialog.Click+=showOpenFolderDialog_Click;varpanel=newStackPanel{Orientation=Orientation.Vertical,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center};panel.AddChild(showOpenFolderDialog);Chart.AddControl(panel);}privatevoidshowOpenFolderDialog_Click(ButtonClickEventArgsobj){varresult=_openFolderDialog.ShowDialog();Print($"Result: {result} | FolderName: {_openFolderDialog.FolderName}");}publicoverridevoidCalculate(intindex){}}}
SaveFileDialog
cTrader Algo API udostępnia interfejs SaveFileDialog, aby umożliwić użytkownikom zapisywanie plików (lokalnie) na swoich komputerach. Gdy pojawi się odpowiednie okno, użytkownik wybiera folder, do którego chce zapisać plik, i wprowadza nazwę pliku. Plik jest następnie zapisywany w określonej lokalizacji.
Wskazówka
Użyj funkcjonalności SaveFileDialog, gdy musisz wykonać dowolną z następujących czynności:
Zapisać raporty wydajności, wyniki backtestingu, pliki konfiguracyjne lub dane optymalizacji.
Wyeksportować dzienniki handlowe, dzienniki operacji lub ogólne dane aktywności użytkownika.
Przechowywać wskaźniki niestandardowe, dane dla wykresów i wizualizacji lub parametry strategii.
Poniższy kod pokazuje, jak użyć okna dialogowego SaveFileDialog we wskaźniku:
usingSystem;usingcAlgo.API;usingSystem.Text;namespacecAlgo{[Indicator(AccessRights = AccessRights.None, IsOverlay = true)]publicclassSaveFileDialogExample:Indicator{privateSaveFileDialog_saveFileDialog;protectedoverridevoidInitialize(){_saveFileDialog=newSaveFileDialog(){InitialDirectory=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),Title="My Save File Dialog Title"};varshowSaveFileDialogText=newButton{Text="Show Save File Dialog (Set Content as text)"};varshowSaveFileDialogBytes=newButton{Text="Show Save File Dialog (Set Content as bytes)"};showSaveFileDialogText.Click+=showSaveFileDialogText_Click;showSaveFileDialogBytes.Click+=showSaveFileDialogBytes_Click;varpanel=newStackPanel{Orientation=Orientation.Vertical,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center};panel.AddChild(showSaveFileDialogText);panel.AddChild(showSaveFileDialogBytes);Chart.AddControl(panel);}privatevoidshowSaveFileDialogText_Click(ButtonClickEventArgsobj){varresult=_saveFileDialog.ShowDialog();Print($"Result: {result}");if(result!=FileDialogResult.Cancel){_saveFileDialog.WriteToFile("Test in text");}}privatevoidshowSaveFileDialogBytes_Click(ButtonClickEventArgsobj){varresult=_saveFileDialog.ShowDialog();Print($"Result: {result}");if(result!=FileDialogResult.Cancel){_saveFileDialog.WriteToFile(Encoding.UTF8.GetBytes("Test in bytes"));}}publicoverridevoidCalculate(intindex){}}}
Kontrolki przeciągalne
Kontrolka przeciągalna obszaru wykresu
Interfejsy ChartDraggable i ChartDraggables udostępniają typy, które pozwalają dodać do wykresu kontrolkę przeciągalną zdolną do hostowania innych kontrolek i różnych elementów. Te kontrolki przeciągalne ułatwiają użytkownikom interakcję z różnymi elementami wykresu.
Uwaga
Kontrolkę przeciągalną można przesuwać lub zmieniać jej pozycję tylko w obrębie wykresu, do którego została dodana.
Ten kod pokazuje, jak utworzyć wskaźnik, który dodaje dwa elementy sterujące, które można przemieszczać w obrębie wykresu:
usingSystem;usingcAlgo.API;usingcAlgo.API.Collections;usingcAlgo.API.Indicators;usingcAlgo.API.Internals;namespacecAlgo{[Indicator(AccessRights = AccessRights.None)]publicclassDragControl:Indicator{protectedoverridevoidInitialize(){vardraggable=Chart.Draggables.Add();vardraggable2=IndicatorArea.Draggables.Add();draggable.Child=GetDraggableChildWebView();draggable2.Child=GetDraggableChildText();draggable.LocationChanged+=draggable_LocationChanged;draggable2.LocationChanged+=draggable2_LocationChanged;}publicoverridevoidCalculate(intindex){// Calculate value at specified index// Result[index] = }privateStackPanelGetDraggableChildWebView(){varstackPanel=newStackPanel{HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center,BackgroundColor=Color.Gold};varwebView=newWebView(){Height=500,Width=300};webView.Loaded+=webView_Loaded;stackPanel.AddChild(webView);returnstackPanel;}privateStackPanelGetDraggableChildText(){varstackPanel=newStackPanel{HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center,BackgroundColor=Color.Gold};vartext_block=newTextBlock{Text="Testing draggable controls",Margin=5,ForegroundColor=Color.Black,FontWeight=FontWeight.ExtraBold};stackPanel.AddChild(text_block);returnstackPanel;}privatevoidwebView_Loaded(WebViewLoadedEventArgsobj){obj.WebView.NavigateAsync("https://www.youtube.com/");}privatevoiddraggable_LocationChanged(ChartDraggableLocationChangedEventArgsobj){Print($"Draggable '{obj.Draggable.Id}' location changed to: ({obj.Draggable.X}, {obj.Draggable.Y})");}privatevoiddraggable2_LocationChanged(ChartDraggableLocationChangedEventArgsobj){Print($"Draggable '{obj.Draggable.Id}' location changed to: ({obj.Draggable.X}, {obj.Draggable.Y})");}}}
Przeciągalny element sterujący okna aplikacji
Interfejsy ApplicationDraggable i ApplicationDraggables zapewniają typy używane do dodawania pływających elementów sterujących, które można przemieszczać indywidualnie w całym oknie aplikacji cTrader. Takie elementy sterujące umożliwiają tworzenie interaktywnych i dynamicznych interfejsów użytkownika.
Uwaga
Spośród trzech typów algorytmów tylko wtyczki mogą implementować przeciągalne elementy sterujące obejmujące całą aplikację.
Ten kod pokazuje, jak utworzyć wtyczkę, która dodaje komponent WebView i blok tekstu w dwóch oddzielnych oknach, które można przemieszczać w całym interfejsie użytkownika cTrader:
Klasa TabControl zapewnia typy, które umożliwiają tworzenie wielu kart dla algorytmu. Te karty mogą być używane do grupowania powiązanych elementów lub prezentowania oddzielnych widoków dla funkcjonalności.
Ten kod pokazuje, jak używać kart we wtyczce dodanej do Panelu aktywnego symbolu:
Niestandardowy element sterujący to element sterujący, który w istocie składa się z kilku wstępnie zdefiniowanych elementów sterujących. Innymi słowy, jest to element sterujący, dla którego inne elementy sterujące stanowią jego zawartość.
Niestandardowe elementy sterujące działają jako klasy wielokrotnego użytku podobnie do wbudowanych elementów sterujących.
usingcAlgo.API;namespaceChartControlsTest{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassChartControls:Indicator{[Parameter("# Of Text Areas", DefaultValue = 4)]publicintNumberOfTextAreas{get;set;}protectedoverridevoidInitialize(){varpanel=newWrapPanel{Orientation=Orientation.Horizontal,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center};for(inti=0;i<NumberOfTextAreas;i++){vartextArea=newTextArea{HorizontalAlignment=HorizontalAlignment.Right,VerticalAlignment=VerticalAlignment.Stretch,Margin=5,};panel.AddChild(textArea);}Chart.AddControl(panel);}publicoverridevoidCalculate(intindex){}}publicclassTextArea:CustomControl{privatereadonlyTextBox_textBox;publicTextArea(){_textBox=newTextBox{TextAlignment=TextAlignment.Left,TextWrapping=TextWrapping.Wrap,AcceptsReturn=true,AcceptsTab=true,Width=300,Height=200,};AddChild(_textBox);}}}
Instancja tego wskaźnika powinna wyświetlać cztery pola tekstowe bezpośrednio w centrum głównego wykresu.
Organizuj elementy sterujące za pomocą paneli
Aby praca z elementami sterującymi była wygodniejsza, możesz umieścić kilka elementów sterujących w odrębnej grupie z własną pozycją w interfejsie użytkownika. Aby to zrobić, możesz użyć klasy Panels i jej pochodnych.
Pomyśl o panelu jako o elemencie sterującym z innymi elementami sterującymi jako jego zawartością. cTrader obsługuje pięć różnych klas dziedziczących z podstawowej klasy Panels (która sama dziedziczy z klasy Control):
Canvas
DockPanel
Grid
StackPanel
WrapPanel
Każda z powyższych klas używa różnych układów paneli i strategii pozycjonowania, jak omówiono poniżej.
Płótno
Płótno to panel, który umożliwia pozycjonowanie elementów sterujących na podstawie określonych współrzędnych X i Y.
Warto zauważyć, że osie X i Y różnią się od tych używanych przez obiekty wykresów lub rysunki. Współrzędne X i Y używane przez klasę Canvas reprezentują wartości liczbowe zaczynające się od (0, 0) od lewego górnego rogu wykresu.
usingcAlgo.API;namespaceChartControlsTest{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassChartControls:Indicator{[Parameter(DefaultValue = "Click Me")]publicstringText{get;set;}[Parameter(DefaultValue = 0)]publicdoubleLeft{get;set;}[Parameter(DefaultValue = 0)]publicdoubleTop{get;set;}[Parameter(DefaultValue = 0)]publicdoubleMargin{get;set;}[Parameter(DefaultValue = 10)]publicdoublePadding{get;set;}protectedoverridevoidInitialize(){varbutton=newButton{Text=Text,Left=Left,Top=Top,Margin=Margin,Padding=Padding};button.Click+=Button_Click;varcanvas=newCanvas();/* We add our button control to the canvas panel. */canvas.AddChild(button);// We add our canvas panel to the chart.Chart.AddControl(canvas);}privatevoidButton_Click(ButtonClickEventArgsobj){obj.Button.Text="You clicked me, thanks";}publicoverridevoidCalculate(intindex){}}}
Po utworzeniu instancji powyższego wskaźnika powinieneś zobaczyć przycisk Kliknij mnie w lewym górnym rogu wykresu.
Właściwość Top elementu sterującego określa jego pozycjonowanie na osi Y. Z kolei właściwość Left definiuje jego pozycjonowanie na osi X.
Powyższy kod używa również właściwości Padding i Margin. Padding odnosi się do odległości między zawartością elementu sterującego a jego zewnętrznymi krawędziami. Margin to odległość między elementem sterującym a krawędziami jego elementu nadrzędnego. Właściwości Padding i Margin mają zastosowanie do wszystkich paneli, nie tylko do klasy płótna. Są przydatne do zarządzania odstępami między elementami sterującymi.
W większości przypadków klasa Canvas jest używana do grupowania tylko niewielkiej liczby elementów sterujących.
Panel dokowania
Klasa DockPanel służy do dokowania (umieszczania) elementu sterującego w statycznej lokalizacji na wykresie. Istnieją cztery możliwe pozycje dokowania:
Góra
Dół
Lewo
Prawo
Każdy element sterujący ma właściwość Dock. Podczas używania klasy DockPanel możesz użyć tej właściwości do pozycjonowania elementu sterującego wewnątrz DockPanel. Ilustruje to poniższy przykład:
usingcAlgo.API;namespaceChartControlsTest{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassChartControls:Indicator{[Parameter(DefaultValue = Dock.Top)]publicDockTextBoxDock{get;set;}[Parameter(DefaultValue = Dock.Bottom)]publicDockButtonDock{get;set;}privateTextBox_textBox;protectedoverridevoidInitialize(){_textBox=newTextBox{Margin=5,Text="Write here...",ForegroundColor=Color.Yellow,Dock=TextBoxDock,Width=200};varbutton=newButton{Text="Tell what I wrote?",Dock=ButtonDock,Width=200};button.Click+=Button_Click;vardockPanel=newDockPanel{HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center,};dockPanel.AddChild(_textBox);dockPanel.AddChild(button);Chart.AddControl(dockPanel);}privatevoidButton_Click(ButtonClickEventArgsobj){obj.Button.Text=$"You wrote: {_textBox.Text}";}publicoverridevoidCalculate(intindex){}}}
Podczas tworzenia instancji tego wskaźnika powinieneś zobaczyć panel dokowania w centrum wykresu zawierający pole tekstowe i klikalny przycisk.
Należy zauważyć, że panele dokowania mogą być wypełniane poziomo lub pionowo. Nie możesz używać obu tych wyrównań jednocześnie. Orientacja panelu dokowania jest ustawiana automatycznie podczas konfigurowania pierwszego elementu sterującego w DockPanel. Jeśli właściwość Dock pierwszego elementu sterującego jest ustawiona na Top lub Bottom, cały DockPanel będzie zorientowany pionowo i odwrotnie.
Panel stosu
Panele stosu są jednymi z najczęściej używanych elementów sterujących ze względu na ich prostotę i użyteczność. Panele stosu wyrównują elementy sterujące podrzędne poziomo lub pionowo jeden po drugim. Jak pokazano poniżej, wystarczy ustawić jego orientację, a klasa zajmie się resztą:
Po utworzeniu instancji wskaźnika powinieneś zobaczyć poziomy panel stosu z dwoma polami tekstowymi i przyciskiem Prześlij w prawym dolnym rogu głównego wykresu.
Panel zawijania
Panele zawijania są w większości identyczne z panelami stosu. Jednak gdy nie ma wystarczającej ilości miejsca, aby zmieścić wszystkie elementy panelu zawijania, automatycznie zawinie pozostałe elementy sterujące do następnej linii na osi Y.
Siatka
Pomyśl o siatkach jak o arkuszach kalkulacyjnych z ustaloną liczbą kolumn i wierszy. Podczas używania siatek możesz dodawać elementy sterujące do każdej oddzielnej komórki.
Jak pokazano poniżej, podczas tworzenia instancji klasy Grid przekazujesz liczbę jej wierszy i kolumn jako argumenty integer. Podczas dodawania nowych elementów podrzędnych lub elementów sterujących musisz podobnie określić liczbę wierszy i kolumn podrzędnych.
Podczas tworzenia instancji powyższego wskaźnika powinieneś zobaczyć siatkę 10x2 dokładnie w centrum wykresu.
Pozycjonuj elementy sterujące w obrębie współrzędnych ceny i czasu
Oprócz elementów sterujących panelu cTrader umożliwia określanie współrzędnych ceny i czasu dla elementów sterujących bezpośrednio w obszarze wykresu. Metody AddControl() i MoveControl() zapewniają programistom algorytmów tę funkcjonalność.
Użyj następujących przeciążeń metod, aby zarządzać współrzędnymi elementów sterujących wykresu w zależności od swoich preferencji.
Aby dodać element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnych współrzędnych indeksu słupka i ceny (x, y).
Aby dodać element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnej współrzędnej czasu (x).
1
voidAddControl(ControlBasecontrol,DateTimetime)
Aby przenieść element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnej współrzędnej czasu (x).
1
voidMoveControl(ControlBasecontrol,DateTimetime)
Aby dodać element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnej współrzędnej indeksu słupka (x).
1
voidAddControl(ControlBasecontrol,intbarIndex)
Aby przenieść element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnej współrzędnej indeksu słupka (x).
1
voidMoveControl(ControlBasecontrol,intbarIndex)
Aby dodać element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnej współrzędnej ceny (y).
1
voidAddControl(ControlBasecontrol,doubley)
Aby przenieść element sterujący wykresu do obszaru wykresu lub wskaźnika na bezwzględnej współrzędnej ceny (y).
1
voidMoveControl(ControlBasecontrol,doubley)
Klasa parametrów ControlBase może zawierać dowolną inną klasę podrzędną (Control, Button itp.), aby metoda została wywołana zgodnie z powyższymi sygnaturami.
Poniższy przykład cBota dodaje przycisk Kliknij mnie! nad ostatnim słupkiem na wykresie. Przycisk jest przesuwany do przodu wraz z każdym nowym dodanym słupkiem. Po kliknięciu przycisku na ekranie pojawia się okno komunikatu.
Liczba głównych elementów sterujących, które można dodać na wykresie, jest ograniczona do 100 ze względu na możliwe problemy z wydajnością. To ograniczenie dotyczy tylko jednego wystąpienia algorytmu i kontrolek dołączonych do ceny i słupków.
Właściwości padding i margin
Właściwość Margin określa przestrzeń między obramowaniami obiektu Control a jego elementem nadrzędnym (wykresem, panelem, obramowaniem itp.).
Z kolei właściwość Padding określa przestrzeń między zawartością kontrolki a jej obramowaniami. Możesz zmieniać wartości właściwości tak, aby były różne dla różnych stron.
usingcAlgo.API;namespaceChartControlsTest{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassChartControls:Indicator{[Parameter(DefaultValue = "Click Me")]publicstringText{get;set;}[Parameter(DefaultValue = 0)]publicdoubleLeft{get;set;}[Parameter(DefaultValue = 0)]publicdoubleTop{get;set;}[Parameter(DefaultValue = 0, Group = "Margin")]publicdoubleLeftMargin{get;set;}[Parameter(DefaultValue = 0, Group = "Margin")]publicdoubleTopMargin{get;set;}[Parameter(DefaultValue = 0, Group = "Margin")]publicdoubleRightMargin{get;set;}[Parameter(DefaultValue = 0, Group = "Margin")]publicdoubleBottomMargin{get;set;}[Parameter(DefaultValue = 5, Group = "Padding")]publicdoubleLeftPadding{get;set;}[Parameter(DefaultValue = 5, Group = "Padding")]publicdoubleTopPadding{get;set;}[Parameter(DefaultValue = 5, Group = "Padding")]publicdoubleRightPadding{get;set;}[Parameter(DefaultValue = 5, Group = "Padding")]publicdoubleBottomPadding{get;set;}protectedoverridevoidInitialize(){varbutton=newButton{Text=Text,Left=Left,Top=Top,Margin=newThickness(LeftMargin,TopMargin,RightMargin,BottomMargin),Padding=newThickness(LeftPadding,TopPadding,RightPadding,BottomPadding)};button.Click+=Button_Click;varcanvas=newCanvas();canvas.AddChild(button);Chart.AddControl(canvas);}privatevoidButton_Click(ButtonClickEventArgsobj){obj.Button.Text="You clicked me, thanks";}publicoverridevoidCalculate(intindex){}}}
Wystąpienie tego wskaźnika utworzy szary przycisk Click me w lewym górnym rogu wykresu. Zmodyfikuj parametry w oknach Dodaj wystąpienie lub Modyfikuj parametry, aby zobaczyć, jak dokładnie różne wartości marginesu i paddingu zmieniają sposób wyświetlania kontrolki.
Style
Używając stylów, możesz nadać podobny wygląd kilku różnym typom kontrolek. Jest to szczególnie przydatne w przypadku dużej (pięciu lub więcej) liczby kontrolek.
Klasa Style umożliwia ustawianie wartości dla różnych właściwości kontrolek, takich jak Margin lub BackgroundColor. Następnie możesz ponownie wykorzystać te wartości jako szablon dla wielu innych kontrolek.
Możemy również stworzyć spójny wygląd dla wielu kontrolek bez użycia klasy Style.
usingcAlgo.API;namespaceChartControlsTest{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassChartControls:Indicator{protectedoverridevoidInitialize(){vartextBoxStyle=newStyle();textBoxStyle.Set(ControlProperty.ForegroundColor,Color.Red);textBoxStyle.Set(ControlProperty.Margin,5);textBoxStyle.Set(ControlProperty.FontFamily,"Cambria");textBoxStyle.Set(ControlProperty.FontSize,12);textBoxStyle.Set(ControlProperty.Width,150);// Here we change the foreground color to Yellow if mouse hover over the textboxtextBoxStyle.Set(ControlProperty.ForegroundColor,Color.Yellow,ControlState.Hover);varfirstTextBox=newTextBox{Text="Type...",Style=textBoxStyle};varsecondTextBox=newTextBox{Text="Type...",Style=textBoxStyle};varthirdTextBox=newTextBox{Text="Type...",Style=textBoxStyle};varpanel=newStackPanel{Orientation=Orientation.Vertical,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Center};panel.AddChild(firstTextBox);panel.AddChild(secondTextBox);panel.AddChild(thirdTextBox);Chart.AddControl(panel);}publicoverridevoidCalculate(intindex){}}}
Obraz
Kontrolka Image może być używana do wyświetlania lokalnie przechowywanego obrazu. Kontrolka Image używa klasy .NET Bitmap, co oznacza, że obsługuje większość popularnych formatów obrazów, takich jak następujące:
.PNG
.JPG
.BMP
.GIF
.TIFF
Zapoznaj się z dokumentacją klasy .NET Bitmap, aby dowiedzieć się więcej na jej temat.
Aby użyć kontrolki Image, ustaw jej właściwość Source na dane pliku obrazu w tablicy bajtów (byte[]).
Po uruchomieniu wystąpienia powyższego wskaźnika nie powinieneś zobaczyć nic nowego na głównym wykresie. Jednak wprowadź prawidłową ścieżkę pliku jako wartość parametru (Image File Path), a powinieneś zobaczyć wybrany obraz wyświetlony na środku ekranu.
Możesz również użyć zasobów swojego projektu do przechowywania obrazów i wyświetlania ich za pomocą kontrolki Image. Aby to zrobić, otwórz zasoby projektu w Visual Studio i przełącz się na kartę Resources. W niej utwórz nowy zasób i dodaj istniejący obraz. Następnie będziesz mógł użyć tego obrazu jako źródła w dowolnej kontrolce Image za pomocą właściwości Project_Name_Space.Properties.Resources._Image_Name.
Jako przykład skopiuj poniższy obraz i zapisz go jako „image.png" w swoim systemie:
Utwórz nowy wskaźnik w cTrader, ustaw jego nazwę na „Image Sample" i otwórz go za pomocą Visual Studio. Następnie dodaj projekt wskaźnika logo jako zasób. Aby to zrobić, kliknij prawym przyciskiem myszy swój projekt, wybierz Properties i kliknij Resources, a następnie kliknij Create and manage assembly resources. Skopiuj plik logo.png do nowo otwartej karty.
Skopiuj poniższy kod do głównego pliku kodu źródłowego wskaźnika: