Как работать с локальным хранилищем
В этой статье и соответствующем видео мы объясним, что такое локальное хранилище и как его можно использовать в ваших алгоритмах cTrader. Мы также приведем полезные примеры и объясним, как работает область видимости локального хранилища.
Зачем использовать локальное хранилище
Существует множество случаев, когда вы хотите, чтобы ваш алгоритм сохранял что-то в локальную файловую систему или получал к ней доступ. Например, вы можете захотеть сохранить журнал всех операций сиБота. Однако обычно это требует, чтобы алгоритм имел повышенные права доступа (AccessRights.FullAccess), что далеко не идеально для пользователей. Если алгоритм запрашивает у пользователя предоставление повышенных разрешений, пользователь с гораздо меньшей вероятностью будет доверять алгоритму, особенно если он распространяется без исходного кода. Локальное хранилище — это удобный способ безопасного доступа к локальной файловой системе без каких-либо проблем с безопасностью. Использование локального хранилища позволяет разработчикам оставлять права доступа своих алгоритмов установленными на AccessRights.None.
Сохранение строк в локальном хранилище
Каждый тип алгоритма cTrader имеет свойство LocalStorage, которое позволяет выполнять операции чтения и записи. Чтобы продемонстрировать, как работает локальное хранилище, мы создадим новый сиБот. В его обработчике OnStart мы будем использовать метод LocalStorage.SetString(string key, string value). Как видите, он принимает два аргумента, а именно ключ, под которым должна быть сохранена информация, и значение для сохранения.
1 | |
Чтобы получить значение, мы будем использовать метод GetString(string key) в обработчике OnTick сиБота.
1 | |
Пока Message не равно null, мы можем собрать сиБот и увидеть, что полученное значение правильно выводится в журнал.
Сохранение объектов в локальном хранилище
Помимо строк, вы можете использовать локальное хранилище для сохранения любого типа объектов. За кулисами cTrader сериализует и десериализует объекты в локальном хранилище, что позволяет обмениваться любыми данными. Чтобы продемонстрировать это, мы можем создать новый класс для хранения информации, сохранить его, а затем извлечь. Мы назовем этот класс Signal.
1 2 3 4 5 6 | |
В методе OnStart() мы создадим новый экземпляр этого класса и инициализируем его свойства.
1 2 3 4 5 | |
Мы будем использовать метод SetObject(string key, Object object) для сохранения и получения баланса счета.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Если мы соберем наш сиБот и запустим его, мы должны увидеть правильные значения, выводимые в журнал.
Области видимости локального хранилища
При использовании локального хранилища вы также можете определить область видимости, в которой сохраненные значения доступны для последующего извлечения. Доступны три различные области видимости:
- Область видимости экземпляра — сохраненные значения доступны только конкретному экземпляру.
- Область видимости типа — сохраненные значения доступны всем экземплярам конкретного алгоритма.
- Область видимости устройства — сохраненные значения доступны всем алгоритмам независимо от их типов.
Вот как может выглядеть использование области видимости экземпляра.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Обратите внимание, что мы явно указали область видимости в методе SetString().
Мы можем добавить несколько экземпляров этого сиБота и настроить их так, чтобы один записывал в локальное хранилище, а другой извлекал информацию. В этом случае чтение информации должно быть невозможным. Однако если настроен только один экземпляр для выполнения операций записи и чтения, сиБот должен работать как задумано.
Вот пример использования области видимости типа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Если мы создадим два экземпляра этого бота и настроим их так, чтобы один экземпляр записывал в локальное хранилище, а другой читал сохраненное значение, все должно работать без ошибок.
И наконец, область видимости устройства позволяет обмениваться информацией между различными алгоритмами. Вот пример использования этого типа области видимости.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Мы можем собрать несколько сиБотов, которые используют один и тот же код. Если мы правильно их настроим, один сиБот может сохранять информацию в локальное хранилище, а другой извлекать ее. Пока область видимости равна LocalStorageScope.Device, наша система должна работать как задумано.
Использование методов Flush() и Reload()
Если вы хотите обмениваться информацией между несколькими экземплярами cTrader, вызовите методы Flush() и Reload().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Если мы соберем несколько сиБотов с этим кодом и проведем эксперимент по обмену информацией между различными экземплярами cTrader, мы увидим, что наши сохраненные значения сохраняются как задумано.