跳转至

本地存储

在本指南中,我们解释了在开发 cTrader 算法时如何使用本地存储。 下面,我们提供了一分钟的本地存储访问工作原理摘要。

一分钟了解本地存储!

  • 本地存储允许您在本地文件系统中保存信息。 使用它在 cBot 和指标的两次或多次部署之间保持数据。
  • 要保存数据,使用 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) 方法立即存储数据,无需延迟。
  • 在回测和优化期间,本地存储仅在内存中存储数据。

使用本地存储

将本地存储视为在 cBot 和指标的一次或多次停止和启动之间存储信息的方式。 此功能允许保存 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 扩展类型(cBotsIndicators),而 AlgoName 是特定 cBot/指标的名称。 InstanceUniqueIdentifier 是特定 cBot 或指标实例的唯一 ID。
  • LocalStorageScope.Type - 保存的数据可以由特定 cBot 或指标的所有运行实例存储和访问。 信息保存在 Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/ 目录中。
  • LocalStorageScope.Device - 保存的数据可以由当前设备上所有运行的 cBot 和指标实例存储和访问。 信息保存在 "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 MB。
  • LocalStorageScope.Type 限制为 100 MB。
  • LocalStorageScope.Device 限制为 500 MB。

上述限制不是累积的。 例如,如果您已经使用了所有 500 MB 的设备级存储,您仍然可以使用实例级存储来存储信息,直到达到其 10 MB 的限制。

信息的保存和加载方式

将信息存储到本地存储时(例如,通过调用 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);

回测和优化中的本地存储

本地存储在回测中的工作方式与实时交易不同。

如前所示,本地存储在实时交易中使用本地机器的文件系统。 然而,在回测中使用文件系统会导致几个问题,最显著的是保存大量与当前市场走势和交易操作无关的数据。

为避免这些问题,在执行回测或优化 cBot 时,所有本地存储操作仅在内存中进行。 因此,您可以确保保存到文件系统的所有数据仅涉及实时交易。

总之,本地存储是 Algo API 的一个非常有益的功能,允许在多个 cBot 和指标的多次停止和启动之间保留数据。 通过有效使用本地存储,您可以创建基于保存在文件系统中的自定义数据的复杂自动交易策略。