Kontrol memungkinkan interaksi tertentu yang melibatkan cBot, indikator, dan plugin. Dengan menggunakan panduan di bawah ini, Anda dapat dengan mudah membuat kontrol UI dasar dan lanjutan langsung pada grafik.
Ada beberapa kelas bawaan yang mewakili kontrol populer seperti tombol, blok teks, kotak teks, dan bentuk. Namun, Anda juga dapat membuat kontrol kustom.
Jika Anda membangun indikator di atas dan membuat instance, Anda akan melihat tombol abu-abu Click me tepat di tengah grafik.
Perbedaan antara kontrol dan objek grafik
Dalam bagian sebelumnya, kita telah membahas objek grafik. Kontrol memungkinkan pengguna untuk berinteraksi dengan cBot dan indikator. Sebaliknya, objek grafik memberikan kesempatan untuk menggambar sesuatu pada grafik trading atau di jendela keluaran indikator yang terpisah.
Kontrol grafik berasal dari kelas ControlBase sementara objek grafik berasal dari kelas ChartObject.
Kontrol grafik diposisikan secara statis dengan menggunakan berbagai opsi perataan. Sementara objek grafik dapat diposisikan dengan cara yang sama persis, posisi mereka juga dapat berubah secara dinamis tergantung pada koordinat X dan Y tertentu.
Serupa dengan objek grafik, kontrol grafik dapat ditambahkan baik ke grafik utama maupun jendela keluaran indikator mana pun (jika ada). Contoh penempatan seperti itu diberikan di bawah ini:
Setelah membuat instance indikator, Anda akan melihat tombol Klik saya di jendela keluaran indikator.
ColorPicker
Kontrol ColorPicker memungkinkan trader untuk memilih warna pilihan mereka untuk elemen atau objek kunci di cTrader. Misalnya, pengembang dapat mengintegrasikan kontrol ColorPicker ke dalam cBot yang menggambar garis tren sehingga pengguna dapat memilih warna pilihan mereka untuk setiap garis tren. Pengaturan ini memudahkan trader untuk membedakan antara berbagai jenis garis tren.
Plugin yang menambahkan indikator ke grafik juga dapat menerapkan kontrol ColorPicker karena fitur ini memungkinkan pengguna untuk memilih warna untuk berbagai garis indikator.
Ketika pengguna mengklik kotak warna, pemilih warna muncul. Pengguna kemudian dapat memilih antara warna standar dan kustom.
Kontrol DropZone memungkinkan trader untuk melakukan aksi seret dan lepas yang melibatkan cBot, indikator, atau plugin. Untuk menerapkan kontrol ini dalam algoritma Anda, gunakan kelas DropZone. Kontrol DropZone dapat dimanipulasi seperti kontrol lainnya.
Ketika pengguna menjatuhkan file atau folder yang kompatibel ke dalam kotak, event Dropped dihasilkan. Ketika pengguna menjatuhkan folder atau beberapa folder ke dalam kotak, hanya file yang kompatibel dengan ekstensi yang ditentukan dalam FilterExtensions yang diproses dan disalin.
Catatan
File yang dijatuhkan biasanya disalin dan disimpan di lokasi ini: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected Files\
Lokasi untuk instance cBot berbeda dari yang di atas: ..\Documents\cAlgo\Data\cBots\{cBotName}\{unique-instance-number}\Selected files\
Kode plugin ini menunjukkan cara menambahkan kontrol DropZone ke 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
Kontrol ProgressBar menampilkan perkembangan operasi yang sedang berlangsung. Bar kemajuan membuat algoritma lebih ramah pengguna dan membantu mengelola ekspektasi trader mengenai waktu tunggu untuk operasi tertentu.
cTrader Algo API memungkinkan pengembang untuk menambahkan dua jenis kontrol ProgressBar: kontrol tak terbatas dan kontrol tertentu.
Kontrol tak terbatas
Anda mungkin ingin menggunakan kontrol tak terbatas dalam situasi berikut:
Anda tidak dapat menentukan waktu tunggu untuk suatu operasi.
Anda tidak dapat mendeteksi perkembangan suatu operasi.
Anda tidak ingin menunjukkan berapa lama suatu operasi akan berlangsung.
Kontrol tertentu
Anda mungkin ingin menggunakan kontrol ini ketika Anda dapat menentukan waktu tunggu untuk suatu operasi dan ingin pengguna melihat indikator berdasarkan waktu tersebut.
Untuk menampilkan kemajuan operasi, gunakan properti Value untuk mengatur angka. Untuk mengatur persentase bar kemajuan, gunakan properti Minimum dan Maximum.
Kode plugin di bawah ini menunjukkan cara membuat bar kemajuan menggunakan kontrol tak terbatas dan tertentu (hijau):
cTrader Algo API menyediakan antarmuka OpenFileDialog untuk memungkinkan pengguna memilih file untuk algoritma. Ketika pengguna memilih file di jendela yang dihasilkan, file tersebut disalin ke folder Selected files algoritma. Algoritma dapat bekerja dengan file di dalam folder Selected files-nya tanpa batasan.
Kiat
Gunakan fungsionalitas OpenFileDialog ketika Anda perlu memuat file data penting, file cadangan atau konfigurasi, indikator kustom atau skrip.
Kode di bawah ini menunjukkan cara menggunakan dialog OpenFileDialog dalam indikator:
cTrader Algo API menyediakan antarmuka OpenFolderDialog untuk memungkinkan pengguna menentukan folder untuk algoritma. Ketika pengguna memilih folder di jendela yang dihasilkan, semua file dan folder dengan file di dalamnya yang dipilih disalin ke folder Selected files algoritma.
Kiat
Gunakan fungsionalitas OpenFolderDialog ketika Anda perlu memuat folder yang berisi file data penting, file cadangan atau konfigurasi, indikator kustom atau skrip.
File dan folder yang dipilih biasanya disalin ke folder Selected files karena algoritma dapat bekerja dengan item di dalam folder tersebut bahkan ketika AccessRights-nya diatur ke None.
Catatan
Folder Selected files algoritma biasanya berada di jalur ini: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected files\
Folder Selected files untuk instance cBot berbeda dari yang di atas: ..\Documents\cAlgo\Data\cBots\{cBotName}\{Instance-Id}\Selected files\
Kode di bawah ini menunjukkan cara menggunakan dialog OpenFolderDialog dalam indikator:
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 menyediakan antarmuka SaveFileDialog untuk memungkinkan pengguna menyimpan file (secara lokal) ke komputer mereka. Ketika jendela yang relevan muncul, pengguna memilih folder tempat mereka ingin menyimpan file dan memasukkan nama untuk file tersebut. File kemudian disimpan di lokasi yang ditentukan.
Kiat
Gunakan fungsionalitas SaveFileDialog ketika Anda perlu melakukan salah satu dari hal berikut:
Menyimpan laporan kinerja, hasil backtesting, file konfigurasi atau data optimisasi.
Mengekspor log trading, jurnal operasi atau data aktivitas pengguna umum.
Menyimpan indikator kustom, data untuk grafik dan visualisasi atau parameter untuk strategi.
Kode di bawah ini menunjukkan cara menggunakan dialog SaveFileDialog dalam indikator:
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){}}}
Kontrol yang dapat diseret
Kontrol yang dapat diseret di area grafik
Antarmuka ChartDraggable dan ChartDraggables menyediakan tipe yang memungkinkan Anda menambahkan kontrol yang dapat diseret yang mampu menampung kontrol lain dan elemen berbeda ke grafik. Kontrol yang dapat diseret ini memudahkan pengguna untuk berinteraksi dengan berbagai elemen grafik.
Catatan
Kontrol yang dapat diseret hanya dapat dipindahkan atau diposisikan ulang dalam grafik tempat kontrol tersebut ditambahkan.
Kode ini menunjukkan cara membuat indikator yang menambahkan dua kontrol yang dapat dipindahkan dalam grafik:
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})");}}}
Kontrol yang dapat diseret di jendela aplikasi
Antarmuka ApplicationDraggable dan ApplicationDraggables menyediakan tipe yang digunakan untuk menambahkan kontrol mengambang yang dapat dipindahkan secara individual di seluruh jendela aplikasi cTrader. Kontrol seperti itu memungkinkan Anda untuk membuat antarmuka pengguna yang interaktif dan dinamis.
Catatan
Dari tiga jenis algoritma, hanya plugin yang diizinkan untuk menerapkan kontrol yang dapat diseret di seluruh aplikasi.
Kode ini menunjukkan cara membuat plugin yang menambahkan komponen WebView dan blok teks dalam dua jendela terpisah, yang dapat dipindahkan di seluruh UI cTrader:
Kelas TabControl menyediakan tipe yang memungkinkan Anda membuat beberapa tab untuk sebuah algoritma. Tab-tab ini dapat digunakan untuk menyatukan elemen-elemen terkait atau menampilkan tampilan terpisah untuk berbagai fungsionalitas.
Kode ini menunjukkan cara menggunakan tab dalam plugin yang ditambahkan ke Panel Simbol Aktif:
Kontrol kustom adalah kontrol yang pada dasarnya terdiri dari beberapa kontrol yang telah ditentukan sebelumnya. Dengan kata lain, ini adalah kontrol yang isinya terdiri dari kontrol-kontrol lain.
Kontrol kustom bertindak sebagai kelas yang dapat digunakan kembali, mirip dengan kontrol bawaan.
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);}}}
Sebuah instance dari indikator ini harus menampilkan empat kotak teks langsung di tengah grafik utama.
Atur kontrol dengan panel
Untuk membuat penggunaan kontrol lebih nyaman, Anda mungkin ingin menempatkan beberapa kontrol ke dalam grup yang berbeda dengan posisinya sendiri di UI. Untuk melakukan ini, Anda dapat menggunakan kelas Panels dan turunannya.
Anggap panel sebagai kontrol dengan kontrol lain sebagai isinya. cTrader mendukung lima kelas berbeda yang mewarisi dari kelas dasar Panels (yang sendirinya mewarisi dari kelas Control):
Canvas
DockPanel
Grid
StackPanel
WrapPanel
Masing-masing kelas di atas menggunakan tata letak panel dan strategi penempatan yang berbeda seperti yang dibahas di bawah ini.
Canvas
Canvas adalah panel yang memungkinkan penempatan kontrol berdasarkan koordinat X dan Y tertentu.
Perlu diperhatikan bahwa sumbu X dan Y berbeda dari yang digunakan oleh objek grafik atau gambar. Koordinat X dan Y yang digunakan oleh kelas Canvas mewakili nilai numerik yang dimulai dari (0, 0) dari sudut kiri atas grafik.
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){}}}
Setelah membuat instance dari indikator di atas, Anda akan melihat tombol Click me di sudut kiri atas grafik.
Properti Top dari sebuah kontrol menentukan posisinya pada sumbu Y. Sebaliknya, properti Left menentukan posisinya pada sumbu X.
Kode di atas juga menggunakan properti Padding dan Margin. Padding mengacu pada jarak antara isi kontrol dan batas luarnya. Margin adalah jarak antara kontrol dan batas induknya. Properti Padding dan Margin berlaku untuk semua panel, tidak hanya kelas canvas. Keduanya berguna untuk mengatur jarak antar kontrol Anda.
Dalam kebanyakan kasus, kelas Canvas digunakan untuk mengelompokkan hanya sejumlah kecil kontrol.
Panel dock
Kelas DockPanel digunakan untuk menempatkan (dock) sebuah kontrol di lokasi statis pada grafik. Ada empat posisi dock yang mungkin:
Atas
Bawah
Kiri
Kanan
Setiap kontrol memiliki properti Dock. Saat menggunakan kelas DockPanel, Anda dapat menggunakan properti ini untuk memposisikan kontrol di dalam DockPanel. Hal ini diilustrasikan dalam contoh berikut:
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){}}}
Saat membuat instance dari indikator ini, Anda akan melihat panel dock di tengah grafik yang berisi bidang teks dan tombol yang dapat diklik.
Perhatikan bahwa panel dock dapat diisi baik secara horizontal maupun vertikal. Anda tidak dapat menggunakan kedua penyejajaran ini secara bersamaan. Orientasi panel dock diatur secara otomatis saat menyiapkan kontrol pertama dalam DockPanel. Jika properti Dock dari kontrol pertama diatur ke Top atau Bottom, seluruh DockPanel akan berorientasi vertikal, dan sebaliknya.
Panel tumpuk
Panel tumpuk adalah salah satu kontrol yang paling sering digunakan karena kesederhanaan dan kegunaannya. Panel tumpuk menyejajarkan kontrol anak baik secara horizontal maupun vertikal satu per satu. Seperti yang ditunjukkan di bawah, Anda hanya perlu mengatur orientasinya dan kelas akan mengatur sisanya:
Setelah membuat instance indikator, Anda akan melihat panel tumpuk horizontal dengan dua bidang teks dan tombol 'Submit' di sudut kanan bawah grafik utama.
Panel bungkus
Panel bungkus sebagian besar identik dengan panel tumpuk. Namun, ketika tidak ada cukup ruang untuk memuat semua elemen panel bungkus, ia akan secara otomatis membungkus kontrol yang tersisa ke baris berikutnya pada sumbu Y.
Grid
Anggap grid sebagai spreadsheet dengan jumlah kolom dan baris yang telah ditentukan. Saat menggunakan grid, Anda dapat menambahkan kontrol ke setiap sel terpisah.
Seperti yang ditunjukkan di bawah, ketika Anda membuat instance dari kelas Grid, Anda memasukkan jumlah baris dan kolomnya sebagai argumen integer. Saat menambahkan anak atau kontrol baru, Anda juga harus menentukan jumlah baris dan kolom anak.
Saat membuat instance dari indikator di atas, Anda akan melihat grid 10x2 tepat di tengah grafik.
Posisikan kontrol dalam koordinat harga dan waktu
Selain kontrol panel, cTrader memungkinkan untuk menentukan koordinat harga dan waktu untuk kontrol langsung di area grafik. Metode AddControl() dan MoveControl() menyediakan fungsionalitas ini bagi pengembang algo.
Gunakan overload metode berikut untuk mengelola koordinat kontrol grafik Anda sesuai preferensi Anda.
Untuk menambahkan kontrol grafik ke area grafik atau indikator pada koordinat indeks bar absolut dan harga (x, y).
Untuk menambahkan kontrol grafik ke area grafik atau indikator pada koordinat waktu absolut (x).
1
voidAddControl(ControlBasecontrol,DateTimetime)
Untuk memindahkan kontrol grafik ke area grafik atau indikator pada koordinat waktu absolut (x).
1
voidMoveControl(ControlBasecontrol,DateTimetime)
Untuk menambahkan kontrol grafik ke area grafik atau indikator pada koordinat indeks bar absolut (x).
1
voidAddControl(ControlBasecontrol,intbarIndex)
Untuk memindahkan kontrol grafik ke area grafik atau indikator pada koordinat indeks bar absolut (x).
1
voidMoveControl(ControlBasecontrol,intbarIndex)
Untuk menambahkan kontrol grafik ke area grafik atau indikator pada koordinat harga absolut (y).
1
voidAddControl(ControlBasecontrol,doubley)
Untuk memindahkan kontrol grafik ke area grafik atau indikator pada koordinat harga absolut (y).
1
voidMoveControl(ControlBasecontrol,doubley)
Parameter kelas ControlBase dapat mencakup kelas bawahan lainnya (Control, Button, dll.) agar metode dapat dipanggil sesuai dengan tanda tangan di atas.
Contoh cBot berikut menambahkan tombol Click me! di atas bar terakhir pada grafik. Tombol tersebut bergerak maju bersama dengan setiap bar baru yang ditambahkan. Setelah mengklik tombol, kotak pesan muncul di layar.
Jumlah kontrol akar yang dapat ditambahkan pada grafik dibatasi hingga 100 karena kemungkinan masalah kinerja. Batasan ini hanya berlaku untuk satu instance algoritma dan kontrol yang terpasang pada harga dan bar.
Properti padding dan margin
Properti Margin menentukan ruang antara batas objek Control dan induknya (grafik, panel, batas, dll.).
Sebaliknya, properti Padding menentukan ruang antara isi kontrol dan batasnya. Anda dapat memvariasikan nilai properti sehingga semuanya berbeda untuk sisi yang berbeda.
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){}}}
Sebuah instance dari indikator ini akan membuat tombol abu-abu Click me di sudut kiri atas grafik. Ubah parameter di jendela Add instance atau Modify parameters untuk melihat bagaimana nilai margin dan padding yang berbeda mengubah tampilan kontrol.
Gaya
Saat menggunakan gaya, Anda dapat memberikan tampilan serupa pada beberapa jenis kontrol yang berbeda. Hal ini sangat berguna ketika berurusan dengan sejumlah besar (lima atau lebih) kontrol.
Kelas Style memungkinkan pengaturan nilai untuk berbagai properti kontrol seperti Margin atau BackgroundColor. Setelah itu, Anda dapat menggunakan kembali nilai-nilai ini sebagai template untuk beberapa kontrol lainnya.
Kita juga dapat membuat tampilan yang konsisten untuk beberapa kontrol tanpa menggunakan kelas Style sama sekali.
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){}}}
Gambar
Kontrol Image dapat digunakan untuk menampilkan gambar yang disimpan secara lokal. Kontrol Image menggunakan kelas Bitmap .NET, yang berarti mendukung sebagian besar format gambar populer seperti berikut:
.PNG
.JPG
.BMP
.GIF
.TIFF
Lihat dokumentasi kelas Bitmap .NET untuk mempelajari lebih lanjut tentangnya.
Untuk menggunakan kontrol Image, atur properti Source ke data file gambar dalam array byte (byte[]).
Setelah meluncurkan instance indikator di atas, Anda seharusnya tidak melihat hal baru pada grafik utama. Namun, masukkan jalur file yang valid sebagai nilai parameter (Image File Path), dan Anda seharusnya melihat gambar yang dipilih ditampilkan di tengah layar.
Anda juga dapat menggunakan sumber daya proyek Anda untuk menyimpan gambar dan menampilkannya melalui kontrol Image. Untuk melakukannya, buka sumber daya proyek di Visual Studio dan beralih ke tab Resources. Di dalamnya, buat sumber daya baru dan tambahkan gambar yang sudah ada. Setelah itu, Anda akan dapat menggunakan gambar ini sebagai sumber di kontrol Image mana pun melalui properti Project_Name_Space.Properties.Resources._Image_Name.
Sebagai contoh, salin gambar di bawah ini dan simpan sebagai "image.png" di sistem Anda:
Buat indikator baru di cTrader, atur namanya menjadi "Image Sample", dan buka melalui Visual Studio. Setelah itu, tambahkan indikator logo proyek sebagai sumber daya. Untuk melakukannya, klik kanan proyek Anda, pilih Properties dan klik Resources, lalu klik Create and manage assembly resources. Salin file logo.png ke tab yang baru dibuka.
Salin kode di bawah ini ke file kode sumber utama indikator Anda: