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)vàSetObject(string key, object obj). Để truy xuất nó, gọi các phương thứcGetString(string key)và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ụcDocuments/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ạiTtừ 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) và 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 | |
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ụcDocuments/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ộ (cBotshoặcIndicators) trong khiAlgoNamelà tên của một cBot/chỉ báo cụ thể.InstanceUniqueIdentifierlà 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ụcDocuments/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() và 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 | |
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) và 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.Instancegiới hạn ở 10 MB.LocalStorageScope.Typegiới hạn ở 100 MB.LocalStorageScope.Devicegiớ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 | |
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.