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

التخزين المحلي

في هذا الدليل، نشرح كيف يمكنك العمل مع التخزين المحلي عند تطوير خوارزميات cTrader. فيما يلي، نقدم ملخصًا لمدة دقيقة واحدة حول كيفية عمل الوصول إلى التخزين المحلي.

التخزين المحلي في دقيقة واحدة!

  • يتيح لك التخزين المحلي حفظ المعلومات في نظام الملفات المحلي الخاص بك. استخدمه للحفاظ على البيانات بين عمليتين أو أكثر من عمليات نشر cBots والمؤشرات الخاصة بك.
  • لحفظ البيانات، استخدم الطرق SetString(string key, string value) و SetObject(string key, object obj). لاسترجاعها، قم باستدعاء الطرق GetString(string key) و T GetObject<T>(string key).
  • حدد نطاق التخزين المحلي المفضل لديك باستخدام التعداد LocalStorageScope. على سبيل المثال، سيقوم الإصدار المُحمل زيادة SetString(string key, string value, LocalStorageScope.Device) بحفظ البيانات في دليل Documents/cAlgo/LocalStorage/ الخاص بك.
  • بينما يتم حفظ المعلومات تلقائيًا كل دقيقة، يمكنك استخدام طريقة Flush(LocalStorageScope localStorageScope) لتخزين البيانات دون تأخير.
  • أثناء الاختبار العكسي والتحسين، يخزن التخزين المحلي البيانات في الذاكرة فقط.

استخدام التخزين المحلي

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

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

  • SetString(string key, string value) - يحفظ قيمة سلسلة عن طريق مطابقتها مع المفتاح المحدد.
  • SetObject(string key, object obj) - يحفظ كائنًا عن طريق مطابقته مع المفتاح المحدد.
  • GetString(string key) - يسترجع قيمة سلسلة محفوظة عن طريق العثور عليها تحت المفتاح المحدد.
  • T GetObject<T>(string key) - يسترجع كائنًا محفوظًا من النوع T من التخزين المحلي عن طريق العثور عليه تحت المفتاح المحدد.

تحذير

تعمل الطرق SetObject(string key, object obj) و GetObject<T>(string key) فقط مع أنواع البيانات التي يمكن تسلسلها (تحويلها إلى بايتات).

ضع في اعتبارك المثال التالي الذي نطلب فيه من مثيل 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
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 SampleLocalStorageTest : Robot

    {

        protected override void OnStart()
        {

            string messageLocalStorage = LocalStorage.GetString("Example Message");

            if (messageLocalStorage is not null)

            {

                MessageBox.Show(messageLocalStorage);

            }

            LocalStorage.SetString("Example Message", "This is just an example message");
        }
    }
}

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

لاحظ أن التخزين المحلي يعمل حتى عند تحديد AccessRights.None.

تحديد نطاق التخزين المحلي

يحدد نطاق التخزين المحلي (المحدد عبر النوع LocalStorageScope) المكان الدقيق الذي يتم فيه تخزين المعلومات وكيفية الوصول إليها. يحتوي هذا التعداد enum على الثوابت التالية:

  • LocalStorageScope.Instance - يتم تخزين البيانات المحفوظة ولا يمكن الوصول إليها إلا بواسطة مثيل محدد قيد التشغيل لـ cBot أو مؤشر. يتم حفظ المعلومات في دليل Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/. في هذا المسار، يشير "AlgoType" إلى نوع امتداد cTrader الذي يعمل مع التخزين المحلي (cBots أو Indicators) بينما AlgoName هو اسم cBot/مؤشر معين. InstanceUniqueIdentifier هو المعرف الفريد لمثيل معين من cBot أو مؤشر معين.
  • LocalStorageScope.Type - يتم تخزين البيانات المحفوظة ويمكن الوصول إليها بواسطة جميع المثيلات قيد التشغيل لـ cBot أو مؤشر معين. يتم حفظ المعلومات في دليل Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/.
  • LocalStorageScope.Device - يتم تخزين البيانات المحفوظة ويمكن الوصول إليها بواسطة جميع المثيلات قيد التشغيل لـ cBots والمؤشرات على الجهاز الحالي. يتم حفظ المعلومات في دليل "Documents/cAlgo/LocalStorage/".

بدورها، تحتوي طرق مثل SetString() و SetObject() على إصدارات محملة زيادة إضافية تسمح بتحديد نطاق تخزين محلي مخصص. على سبيل المثال، سيقوم الكود التالي بحفظ سلسلة في LocalStorageScope.Type؛ ستكون هذه السلسلة، لاحقًا، قابلة للوصول لجميع الامتدادات من نوع معين.

1
SetString(Example String, Just an example string, LocalStorageScope.Type);

إذا لم يتم تحديد LocalStorageScope كمعلمة، يتم استخدام LocalStorageScope.Instance بشكل افتراضي.

لاحظ أن هذا السلوك مختلف بالنسبة للطرق GetString(string key) و T GetObject<T>(string key). عند استدعاء هذه الطرق دون تحديد نطاق التخزين المحلي، ستبحث عن المفتاح المحدد في جميع النطاقات باتباع التسلسل الهرمي أدناه:

  • مثيل
  • النوع
  • الجهاز

بالإضافة إلى ذلك، يحتوي كل نطاق تخزين محلي مختلف على حصة مساحة القرص الخاصة به:

  • LocalStorageScope.Instance محدود بـ 10 ميجابايت.
  • LocalStorageScope.Type محدود بـ 100 ميجابايت.
  • LocalStorageScope.Device محدود بـ 500 ميجابايت.

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

كيف تعمل عملية حفظ وتحميل المعلومات

عند تخزين المعلومات في التخزين المحلي (على سبيل المثال، عن طريق استدعاء طريقة SetString()), يقوم cTrader تلقائيًا بحفظ البيانات كل دقيقة. يتم حفظ البيانات أيضًا عند إيقاف المثيل.

ومع ذلك، يمكنك تخصيص هذا السلوك باستخدام الطرق التالية:

  • Flush(LocalStorageScope localStorageScope) - يحفظ جميع البيانات في النطاق المحدد.
  • Reload(LocalStorageScope localStorageScope) - يعيد تحميل جميع القيم من النطاق المحدد.

ضع في اعتبارك أنه عند استدعاء طريقة Reload(LocalStorageScope localStorageScope، قد يتم فقدان أي تغييرات معلقة. لتجنب ذلك، تأكد من استدعاء Flush(LocalStorageScope localStorageScope) مسبقًا.

في المثال أدناه، نطلب من cBot تنفيذ أمر السوق. بعد اكتمال هذا الإجراء، نقوم على الفور بحفظ إجمالي الربح والخسارة للمركز الذي فتحناه للتو في LocalStorageScope.Type.

1
2
3
4
5
ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, Custom label);
var positionOne = Positions.Find("Custom label");        
string positionOneGrossProfit = positionOne.GrossProfit.ToString();
LocalStorage.SetString("Position 1", positionOneGrossProfit, LocalStorageScope.Device); 
LocalStorage.Flush(LocalStorageScope.Device);

التخزين المحلي في الاختبار العكسي والتحسين

يعمل التخزين المحلي بشكل مختلف في الاختبار العكسي مقارنة بالتداول في الوقت الفعلي.

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

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

باختصار، يعد التخزين المحلي ميزة مفيدة للغاية في واجهة برمجة تطبيقات Algo تسمح بالاحتفاظ بالبيانات بين عمليات التوقف والبدء المتعددة لـ cBots والمؤشرات المختلفة. من خلال استخدام التخزين المحلي بشكل فعال، يمكنك إنشاء استراتيجيات تداول آلية معقدة بناءً على البيانات المخصصة المحفوظة في نظام الملفات الخاص بك.