Aplicação Java para sincronização de dados diário e intradiário de ações e derivativos da B3 em uma base de dados PostgreSQL TimescaleDB.
- Sincronização de dados do mercado à vista (BOVESPA) - Diário e Intraday
- Sincronização de dados intradiário do mercado balcão (BMF) - Intraday
1) Instalar última versão da base de dados Postgre: https://www.postgresql.org/download/
2) Instalar a última versão da extensão TimescaleDB seguindo as instruções disponíveis em: https://docs.timescale.com
-- Database: stockmarket
-- DROP DATABASE stockmarket;
CREATE DATABASE stockmarket
ENCODING = 'UTF8'
CONNECTION LIMIT = -1;
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
-- Table: tstock
-- DROP TABLE tstock;
CREATE TABLE tstock
(
symbol character varying(50) COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT tstock_pkey PRIMARY KEY (symbol)
);
-- Table: tdaily
-- DROP TABLE tdaily;
CREATE TABLE tdaily
(
symbol character varying(50) COLLATE pg_catalog."default" NOT NULL,
date timestamp without time zone NOT NULL,
close numeric(20,2),
closeadj numeric(20,2),
high numeric(20,2),
low numeric(20,2),
open numeric(20,2),
volume numeric(20,2),
CONSTRAINT tdaily_pkey PRIMARY KEY (symbol, date),
CONSTRAINT fk_tdaily_symbol FOREIGN KEY (symbol)
REFERENCES public.tstock (symbol) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
);
SELECT create_hypertable('tdaily', 'date', 'symbol');
-- Index: tdaily_date_idx
-- DROP INDEX public.tdaily_date_idx;
CREATE INDEX IF NOT EXISTS tdaily_date_idx
ON tdaily USING btree
(date DESC);
-- Table: tintraday
-- DROP TABLE tintraday;
CREATE TABLE tintraday
(
tradenumber bigint NOT NULL,
symbol character varying(50) COLLATE pg_catalog."default" NOT NULL,
date timestamp without time zone NOT NULL,
brokerbuy integer,
brokersell integer,
price numeric(20,2),
tradeindicator character(1) COLLATE pg_catalog."default",
volume bigint,
CONSTRAINT tintraday_pkey PRIMARY KEY (tradenumber, symbol, date),
CONSTRAINT fk_tintraday_symbol FOREIGN KEY (symbol)
REFERENCES public.tstock (symbol) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
);
SELECT create_hypertable('tintraday', 'date', 'symbol');
-- Index: tintraday_date_idx
-- DROP INDEX tintraday_date_idx;
CREATE INDEX IF NOT EXISTS tintraday_date_idx
ON tintraday USING btree
(date DESC);
-- Index: tintraday_symbol_idx
-- DROP INDEX tintraday_symbol_idx;
CREATE INDEX IF NOT EXISTS tintraday_symbol_idx
ON tintraday USING btree
(symbol COLLATE pg_catalog."default");
/marretti/stockexchange/apl --> Sugestão de armazenamento do .jar (compilado disponível na pasta target: marretti-stockexchange-sync-0.0.1-SNAPSHOT.jar).
/marretti/stockexchange/config --> Arquivos de configurações da aplicação.
/marretti/stockexchange/logs --> Pasta de logs.
/marretti/stockexchange/storage --> Local onde será realizado o download dos arquivos históricos.
5) Obter o arquivo application.properties da pasta /src/main/resources e copiar para o diretório /marretti/stockexchange/config
Efetuar os ajustes necessários de base de dados (usuário, senha, etc):
spring.datasource.url=jdbc:postgresql://localhost:5432/stockmarket
spring.datasource.username = postgres
spring.datasource.password = SUA_SENHA
Caso haja necessidade, efetuar os ajustes necessários de Regex para os instrumentos que serão sincronizados:
regex.bovespa.daily=^[A-Z][A-Z][A-Z][A-Z][3-6]|[A-Z][A-Z][A-Z][A-Z]11$
regex.bovespa.intraday=^[A-Z][A-Z][A-Z][A-Z][3-6]|[A-Z][A-Z][A-Z][A-Z]11$
regex.bmf.intraday=^DOL[A-Z][0-9][0-9]|WDO[A-Z][0-9][0-9]|WIN[A-Z][0-9][0-9]|IND[A-Z][0-9][0-9]$
Efetuar os ajustes de data de início da sincronização:
sync.bovespa.daily.startDate=01/01/2019
sync.bovespa.intraday.startDate=01/01/2019
sync.bmf.intraday.startDate=01/01/2019
Executar a aplicação através da linha de comando: java -jar /marretti/stockexchange/apl/marretti-stockexchange-sync-0.0.1-SNAPSHOT.jar
Acompanhar a sincronização por meio do arquivo Data.log disponível na pasta de logs.
- Todas as contribuições são bem-vindas.