Algo Trading
A ferramenta de Algo Trading executa um algoritmo de trading que você escreve em JavaScript. O código recebe os dados de mercado uma data por vez, envia ordens de compra e venda, e gera os mesmos resultados da ferramenta de Portfólio.
Campos:
- Símbolos - Os ativos que o algoritmo pode negociar. Use qualquer um dos tipos de símbolo, até 10.
- Saldo - O caixa inicial, na moeda selecionada no topo da página.
- Intervalo - As datas de início e fim da simulação.
- Alavancagem - Quando ativada, permite venda a descoberto, para que o algoritmo venda ativos que não possui, dentro dos limites de margem abaixo. O valor de uma venda a descoberto não é adicionado ao caixa. Use com cautela, pois aumenta tanto os retornos potenciais quanto os riscos.
- Margem Inicial - Uma porcentagem (padrão 50%) que limita novas posições vendidas: o valor vendido total pode ser de até (caixa + posições compradas) / Margem Inicial. Por exemplo, 50% permite posições vendidas de até 2 vezes o caixa mais as posições compradas.
- Margem Mínima - Uma porcentagem (padrão 30%) do valor vendido que deve ficar disponível como margem. Se a margem ficar abaixo dela, a simulação para com um erro. Não há chamada de margem automática.
- Código - O código JavaScript do algoritmo (veja abaixo).
Código (AlgoWorkspace):
O código roda como o corpo de uma função async, com this vinculado ao AlgoWorkspace. Registre os listeners de eventos e chame start() no final do código para iniciar a simulação. O código deve ter exatamente um listener de data, e todo listener deve chamar next() ao terminar.
Eventos disponíveis:
this.on('start', async (next, timeseries) => { ... })- Executado uma vez antes da primeira data. timeseries tem todos os dados de preço, indexados por data (Record<string, AssetDataFlat[]>). this.assets e this.portfolio ainda não estão definidos.this.on('data', async (next) => { ... })- Executado uma vez para cada data com dados. As ordens são executadas depois que o listener chama next(), ao preço dessa data.this.on('end', async (next, result) => { ... })- Executado após a última data, com o resultado final. result.summary.alpha e beta são Promises.this.on('error', async (next, errors) => { ... })- Executado quando ordens de uma data são canceladas, ex.: caixa ou margem insuficiente. errors é um string[]. Uma exceção no seu código interrompe a simulação e aparece na aba Avisos.
Propriedades e métodos:
this.date- A data atual.this.assets- Os preços da data atual (AssetDataFlat[]: assetCode, date, value, currency). Só inclui os símbolos com dados nessa data.this.portfolio- Uma cópia da carteira atual (cash, assets, total, longValue, shortValue, totalProfit, realizedProfit, margin). Alterá-la não tem efeito, use os métodos abaixo.this.index- O número da data atual, de 1 a this.length.this.length- O número de datas com dados.this.inputs- As entradas da simulação.this.state- Um objeto para guardar seus próprios dados entre eventos.this.buy(assetCode: string, quantity: number): void- Envia uma ordem de compra. A quantidade deve ser um número finito diferente de zero.this.sell(assetCode: string, quantity: number): void- Envia uma ordem de venda. Vender mais que a posição abre uma posição vendida, se a Alavancagem estiver ativada.this.print(...msgs: any[]): void- Adiciona uma mensagem, com a data atual, à aba Mensagens.this.depositCash(amount: number): void- Adiciona caixa à carteira.this.loadScript(url: string): Promise<number>- Carrega uma biblioteca JavaScript externa. Os scripts carregados são removidos após a execução.this.download(obj: any, name?: string): Promise<void>- Baixa obj como um arquivo JSON chamado name.json (padrão invest-tester.json).
O código padrão na página de Algo Trading é um exemplo completo. Ele carrega uma biblioteca, envia ordens aleatórias e faz aportes mensais.