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

سجل الخوارزميات

إذا كان لديك محفظة كبيرة من الخوارزميات التي توزعها على المستخدمين، فقد ترغب أيضًا في تقديم لوحة أو نظام مخصص يسمح لهؤلاء المستخدمين بإدارة خوارزمياتك بسهولة على أجهزتهم المحلية. سيكون مثل هذا النظام ذا قيمة خاصة إذا كنت تقدم العديد من المنتجات التي تكمل بعضها البعض (على سبيل المثال، خوارزميتي cBot ومؤشر مخصص يحتاج جميعها إلى التثبيت للعمل بشكل صحيح). إذا تخطى المستخدم تثبيت منتج مطلوب، ستتمكن من تنبيهه إلى هذه الحقيقة.

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

لمساعدتك ومساعدة مستخدميك، تعرض واجهة برمجة تطبيقات الخوارزميات واجهة AlgoRegistry، والتي توفر وسيلة مريحة لتتبع إحصائيات ديناميكيًا حول الخوارزميات المثبتة وغير المثبتة حاليًا من أنواع مختلفة.

العمل مع سجل الخوارزميات

في AlgoRegistry، يتم تمثيل كل خوارزمية بواسطة AlgoType، والذي يحتوي على الاسم الفريد للخوارزمية وAlgoKind الخاص بها (مثل AlgoKind.CustomIndicator).

يمكنك استرداد خوارزمية معينة من السجل عن طريق استدعاء الطريقة التالية.

1
AlgoRegistry.Get(string name, AlgoKind algoKind);

لاسترداد عدد الخوارزميات من نوع معين، قم باستدعاء الطريقة التالية.

1
AlgoRegistry.GetCount(AlgoKind algoKind)

يمكنك أيضًا إضافة معالجات مخصصة للأحداث التالية:

  • AlgoTypeInstalled - يتم تشغيله في كل مرة يتم فيها تثبيت خوارزمية جديدة.
  • AlgoTypeDeleted - يتم تشغيله في كل مرة يتم فيها حذف خوارزمية جديدة.
  • AlgoTypeChanged - يتم تشغيله في كل مرة يتم فيها تعديل خوارزمية مثبتة.

AlgoRegistry في أوضاع مختلفة

يعمل AlgoRegistry كما هو مقصود في الاختبار العكسي والتحسين. لا يعمل عند استخدام cTrader CLI.

إنشاء إضافة مثال

إن AlgoRegistry مثالي لإنشاء إضافة ستعرض معلومات حول الخوارزميات مباشرة في واجهة مستخدم cTrader. تقوم الإضافة التالية بذلك بالضبط.

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class AlgoStatsPlugin : Plugin
    {
        private TextBlock _customIndicatorsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private TextBlock _indicatorsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private TextBlock _robotsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private TextBlock _pluginsBlock = new TextBlock
        {
            FontSize = 12,
            FontWeight = FontWeight.Bold,
            TextAlignment = TextAlignment.Left,
            Padding = new Thickness(5, 5, 5, 5),
        };

        private Grid _grid = new Grid(4, 1);

        protected override void OnStart()
        {
            var aspBlock = Asp.SymbolTab.AddBlock("Algo Registry");
            aspBlock.IsExpanded = true;
            aspBlock.Height = 200;

            _grid.AddChild(_robotsBlock, 0, 0);
            _grid.AddChild(_indicatorsBlock, 1, 0);
            _grid.AddChild(_customIndicatorsBlock, 2, 0);
            _grid.AddChild(_pluginsBlock, 3, 0);

            aspBlock.Child = _grid;

            Timer.Start(TimeSpan.FromSeconds(1));
        }

        protected override void OnTimer() 
        {
            _robotsBlock.Text = $"cBots: {AlgoRegistry.GetCount(AlgoKind.Robot)}";
            _customIndicatorsBlock.Text = $"Custom indicators: {AlgoRegistry.GetCount(AlgoKind.CustomIndicator)}";
            _indicatorsBlock.Text = $"Indicators: {AlgoRegistry.GetCount(AlgoKind.StandardIndicator)}";
            _pluginsBlock.Text = $"Plugins: {AlgoRegistry.GetCount(AlgoKind.Plugin)}";
        }

    }
}

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

تثبيت خوارزمية من خلال خوارزمية أخرى

تمكّن واجهة AlgoRegistry المطورين من إنشاء خوارزميات يمكنها تثبيت خوارزميات أخرى. على سبيل المثال، يمكنك برمجة خوارزمية cBot (عند البدء) لتثبيت خوارزمية cBot أخرى أو مؤشر أو إضافة تلقائيًا.

تمت برمجة خوارزمية cBot التالية لتثبيت خوارزمية 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
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 Installation : Robot
    {
        protected override void OnStart()
        {
            InstallationResult result = AlgoRegistry.Install("https://ctrader.com/algos/download/4392/");
            Print(result.Succeeded);
        }

        protected override void OnTick()
        {
        }

        protected override void OnStop()
        {
        }
    }
}

الملخص

AlgoRegistry هي ميزة رائعة لمطوري الإضافات ولكن يمكن استخدامها أيضًا مع أنواع أخرى من الخوارزميات. على سبيل المثال، قد تنشئ مؤشرًا يشير إلى مؤشر مخصص آخر، وفي هذه الحالة ستحتاج خوارزميتك أولاً إلى التحقق مما إذا كان المؤشر المطلوب مثبتًا من قبل المستخدم. نوصي أيضًا بإضافة AlgoRegistry إلى خوارزمياتك الحالية لتبسيط إدارة المؤشرات المخصصة وأنواع أخرى من الخوارزميات.