Элементы управления обеспечивают определенные взаимодействия с участием сиБотов, индикаторов и плагинов. Используя приведенное ниже руководство, вы можете легко создавать базовые и расширенные элементы управления пользовательского интерфейса непосредственно на графике.
Существует несколько встроенных классов, которые представляют популярные элементы управления, такие как кнопки, текстовые блоки, текстовые поля и фигуры. Однако вы также можете создавать пользовательские элементы управления.
Если вы создадите вышеуказанный индикатор и создадите экземпляр, вы должны увидеть серую кнопку Click me прямо в центре графика.
Разница между элементами управления и объектами графика
В предыдущем разделе мы уже рассмотрели объекты графика. Элементы управления позволяют пользователям взаимодействовать с сиБотами и индикаторами. И наоборот, объекты графика дают возможность нарисовать что-то на торговом графике или в отдельном окне вывода индикатора.
Элементы управления графиком наследуются от класса ControlBase, в то время как объекты графика наследуются от класса ChartObject.
Элементы управления графиком позиционируются статически с использованием различных параметров выравнивания. Хотя объекты графика могут быть позиционированы точно так же, их положение также может изменяться динамически в зависимости от определенных координат X и Y.
Подобно объектам графика, элементы управления графиком могут быть добавлены как на основной график, так и в любые окна вывода индикатора (если они существуют). Пример такого позиционирования приведен ниже:
После создания экземпляра индикатора вы должны увидеть кнопку Click me в окне вывода индикатора.
ColorPicker
Элемент управления ColorPicker позволяет трейдерам выбирать предпочитаемый цвет для ключевых элементов или объектов в cTrader. Например, разработчик может интегрировать элемент управления ColorPicker в сиБота, который рисует линии тренда, чтобы пользователи могли выбрать предпочитаемый цвет для каждой линии тренда. Такая настройка облегчает трейдерам различение между различными типами линий тренда.
Плагин, который добавляет индикаторы на графики, также может реализовать элемент управления ColorPicker, поскольку эта функция позволяет пользователям выбирать цвет для различных линий индикатора.
Когда пользователи нажимают на квадрат цвета, появляется селектор цвета. Затем пользователи могут выбирать между стандартными и пользовательскими цветами.
Элемент управления DropZone позволяет трейдерам выполнять действия перетаскивания с участием сиБотов, индикаторов или плагинов. Чтобы реализовать этот элемент управления в вашем алгоритме, используйте класс DropZone. Элементом управления DropZone можно манипулировать, как и любым другим элементом управления.
Когда пользователь перетаскивает совместимый файл или папку в поле, генерируется событие Dropped. Когда пользователь перетаскивает папку или несколько папок в поле, обрабатываются и копируются только совместимые файлы с указанными расширениями в FilterExtensions.
Примечание
Перетаскиваемые файлы обычно копируются и сохраняются в этом месте: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected Files\
Расположение для экземпляров сиБотов отличается от вышеуказанного: ..\Documents\cAlgo\Data\cBots\{cBotName}\{unique-instance-number}\Selected files\
Этот код плагина показывает, как добавить элемент управления DropZone в Обзор сделок:
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
Элемент управления ProgressBar отображает прогресс текущей операции. Индикаторы выполнения делают алгоритмы более удобными для пользователя и помогают управлять ожиданиями трейдеров относительно времени ожидания определенных операций.
cTrader Algo API позволяет разработчикам добавлять два типа элементов управления ProgressBar: бесконечный элемент управления и определенный элемент управления.
Бесконечный элемент управления
Вы можете использовать бесконечный элемент управления в следующих ситуациях:
Вы не можете определить время ожидания операции.
Вы не можете обнаружить прогресс операции.
Вы не хотите указывать, сколько времени займет операция.
Определенный элемент управления
Вы можете использовать этот элемент управления, когда можете определить время ожидания операции и хотите, чтобы пользователи видели индикатор на основе этого времени.
Чтобы отобразить прогресс операции, используйте свойство Value для установки значения. Чтобы установить процент индикатора выполнения, используйте свойства Minimum и Maximum.
Приведенный ниже код плагина показывает, как создать индикатор выполнения, используя как бесконечный, так и определенный (зеленый) элементы управления:
cTrader Algo API предоставляет интерфейс OpenFileDialog, позволяющий пользователям выбирать файл для алгоритма. Когда пользователь выбирает файл в появившемся окне, файл копируется в папку алгоритма Selected files. Алгоритм может работать с файлами внутри своей папки Selected files без ограничений.
Совет
Используйте функциональность OpenFileDialog, когда вам нужно загрузить важные файлы данных, резервные копии или файлы конфигурации, пользовательские индикаторы или скрипты.
Приведенный ниже код показывает, как использовать диалоговое окно OpenFileDialog в индикаторе:
cTrader Algo API предоставляет интерфейс OpenFolderDialog, позволяющий пользователям указать папку для алгоритма. Когда пользователь выбирает папку в появившемся окне, все файлы и папки с файлами внутри выбранной папки копируются в папку Selected files алгоритма.
Совет
Используйте функциональность OpenFolderDialog, когда вам нужно загрузить папку, содержащую критически важные файлы данных, резервные копии или файлы конфигурации, пользовательские индикаторы или скрипты.
Выбранные файлы и папки обычно копируются в папку Selected files, потому что алгоритм может работать с элементами внутри этой папки, даже когда его AccessRights установлен на None.
Примечание
Папка Selected files алгоритма обычно находится по этому пути: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected files\
Папка Selected files для экземпляра сиБота отличается от указанной выше: ..\Documents\cAlgo\Data\cBots\{cBotName}\{Instance-Id}\Selected files\
Приведенный ниже код показывает, как использовать диалоговое окно OpenFolderDialog в индикаторе:
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 предоставляет интерфейс SaveFileDialog, позволяющий пользователям сохранять файлы (локально) на своих компьютерах. Когда появляется соответствующее окно, пользователь выбирает папку, в которую он хочет сохранить файл, и вводит имя файла. Затем файл сохраняется в указанном месте.
Совет
Используйте функциональность SaveFileDialog, когда вам нужно выполнить любое из следующих действий:
Сохранить отчеты о производительности, результаты бэктестинга, файлы конфигурации или данные оптимизации.
Экспортировать торговые логи, журналы операций или общие данные о действиях пользователя.
Сохранить пользовательские индикаторы, данные для графиков и визуализаций или параметры стратегии.
Приведенный ниже код показывает, как использовать диалоговое окно SaveFileDialog в индикаторе:
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){}}}
Перетаскиваемые элементы управления
Перетаскиваемый элемент управления в области графика
Интерфейсы ChartDraggable и ChartDraggables предоставляют типы, позволяющие добавлять на график перетаскиваемый элемент управления, способный размещать другие элементы управления и различные элементы. Эти перетаскиваемые элементы управления упрощают взаимодействие пользователей с различными элементами графика.
Примечание
Перетаскиваемый элемент управления можно перемещать или изменять его положение только в пределах графика, на который он был добавлен.
Этот код показывает, как создать индикатор, который добавляет два элемента управления, которые можно перемещать в пределах графика:
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})");}}}
Перетаскиваемый элемент управления в окне приложения
Интерфейсы ApplicationDraggable и ApplicationDraggables предоставляют типы, используемые для добавления плавающих элементов управления, которые можно перемещать по отдельности по всему окну приложения cTrader. Такие элементы управления позволяют создавать интерактивные и динамичные пользовательские интерфейсы.
Примечание
Из трех типов алгоритмов только плагинам разрешено реализовывать перетаскиваемые элементы управления на уровне всего приложения.
Этот код показывает, как создать плагин, который добавляет компонент WebView и текстовый блок в двух отдельных окнах, которые можно перемещать по всему интерфейсу cTrader:
Класс TabControl предоставляет типы, позволяющие создавать несколько вкладок для алгоритма. Эти вкладки можно использовать для группировки связанных элементов или представления отдельных представлений для функциональных возможностей.
Этот код показывает, как использовать вкладки в плагине, добавленном на Панель активного инструмента:
Пользовательский элемент управления — это элемент управления, который по сути состоит из нескольких предопределенных элементов управления. Другими словами, это элемент управления, содержимое которого составляют другие элементы управления.
Пользовательские элементы управления действуют как повторно используемые классы аналогично встроенным элементам управления.
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);}}}
Экземпляр этого индикатора должен отображать четыре текстовых поля непосредственно в центре основного графика.
Организуйте элементы управления с помощью панелей
Чтобы сделать работу с элементами управления более удобной, вы можете поместить несколько элементов управления в отдельную группу с собственным положением в интерфейсе. Для этого можно использовать класс Panels и его производные.
Представьте панель как элемент управления с другими элементами управления в качестве его содержимого. cTrader поддерживает пять различных классов, наследующих от базового класса Panels (который сам наследует от класса Control):
Canvas
DockPanel
Grid
StackPanel
WrapPanel
Каждый из вышеперечисленных классов использует различные макеты панелей и стратегии позиционирования, как описано ниже.
Холст
Холст — это панель, которая позволяет позиционировать элементы управления на основе определенных координат X и Y.
Примечательно, что оси X и Y отличаются от тех, которые используются объектами графика или рисунками. Координаты X и Y, используемые классом Canvas, представляют собой числовые значения, начинающиеся с (0, 0) в верхнем левом углу графика.
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){}}}
После создания экземпляра вышеуказанного индикатора вы должны увидеть кнопку Click me в верхнем левом углу графика.
Свойство Top элемента управления определяет его положение по оси Y. В свою очередь, свойство Left определяет его положение по оси X.
Приведенный выше код также использует свойства Padding и Margin. Padding относится к расстоянию между содержимым элемента управления и его внешними границами. Margin — это расстояние между элементом управления и границами его родительского элемента. Свойства Padding и Margin применимы ко всем панелям, а не только к классу холста. Они полезны для управления расстоянием между элементами управления.
В большинстве случаев класс Canvas используется для группировки только небольшого количества элементов управления.
Закрепляемая панель
Класс DockPanel используется для закрепления (размещения) элемента управления в статическом месте на графике. Существует четыре возможных позиции закрепления:
Сверху
Снизу
Слева
Справа
Каждый элемент управления имеет свойство Dock. При использовании класса DockPanel вы можете использовать это свойство для позиционирования элемента управления внутри DockPanel. Это показано в следующем примере:
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){}}}
При создании экземпляра этого индикатора вы должны увидеть закрепляемую панель в центре графика, содержащую текстовое поле и кнопку, на которую можно нажать.
Обратите внимание, что закрепляемые панели могут быть заполнены либо горизонтально, либо вертикально. Вы не можете использовать оба этих выравнивания одновременно. Ориентация закрепляемой панели устанавливается автоматически при настройке первого элемента управления в DockPanel. Если свойство Dock первого элемента управления установлено на Top или Bottom, вся DockPanel будет ориентирована вертикально, и наоборот.
Панель стека
Панели стека являются одними из наиболее часто используемых элементов управления благодаря своей простоте и удобству использования. Панели стека выравнивают дочерние элементы управления либо горизонтально, либо вертикально один за другим. Как показано ниже, вам нужно только настроить ее ориентацию, и класс управится с остальным:
После создания экземпляра индикатора вы должны увидеть горизонтальную панель стека с двумя текстовыми полями и кнопкой Submit в правом нижнем углу основного графика.
Панель с переносом
Панели с переносом в основном идентичны панелям стека. Однако, когда недостаточно места для размещения всех элементов панели с переносом, она автоматически перенесет оставшиеся элементы управления на следующую строку по оси Y.
Сетка
Представьте сетки как электронные таблицы с заданным количеством столбцов и строк. При использовании сеток вы можете добавлять элементы управления в каждую отдельную ячейку.
Как показано ниже, когда вы создаете экземпляр класса Grid, вы передаете количество его строк и столбцов в качестве аргументов integer. При добавлении новых дочерних элементов или элементов управления вам также необходимо указать количество дочерних строк и столбцов.
При создании экземпляра вышеуказанного индикатора вы должны увидеть сетку 10x2 прямо в центре графика.
Размещайте элементы управления в координатах цены и времени
Помимо элементов управления панелями, cTrader позволяет указывать координаты цены и времени для элементов управления непосредственно в области графика. Методы AddControl() и MoveControl() предоставляют разработчикам алгоритмов эту функциональность.
Используйте следующие перегрузки методов для управления координатами элементов управления на графике в зависимости от ваших предпочтений.
Чтобы добавить элемент управления графика на график или область индикатора по абсолютному индексу бара и координатам цены (x, y).
Чтобы добавить элемент управления графика на график или область индикатора по абсолютной координате времени (x).
1
voidAddControl(ControlBasecontrol,DateTimetime)
Чтобы переместить элемент управления графика на график или область индикатора по абсолютной координате времени (x).
1
voidMoveControl(ControlBasecontrol,DateTimetime)
Чтобы добавить элемент управления графика на график или область индикатора по абсолютной координате индекса бара (x).
1
voidAddControl(ControlBasecontrol,intbarIndex)
Чтобы переместить элемент управления графика на график или область индикатора по абсолютной координате индекса бара (x).
1
voidMoveControl(ControlBasecontrol,intbarIndex)
Чтобы добавить элемент управления графика на график или область индикатора по абсолютной координате цены (y).
1
voidAddControl(ControlBasecontrol,doubley)
Чтобы переместить элемент управления графика на график или область индикатора по абсолютной координате цены (y).
1
voidMoveControl(ControlBasecontrol,doubley)
Класс параметров ControlBase может включать любой другой подчиненный класс (Control, Button и т. д.), чтобы метод вызывался в соответствии с вышеуказанными сигнатурами.
Следующий пример сиБота добавляет кнопку Нажми меня! над последним баром на графике. Кнопка перемещается вперед вместе с каждым новым добавленным баром. После нажатия на кнопку на экране появляется окно сообщения.
Количество корневых элементов управления, которые можно добавить на график, ограничено 100 из-за возможных проблем с производительностью. Это ограничение применяется только к одному экземпляру алгоритма и элементам управления, привязанным к цене и барам.
Свойства отступов и полей
Свойство Margin определяет пространство между границами объекта Control и его родителем (графиком, панелью, границей и т. д.).
В свою очередь, свойство Padding определяет пространство между содержимым элемента управления и его границами. Вы можете изменять значения свойств так, чтобы они были разными для разных сторон.
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){}}}
Экземпляр этого индикатора создаст серую кнопку Нажми меня в верхнем левом углу графика. Измените параметры в окнах Добавить экземпляр или Изменить параметры, чтобы увидеть, как именно различные значения полей и отступов изменяют отображение элемента управления.
Стили
При использовании стилей вы можете придать схожий вид нескольким различным типам элементов управления. Это особенно полезно при работе с большим (пять или более) количеством элементов управления.
Класс Style позволяет устанавливать значения для различных свойств элементов управления, таких как Margin или BackgroundColor. После этого вы можете повторно использовать эти значения в качестве шаблона для множества других элементов управления.
Мы также можем создать единообразный вид для нескольких элементов управления без использования класса 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){}}}
Изображение
Элемент управления Image можно использовать для отображения локально сохраненного изображения. Элемент управления Image использует класс .NET Bitmap, что означает, что он поддерживает большинство популярных форматов изображений, таких как следующие:
.PNG
.JPG
.BMP
.GIF
.TIFF
Обратитесь к документации класса .NET Bitmap, чтобы узнать о нем больше.
Чтобы использовать элемент управления Image, установите его свойство Source на данные файла изображения в массиве байтов (byte[]).
После запуска экземпляра вышеуказанного индикатора вы не должны увидеть ничего нового на основном графике. Однако введите действительный путь к файлу в качестве значения параметра (Image File Path), и вы должны увидеть выбранное изображение, отображаемое в центре экрана.
Вы также можете использовать ресурсы вашего проекта для хранения изображений и их отображения через элемент управления Image. Для этого откройте ресурсы проекта в Visual Studio и переключитесь на вкладку Resources. В ней создайте новый ресурс и добавьте существующее изображение. После этого вы сможете использовать это изображение в качестве источника в любом элементе управления Image через свойство Project_Name_Space.Properties.Resources._Image_Name.
В качестве примера скопируйте изображение ниже и сохраните его как "image.png" в вашей системе:
Создайте новый индикатор в cTrader, задайте ему имя "Image Sample" и откройте его через Visual Studio. После этого добавьте проект индикатора логотипа в качестве ресурса. Для этого щелкните правой кнопкой мыши по вашему проекту, выберите Properties и нажмите Resources, затем нажмите Create and manage assembly resources. Скопируйте файл logo.png на вновь открывшуюся вкладку.
Скопируйте приведенный ниже код в основной файл исходного кода вашего индикатора: