انتقل إلى المحتوى

كيفية إدارة cBots والمؤشرات باستخدام الخوارزميات

تمكّن وظيفة الخوارزمية التي تدير خوارزمية أخرى المتداولين من إضافة cBots والمؤشرات إلى الرسم البياني باستخدام الكود. بهذه القدرة، يمكنهم تخطيط وتطوير استراتيجيات تداول فعالة، وإجراء تعديلات ديناميكية، وتنفيذ استراتيجيات متعددة وتطبيق ضوابط المخاطر الآلية.

في هذا المقال والفيديو المصاحب له، سنوضح لك كيفية إنشاء والعمل مع cBots التي تدير خوارزميات أخرى.

إضافة مؤشر باستخدام cBot

في تطبيق Algo، افتح علامة التبويب cBots. ابحث عن واختر عينة Sample Trend cBot التي تستخدم المتوسطات المتحركة.

حدد مؤشرين.

1
2
ChartIndicator _indicator1;
ChartIndicator _indicator2;

أضف مؤشرين إلى الرسم البياني.

1
2
_indicator1 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, FastPeriods, MAType);
_indicator2 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, SlowPeriods, MAType);

يمكن تخصيص مظهر المؤشر من خلال إعدادات خط الإخراج الخاص به. تشمل الخيارات القابلة للتخصيص اللون والسماكة ونمط الخط.

سنجعل الخط للمؤشر الأول أحمر وسميك.

1
2
_indicator1.Lines[0].Color = Color.Red;
_indicator1.Lines[0].Thickness = 3;

يمكن تطبيق نفس العملية لإزالة المؤشرات من الرسم البياني في أي وقت. سنجعل التغييرات تسري عندما يتغير الشريط.

1
2
3
4
5
protected override void OnBarClosed()
{
    Chart.Indicators.Remove(_indicator1);
    Chart.Indicators.Remove(_indicator2);
}

يمكنك نسخ الكود الكامل أدناه:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None, AddIndicators = true)]
    public class SampleTrendcBot : Robot
    {
        [Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
        public double Quantity { get; set; }

        [Parameter("MA Type", Group = "Moving Average")]
        public MovingAverageType MAType { get; set; }

        [Parameter("Source", Group = "Moving Average")]
        public DataSeries SourceSeries { get; set; }

        [Parameter("Slow Periods", Group = "Moving Average", DefaultValue = 10)]
        public int SlowPeriods { get; set; }

        [Parameter("Fast Periods", Group = "Moving Average", DefaultValue = 5)]
        public int FastPeriods { get; set; }

        private MovingAverage slowMa;
        private MovingAverage fastMa;
        private const string label = "Sample Trend cBot";   

        ChartIndicator _indicator1;
        ChartIndicator _indicator2;

        protected override void OnStart()
        {
            fastMa = Indicators.MovingAverage(SourceSeries, FastPeriods, MAType);
            slowMa = Indicators.MovingAverage(SourceSeries, SlowPeriods, MAType);

            _indicator1 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, FastPeriods, MAType);
            _indicator2 = Chart.Indicators.Add("Simple Moving Average", SourceSeries, SlowPeriods, MAType);

            _indicator1.Lines[0].Color = Color.Red;
            _indicator1.Lines[0].Thickness = 3;
        }

        protected override void OnBarClosed()
        {
            Chart.Indicators.Remove(_indicator1);
            Chart.Indicators.Remove(_indicator2);
        }

        protected override void OnTick()
        {
            var longPosition = Positions.Find(label, SymbolName, TradeType.Buy);
            var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell);

            var currentSlowMa = slowMa.Result.Last(0);
            var currentFastMa = fastMa.Result.Last(0);
            var previousSlowMa = slowMa.Result.Last(1);
            var previousFastMa = fastMa.Result.Last(1);

            if (previousSlowMa > previousFastMa && currentSlowMa <= currentFastMa && longPosition == null)
            {
                if (shortPosition != null)
                    ClosePosition(shortPosition);

                ExecuteMarketOrder(TradeType.Buy, SymbolName, VolumeInUnits, label);
            }
            else if (previousSlowMa < previousFastMa && currentSlowMa >= currentFastMa && shortPosition == null)
            {
                if (longPosition != null)
                    ClosePosition(longPosition);

                ExecuteMarketOrder(TradeType.Sell, SymbolName, VolumeInUnits, label);
            }
        }

        private double VolumeInUnits
        {
            get { return Symbol.QuantityToVolumeInUnits(Quantity); }
        }
    }
}

لبناء cBot، استخدم اختصار لوحة المفاتيح Ctrl+B أو انقر فوق بناء.

انتقل إلى تطبيق Trade. حدد الرسم البياني EURUSD، انقر على أيقونة cBot، ابحث عن وحدد Sample Trend cBot.

عندما تظهر نافذة إضافة مثيل، انقر على تطبيق ثم ابدأ cBot.

يجب أن ترى أن المتوسطين المتحركين المستخدمين للتداول قد تمت إضافتهما إلى الرسم البياني.

بدء cBot باستخدام cBot آخر

سنوضح كيفية إدارة cBot من خلال cBot آخر. هذه المرة، سننشئ cBot جديد فارغ من الصفر.

انتقل إلى تطبيق Algo وانقر على زر جديد تحت علامة التبويب cBots. حدد خيار فارغ، أدخل اسمًا مثل إضافة cBots ثم انقر على إنشاء.

نبدأ بتعريف كائنين للروبوت البياني.

1
2
ChartRobot _robot1;
ChartRobot _robot2;

ثم نضيف هذه الروبوتات إلى الرسم البياني في طريقة OnStart().

1
2
_robot1 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 10, 5);
_robot2 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 12, 7);

يمكننا أيضًا إضافة معالج حدث لطباعة رسالة كلما تم بدء cBot.

1
2
3
4
5
6
Chart.Robots.RobotStarted += ChartRobots_RobotStarted;

private void ChartRobots_RobotStarted(ChartRobotStartedEventArgs obj)
{
    Print ("Robot Started");
}

اكتب بعض المنطق داخل طريقة OnBarClosed() لبدء الروبوت الأول عندما يتغير الشريط، وإيقافه ثم بدء الروبوت الثاني في الشريط التالي.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBarClosed()
{
    if (_robot1.State == RobotState.Stopped)
    {
        _robot1.Start();
        _robot2.Stop();
            }
    else if (_robot1.State == RobotState.Running)
    {
        _robot1.Stop();
        _robot2.Start();
    }
}

يمكنك نسخ الكود الكامل أدناه:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class AddcBots : Robot
    {

        ChartRobot _robot1;
        ChartRobot _robot2;

        protected override void OnStart()
        {
            _robot1 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 10, 5);
            _robot2 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 12, 7);

            Chart.Robots.RobotStarted += ChartRobots_RobotStarted;
        }

        private void ChartRobots_RobotStarted(ChartRobotStartedEventArgs obj)
        {
            Print ("Robot Started");

        }

        protected override void OnBarClosed()
        {
            if (_robot1.State == RobotState.Stopped)
            {
                _robot1.Start();
                _robot2.Stop();
            }

            else if (_robot1.State == RobotState.Running)
            {
                _robot2.Start();
                _robot1.Stop();
            }
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

بعد بناء cBot، عد إلى تطبيق Trade، ابحث عن وحدد إضافة cBots ثم ابدأ cBot.

عندما يظهر مربع حوار طلب إذن، انقر على السماح.

يجب أن يظهر مثيلان من Sample Trend cBot على الرسم البياني.

انتظر حتى يكتمل الشريط الأول ويجب أن ترى المثيل الأول من Sample Trend cBot يبدأ تلقائيًا.

في الشريط التالي، يجب أن ترى المثيل الثاني من Sample Trend cBot يبدأ تلقائيًا.

يمكنك ملاحظة كيف ينفذ cBot منطقنا ويدير cBots الأخرى بناءً على الظروف المتغيرة.

تعديل معلمات cBot أثناء التنفيذ

قد تحتاج إلى تغيير معلمات cBot أثناء تشغيله. على سبيل المثال، تقرر تحديث الكود بسرعة أثناء التنقل بعد تلقي أخبار مالية مهمة أو تحديثات.

بدلاً من إيقاف وبدء cBot الخاص بنا، دعنا نقوم على الفور بتعديل معلمة SlowPeriods للـ cBot الأول.

1
2
3
4
5
6
else if(_robot1.State == RobotState.Running)
{
_robot1.Stop();
_robot1.Parameters["SlowPeriods"].Value = (int)_robot2.Parameters["SlowPeriods"].Value + 1;
_robot1.Start();
}

الآن، سنعيد بناء cBot.

يمكنك نسخ الكود الكامل أدناه:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class AddcBots : Robot
    {

        ChartRobot _robot1;
        ChartRobot _robot2;

        protected override void OnStart()
        {
            _robot1 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 10, 5);
            _robot2 = Chart.Robots.Add("Sample Trend cBot", 0.01, MovingAverageType.Simple, Bars.ClosePrices, 12, 7);

            Chart.Robots.RobotStarted += ChartRobots_RobotStarted;
        }

        private void ChartRobots_RobotStarted(ChartRobotStartedEventArgs obj)
        {
            Print ("Robot Started");

        }

        protected override void OnBarClosed()
        {
            if (_robot1.State == RobotState.Stopped)
            {
                _robot1.Start();
                _robot2.Stop();
            }

            else if (_robot1.State == RobotState.Running)
            {
                _robot1.Stop();
                _robot1.Parameters["SlowPeriods"].Value = (int)_robot2.Parameters["SlowPeriods"].Value + 1;
                _robot1.Start();
            }
        }

        protected override void OnStop()
        {
            // Handle cBot stop here
        }
    }
}

انتقل إلى تطبيق Trade وابدأ cBot لترى كيف تتغير قيمة المؤشر في كل شريط.

ملخص

نأمل أن يكون هذا المقال قد ساعدك على فهم كيفية استخدام الخوارزميات لبدء وتحكم وإدارة الخوارزميات الأخرى.