Przejdź do treści

Lokalne przechowywanie danych

W tym przewodniku wyjaśniamy, jak możesz pracować z lokalnym przechowywaniem danych podczas tworzenia algorytmów cTrader. Poniżej przedstawiamy jednominutowe podsumowanie działania dostępu do pamięci lokalnej.

Pamięć lokalna w jedną minutę!

  • Pamięć lokalna umożliwia zapisywanie informacji w lokalnym systemie plików. Używaj jej do utrwalania danych między dwoma lub więcej wdrożeniami Twoich cBotów i wskaźników.
  • Aby zapisać dane, użyj metod SetString(string key, string value) i SetObject(string key, object obj). Aby je pobrać, wywołaj metody GetString(string key) i T GetObject<T>(string key).
  • Określ preferowany zakres pamięci lokalnej, używając wyliczenia LocalStorageScope. Na przykład przeciążenie SetString(string key, string value, LocalStorageScope.Device) zapisze dane w katalogu Documents/cAlgo/LocalStorage/.
  • Chociaż informacje są zapisywane automatycznie co minutę, możesz użyć metody Flush(LocalStorageScope localStorageScope), aby przechowywać dane bez opóźnień.
  • Podczas backtestingu i optymalizacji pamięć lokalna przechowuje dane tylko w pamięci.

Korzystanie z pamięci lokalnej

Pomyśl o pamięci lokalnej jako o sposobie przechowywania informacji między jednym lub kilkoma zatrzymaniami i uruchomieniami Twoich cBotów i wskaźników. Ta funkcja umożliwia zapisywanie danych cBotów i wskaźników, a następnie dostęp do tych informacji na kilka sposobów w zależności od Twoich potrzeb. Pamięć lokalna działa niezależnie od praw dostępu przyznanych algorytmowi.

Interfejs LocalStorage zawiera wszystkie metody, których możesz użyć do przechowywania i uzyskiwania dostępu do danych z pamięci lokalnej. Niektóre przykłady tych metod obejmują następujące:

  • SetString(string key, string value) - zapisuje wartość ciągu znaków, dopasowując ją do określonego klucza.
  • SetObject(string key, object obj) - zapisuje obiekt, dopasowując go do określonego klucza.
  • GetString(string key) - pobiera zapisaną wartość ciągu znaków, znajdując ją pod określonym kluczem.
  • T GetObject<T>(string key) - pobiera zapisany obiekt typu T z pamięci lokalnej, znajdując go pod określonym kluczem.

Ostrzeżenie

Metody SetObject(string key, object obj) i GetObject<T>(string key) działają tylko z typami danych, które można serializować (przekonwertować na bajty).

Rozważ następujący przykład, w którym prosimy wystąpienie cBota o zapisanie przykładowej wiadomości przy uruchomieniu. Przy kolejnych uruchomieniach to samo wystąpienie wyświetli okno komunikatu zawierające naszą wiadomość.

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

Po pierwszym uruchomieniu wystąpienia powyższego cBota zapisuje on naszą przykładową wiadomość w pamięci lokalnej. Po zatrzymaniu wystąpienia i ponownym uruchomieniu wyświetlane jest następujące okno komunikatu.

Zauważ, że pamięć lokalna działa nawet wtedy, gdy określono AccessRights.None.

Definiowanie zakresu pamięci lokalnej

Zakres pamięci lokalnej (zdefiniowany za pomocą typu LocalStorageScope) określa, gdzie dokładnie informacje są przechowywane i jak można uzyskać do nich dostęp. To wyliczenie enum zawiera następujące stałe:

  • LocalStorageScope.Instance - zapisane dane są przechowywane i mogą być dostępne tylko dla określonego działającego wystąpienia cBota lub wskaźnika. Informacje są zapisywane w katalogu Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/. W tej ścieżce „AlgoType" oznacza typ rozszerzenia cTrader pracującego z pamięcią lokalną (cBots lub Indicators), podczas gdy AlgoName to nazwa konkretnego cBota/wskaźnika. InstanceUniqueIdentifier to unikalny identyfikator konkretnego wystąpienia danego cBota lub wskaźnika.
  • LocalStorageScope.Type - zapisane dane są przechowywane i mogą być dostępne dla wszystkich działających wystąpień danego cBota lub wskaźnika. Informacje są zapisywane w katalogu Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/.
  • LocalStorageScope.Device - zapisane dane są przechowywane i mogą być dostępne dla wszystkich działających wystąpień cBotów i wskaźników na bieżącym urządzeniu. Informacje są zapisywane w katalogu „Documents/cAlgo/LocalStorage/".

Z kolei metody takie jak SetString() i SetObject() mają dodatkowe przeciążenia umożliwiające określenie niestandardowego zakresu pamięci lokalnej. Na przykład poniższy kod zapisze ciąg znaków do LocalStorageScope.Type; ten ciąg znaków będzie następnie dostępny dla wszystkich rozszerzeń danego typu.

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

Jeśli LocalStorageScope nie jest określony jako parametr, domyślnie używany jest LocalStorageScope.Instance.

Zauważ, że to zachowanie jest inne dla metod GetString(string key) i T GetObject<T>(string key). Gdy te metody są wywoływane bez określenia zakresu pamięci lokalnej, będą szukać określonego klucza we wszystkich zakresach zgodnie z poniższą hierarchią:

  • Instancja
  • Typ
  • Urządzenie

Dodatkowo każdy inny zakres pamięci lokalnej ma własny limit miejsca na dysku:

  • LocalStorageScope.Instance jest ograniczony do 10 MB.
  • LocalStorageScope.Type jest ograniczony do 100 MB.
  • LocalStorageScope.Device jest ograniczony do 500 MB.

Limity zdefiniowane powyżej nie są kumulatywne. Na przykład, jeśli wykorzystałeś już wszystkie 500 MB pamięci na poziomie urządzenia, nadal będziesz mógł przechowywać informacje przy użyciu pamięci na poziomie wystąpienia, aż do osiągnięcia jej limitu wynoszącego 10 MB.

Jak działa zapisywanie i ładowanie informacji

Podczas przechowywania informacji w pamięci lokalnej (na przykład poprzez wywołanie metody SetString()), cTrader automatycznie zapisuje dane co minutę. Dane są również zapisywane przy zatrzymaniu wystąpienia.

Możesz jednak dostosować to zachowanie, używając następujących metod:

  • Flush(LocalStorageScope localStorageScope) - zapisuje wszystkie dane do określonego zakresu.
  • Reload(LocalStorageScope localStorageScope) - ponownie ładuje wszystkie wartości z określonego zakresu.

Pamiętaj, że podczas wywoływania metody Reload(LocalStorageScope localStorageScope wszelkie oczekujące zmiany mogą zostać utracone. Aby tego uniknąć, upewnij się, że wcześniej wywołałeś Flush(LocalStorageScope localStorageScope).

W poniższym przykładzie prosimy cBota o wykonanie zlecenia rynkowego. Po zakończeniu tej czynności natychmiast zapisujemy zysk/stratę brutto z pozycji, którą właśnie otworzyliśmy, w 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);

Pamięć lokalna w backtestingu i optymalizacji

Pamięć lokalna działa inaczej w backtestingu w porównaniu z handlem w czasie rzeczywistym.

Jak pokazano wcześniej, pamięć lokalna wykorzystuje system plików Twojego lokalnego komputera, gdy ta funkcja jest używana w handlu w czasie rzeczywistym. Jednak użycie systemu plików w backtestingu prowadziłoby do kilku problemów, w szczególności do zapisywania dużych ilości danych, które nie mają związku z bieżącymi ruchami rynkowymi i operacjami handlowymi.

Aby uniknąć tych problemów, wszystkie operacje z pamięcią lokalną są przeprowadzane tylko w pamięci podczas wykonywania backtestów lub optymalizacji Twoich cBotów. W rezultacie możesz mieć pewność, że wszystkie dane zapisane w Twoim systemie plików dotyczą tylko handlu w czasie rzeczywistym.

Podsumowując, pamięć lokalna to bardzo korzystna funkcja Algo API, która umożliwia utrwalanie danych między wieloma zatrzymaniami i uruchomieniami różnych cBotów i wskaźników. Dzięki efektywnemu wykorzystaniu pamięci lokalnej możesz tworzyć złożone zautomatyzowane strategie handlowe oparte na niestandardowych danych zapisanych w Twoim systemie plików.