Điều khiển cho phép một số tương tác liên quan đến cBot, chỉ báo và plugin. Sử dụng hướng dẫn dưới đây, bạn có thể dễ dàng tạo các điều khiển giao diện người dùng cơ bản và nâng cao trực tiếp trên biểu đồ.
Có một số lớp tích hợp sẵn đại diện cho các điều khiển phổ biến như nút, khối văn bản, hộp văn bản và hình dạng. Tuy nhiên, bạn cũng có thể tạo các điều khiển tùy chỉnh.
Nếu bạn xây dựng chỉ báo trên và tạo một thể hiện, bạn sẽ thấy một nút Click me màu xám ngay giữa biểu đồ.
Sự khác biệt giữa điều khiển và đối tượng biểu đồ
Trong phần trước, chúng tôi đã đề cập đến các đối tượng biểu đồ. Điều khiển cho phép người dùng tương tác với cBot và chỉ báo. Ngược lại, đối tượng biểu đồ cho phép vẽ một thứ gì đó trên biểu đồ giao dịch hoặc trong cửa sổ đầu ra chỉ báo tách rời.
Điều khiển biểu đồ được kế thừa từ lớp ControlBase trong khi đối tượng biểu đồ được kế thừa từ lớp ChartObject.
Điều khiển biểu đồ được định vị tĩnh bằng cách sử dụng các tùy chọn căn chỉnh khác nhau. Mặc dù đối tượng biểu đồ có thể được định vị theo cách hoàn toàn giống nhau, vị trí của chúng cũng có thể thay đổi động tùy thuộc vào các tọa độ X và Y nhất định.
Tương tự như đối tượng biểu đồ, điều khiển biểu đồ có thể được thêm vào cả biểu đồ chính và bất kỳ cửa sổ đầu ra chỉ báo nào (nếu có). Một ví dụ về việc định vị như vậy được đưa ra dưới đây:
Sau khi tạo một thể hiện chỉ báo, bạn sẽ thấy một nút Click me trong cửa sổ đầu ra chỉ báo.
ColorPicker
Điều khiển ColorPicker cho phép các nhà giao dịch chọn màu sắc ưa thích cho các yếu tố hoặc đối tượng chính trong cTrader. Ví dụ, nhà phát triển có thể tích hợp điều khiển ColorPicker vào cBot vẽ đường xu hướng để người dùng có thể chọn màu ưa thích cho mỗi đường xu hướng. Thiết lập này giúp các nhà giao dịch dễ dàng phân biệt giữa các loại đường xu hướng khác nhau.
Một plugin thêm chỉ báo vào biểu đồ cũng có thể triển khai điều khiển ColorPicker vì tính năng này cho phép người dùng chọn màu cho các đường chỉ báo khác nhau.
Khi người dùng nhấp vào ô màu, bộ chọn màu sẽ xuất hiện. Sau đó, người dùng có thể chọn giữa các màu tiêu chuẩn và tùy chỉnh.
Điều khiển DropZone cho phép các nhà giao dịch thực hiện các thao tác kéo và thả liên quan đến cBot, chỉ báo hoặc plugin. Để triển khai điều khiển này trong thuật toán của bạn, hãy sử dụng lớp DropZone. Điều khiển DropZone có thể được thao tác như bất kỳ điều khiển nào khác.
Khi người dùng thả một tệp hoặc thư mục tương thích vào hộp, sự kiện Dropped sẽ được tạo ra. Khi người dùng thả một thư mục hoặc nhiều thư mục vào hộp, chỉ các tệp tương thích có phần mở rộng được chỉ định trong FilterExtensions mới được xử lý và sao chép.
Ghi chú
Các tệp được thả thường được sao chép và lưu ở vị trí này: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected Files\
Vị trí cho các thể hiện cBot khác với trên: ..\Documents\cAlgo\Data\cBots\{cBotName}\{unique-instance-number}\Selected files\
Mã plugin này cho bạn thấy cách thêm điều khiển DropZone vào 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
Điều khiển ProgressBar hiển thị tiến trình của một hoạt động đang diễn ra. Thanh tiến trình giúp các thuật toán thân thiện với người dùng hơn và giúp quản lý kỳ vọng của các nhà giao dịch về thời gian chờ đợi cho các hoạt động nhất định.
cTrader Algo API cho phép các nhà phát triển thêm hai loại điều khiển ProgressBar: điều khiển vô hạn và điều khiển xác định.
Điều khiển vô hạn
Bạn có thể muốn sử dụng điều khiển vô hạn trong các tình huống sau:
Bạn không thể xác định thời gian chờ đợi cho một hoạt động.
Bạn không thể phát hiện tiến trình của một hoạt động.
Bạn không muốn chỉ ra hoạt động sẽ mất bao lâu.
Điều khiển xác định
Bạn có thể muốn sử dụng điều khiển này khi bạn có thể xác định thời gian chờ đợi cho một hoạt động và muốn người dùng thấy một chỉ báo dựa trên thời gian đó.
Để hiển thị tiến trình của hoạt động, sử dụng thuộc tính Value để đặt một con số. Để đặt phần trăm thanh tiến trình, sử dụng các thuộc tính Minimum và Maximum.
Mã plugin dưới đây cho bạn thấy cách tạo thanh tiến trình sử dụng cả điều khiển vô hạn và xác định (màu xanh lá):
cTrader Algo API cung cấp giao diện OpenFileDialog để cho phép người dùng chọn một tệp cho thuật toán. Khi người dùng chọn một tệp trong cửa sổ kết quả, tệp đó được sao chép vào thư mục Selected files của thuật toán. Một thuật toán có thể làm việc với các tệp bên trong thư mục Selected files của nó mà không bị hạn chế.
Mẹo
Sử dụng chức năng OpenFileDialog khi bạn cần tải các tệp dữ liệu quan trọng, tệp sao lưu hoặc cấu hình, chỉ báo tùy chỉnh hoặc tập lệnh.
Mã dưới đây cho bạn thấy cách sử dụng hộp thoại OpenFileDialog trong một chỉ báo:
cTrader Algo API cung cấp giao diện OpenFolderDialog để cho phép người dùng chỉ định một thư mục cho thuật toán. Khi người dùng chọn một thư mục trong cửa sổ kết quả, tất cả các tệp và thư mục có tệp bên trong thư mục được chọn sẽ được sao chép vào thư mục Selected files của thuật toán.
Mẹo
Sử dụng chức năng OpenFolderDialog khi bạn cần tải một thư mục chứa các tệp dữ liệu quan trọng, tệp sao lưu hoặc cấu hình, chỉ báo tùy chỉnh hoặc tập lệnh.
Các tệp và thư mục được chọn thường được sao chép vào thư mục Selected files vì một thuật toán có thể làm việc với các mục bên trong thư mục đó ngay cả khi AccessRights của nó được đặt thành None.
Ghi chú
Thư mục Selected files của một thuật toán thường nằm theo đường dẫn này: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected files\
Thư mục Selected files cho một thể hiện cBot khác với trên: ..\Documents\cAlgo\Data\cBots\{cBotName}\{Instance-Id}\Selected files\
Mã dưới đây cho bạn thấy cách sử dụng hộp thoại OpenFolderDialog trong một chỉ báo:
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
API cTrader Algo cung cấp giao diện SaveFileDialog để cho phép người dùng lưu các tệp (cục bộ) vào máy tính của họ. Khi cửa sổ liên quan xuất hiện, người dùng chọn thư mục mà họ muốn lưu tệp và nhập tên cho tệp. Sau đó, tệp sẽ được lưu vào vị trí đã chỉ định.
Mẹo
Sử dụng chức năng SaveFileDialog khi bạn cần thực hiện bất kỳ điều nào sau đây:
Lưu báo cáo hiệu suất, kết quả backtest, tệp cấu hình hoặc dữ liệu tối ưu hóa.
Xuất bản ghi giao dịch, nhật ký hoạt động hoặc dữ liệu hoạt động chung của người dùng.
Lưu trữ các chỉ báo tùy chỉnh, dữ liệu cho biểu đồ và trực quan hóa hoặc các tham số cho chiến lược.
Mã dưới đây cho bạn thấy cách sử dụng hộp thoại SaveFileDialog trong một chỉ báo:
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){}}}
Các điều khiển có thể kéo thả
Điều khiển có thể kéo thả trong khu vực biểu đồ
Các giao diện ChartDraggable và ChartDraggables cung cấp các loại cho phép bạn thêm một điều khiển có thể kéo thả có khả năng chứa các điều khiển khác và các phần tử khác nhau vào biểu đồ. Các điều khiển có thể kéo thả này giúp người dùng dễ dàng tương tác với các phần tử biểu đồ khác nhau hơn.
Ghi chú
Một điều khiển có thể kéo thả chỉ có thể được di chuyển hoặc định vị lại trong phạm vi biểu đồ nơi nó đã được thêm vào.
Đoạn mã này cho bạn thấy cách tạo một chỉ báo thêm hai điều khiển có thể di chuyển trong biểu đồ:
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})");}}}
Điều khiển có thể kéo thả trong cửa sổ ứng dụng
Các giao diện ApplicationDraggable và ApplicationDraggables cung cấp các loại được sử dụng để thêm các điều khiển nổi có thể di chuyển riêng lẻ trên toàn bộ cửa sổ ứng dụng cTrader. Các điều khiển như vậy cho phép bạn tạo ra giao diện người dùng tương tác và năng động.
Ghi chú
Trong ba loại thuật toán, chỉ có plugin được phép triển khai các điều khiển có thể kéo thả trên toàn ứng dụng.
Đoạn mã này cho bạn thấy cách tạo một plugin thêm một thành phần WebView và khối văn bản trong hai cửa sổ riêng biệt, có thể di chuyển trên toàn bộ giao diện người dùng cTrader:
Lớp TabControl cung cấp các loại cho phép bạn tạo nhiều tab cho một thuật toán. Các tab này có thể được sử dụng để giữ các phần tử liên quan với nhau hoặc trình bày các chế độ xem riêng biệt cho các chức năng.
Đoạn mã này cho bạn thấy cách sử dụng các tab trong một plugin được thêm vào Bảng ký hiệu đang hoạt động:
Một điều khiển tùy chỉnh về bản chất là một điều khiển được tạo thành từ một số điều khiển được xác định trước. Nói cách khác, đó là một điều khiển mà các điều khiển khác tạo nên nội dung của nó.
Các điều khiển tùy chỉnh hoạt động như các lớp có thể tái sử dụng tương tự như các điều khiển tích hợp sẵn.
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);}}}
Một phiên bản của chỉ báo này sẽ hiển thị bốn hộp văn bản trực tiếp ở trung tâm của biểu đồ chính.
Sắp xếp các điều khiển bằng panel
Để làm việc với các điều khiển thuận tiện hơn, bạn có thể muốn đặt một số điều khiển vào một nhóm riêng biệt với vị trí riêng trong giao diện người dùng. Để làm điều này, bạn có thể sử dụng lớp Panels và các lớp dẫn xuất của nó.
Hãy xem panel như một điều khiển có các điều khiển khác làm nội dung của nó. cTrader hỗ trợ năm lớp khác nhau kế thừa từ lớp cơ sở Panels (lớp này kế thừa từ lớp Control):
Canvas
DockPanel
Grid
StackPanel
WrapPanel
Mỗi lớp trong số các lớp trên sử dụng các bố cục panel và chiến lược định vị khác nhau như được thảo luận dưới đây.
Canvas
Canvas là một panel cho phép định vị các điều khiển dựa trên các tọa độ X và Y nhất định.
Đáng chú ý là trục X và Y khác với các trục được sử dụng bởi các đối tượng biểu đồ hoặc bản vẽ. Tọa độ X và Y được sử dụng bởi lớp Canvas đại diện cho các giá trị số bắt đầu từ (0, 0) từ góc trên bên trái của biểu đồ.
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){}}}
Khi tạo một phiên bản của chỉ báo trên, bạn sẽ thấy nút Click me ở góc trên bên trái của biểu đồ.
Thuộc tính Top của một điều khiển xác định vị trí của nó trên trục Y. Ngược lại, thuộc tính Left xác định vị trí của nó trên trục X.
Đoạn mã trên cũng sử dụng các thuộc tính Padding và Margin. Padding đề cập đến khoảng cách giữa nội dung điều khiển và đường viền ngoài của nó. Margin là khoảng cách giữa điều khiển và đường viền của phần tử cha của nó. Các thuộc tính Padding và Margin áp dụng cho tất cả các panel, không chỉ riêng lớp canvas. Chúng hữu ích để quản lý khoảng cách giữa các điều khiển của bạn.
Trong phần lớn các trường hợp, lớp Canvas được sử dụng để nhóm chỉ một số lượng nhỏ các điều khiển.
Gắn bảng điều khiển
Lớp DockPanel được sử dụng để gắn (đặt) một điều khiển vào một vị trí cố định trên biểu đồ. Có bốn vị trí gắn có thể:
Trên cùng
Dưới cùng
Trái
Phải
Mỗi điều khiển có một thuộc tính Dock. Khi sử dụng lớp DockPanel, bạn có thể sử dụng thuộc tính này để định vị một điều khiển bên trong DockPanel. Điều này được minh họa trong ví dụ sau:
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){}}}
Khi tạo một phiên bản của chỉ báo này, bạn sẽ thấy một dock panel ở trung tâm của biểu đồ chứa một trường văn bản và một nút có thể nhấp.
Lưu ý rằng các dock panel có thể được điền theo chiều ngang hoặc chiều dọc. Bạn không thể sử dụng cả hai hướng này cùng một lúc. Hướng của dock panel được thiết lập tự động khi thiết lập điều khiển đầu tiên trong DockPanel. Nếu thuộc tính Dock của điều khiển đầu tiên được đặt thành Top hoặc Bottom, toàn bộ DockPanel sẽ được định hướng theo chiều dọc, và ngược lại.
Bảng điều khiển xếp chồng
Stack panel là một trong những điều khiển được sử dụng thường xuyên nhất do tính đơn giản và khả năng sử dụng của chúng. Stack panel sắp xếp các điều khiển con theo chiều ngang hoặc chiều dọc lần lượt. Như được hiển thị dưới đây, bạn chỉ cần thiết lập hướng của nó và lớp sẽ quản lý phần còn lại:
Sau khi tạo một phiên bản chỉ báo, bạn sẽ thấy một stack panel nằm ngang với hai trường văn bản và một nút 'Submit' ở góc dưới bên phải của biểu đồ chính.
Bọc bảng điều khiển
Các panel bọc về cơ bản giống với các panel xếp chồng. Tuy nhiên, khi không có đủ không gian để chứa tất cả các phần tử của một panel bọc, nó sẽ tự động bọc các điều khiển còn lại sang dòng tiếp theo trên trục Y.
Lưới
Hãy nghĩ về lưới như các bảng tính với số cột và hàng cố định. Khi sử dụng lưới, bạn có thể thêm các điều khiển vào từng ô riêng biệt.
Như được minh họa bên dưới, khi bạn tạo một thể hiện của lớp Grid, bạn truyền vào số hàng và cột của nó dưới dạng các đối số integer. Khi thêm các phần tử con hoặc điều khiển mới, bạn cũng phải chỉ định số hàng và cột của phần tử con.
Khi tạo một thể hiện của chỉ báo trên, bạn sẽ thấy một lưới 10x2 ngay giữa biểu đồ.
Kiểm soát vị thế trong tọa độ giá và thời gian
Ngoài các điều khiển panel, cTrader cho phép chỉ định tọa độ giá và thời gian cho các điều khiển trực tiếp trong khu vực biểu đồ. Các phương thức AddControl() và MoveControl() cung cấp cho các nhà phát triển thuật toán chức năng này.
Sử dụng các phương thức overload sau để quản lý tọa độ của các điều khiển biểu đồ của bạn tùy theo sở thích.
Để thêm một điều khiển biểu đồ vào khu vực biểu đồ hoặc chỉ báo trên tọa độ chỉ số thanh tuyệt đối và giá (x, y).
Để thêm một điều khiển biểu đồ vào khu vực biểu đồ hoặc chỉ báo trên tọa độ thời gian tuyệt đối (x).
1
voidAddControl(ControlBasecontrol,DateTimetime)
Để di chuyển một điều khiển biểu đồ đến khu vực biểu đồ hoặc chỉ báo trên tọa độ thời gian tuyệt đối (x).
1
voidMoveControl(ControlBasecontrol,DateTimetime)
Để thêm một điều khiển biểu đồ vào khu vực biểu đồ hoặc chỉ báo trên tọa độ chỉ số thanh tuyệt đối (x).
1
voidAddControl(ControlBasecontrol,intbarIndex)
Để di chuyển một điều khiển biểu đồ đến khu vực biểu đồ hoặc chỉ báo trên tọa độ chỉ số thanh tuyệt đối (x).
1
voidMoveControl(ControlBasecontrol,intbarIndex)
Để thêm một điều khiển biểu đồ vào khu vực biểu đồ hoặc chỉ báo trên tọa độ giá tuyệt đối (y).
1
voidAddControl(ControlBasecontrol,doubley)
Để di chuyển một điều khiển biểu đồ đến khu vực biểu đồ hoặc chỉ báo trên tọa độ giá tuyệt đối (y).
1
voidMoveControl(ControlBasecontrol,doubley)
Tham số lớp ControlBase có thể bao gồm bất kỳ lớp phụ nào khác (Control, Button, v.v.) để phương thức được gọi theo các chữ ký trên.
Ví dụ cBot sau thêm nút Click me! phía trên thanh cuối cùng trên biểu đồ. Nút này được di chuyển về phía trước cùng với mỗi thanh mới được thêm vào. Sau khi nhấp vào nút, một hộp thông báo sẽ xuất hiện trên màn hình.
Số lượng điều khiển gốc có thể được thêm vào biểu đồ bị giới hạn ở 100 do các vấn đề hiệu suất có thể xảy ra. Giới hạn này chỉ áp dụng cho một thể hiện thuật toán và các điều khiển gắn với giá và thanh.
Các thuộc tính padding và margin
Thuộc tính Margin xác định khoảng cách giữa các đường viền của đối tượng Control và phần tử cha của nó (biểu đồ, panel, đường viền, v.v.).
Ngược lại, thuộc tính Padding xác định khoảng cách giữa nội dung điều khiển và các đường viền của nó. Bạn có thể thay đổi giá trị thuộc tính để chúng khác nhau cho các cạnh khác nhau.
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){}}}
Một thể hiện của chỉ báo này sẽ tạo ra một nút màu xám Click me ở góc trên bên trái của biểu đồ. Sửa đổi các tham số trong cửa sổ Add instance hoặc Modify parameters để xem chính xác các giá trị margin và padding khác nhau thay đổi cách hiển thị điều khiển như thế nào.
Kiểu dáng
Khi sử dụng kiểu, bạn có thể tạo giao diện tương tự cho một số loại điều khiển khác nhau. Điều này đặc biệt hữu ích khi xử lý một số lượng lớn (năm trở lên) các điều khiển.
Lớp Style cho phép đặt giá trị cho các thuộc tính khác nhau của điều khiển như Margin hoặc BackgroundColor. Sau đó, bạn có thể tái sử dụng các giá trị này làm mẫu cho nhiều điều khiển khác.
Chúng ta cũng có thể tạo giao diện nhất quán cho nhiều điều khiển mà không cần sử dụng lớp 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){}}}
Hình ảnh
Điều khiển Image có thể được sử dụng để hiển thị một hình ảnh được lưu trữ cục bộ. Điều khiển Image sử dụng lớp Bitmap của .NET, có nghĩa là nó hỗ trợ phần lớn các định dạng hình ảnh phổ biến như sau:
.PNG
.JPG
.BMP
.GIF
.TIFF
Tham khảo tài liệu của lớp Bitmap .NET để tìm hiểu thêm về nó.
Để sử dụng điều khiển Image, hãy đặt thuộc tính Source của nó thành dữ liệu tệp hình ảnh trong một mảng byte (byte[]).
Sau khi khởi chạy một thể hiện của chỉ báo trên, bạn sẽ không thấy gì mới trên biểu đồ chính. Tuy nhiên, nhập một đường dẫn tệp hợp lệ làm giá trị của tham số (Image File Path), và bạn sẽ thấy hình ảnh đã chọn được hiển thị ở giữa màn hình.
Bạn cũng có thể sử dụng tài nguyên dự án của mình để lưu trữ hình ảnh và hiển thị chúng thông qua điều khiển Image. Để làm điều này, hãy mở tài nguyên dự án trong Visual Studio và chuyển sang tab Resources. Trong đó, tạo một tài nguyên mới và thêm một hình ảnh hiện có. Sau đó, bạn sẽ có thể sử dụng hình ảnh này làm nguồn trong bất kỳ điều khiển Image nào thông qua thuộc tính Project_Name_Space.Properties.Resources._Image_Name.
Ví dụ, hãy sao chép hình ảnh bên dưới và lưu nó dưới dạng "image.png" trên hệ thống của bạn:
Tạo một chỉ báo mới trong cTrader, đặt tên là "Image Sample", và mở nó qua Visual Studio. Sau đó, thêm chỉ báo logo dự án làm tài nguyên. Để làm điều này, nhấp chuột phải vào dự án của bạn, chọn Properties và nhấp vào Resources, sau đó nhấp vào Create and manage assembly resources. Sao chép tệp logo.png vào tab mới mở.
Sao chép mã bên dưới vào tệp mã nguồn chính của chỉ báo của bạn: