Neutrino API
O neutrino é uma API em Python para implementar estratégias de algotrading no mercado brasileiro. Ela dá acesso à uma engine desenvolvida em C++ que cuida de todas as interações com a B3 e está divida nos seguintes conjuntos:
- Estruturas de análise: book, trades (ticks), candles e indicadores
- Funções de configuração
- Callbacks
O acesso à estes conjuntos é feito pelos objetos market
, utils
, oms
e
position
. A API também realiza alguns callbacks para seu código em Python
quando certos eventos ocorrem. Portanto, você pode implementar os métodos
abaixo:
initialize
(obrigatório)on_data
(opcional)order_update
(obrigatório se estratégia enviar ordens)order_filled
(opcional)set_parameters
(obrigatório se rodar pelo Quantick)get_parameters
(obrigatório se rodar pelo Quantick)finalize
(opcional)
Preparando o ambiente local
Para preparar seu ambiente para testar o neutrino localmente você precisa
clonar este repositório,
instalar o Docker e o Make na sua máquina (se estiver usando windows, pode
querer fazer isso usando o chocolatery).
Depois, preencha o arquivo scripts/credentials.yml
seguindo o arquivo
exemplo disponível na mesma pasta. Finalmente, inicie o Docker e use os
comandos abaixo. Isso iniciará uma estratégia demo para testar o ambiente.
Pressione Ctrl+A D
para terminar.
$ make docker-build
$ make example
Para instalar diferetes módulos do Python para serem utilizadas dentro de suas
estratégias, inicie a imagem base do docker e instale os pacotes desejados
utilizando o pip
.
$ make base-env
$ pip3.7 install [PACKAGE NAME]
Antes de terminar o container atual, inicie outro terminal e siga estas instruções para comitar as mudanças que você fez como uma nova imagem. Assim você pode voltar a utilizá-la mais tarde, sem precisar reinstalar os módulos novamente.
$ docker ps -a
$ docker commit [CONTAINER_ID] neutrino-1
$ doker image
Finalmente, termine o ambiente que utilizou para fazer as instalações utilizando
Ctrl+A D
e inicie um novo container para testar suas estratégias.
$ make neutrino-env
Arquivos de configuração
Market Data
O arquivo de configuração determina os parâmetros para execução do Neutrino. O formato do arquivo é JSON, confira um exemplo:
{
"Algorithm" : "python",
"CPUMask" : 15,
"ExecutionClient" : "demo.conf",
"MDChannel" : { "<ALIAS>": "<IP>:<PORTA>"},
"AlgoId" : 0,
"AlgoClusterId" : 0,
"Parent" : 0,
"FrontendIdleTimeout": 60,
"pos": {
"DI1F21": {
"net": -5,
"net_price": 0.025
}
},
"Symbols" : [ "DOLM18" ],
"class" : "SimpleCorpOrder",
"import" : "algo_modules",
"StrictRisk": false
}
Onde os parâmetros disponíveis são:
Nome | Descrição | Valores |
---|---|---|
Algorithm | Tipo de algoritmo | "python", "corporate" |
Symbol | Lista dos nomes dos ativos | lista de strings |
StrictRisk | Se e somente se o simbolo de uma ordem não tenha uma configuração de risco, esse parâmetro configura se tal ordem será bloqueada ou não. Se "true": bloqueia (strict). Se "false": aceita. | bool |
pos | A chave é o nome do ativo e o valor é um dict composto por net e net_price , onde o primeiro termo se refere à posição atual no instrumento e net_price o seu preço médio. |
dict |
CPUMask | Máscara usada pelo taskset para determinar alocação de CPU pelo sistema operacional | int |
AlgoClusterId | Process ID atribuido pelo sistema operacional e preenchido pelo AlgoMan | int |
AlgoId | Process ID atribuido pelo neutrino e preenchido pelo AlgoMan | int |
FrontendIdleTimeout | imeout para interação com o frontend. Sem comunicação com o frontend além do timeout a estrategia é encerrada. Se o valor igual a zero, esta validação não é feita | int |
ExecutionClient | Caminho para o arquivo com a configuração do cliente de ordens | string |
class | Nome do classe do algoritmo | string |
import | Pasta com os algoritmos | string |
MDChannel | Dicionário com IP e porta dos Relays utilizados | dict de strings, no formato <IP>:<porta> |
Para que este arquivo seja gerado corretamente, a estratégia deve ser cadastrada através do Admin com o atributo Classe no formato python:<import>:<class>
e o atributo name como <class>
.
Order Routing
O arquivo de configuração determina os parâmetros para execução do Neutrino relacionados ao envio de ordens. Segue o exemplo:
port = 14006
user = neutrino
password = neutrino
account = DEMO
exchange = XBMF
prefix = XBMF.
report-delay = 500
Onde os parâmetros disponíveis são:
Nome | Descrição | Valores |
---|---|---|
port | porta DTC do OMS | int |
user | nome de usuário para conexão com o OMS | string |
password | senha do usuário para conexão com o OMS | string |
account | conta para envio de ordens | string |
exchange | string | |
prefix | prefixo utilizado no client order id das ordens enviadas | string |
report-delay | Indica qual deve ser o tempo de delay da simulação. Caso seja colocado um valor negativo o código interpreta como valor de delay 0. | int |
Rodando estratégias no Docker
No repositório neutrino-devel,
inclua a pasta com os arquivos relacionados à estratégia que quiser testar na
pasta strats/
e preencha o arquivo scripts/confs/strastlist.yml
com um
alias para sua estratégia (que utilizará com outro script), o nome da pasta
onde os arquivos estão e o nome da classe que será importada pelo neutrino,
conforme modelo na pasta scripts/confs/
. Depois disso, navegue para a pasta
raiz do repositório (onde fica o README) e rode:
$ python scripts/create_algo.py -a <ALIAS> -id <ID para usar na pasta> -i <INSTRUMENTO PARA TESTAR>
$ make neutrino-env
Já dentro do docker, rode:
$ cd ~/onesoft/algos/algo<ID>
$ neutrinov4 -c <ARQUIVO DA PASTA>.conf
Isso iniciará o neutrino
em modo de simulação, utilizando dados em tempo
real, e todo evento de book ou negócio chamará os callbacks para sua
estratégia. Para testar os comandos que implementar, digite em um novo console:
$ controller <algo-id> <unix-domain-socket-path>
$ set <NOME ESTRATÉGIA> comandos-em-formato-json-aqui