Bỏ qua

Bộ nhớ cục bộ

Trong hướng dẫn này, chúng tôi giải thích cách bạn có thể làm việc với bộ nhớ cục bộ khi phát triển các thuật toán cTrader. Dưới đây, chúng tôi cung cấp một bản tóm tắt một phút về cách truy cập bộ nhớ cục bộ hoạt động.

Bộ nhớ cục bộ trong một phút!

  • Bộ nhớ cục bộ cho phép bạn lưu thông tin trong hệ thống tệp cục bộ của mình. Sử dụng nó để duy trì dữ liệu giữa hai hoặc nhiều lần triển khai cBot và chỉ báo của bạn.
  • Để lưu dữ liệu, sử dụng các phương thức SetString(string key, string value)SetObject(string key, object obj). Để truy xuất nó, gọi các phương thức GetString(string key)T GetObject<T>(string key).
  • Chỉ định phạm vi bộ nhớ cục bộ ưa thích của bạn bằng cách sử dụng enum LocalStorageScope. Ví dụ, phương thức ghi đè SetString(string key, string value, LocalStorageScope.Device) sẽ lưu dữ liệu trong thư mục Documents/cAlgo/LocalStorage/ của bạn.
  • Mặc dù thông tin được lưu tự động mỗi phút, bạn có thể sử dụng phương thức Flush(LocalStorageScope localStorageScope) để lưu trữ dữ liệu mà không bị trì hoãn.
  • Trong quá trình backtest và tối ưu hóa, bộ nhớ cục bộ chỉ lưu trữ dữ liệu trong bộ nhớ.

Sử dụng bộ nhớ cục bộ

Hãy coi bộ nhớ cục bộ như một cách để lưu trữ thông tin giữa một hoặc nhiều lần dừng và khởi động cBot và chỉ báo của bạn. Tính năng này cho phép lưu dữ liệu cBot và chỉ báo, sau đó truy cập thông tin này theo nhiều cách tùy thuộc vào nhu cầu của bạn. Bộ nhớ cục bộ hoạt động bất kể quyền truy cập được cấp cho thuật toán.

Giao diện LocalStorage chứa tất cả các phương thức mà bạn có thể sử dụng để lưu trữ và truy cập dữ liệu vào và từ bộ nhớ cục bộ. Một số ví dụ về các phương thức này bao gồm:

  • SetString(string key, string value)- lưu một giá trị chuỗi bằng cách ghép nó với khóa được chỉ định.
  • SetObject(string key, object obj)- lưu một đối tượng bằng cách ghép nó với khóa được chỉ định.
  • GetString(string key) - truy xuất giá trị chuỗi đã lưu bằng cách tìm nó theo khóa được chỉ định.
  • T GetObject<T>(string key) - truy xuất một đối tượng đã lưu thuộc loại T từ bộ nhớ cục bộ bằng cách tìm nó theo khóa được chỉ định.

Cảnh báo

Các phương thức SetObject(string key, object obj)GetObject<T>(string key) chỉ hoạt động với các kiểu dữ liệu có thể được tuần tự hóa (chuyển đổi thành byte).

Hãy xem xét ví dụ sau, trong đó chúng ta yêu cầu một phiên bản cBot lưu một thông điệp mẫu khi bắt đầu. Ở các lần khởi động tiếp theo, cùng một phiên bản sẽ hiển thị một hộp thông báo chứa thông điệp của chúng ta.

 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");
        }
    }
}

Sau khi một phiên bản của cBot trên được khởi chạy lần đầu tiên, nó sẽ lưu thông điệp mẫu của chúng ta vào bộ nhớ cục bộ. Sau khi dừng phiên bản và khởi động lại, hộp thông báo sau sẽ được hiển thị.

Lưu ý rằng bộ nhớ cục bộ hoạt động ngay cả khi AccessRights.None được chỉ định.

Xác định phạm vi bộ nhớ cục bộ

Phạm vi bộ nhớ cục bộ (được xác định thông qua kiểu LocalStorageScope) xác định chính xác nơi thông tin được lưu trữ và cách truy cập nó. enum này chứa các hằng số sau:

  • LocalStorageScope.Instance - dữ liệu đã lưu được lưu trữ và chỉ có thể được truy cập bởi một phiên bản đang chạy cụ thể của cBot hoặc chỉ báo. Thông tin được lưu vào thư mục Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/. Trong đường dẫn này, "AlgoType" biểu thị loại tiện ích mở rộng cTrader làm việc với bộ nhớ cục bộ (cBots hoặc Indicators) trong khi AlgoName là tên của một cBot/chỉ báo cụ thể. InstanceUniqueIdentifier là ID duy nhất của một phiên bản cụ thể của một cBot hoặc chỉ báo cụ thể.
  • LocalStorageScope.Type - dữ liệu đã lưu được lưu trữ và có thể được truy cập bởi tất cả các phiên bản đang chạy của một cBot hoặc chỉ báo cụ thể. Thông tin được lưu vào thư mục Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/.
  • LocalStorageScope.Device - dữ liệu đã lưu được lưu trữ và có thể được truy cập bởi tất cả các phiên bản đang chạy của cBot và chỉ báo trên thiết bị hiện tại. Thông tin được lưu vào thư mục "Documents/cAlgo/LocalStorage/".

Đến lượt mình, các phương thức như SetString()SetObject() có các phiên bản nạp chồng bổ sung cho phép chỉ định phạm vi bộ nhớ cục bộ tùy chỉnh. Ví dụ, đoạn mã sau sẽ lưu một chuỗi vào LocalStorageScope.Type; chuỗi này, sau đó, sẽ có thể truy cập được đối với tất cả các tiện ích mở rộng của một loại cụ thể.

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

Nếu LocalStorageScope không được chỉ định làm tham số, LocalStorageScope.Instance sẽ được sử dụng theo mặc định.

Lưu ý rằng hành vi này khác đối với các phương thức GetString(string key)T GetObject<T>(string key). Khi các phương thức này được gọi mà không chỉ định phạm vi bộ nhớ cục bộ, chúng sẽ tìm kiếm khóa được chỉ định trong tất cả các phạm vi theo thứ tự sau:

  • Ví dụ
  • Loại
  • Thiết bị

Ngoài ra, mỗi phạm vi bộ nhớ cục bộ khác nhau có hạn ngạch dung lượng đĩa riêng:

  • LocalStorageScope.Instance giới hạn ở 10 MB.
  • LocalStorageScope.Type giới hạn ở 100 MB.
  • LocalStorageScope.Device giới hạn ở 500 MB.

Các giới hạn được xác định ở trên không phải là tích lũy. Ví dụ, nếu bạn đã sử dụng hết 500 MB bộ nhớ cấp thiết bị, bạn vẫn có thể lưu trữ thông tin bằng bộ nhớ cấp phiên bản cho đến khi đạt đến giới hạn 10 MB của nó.

Cách thức lưu và tải thông tin hoạt động

Khi lưu trữ thông tin vào bộ nhớ cục bộ (ví dụ: bằng cách gọi phương thức SetString()), cTrader tự động lưu dữ liệu mỗi phút một lần. Dữ liệu cũng được lưu khi dừng phiên bản.

Tuy nhiên, bạn có thể tùy chỉnh hành vi này bằng cách sử dụng các phương thức sau:

  • Flush(LocalStorageScope localStorageScope) - lưu tất cả dữ liệu vào phạm vi được chỉ định.
  • Reload(LocalStorageScope localStorageScope) - tải lại tất cả các giá trị từ phạm vi được chỉ định.

Hãy nhớ rằng, khi gọi phương thức Reload(LocalStorageScope localStorageScope, mọi thay đổi đang chờ xử lý có thể bị mất. Để tránh điều này, hãy đảm bảo gọi Flush(LocalStorageScope localStorageScope) trước.

Trong ví dụ dưới đây, chúng ta yêu cầu một cBot thực hiện một lệnh thị trường. Sau khi hành động này hoàn tất, chúng ta ngay lập tức lưu tổng Lãi & Lỗ của vị thế mà chúng ta vừa mở trong 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);

Bộ nhớ cục bộ trong backtest và tối ưu hóa

Bộ nhớ cục bộ hoạt động khác nhau trong backtest so với giao dịch thời gian thực.

Như đã trình bày trước đó, bộ nhớ cục bộ sử dụng hệ thống tệp của máy cục bộ của bạn khi tính năng này được sử dụng trong giao dịch thời gian thực. Tuy nhiên, việc sử dụng hệ thống tệp trong backtest sẽ dẫn đến một số vấn đề, đáng chú ý nhất là lưu lượng lớn dữ liệu không liên quan đến biến động thị trường và hoạt động giao dịch hiện tại.

Để tránh những vấn đề này, tất cả các hoạt động với bộ nhớ cục bộ chỉ được thực hiện trong bộ nhớ khi thực hiện backtest hoặc tối ưu hóa cBot của bạn. Kết quả là, bạn có thể chắc chắn rằng tất cả dữ liệu được lưu vào hệ thống tệp của bạn chỉ liên quan đến giao dịch thời gian thực.

Tóm lại, bộ nhớ cục bộ là một tính năng rất hữu ích của API Algo cho phép duy trì dữ liệu giữa nhiều lần dừng và khởi động của các cBot và chỉ báo khác nhau. Bằng cách sử dụng bộ nhớ cục bộ một cách hiệu quả, bạn có thể tạo ra các chiến lược giao dịch tự động phức tạp dựa trên dữ liệu tùy chỉnh được lưu trong hệ thống tệp của bạn.