Локальное хранилище
В этом руководстве мы объясняем, как работать с локальным хранилищем при разработке алгоритмов cTrader. Ниже мы приводим краткое описание того, как работает доступ к локальному хранилищу.
Локальное хранилище за одну минуту!
- Локальное хранилище позволяет сохранять информацию в вашей локальной файловой системе. Используйте его для сохранения данных между двумя или более развертываниями ваших сиБотов и индикаторов.
- Для сохранения данных используйте методы
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)для сохранения данных без задержек. - Во время бэктестинга и оптимизации локальное хранилище сохраняет данные только в памяти.
Использование локального хранилища
Думайте о локальном хранилище как о способе сохранения информации между одной или несколькими остановками и запусками ваших сиБотов и индикаторов. Эта функция позволяет сохранять данные сиБотов и индикаторов, а затем получать доступ к этой информации несколькими способами в зависимости от ваших потребностей. Локальное хранилище работает независимо от прав доступа, предоставленных алгоритму.
Интерфейс 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) работают только с типами данных, которые могут быть сериализованы (преобразованы в байты).
Рассмотрим следующий пример, в котором мы просим экземпляр сиБота сохранить пример сообщения при запуске. При последующих запусках тот же экземпляр отобразит окно сообщения, содержащее наше сообщение.
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 | |
После первого запуска экземпляра сиБота он сохраняет наше примерное сообщение в локальном хранилище. После остановки экземпляра и его повторного запуска отображается следующее окно сообщения.

Обратите внимание, что локальное хранилище работает даже при указании AccessRights.None.
Определение области локального хранилища
Область локального хранилища (определяемая через тип LocalStorageScope) определяет, где именно хранится информация и как к ней можно получить доступ. Это перечисление enum содержит следующие константы:
LocalStorageScope.Instance— сохраненные данные хранятся и доступны только конкретному запущенному экземпляру сиБота или индикатора. Информация сохраняется в каталогеDocuments/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/. В этом пути "AlgoType" обозначает тип расширения cTrader, работающего с локальным хранилищем (cBotsилиIndicators), аAlgoName— это имя конкретного сиБота/индикатора.InstanceUniqueIdentifier— это уникальный идентификатор конкретного экземпляра определенного сиБота или индикатора.LocalStorageScope.Type— сохраненные данные хранятся и доступны всем запущенным экземплярам конкретного сиБота или индикатора. Информация сохраняется в каталогеDocuments/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/.LocalStorageScope.Device— сохраненные данные хранятся и доступны всем запущенным экземплярам сиБотов и индикаторов на текущем устройстве. Информация сохраняется в каталоге "Documents/cAlgo/LocalStorage/".
В свою очередь, методы, такие как SetString() и SetObject(), имеют дополнительные перегрузки, позволяющие указать пользовательскую область локального хранилища. Например, следующий код сохранит строку в LocalStorageScope.Type; эта строка, следовательно, будет доступна всем расширениям определенного типа.
1 | |
Если 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) заранее.
В приведенном ниже примере мы просим сиБота выполнить рыночный ордер. После завершения этого действия мы немедленно сохраняем валовую прибыль позиции, которую мы только что открыли, в LocalStorageScope.Type.
1 2 3 4 5 | |
Локальное хранилище в бэктестинге и оптимизации
Локальное хранилище работает иначе в бэктестинге по сравнению с торговлей в реальном времени.
Как показано ранее, локальное хранилище использует файловую систему вашего локального компьютера, когда эта функция используется в торговле в реальном времени. Однако использование файловой системы в бэктестинге привело бы к нескольким проблемам, в частности к сохранению больших объемов данных, не имеющих отношения к текущим рыночным движениям и торговым операциям.
Чтобы избежать этих проблем, все операции с локальным хранилищем выполняются только в памяти при проведении бэктестов или оптимизации ваших сиБотов. В результате вы можете быть уверены, что все данные, сохраненные в вашей файловой системе, касаются только торговли в реальном времени.
Подводя итог, локальное хранилище — это очень полезная функция Algo API, которая позволяет сохранять данные между несколькими остановками и запусками различных сиБотов и индикаторов. Эффективно используя локальное хранилище, вы можете создавать сложные автоматизированные торговые стратегии на основе пользовательских данных, сохраненных в вашей файловой системе.