Ir para o conteúdo

Armazenamento local

Neste guia, explicamos como pode trabalhar com armazenamento local ao desenvolver algoritmos cTrader. Abaixo, fornecemos um resumo de um minuto sobre como funciona o acesso ao armazenamento local.

Armazenamento local em um minuto!

  • O armazenamento local permite-lhe guardar informações no seu sistema de ficheiros local. Use-o para persistir dados entre duas ou mais implementações dos seus cBots e indicadores.
  • Para guardar dados, use os métodos SetString(string key, string value) e SetObject(string key, object obj). Para recuperá-los, invoque os métodos GetString(string key) e T GetObject<T>(string key).
  • Especifique o seu âmbito de armazenamento local preferido usando o enum LocalStorageScope. Por exemplo, a sobrecarga SetString(string key, string value, LocalStorageScope.Device) guardará dados no seu diretório Documents/cAlgo/LocalStorage/.
  • Embora as informações sejam guardadas automaticamente a cada minuto, pode usar o método Flush(LocalStorageScope localStorageScope) para armazenar dados sem atrasos.
  • Durante testes de verificação e otimização, o armazenamento local guarda dados apenas na memória.

Usar armazenamento local

Pense no armazenamento local como uma forma de armazenar informações entre uma ou várias paragens e inícios dos seus cBots e indicadores. Este recurso permite guardar dados de cBot e indicadores e depois aceder a essas informações de várias maneiras, dependendo das suas necessidades. O armazenamento local funciona independentemente dos direitos de acesso concedidos a um algoritmo.

A interface LocalStorage contém todos os métodos que pode usar para armazenar e aceder a dados de e para o armazenamento local. Alguns exemplos desses métodos incluem os seguintes:

  • SetString(string key, string value)- guarda um valor de string combinando-o com a chave especificada.
  • SetObject(string key, object obj)- guarda um objeto combinando-o com a chave especificada.
  • GetString(string key) - recupera um valor de string guardado encontrando-o sob a chave especificada.
  • T GetObject<T>(string key) - recupera um objeto guardado do tipo T do armazenamento local encontrando-o sob a chave especificada.

Aviso

Os métodos SetObject(string key, object obj) e GetObject<T>(string key) só funcionam com tipos de dados que podem ser serializados (convertidos em bytes).

Considere o seguinte exemplo no qual pedimos a uma instância de cBot para guardar uma mensagem de exemplo no início. Em inícios subsequentes, a mesma instância exibirá uma caixa de mensagem contendo a nossa mensagem.

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

Após uma instância do cBot acima ser lançada pela primeira vez, ela guarda a nossa mensagem de exemplo no armazenamento local. Depois de parar a instância e iniciá-la novamente, a seguinte caixa de mensagem é mostrada.

Note que o armazenamento local funciona mesmo quando AccessRights.None é especificado.

Defina o âmbito do armazenamento local

O âmbito do armazenamento local (definido através do tipo LocalStorageScope) determina onde exatamente a informação é armazenada e como pode ser acedida. Este enum contém as seguintes constantes:

  • LocalStorageScope.Instance - os dados guardados são armazenados e só podem ser acedidos por uma instância específica em execução de um cBot ou indicador. A informação é guardada no diretório Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/{InstanceUniqueIdentifier}/. Neste caminho, "AlgoType" denota o tipo de extensão cTrader que trabalha com o armazenamento local (cBots ou Indicators) enquanto AlgoName é o nome de um cBot/indicador específico. InstanceUniqueIdentifier é o ID único de uma instância específica de um cBot ou indicador em particular.
  • LocalStorageScope.Type - os dados guardados são armazenados e podem ser acedidos por todas as instâncias em execução de um cBot ou indicador em particular. A informação é guardada no diretório Documents/cAlgo/LocalStorage/{AlgoType}/{AlgoName}/.
  • LocalStorageScope.Device - os dados guardados são armazenados e podem ser acedidos por todas as instâncias em execução de cBots e indicadores no dispositivo atual. A informação é guardada no diretório "Documents/cAlgo/LocalStorage/".

Por sua vez, métodos como SetString() e SetObject() têm sobrecargas adicionais que permitem especificar um âmbito de armazenamento local personalizado. Por exemplo, o seguinte código irá guardar uma string em LocalStorageScope.Type; esta string, subsequentemente, será acessível a todas as extensões de um tipo particular.

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

Se LocalStorageScope não for especificado como um parâmetro, LocalStorageScope.Instance é utilizado por predefinição.

Note que este comportamento é diferente para os métodos GetString(string key) e T GetObject<T>(string key). Quando estes métodos são invocados sem especificar o âmbito do armazenamento local, irão procurar pela chave especificada em todos os âmbitos seguindo a hierarquia abaixo:

  • Instância
  • Tipo
  • Dispositivo

Adicionalmente, cada âmbito de armazenamento local diferente tem a sua própria quota de espaço em disco:

  • LocalStorageScope.Instance está limitado a 10 MB.
  • LocalStorageScope.Type está limitado a 100 MB.
  • LocalStorageScope.Device está limitado a 500 MB.

Os limites definidos acima não são cumulativos. Por exemplo, se já tiver utilizado todos os 500 MB de armazenamento ao nível do dispositivo, ainda poderá armazenar informação utilizando o armazenamento ao nível da instância até atingir o seu limite de 10 MB.

Como funciona o armazenamento e carregamento de informação

Ao armazenar informação no armazenamento local (por exemplo, invocando o método SetString()), o cTrader guarda automaticamente os dados a cada minuto. Os dados também são guardados quando a instância é parada.

No entanto, pode personalizar este comportamento utilizando os seguintes métodos:

  • Flush(LocalStorageScope localStorageScope) - guarda todos os dados no âmbito especificado.
  • Reload(LocalStorageScope localStorageScope) - recarrega todos os valores do âmbito especificado.

Tenha em mente que, ao chamar o método Reload(LocalStorageScope localStorageScope, quaisquer alterações pendentes podem ser perdidas. Para evitar isto, certifique-se de invocar Flush(LocalStorageScope localStorageScope) antes.

No exemplo abaixo, pedimos a um cBot para executar uma ordem de mercado. Após esta ação ser concluída, guardamos imediatamente o P&L bruto da posição que acabámos de abrir em 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);

Armazenamento local em testes de verificação e otimização

O armazenamento local funciona de forma diferente nos testes de verificação em comparação com a negociação em tempo real.

Como mostrado anteriormente, o armazenamento local utiliza o sistema de ficheiros da sua máquina local quando esta funcionalidade é utilizada na negociação em tempo real. No entanto, utilizar o sistema de ficheiros nos testes de verificação levaria a vários problemas, nomeadamente guardar grandes quantidades de dados que não tinham relação com os movimentos de mercado e operações de negociação atuais.

Para evitar estes problemas, todas as operações com o armazenamento local são conduzidas apenas na memória ao realizar testes de verificação ou otimizar os seus cBots. Como resultado, pode ter a certeza de que todos os dados guardados no seu sistema de ficheiros dizem respeito apenas à negociação em tempo real.

Em resumo, o armazenamento local é uma funcionalidade altamente benéfica da API Algo que permite persistir dados entre várias paragens e inícios de vários cBots e indicadores. Ao utilizar o armazenamento local de forma eficaz, pode criar estratégias de negociação automatizadas complexas baseadas em dados personalizados guardados no seu sistema de ficheiros.