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

الوصول إلى الشبكة

يحدد هذا الدليل كيفية إنشاء خوارزميات يمكنها الوصول إلى الإنترنت. فيما يلي ملخص لمدة دقيقة واحدة لميزة واجهة برمجة التطبيقات هذه.

الوصول إلى الشبكة في دقيقة واحدة!

  • يمكن لحلول الخوارزميات الخاصة بك الحصول على المعلومات من مواقع الويب الإخبارية للتداول أو واجهات برمجة التطبيقات على الويب الموجهة للفوركس. استخدم هذه الميزة للتأكد من أن cBots والإضافات والمؤشرات الخاصة بك تتفاعل مع الأحداث والمعلومات الحياتية الملحة.
  • باستخدام الطرق في مساحات الأسماء System.Text.Json و System.Text.Json.Serialization، يمكنك بسرعة تسلسل الكائنات أو إلغاء تسلسلها من وإلى ملفات JSON، مما يسمح لـ cBots باستهلاك نقاط النهاية بسهولة ومعالجة المعلومات القيمة.
  • يسمح بروتوكول WebSocket باستلام البيانات من خدمة في الوقت الفعلي بدلاً من الاضطرار إلى إجراء طلب HTTP في كل مرة. استخدم websocket لدمج خوارزمياتك بسلاسة مع موارد الويب. تحتوي فئة WebSocketClient على جميع الطرق والمعلمات اللازمة لاستخدام اتصالات websocket.
  • عند استخدام websocket، يمكنك إرسال واستقبال السلاسل النصية وبيانات البايت الخام. اعمل مع هياكل البيانات المختلفة وقم بتسلسلها إلى بايتات لاستخدام خدمات الطرف الثالث القيمة.
  • AccessRights.None كافٍ لوظائف الشبكة.

HTTP

تحتوي واجهة Http الجديدة على العديد من الطرق التي، عند تنفيذها، يجب أن تمكن cBots وأنواع أخرى من الخوارزميات من الوصول إلى الإنترنت. للتوضيح، انظر ما يلي:

  • HttpResponse Http.Get(string uri). يقوم بتنفيذ طلب GET إلى عنوان URI المحدد في السلسلة النصية الممررة uri ويعيد كائن HttpsResponse يحتوي على نتائج هذا الطلب.

تسمح فئة HttpsRequest بتنفيذ طلبات أكثر تعقيدًا بما في ذلك طلبات POST. لتنفيذ هذه الطلبات، قم بتعيين خاصية HttpsRequest.Method إلى إحدى قيم enum HttpMethod مثل HttpMethod.Put أو HttpMethod.Patch.

بدورها، تحتوي خاصية HttpsRequest.Uri على عنوان URI الذي يتم إرسال الطلب إليه بينما يمكن استخدام خاصية HttpsRequest.Body لتعيين نص الطلب. انظر أدناه لمثال على كيفية استخدام كائن HttpsRequest.

  • HttpResponse Http.Send(HttpRequest request). يقوم بتنفيذ طلب إلى عنوان URI المحدد كقيمة لخاصية request.Uri لكائن HttpsRequest الممرر إلى هذه الطريقة. بعد ذلك، يعيد كائن HttpsResponse يحتوي على نتائج هذا الطلب. يتم تعيين نوع الطلب كقيمة لخاصية equest.Method.

الوصول إلى الشبكة في الاختبار العكسي والتحسين

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

إنشاء أمثلة cBots

تنفيذ طلب GET

سنقوم بإنشاء cBot بسيط يقوم بالإجراءات التالية:

  • يرسل طلب GET ويصل إلى ملف JSON عبر واجهة برمجة التطبيقات على https://forexApiExample.com/v1/exchangerate (لاحظ أن واجهة برمجة التطبيقات هذه وهمية تمامًا).
  • إذا كانت استجابة GET ناجحة، يقوم cBot بإلغاء تسلسل نص الاستجابة إلى كائن من فئة SymbolPrice المخصصة (لقد أنشأنا هذه الفئة لأغراض التوضيح).
  • يضع أمر حد بيع لرمز بسعر أعلى قليلاً من السعر المحدد في واجهة برمجة التطبيقات.

لاحظ أن cBot مختلق تمامًا. بينما سيتم بناء الكود، فإنه لن يؤدي أي إجراءات ذات معنى.

كيفية تسلسل أو إلغاء تسلسل السلاسل النصية من ملفات JSON

يتضمن كود cBot الخاص بنا عبارتين using مهمتين، وهما System.Text.Json و System.Text.Json.Serialization. تحتوي مساحات الأسماء هذه على العديد من الطرق التي تسمح بتسلسل وإلغاء تسلسل السلاسل النصية من ملفات JSON بسهولة مثل JsonSerializer.Deserialize<T>().

إليك كود 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
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;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTest : Robot
    {

        protected override void OnStart()
        {

            var responseToGet = Http.Get("https://forexApiExample.com/v1/exchangerate");

            if (responseToGet.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(responseToGet.Body);
                var result = PlaceLimitOrder(TradeType.Sell, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate + 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

إذا كان هذا cBot سيصل إلى واجهة برمجة تطبيقات حقيقية، لكان قد فعل ذلك بنجاح.

تنفيذ طلب POST

يمكننا أيضًا إنشاء cBot أكثر تقدمًا يحقق الأهداف التالية:

  • يرسل طلب POST إلى نفس واجهة برمجة التطبيقات الوهمية على https://anotherForexApiExample.com/commodities/v1/getaccesstoken. يتم ذلك للحصول على رمز وصول لواجهة برمجة التطبيقات هذه.
  • يخزن الرمز من نص الاستجابة في المتغير token.
  • يقوم بتنفيذ طلب GET إلى نفس واجهة برمجة التطبيقات مع تمرير قيمة المتغير token كمعلمة استعلام في URI (https://anotherForexApiExample.com/commodities/v1/getprices).
  • باستخدام تسلسل JSON (المناقش أعلاه)، يضع أمر إيقاف شراء بسعر أقل قليلاً من السعر المستلم من واجهة برمجة التطبيقات.

مرة أخرى، لاحظ أن هذا 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
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;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class NetworkAccessTestTwo : Robot
    {

        protected override void OnStart()
        {
            var uriForAccessToken = new Uri("https://anotherForexApiExample.com/commodities/v1/getaccesstoken");

            var postRequest = new HttpRequest(uriForAccessToken);

            postRequest.Method = HttpMethod.Post;

            var responseToPost = Http.Send(postRequest);

            var token = responseToPost.Body;

            var response = Http.Get($"https://anotherForexApiExample.com/commodities/v1/getprices?token={token}");

            if (response.IsSuccessful)
            {
                var tradedSymbol = JsonSerializer.Deserialize<SymbolPrice>(response.Body);

                var result = PlaceStopOrder(TradeType.Buy, tradedSymbol.SymbolName, 10000, tradedSymbol.ConversionRate - 0.15);

            }
        }
    }

    public class SymbolPrice
    {
        public string SymbolName { get; set; }
        public double ConversionRate { get; set; }
    }
}

عميل WebSocket

تتيح واجهة برمجة التطبيقات Algo لأي شخص استخدام خدمات وموارد الويب المختلفة باستخدام اتصال websocket. مقارنة ببروتوكول HTTP المستخدم في ميزة الوصول إلى الشبكة، فإن بروتوكول WebSocket أسرع ويسمح باستلام البيانات في الوقت الفعلي.

استخدام عميل WebSocket

استخدام عميل WebSocket أمر بسيط:

  1. اختر خدمة توفر نقطة نهاية لاتصال websocket
  2. قم بتهيئة كائن من فئة WebSocketClientOptions وحدد معلماته لتكوين العميل الخاص بك.
  3. قم بتهيئة كائن من فئة WebSocketClient ومرر الخيارات التي تم إنشاؤها مسبقًا إلى المنشئ.
  4. استخدم طريقة Connect() للاتصال بالمورد الذي اخترته وأرسل البيانات عبر طريقة Send().
  5. استخدم معالجات الأحداث TextReceived() و BinaryReceived() لتحديد ما يجب أن تفعله الخوارزمية الخاصة بك عندما يتلقى عميل WebSocket بيانات جديدة.

فيما يلي، سننشئ cBot بسيط يتصل بخدمة أخبار اقتصادية خيالية عبر websocket. عندما يتم نشر قطعة جديدة من الأخبار حول الرمز الذي يتم إرفاق 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class ExampleWebSocketBot : Robot
    {

        private static WebSocketClientOptions _webSocketClientOptions = new WebSocketClientOptions 
        {
            KeepAliveInterval = new TimeSpan(0, 1, 30),
            UseDefaultCredentials = true,
        };
        private WebSocketClient _webSocketClient = new WebSocketClient(_webSocketClientOptions);
        private readonly Uri _targetUri = new Uri("ws://amazingnews.com:8000");

        protected override void OnStart()
        {
            _webSocketClient.Connect(_targetUri);
            _webSocketClient.Send("Hello");
            _webSocketClient.TextReceived += NewsReceived;
        }

        protected override void OnStop()
        {
            _webSocketClient.Close(WebSocketClientCloseStatus.NormalClosure);
        }

        private void NewsReceived(WebSocketClientTextReceivedEventArgs args) 
        {
            if (args.Text.Contains(SymbolName)) 
            {
                MessageBox.Show(args.Text, "News!", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
            }
        }
    }
}

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

تحذير

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

فوائد WebSocket

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

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

بشكل عام، توفر اتصالات websocket الفوائد التالية مقارنة بـ HTTPS العادي:

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

يسمح عميل WebSocket لجميع أنواع الخوارزميات بالتفاعل الديناميكي مع موارد الويب؛ هذا التفاعل أسرع وأكثر كفاءة مقارنة باستخدام HTTP. استخدم عميل WebSocket لبناء خوارزميات قوية متكاملة مع خدمات الطرف الثالث.

الوصول إلى الشبكة وخاصية AccessRights

باختصار، يحدد enum AccessRights ما إذا كان للخوارزميات حق الوصول إلى البيانات الخارجية عن cTrader مثل نظام الملفات في جهازك المحلي. يمكنك معرفة المزيد في هذا البرنامج التعليمي.

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

نتيجة لذلك، عادة ما يكون AccessRights.None هو الخيار الأكثر منطقية إذا كنت ترغب في مشاركة منتجات الخوارزمية الخاصة بك مع الآخرين. ومع ذلك، حتى إذا اخترت هذا الخيار، فإن منتجات cTrader الخاصة بك حرة في الوصول إلى الويب. إن إضافة وظيفة الوصول إلى الشبكة إلى واجهة برمجة تطبيقات cTrader Algo يعني أن cBots لم تعد تتطلب تعيين خاصية AccessRights إلى AccessRights.FullAccess للعمل مع الموارد على الإنترنت.

هذا يوسع بشكل كبير الفرص التي يتمتع بها مطورو الخوارزميات عند برمجة منتجات cTrader التي ينوون توزيعها على المتداولين الآخرين.

الملخص

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