تتيح عناصر التحكم بعض التفاعلات التي تتضمن cBots والمؤشرات والإضافات. باستخدام الدليل أدناه، يمكنك بسهولة إنشاء عناصر تحكم واجهة المستخدم الأساسية والمتقدمة مباشرة على الرسم البياني.
هناك العديد من الفئات المدمجة التي تمثل عناصر التحكم الشائعة مثل الأزرار وكتل النص ومربعات النص والأشكال. ومع ذلك، يمكنك أيضًا إنشاء عناصر تحكم مخصصة.
إذا قمت ببناء المؤشر أعلاه وإنشاء مثيل له، يجب أن ترى زر انقر هنا رمادي اللون في وسط الرسم البياني تمامًا.
الفرق بين عناصر التحكم وكائنات الرسم البياني
في قسم سابق، تناولنا بالفعل كائنات الرسم البياني. تُمكّن عناصر التحكم المستخدمين من التفاعل مع خوارزميات cBot والمؤشرات. وعلى العكس من ذلك، تتيح كائنات الرسم البياني الفرصة لرسم شيء ما على مخطط التداول أو في نافذة إخراج مؤشر منفصلة.
تشتق عناصر التحكم في الرسم البياني من فئة ControlBase بينما تشتق كائنات الرسم البياني من فئة ChartObject.
يتم وضع عناصر التحكم في الرسم البياني بشكل ثابت باستخدام خيارات محاذاة مختلفة. في حين يمكن وضع كائنات الرسم البياني بنفس الطريقة تمامًا، يمكن أيضًا تغيير موضعها ديناميكيًا اعتمادًا على إحداثيات X و Y معينة.
وبالمثل لكائنات الرسم البياني، يمكن إضافة عناصر التحكم في الرسم البياني إلى كل من الرسم البياني الرئيسي وأي نوافذ إخراج للمؤشرات (إن وجدت). يتم تقديم مثال على هذا الوضع أدناه:
بعد إنشاء نسخة من المؤشر، يجب أن ترى زر انقر هنا في نافذة إخراج المؤشر.
ColorPicker
يُمكّن عنصر التحكم ColorPicker المتداولين من اختيار اللون المفضل لديهم للعناصر أو الكائنات الرئيسية في cTrader. على سبيل المثال، قد يدمج المطور عنصر التحكم ColorPicker في خوارزمية cBot التي ترسم خطوط الاتجاه بحيث يمكن للمستخدمين اختيار اللون المفضل لديهم لكل خط اتجاه. يسهل هذا الإعداد على المتداولين التمييز بين أنواع خطوط الاتجاه المختلفة.
يمكن أيضًا لإضافة تضيف مؤشرات إلى الرسوم البيانية تنفيذ عنصر التحكم ColorPicker حيث تتيح هذه الميزة للمستخدمين اختيار لون لخطوط المؤشر المختلفة.
عندما ينقر المستخدمون على مربع اللون، يظهر منتقي الألوان. يمكن للمستخدمين بعد ذلك الاختيار بين الألوان القياسية والمخصصة.
يُمكّن عنصر التحكم DropZone المتداولين من تنفيذ إجراءات السحب والإفلات التي تتضمن خوارزميات cBot أو المؤشرات أو الإضافات. لتنفيذ عنصر التحكم هذا في خوارزميتك، استخدم فئة DropZone. يمكن التعامل مع عنصر التحكم DropZone مثل أي عنصر تحكم آخر.
عندما يقوم المستخدم بإسقاط ملف أو مجلد متوافق في المربع، يتم إنشاء حدث Dropped. عندما يقوم المستخدم بإسقاط مجلد أو عدة مجلدات في المربع، تتم معالجة ونسخ الملفات المتوافقة فقط ذات الامتدادات المحددة في FilterExtensions.
ملاحظة
عادةً ما يتم نسخ الملفات التي تم إسقاطها وحفظها في هذا الموقع: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected Files\
يختلف الموقع لنسخ خوارزمية cBot عن الموقع أعلاه: ..\Documents\cAlgo\Data\cBots\{cBotName}\{unique-instance-number}\Selected files\
يوضح لك كود الإضافة هذا كيفية إضافة عنصر تحكم DropZone إلى 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
يعرض عنصر التحكم ProgressBar تقدم العملية الجارية. تجعل أشرطة التقدم الخوارزميات أكثر سهولة للمستخدم وتساعد في إدارة توقعات المتداولين فيما يتعلق بوقت الانتظار لعمليات معينة.
تتيح واجهة برمجة تطبيقات cTrader Algo للمطورين إضافة نوعين من عناصر التحكم ProgressBar: التحكم اللانهائي والتحكم المحدد.
التحكم اللانهائي
قد ترغب في استخدام التحكم اللانهائي في الحالات التالية:
لا يمكنك تحديد وقت الانتظار لعملية ما.
لا يمكنك اكتشاف تقدم عملية ما.
لا تريد الإشارة إلى المدة التي ستستغرقها العملية.
التحكم المحدد
قد ترغب في استخدام هذا التحكم عندما يمكنك تحديد وقت الانتظار لعملية ما وتريد أن يرى المستخدمون مؤشرًا بناءً على ذلك الوقت.
لعرض تقدم العملية، استخدم خاصية Value لتعيين رقم. لتعيين النسبة المئوية لشريط التقدم، استخدم خصائص Minimum و Maximum.
يوضح لك كود الإضافة أدناه كيفية إنشاء شريط تقدم باستخدام كل من التحكم اللانهائي والمحدد (الأخضر):
توفر واجهة برمجة تطبيقات cTrader Algo واجهة OpenFileDialog لتمكين المستخدمين من تحديد ملف لخوارزمية. عندما يحدد المستخدم ملفًا في النافذة الناتجة، يتم نسخ الملف إلى مجلد Selected files الخاص بالخوارزمية. يمكن للخوارزمية العمل مع الملفات داخل مجلد Selected files الخاص بها دون قيود.
نصيحة
استخدم وظيفة OpenFileDialog عندما تحتاج إلى تحميل ملفات بيانات مهمة أو ملفات نسخ احتياطي أو تكوين أو مؤشرات أو نصوص برمجية مخصصة.
يوضح لك الكود أدناه كيفية استخدام مربع حوار OpenFileDialog في مؤشر:
توفر واجهة برمجة تطبيقات cTrader Algo واجهة OpenFolderDialog لتمكين المستخدمين من تحديد مجلد لخوارزمية. عندما يحدد المستخدم مجلدًا في النافذة الناتجة، يتم نسخ جميع الملفات والمجلدات التي تحتوي على ملفات داخل المجلد المحدد إلى مجلد Selected files الخاص بالخوارزمية.
نصيحة
استخدم وظيفة OpenFolderDialog عندما تحتاج إلى تحميل مجلد يحتوي على ملفات بيانات حيوية أو ملفات نسخ احتياطي أو تكوين أو مؤشرات أو نصوص برمجية مخصصة.
عادةً ما يتم نسخ الملفات والمجلدات المحددة إلى مجلد Selected files لأن الخوارزمية يمكنها العمل مع العناصر داخل هذا المجلد حتى عندما يتم تعيين AccessRights الخاص بها إلى None.
ملاحظة
عادةً ما يكون مجلد Selected files الخاص بالخوارزمية على طول هذا المسار: ..\Documents\cAlgo\Data\{AlgoType}\{AlgoName}\Selected files\
يختلف مجلد Selected files لنسخة خوارزمية cBot عن المسار أعلاه: ..\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 واجهة 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){}}}
عند إنشاء مثيل للمؤشر أعلاه، يجب أن ترى زر انقر هنا في الزاوية العلوية اليسرى من الرسم البياني.
تحدد خاصية 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 بأكمله عموديًا، والعكس صحيح.
لوحة التكديس
لوحات التكديس هي واحدة من عناصر التحكم الأكثر استخدامًا بسبب بساطتها وسهولة استخدامها. تقوم لوحات التكديس بمحاذاة عناصر التحكم الفرعية إما أفقيًا أو عموديًا واحدًا تلو الآخر. كما هو موضح أدناه، عليك فقط إعداد اتجاهها وستتولى الفئة إدارة الباقي:
بعد إنشاء مثيل للمؤشر، يجب أن ترى لوحة تكديس أفقية بها حقلان نصيان وزر 'إرسال' في الزاوية السفلية اليمنى من الرسم البياني الرئيسي.
لوحة الالتفاف
لوحات الالتفاف متطابقة في معظمها مع لوحات التكديس. ومع ذلك، عندما لا يكون هناك مساحة كافية لاحتواء جميع عناصر لوحة الالتفاف، فإنها ستقوم تلقائيًا بالتفاف العناصر المتبقية إلى السطر التالي على المحور Y.
الشبكة
فكر في الشبكات كجداول بيانات بعدد محدد من الأعمدة والصفوف. عند استخدام الشبكات، يمكنك إضافة عناصر تحكم إلى كل خلية منفصلة.
كما هو موضح أدناه، عندما تقوم بإنشاء مثيل لفئة Grid، فإنك تمرر عدد صفوفها وأعمدتها كوسائط integer. عند إضافة عناصر أو عناصر تحكم جديدة، يجب عليك بالمثل تحديد عدد الصفوف والأعمدة الفرعية.
عند إنشاء مثيل للمؤشر أعلاه، يجب أن ترى شبكة 10×2 في وسط الرسم البياني.
التحكم في الموضع ضمن إحداثيات السعر والوقت
بالإضافة إلى عناصر التحكم في اللوحة، يتيح cTrader تحديد إحداثيات السعر والوقت لعناصر التحكم مباشرة في منطقة الرسم البياني. توفر طرق AddControl() و MoveControl() هذه الوظيفة لمطوري الخوارزميات.
استخدم التحميلات الزائدة التالية للطريقة لإدارة إحداثيات عناصر التحكم في الرسم البياني حسب تفضيلاتك.
لإضافة عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثيات الفهرس المطلق للشريط والسعر (س، ص).
لإضافة عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثية الوقت المطلق (س).
1
voidAddControl(ControlBasecontrol,DateTimetime)
لنقل عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثية الوقت المطلق (س).
1
voidMoveControl(ControlBasecontrol,DateTimetime)
لإضافة عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثية الفهرس المطلق للشريط (س).
1
voidAddControl(ControlBasecontrol,intbarIndex)
لنقل عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثية الفهرس المطلق للشريط (س).
1
voidMoveControl(ControlBasecontrol,intbarIndex)
لإضافة عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثية السعر المطلق (ص).
1
voidAddControl(ControlBasecontrol,doubley)
لنقل عنصر تحكم في الرسم البياني إلى منطقة الرسم البياني أو المؤشر على إحداثية السعر المطلق (ص).
1
voidMoveControl(ControlBasecontrol,doubley)
يمكن أن تتضمن فئة المعلمة ControlBase أي فئة فرعية أخرى (Control، Button، إلخ) لاستدعاء الطريقة وفقًا للتوقيعات المذكورة أعلاه.
يضيف مثال cBot التالي زر انقر هنا! فوق الشريط الأخير على الرسم البياني. يتم نقل الزر إلى الأمام مع كل شريط جديد يتم إضافته. بعد النقر على الزر، يظهر مربع رسالة على الشاشة.
يقتصر عدد عناصر التحكم الأساسية التي يمكن إضافتها إلى الرسم البياني على 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 فئة Bitmap الخاصة بـ .NET، مما يعني أنه يدعم غالبية تنسيقات الصور الشائعة مثل ما يلي:
.PNG
.JPG
.BMP
.GIF
.TIFF
راجع وثائق فئة Bitmap الخاصة بـ .NET لمعرفة المزيد عنها.
لاستخدام عنصر التحكم Image، قم بتعيين خاصية Source الخاصة به إلى بيانات ملف الصورة في مصفوفة بايت (byte[]).
بعد تشغيل مثيل للمؤشر أعلاه، يجب ألا ترى أي شيء جديد على الرسم البياني الرئيسي. ومع ذلك، أدخل مسار ملف صالح كقيمة لمعلمة (مسار ملف الصورة)، ويجب أن ترى الصورة المختارة معروضة في وسط الشاشة.
يمكنك أيضًا استخدام موارد مشروعك لتخزين الصور وعرضها عبر عنصر التحكم Image. للقيام بذلك، افتح موارد المشروع في Visual Studio وانتقل إلى علامة التبويب الموارد. فيها، قم بإنشاء مورد جديد وأضف صورة موجودة. بعد ذلك، ستتمكن من استخدام هذه الصورة كمصدر في أي عنصر تحكم Image عبر خاصية Project_Name_Space.Properties.Resources._Image_Name.
كمثال، انسخ الصورة أدناه واحفظها باسم "image.png" على نظامك:
قم بإنشاء مؤشر جديد في cTrader، وقم بتعيين اسمه إلى "Image Sample"، وافتحه عبر Visual Studio. بعد ذلك، أضف مؤشر الشعار كمورد للمشروع. للقيام بذلك، انقر بزر الماوس الأيمن على مشروعك، وحدد خصائص وانقر على موارد، ثم انقر على إنشاء وإدارة موارد التجميع. انسخ ملف logo.png إلى علامة التبويب التي تم فتحها حديثًا.
انسخ الشفرة أدناه إلى ملف الشفرة المصدر الرئيسي للمؤشر الخاص بك: