ColorPicker 컨트롤은 트레이더가 cTrader에서 주요 요소 또는 객체에 대해 선호하는 색상을 선택할 수 있게 합니다. 예를 들어, 개발자는 트레이더가 각 추세선에 대해 선호하는 색상을 선택할 수 있도록 추세선을 그리는 cBot에 ColorPicker 컨트롤을 통합할 수 있습니다. 이 설정은 트레이더가 다양한 추세선 유형을 구별하기 쉽게 합니다.
차트에 지표를 추가하는 플러그인도 ColorPicker 컨트롤을 구현할 수 있습니다. 이 기능은 사용자가 다른 지표 선에 대해 색상을 선택할 수 있게 합니다.
사용자가 색상 사각형을 클릭하면 색상 선택기가 나타납니다. 사용자는 표준 색상과 사용자 정의 색상 중에서 선택할 수 있습니다.
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 기능을 사용하세요.
cTrader Algo API는 사용자가 알고리즘을 위한 폴더를 지정할 수 있도록 OpenFolderDialog 인터페이스를 제공합니다. 사용자가 결과 창에서 폴더를 선택하면, 선택된 폴더 내의 모든 파일과 폴더가 알고리즘의 Selected files 폴더로 복사됩니다.
팁
중요한 데이터 파일, 백업 또는 구성 파일, 맞춤형 지표 또는 스크립트가 포함된 폴더를 로드해야 할 때 OpenFolderDialog 기능을 사용하세요.
선택된 파일과 폴더는 일반적으로 Selected files 폴더로 복사됩니다. 이는 알고리즘이 AccessRights가 None으로 설정된 경우에도 해당 폴더 내의 항목을 작업할 수 있기 때문입니다.
참고
알고리즘의 Selected files 폴더는 일반적으로 이 경로에 위치합니다: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected files\
cBot 인스턴스의 Selected files 폴더는 위와 다릅니다: ..\Documents\cAlgo\Data\cBots\{cBotName}\{Instance-Id}\Selected files\
아래 코드는 지표에서 OpenFolderDialog 대화 상자를 사용하는 방법을 보여줍니다:
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 애플리케이션 창에서 개별적으로 이동할 수 있는 플로팅 컨트롤을 추가하는 데 사용되는 타입을 제공합니다. 이러한 컨트롤은 인터랙티브하고 동적인 사용자 인터페이스를 만들 수 있게 합니다.
참고
세 가지 알고리즘 타입 중 플러그인만 애플리케이션 전체에서 드래그 가능한 컨트롤을 구현할 수 있습니다.
이 코드는 전체 cTrader UI에서 이동할 수 있는 WebView 구성 요소와 텍스트 블록을 두 개의 별도 창에 추가하는 플러그인을 만드는 방법을 보여줍니다:
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은 세로로 정렬되며, 그 반대의 경우도 마찬가지입니다.
스택 패널
스택 패널은 간단하고 사용하기 쉬운 컨트롤로 가장 자주 사용되는 컨트롤 중 하나입니다. 스택 패널은 자식 컨트롤을 가로 또는 세로로 하나씩 정렬합니다. 아래와 같이 방향만 설정하면 클래스가 나머지를 관리합니다:
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 클래스를 사용하므로 다음과 같은 대부분의 인기 있는 이미지 형식을 지원합니다:
위의 지표 인스턴스를 실행한 후 메인 차트에 새로운 것이 표시되지 않아야 합니다. 그러나 (이미지 파일 경로) 매개변수의 값으로 유효한 파일 경로를 입력하면 선택한 이미지가 화면 중앙에 표시되어야 합니다.
프로젝트 리소스를 사용하여 이미지를 저장하고 Image 컨트롤을 통해 표시할 수도 있습니다. 이렇게 하려면 Visual Studio에서 프로젝트 리소스를 열고 리소스 탭으로 전환하십시오. 그 안에서 새 리소스를 생성하고 기존 이미지를 추가하십시오. 이후 Project_Name_Space.Properties.Resources._Image_Name 속성을 통해 모든 Image 컨트롤에서 이 이미지를 소스로 사용할 수 있습니다.
예를 들어 아래 이미지를 복사하여 시스템에 "image.png"로 저장하십시오:
cTrader에서 새 지표 생성, 이름을 "Image Sample"로 설정하고 Visual Studio를 통해 엽니다. 이후 로고 지표 프로젝트를 리소스로 추가하십시오. 이렇게 하려면 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 후 리소스를 클릭하고 어셈블리 리소스 생성 및 관리를 클릭하십시오. logo.png 파일을 새로 열린 탭에 복사하십시오.