تسمح كائنات الرسم البياني (الرسومات) برسم الخطوط أو الأشكال الهندسية على الرسوم البيانية لـ cTrader. باستخدامها، يمكنك رسم الأنماط أو إظهار أحداث معينة على الرسوم البيانية بناءً على بيانات cBot أو المؤشر الخاص بك.
تستخدم كائنات الرسم البياني إحداثيات X و Y لتحديد المواقع.
يمثل المحور X وقت الرسم البياني أو فهارس الشريط.
المحور Y هو سعر الرمز.
جميع كائنات الرسم البياني مشتقة من الفئة الأساسية ChartObject، مما يعني أن جميعها ترث ميزات أساسية معينة.
عينات كود كائنات الرسم البياني
الرسم داخل نوافذ المؤشر
عند إنشاء كائنات الرسم البياني، لست مقيدًا بالرسم البياني الرئيسي للرمز. في الواقع، يمكنك رسم كائنات الرسم البياني داخل أي نوافذ تحتوي على مخرجات المؤشر.
تحتوي فئة Chart على مجموعة IndicatorAreas. وهي تحتوي على جميع النوافذ غير المتراكبة أو المنفصلة التي يمكن للمؤشرات عرض مخرجاتها فيها.
يمكنك أيضًا الوصول إلى منطقة المؤشر الحالية الخاصة بك باستخدام خاصية IndicatorArea لفئة Indicator الخاصة بك.
عند تشغيل مثيل للمؤشر أعلاه، يجب أن ترى خطًا أحمر في نافذة مؤشر منفصلة. عند إنشاء رسوم بيانية في مناطق مؤشر منفصلة، يمكنك استخدام جميع طرق الرسم حيث أن كلاً من Chart و IndicatorArea يرثان من الفئة الأساسية ChartArea.
النص الثابت
بدلاً من استخدام إحداثيات X و Y لتحديد المواقع، يستخدم النص الثابت محاذاة أفقية وعمودية ثابتة. لإظهار أو رسم نص ثابت، استخدم طريقة DrawStaticText().
1
varstaticText=Chart.DrawStaticText("static","This is the text that will be shown",VerticalAlignment.Center,HorizontalAlignment.Center,Color.Red);
إذا قمت بإرفاق كائن الرسم البياني هذا بمؤشر وتشغيل مثيل، فسترى النص التالي في الرسم البياني الرئيسي.
/* We use the maximum of the high pricesof the last ten bars as the Y coordinate. */varhorizontalLine=Chart.DrawHorizontalLine("line",Bars.HighPrices.Maximum(10),Color.Red);
خط الاتجاه
يبدأ خط الاتجاه من نقطة معينة في الرسم البياني وينتهي عند نقطة أخرى. خطوط الاتجاه مفيدة لإنشاء أشكال مختلفة أو أنماط معقدة.
لرسم خط اتجاه استخدم طريقة DrawTrendLine().
1234567
/* We draw a line from the low price of the first visible bar to the high price of the last visible bar on the chart. */vartrendLine=Chart.DrawTrendLine("line",Chart.FirstVisibleBarIndex,Bars.LowPrices[Chart.FirstVisibleBarIndex],Chart.LastVisibleBarIndex,Bars.HighPrices[Chart.LastVisibleBarIndex],Color.Red);// Alternatively, consider the following.vartrendLine=Chart.DrawTrendLine("line",Bars.OpenTimes[Chart.FirstVisibleBarIndex],Bars.LowPrices[Chart.FirstVisibleBarIndex],Bars.OpenTimes[Chart.LastVisibleBarIndex],Bars.HighPrices[Chart.LastVisibleBarIndex],Color.Red);
المستطيل
استخدم طريقة DrawRectangle() لرسم مستطيل.
1234567
varrectangle=Chart.DrawRectangle("rectangle",Chart.FirstVisibleBarIndex+1,Bars.LowPrices[Chart.FirstVisibleBarIndex+1],Chart.LastVisibleBarIndex,Bars.HighPrices[Chart.LastVisibleBarIndex],Color.Red);/* We fill the rectangle with a transparent color.By using its current color, we only change the alphachannel. */rectangle.IsFilled=true;rectangle.Color=Color.FromArgb(80,rectangle.Color);
المثلث
استخدم طريقة DrawTriangle() لرسم مثلث.
1 2 3 4 5 6 7 8 910111213
varmiddleX=Chart.FirstVisibleBarIndex+(Chart.LastVisibleBarIndex-Chart.FirstVisibleBarIndex)/2;varmiddleY=Bars.LowPrices[Chart.FirstVisibleBarIndex]+(Bars.HighPrices[Chart.LastVisibleBarIndex]-Bars.LowPrices[Chart.FirstVisibleBarIndex])/2;vartriangle=Chart.DrawTriangle("triangle",Chart.FirstVisibleBarIndex,Bars.LowPrices[Chart.FirstVisibleBarIndex],middleX,middleY,Chart.LastVisibleBarIndex,Bars.LowPrices[Chart.FirstVisibleBarIndex],Color.Red);// We fill the triangle with a transparent color// by using it's current color, we change only the alpha channel/* We fill the triangle with a transparent color.By using its current color, we only change the alphachannel. */triangle.IsFilled=true;triangle.Color=Color.FromArgb(80,triangle.Color);
كائنات الرسم البياني الأخرى
من أجل الإيجاز، لم نذكر العديد من كائنات الرسم البياني الأخرى في مقتطفات الكود أعلاه. تشمل هذه الكائنات على سبيل المثال لا الحصر ما يلي:
بيضاوي
الأيقونة
شوكة أندروز
القناة متساوية الأبعاد
امتداد فيبوناتشي
مروحة فيبوناتشي
تصحيح فيبوناتشي
يمكن رسم جميع هذه الكائنات باستخدام طرق Draw...() ذات أسماء مماثلة تقبل معلمات مماثلة.
العائد على المخاطرة
توفر واجهة ChartRiskReward أنواعًا تمكنك من إنشاء وإدارة كائنات العائد على المخاطرة برمجيًا على الرسوم البيانية.
يوضح الكود أدناه كيفية إنشاء مؤشر يرسم كائن العائد على المخاطرة:
كلما حاولت رسم كائن رسم بياني، يجب عليك توفير اسمه كوسيطة لطريقة الرسم.
يجب أن تكون جميع أسماء كائنات الرسم البياني فريدة. إذا لم يتم استيفاء هذا المتطلب، فأنت تخاطر بتجاوز كائنات الرسم البياني لكائنات الرسم البياني ذات الأسماء نفسها اعتمادًا على أوقات تنفيذها. يمكنك استخدام قيمة فهرس الشريط الحالي أو الوقت الحالي لإنشاء أسماء فريدة لكل كائن.
الوصول إلى كائنات الرسم البياني
تحتوي مجموعة Objects على جميع كائنات الرسم البياني. تتضمن هذه المجموعة الكائنات المرسومة من قبل المستخدم. نتيجة لذلك، يمكن الوصول إلى مجموعة Objects لإزالة الكائنات من الرسوم البيانية أو تعديل خصائصها.
يوضح المثال أدناه كيفية الوصول إلى أعضاء مجموعة Objects:
usingcAlgo.API;usingSystem.Linq;namespaceNewIndicator{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassNewIndicator:Indicator{protectedoverridevoidInitialize(){foreach(varchartObjectinChart.Objects){/* If the object is a trend line we change its Y1/2 properties */if(chartObjectisChartTrendLinetrendLine){trendLine.Y1=Chart.BottomY;trendLine.Y2=Chart.TopY;}}/* Here, we filter all objects of the 'ChartRectangle' type. */varrectangles=fromchartObjectinChart.ObjectswherechartObjectisChartRectangleselectchartObjectasChartRectangle;/* We select only the chart objects with a name that begins with "MyObjects". */varmyObjects=fromchartObjectinChart.ObjectswherechartObject.Name.StartsWith("MyObjects",System.StringComparison.OrdinalIgnoreCase)selectchartObject;/* We select only interactive objects. If an object is interactive, it will not be removed when the indicator is removed or reloaded. */varinteractiveObjects=fromchartObjectinChart.ObjectswherechartObject.IsInteractiveselectchartObject;/* We remove all objects with a name that begins with "ToRemove". */varchartObjectsCopy=Chart.Objects.ToArray();foreach(varchartObjectinchartObjectsCopy){if(chartObject.Name.StartsWith("ToRemove",System.StringComparison.OrdinalIgnoreCase)){/* Chart 'RemoveObject' gets the object name as a parameter. */Chart.RemoveObject(chartObject.Name);}}}publicoverridevoidCalculate(intindex){}}}
الأحداث
تحتوي كائنات الرسم البياني على العديد من الأحداث التي يمكنك استخدامها لمعرفة الكائنات التي تم رسمها أو تحديثها أو إزالتها:
ObjectsAdded - يتم تشغيله عند إضافة كائن رسم بياني واحد أو أكثر إلى الرسم البياني.
ObjectsRemoved - يتم تشغيله عند إزالة كائن رسم بياني واحد أو أكثر من الرسم البياني.
ObjectsUpdated - يتم تشغيله عند تحديث كائن رسم بياني واحد أو أكثر (تم تغيير إحدى خصائصه بواسطة المستخدم أو المؤشر النشط أو cBot).
ObjectsSelectionChanged - يتم تشغيله عند تحديد كائن رسم بياني واحد أو أكثر بواسطة المستخدم.
ObjectHoverChanged - يتم تشغيله عندما يحوم مؤشر الماوس فوق كائن رسم بياني.
عند العمل مع الكائنات التفاعلية، يمكن للمستخدمين تغيير خصائصها مثل موضع الكائن واللون والتعليق وما إلى ذلك. جميع الكائنات المرسومة من قبل المستخدم تكون تفاعلية بشكل افتراضي.
ملاحظة
لا يمكن تغيير خاصية ChartStaticText بغض النظر عما إذا كان الكائن المرتبط بها تفاعليًا أم لا.
لجعل الكائن تفاعليًا، قم بتعيين خاصية IsInteractive إلى true كما هو موضح أدناه:
تحتوي جميع كائنات الرسم البياني على خاصية IsInteractive. القيمة الافتراضية لها هي false.
إذا كان كائن الرسم البياني تفاعليًا، فلن تتم إزالته عند إزالة مثيل المؤشر أو cBot أو إيقافه. على العكس من ذلك، تتم إزالة الكائنات غير التفاعلية تلقائيًا عند توقف المؤشر أو cBot عن العمل.
لتجنب الفوضى، تأكد من تنظيف الكائنات التفاعلية بعد إزالة المثيل المرتبط بها باستخدام طريقة Destroy للمؤشر أو طريقة OnStop لـ cBot.
إذا لم يكن كائن الرسم البياني تفاعليًا، فسيكون أيضًا غير مرئي في القوائم ومجموعات كائنات الرسم البياني.
الكائنات المقفلة وغير المقفلة
يمنع قفل كائن الرسم البياني المستخدم من تعديله أو تحديثه. يمكنك القيام بذلك عبر مربع خصائص المتداول (خصائص الرسم البياني) أو عن طريق تعيين خاصية IsLocked إلى true. القيمة الافتراضية هي false.
يمكنك استخدام القفل لجعل الكائن تفاعليًا ولكن في نفس الوقت منع المستخدم من تحديثه. يقوم المثال التالي بقفل كائن الخط العمودي:
استخدام الموارد هو الاعتبار الرئيسي لاستخدام هذه الميزة. إذا كان هناك كائن يجب أن يظهر بشكل متكرر على الرسم البياني (ولكن ليس طوال الوقت)، فمن الأفضل إخفاؤه بدلاً من إزالته وإعادة رسمه في كل مرة يكون هناك حاجة إليه.
تحديد الكائن ومؤشر المظهر (ZIndex)
بطبيعة الحال، قد تكون هناك حالات حيث تتقاطع العديد من الكائنات مع بعضها البعض على الرسم البياني، مما يجعل تحديد كائن معين صعبًا أو مستحيلاً تمامًا. سيكون فقط الكائن الذي تم رسمه في النهاية قابلاً للتحديد عند تحريك مؤشر الماوس فوق مجموعة من كائنات الرسم البياني المتقاطعة.
لتغيير هذا السلوك يمكنك استخدام خاصية ZIndex. يمكن أن يكون ذلك مفيدًا عند محاولة عرض أنماط معقدة من كائنات الرسم البياني.
بمجرد إرفاقه بالرسم البياني، سيعرض المؤشر أعلاه خطًا عموديًا أحمر بدلاً من الأصفر. نظرًا لأن قيمة خاصية ZIndex للخط الأول أعلى من القيمة المقابلة للخط الثاني، فإنه يأخذ الأسبقية على الخط الثاني (الأصفر).
بعبارة أخرى، تحدد خاصية ZIndex أي كائنات الرسم البياني يتم عرضها أولاً عندما تتداخل. يتم تعيين قيمة معينة لخاصية ZIndex تلقائيًا لجميع كائنات الرسم البياني المرسومة.
معرفة ما إذا تمت إزالة كائن
ترث جميع كائنات الرسم البياني خاصية IsAlive من الفئة الأساسية ChartObject. تكون قيمة هذه الخاصية true طالما أن الكائن موجود على الرسم البياني (بغض النظر عما إذا كان مرئيًا أو غير مرئي). يتم تعيين القيمة إلى false بمجرد إزالة الكائن من الرسم البياني.
إذا قمت بحفظ مرجع لكائن رسم بياني وتمت إزالة هذا الكائن بواسطة المستخدم، يمكنك التحقق من خاصية IsAlive للتحقق مما إذا كان الكائن حيًا أو ميتًا.
usingcAlgo.API;namespaceNewIndicator{[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]publicclassNewIndicator:Indicator{privateChartVerticalLine_verticalLine;protectedoverridevoidInitialize(){_verticalLine=Chart.DrawVerticalLine("line1",Chart.LastVisibleBarIndex,Color.Red);_verticalLine.IsInteractive=true;Chart.ObjectsRemoved+=Chart_ObjectsRemoved;Print(_verticalLine.IsAlive);}privatevoidChart_ObjectsRemoved(ChartObjectsRemovedEventArgsobj){Print(_verticalLine.IsAlive);/* If the object is removed, we should rid of its reference. Otherwise, it will remain in memory. */if(_verticalLine.IsAliveisfalse){_verticalLine=null;Print("Object reference removed");}}publicoverridevoidCalculate(intindex){}}}
إذا قمت بتشغيل مثيل لهذا المؤشر، انقر بزر الماوس الأيمن على الخط الأحمر وقم بإزالته. يجب أن يعرض السجل بعد ذلك رسالة "Object reference removed".
إذا احتفظت بمرجع لكائن رسم بياني (ميت)، فسيحدث تسرب في الذاكرة. أثناء جمع النفايات، سيظل الكائن الخاص بك يعتبر حيًا، مما يعني أنه سينجو من عملية الجمع.
لتجنب هذه المشكلة، استخدم حدث ObjectsRemoved مع خاصية IsAlive.
مؤشر الشريط أو الوقت
عند برمجة كائنات الرسم البياني، يمكنك استخدام إما وقت الرسم البياني أو مؤشر الشريط للمحور السيني.
في رأينا، وقت الرسم البياني هو الخيار الأفضل. عند استخدام مؤشرات الأشرطة، لا يمكنك التخطيط للقيم المستقبلية (لأن المؤشرات المطلوبة غير موجودة بعد) ولا يمكنك حساب أي مسافات بين الأشرطة. ومع ذلك، قد يكون استخدام مؤشرات الأشرطة أسهل، خاصة في حالة كائنات الرسم البياني البسيطة نسبيًا.
تحتوي جميع طرق Chart.Draw على تحميلات زائدة مختلفة لمؤشرات الأشرطة ووقت الرسم البياني.