Skip to content

Instantly share code, notes, and snippets.

@ThiagoAnunciacao
Created June 25, 2014 04:11
Show Gist options
  • Save ThiagoAnunciacao/cc54b806d4a10bf3408f to your computer and use it in GitHub Desktop.
Save ThiagoAnunciacao/cc54b806d4a10bf3408f to your computer and use it in GitHub Desktop.
WebServices Bovespa
# Retorna dados sobre o pregão
http://www.bmfbovespa.com.br/Pregao-Online/ExecutaAcaoCarregarDados.asp?CodDado=IBOV,ticker&CA=undefined
# Retorna ações e seus últimos valores negociados
http://www.bmfbovespa.com.br/Pregao-OnLine/ExecutaAcaoCarregarDados.asp?CodDado=Ticker
# Retorna o histórico do dia de um papel
http://www.bmfbovespa.com.br/Pregao-Online/ExecutaAcaoCarregarDadosPapeis.asp?CodDado=petr4
# Retorna dados de um papel
http://www.bmfbovespa.com.br/cotacoes2000/formCotacoesMobile.asp?codsocemi=PETR4
# Retorna array com vários papeis
http://www.bmfbovespa.com.br/Pregao-Online/ExecutaAcaoAjax.asp?CodigoPapel=BISA3|PETR4|BBDC4
# Retorna dados do pregão
http://www.bmfbovespa.com.br/cotacoes2000/formCotacoesMobile.asp?codsocemi=IBOV
@myodcd
Copy link

myodcd commented Nov 21, 2022

@jicart já tentou usar a biblioteca yfinance (https://pypi.org/project/yfinance/)?

Screenshot 2022-11-21 at 15 03 49

@jicart
Copy link

jicart commented Nov 21, 2022

@jicart já tentou usar a biblioteca yfinance (https://pypi.org/project/yfinance/)?

Screenshot 2022-11-21 at 15 03 49

Já. Ela provavelmente é a melhor fonte, mas até nela eu já encontrei cotações erradas. Aí fica difícil de confiar.
Tudo que já testei já vi algum problema. No googlefinance tem tickers errados (VBBR3 ficou como BRDT3 durante meses).
No TradingView já vi cotação errada do DI futuro. No Profit da Nelogica às vezes dá problema nos dados em cache e tem que apagar tudo pra ele baixar de novo.
5 fontes diferentes e em todas já vi alguma inconsistência.
kkkkkkkk tá osso, viu?

De qualquer forma, em geral os erros são de centavos, então nunca dá tanta diferença.

@lucianeCarvalho
Copy link

Olá boa noite !!! alguém sabe me dizer se existe uma API que traz a posição de contratos por participante?
Segue o link de referencia para os dados que preciso.

https://www.b3.com.br/pt_br/market-data-e-indices/servicos-de-dados/market-data/consultas/mercado-de-derivativos/contratos-em-aberto/por-tipo-de-participante/

@myodcd
Copy link

myodcd commented Dec 13, 2022

Olá boa noite !!! alguém sabe me dizer se existe uma API que traz a posição de contratos por participante? Segue o link de referencia para os dados que preciso.

https://www.b3.com.br/pt_br/market-data-e-indices/servicos-de-dados/market-data/consultas/mercado-de-derivativos/contratos-em-aberto/por-tipo-de-participante/

Luciane, não sei se por questão de sigilo a B3 não divulga os participantes individualmente. Não tenho acesso à API para verificar se, por lá, disponibilizam estas informações.

@hyoretsu
Copy link

hyoretsu commented Jan 31, 2023

O melhor que encontrei até agora, com facilitários para uso, é fazer um web scraping da API do StatusInvest. Ela inclui até fundos de investimentos (com facilitários eu quero dizer estrutura propensa a web scraping de indicadores, resultados diretos se colocar o ticker inteiro, organização entre ações, Fii, etc. O que eu planejo fazer é uma carteira/portfólio automatizado, então preciso me certificar que as ações são de uma certa categoria)

https://statusinvest.com.br/home/mainsearchquery?q=b3sa3

Única desvantagem que pode dar BO é que não dá pra pesquisar vários em uma query só, então vc pd acabar abusando e eles caírem em cima.

@guijusto
Copy link

@mtcdultra Parece que o Yahoo Finance não mostra dados sobre bonificação de ações. Conseguiu pegar esse dado de algum outro lugar?

@myodcd
Copy link

myodcd commented Apr 27, 2023

@guijusto não identifiquei nenhum campo que forneça esta informação. Uma sugestão seria acompanhar as notícias em "news articles" da API (https://cryptocointracker.com/yahoo-finance/yahoo-finance-api). Fora isso, talvez fazer scrapping nesta página do Fundamentus - Fatos Relevantes (https://www.fundamentus.com.br/fr.php?&pg=1) com a palavra chave.

@mathemf
Copy link

mathemf commented Jun 3, 2023

Eu uso uma API oficial da bolsa com licença de desenvolvimento, posso dar host pra quem quiser aí, só me avisa pelo Insta @Gwinest Eu não uso nem metade da capacidade, eu ajudo quem precisar, só me pedir Em dom., 12 de jun. de 2022 16:58, Alessandro dev. @.> escreveu:

@.
* commented on this gist. ------------------------------ Esse endpoint não é uma api, mas no navegador é possível acessar os dados da composição da carteira do ibov. dá pra fazer um web scraping. a Hash é uma conversão base64. Já deixei configurada para listar todos os ativos da carteira. GET https://sistemaswebb3-listados.b3.com.br/indexProxy/indexCall/GetPortfolioDay/eyJsYW5ndWFnZSI6ImVuLXVzIiwicGFnZU51bWJlciI6MSwicGFnZVNpemUiOjEyMCwiaW5kZXgiOiJJQk9WIiwic2VnbWVudCI6IjEifQ== Essa é a api pública da B3. Dá pra usar uma ferramenta para vasculhar os endpoints disponíveis (Endpoint Application Discovery Tool) GET https://cotacao.b3.com.br/mds/api/v1/InstrumentPriceFluctuation/ibov — Reply to this email directly, view it on GitHub https://gist.github.com/cc54b806d4a10bf3408f#gistcomment-4198415, or unsubscribe https://github.com/notifications/unsubscribe-auth/AGGZNTY5ZJO5JFOKYXNK3RTVOY6ODANCNFSM4ILTSIFQ . You are receiving this because you commented.Message ID: @.***>

Olá, consegue dar um host para ver amigo?
Obrigado.

@matheusbnas
Copy link

Olá pessoal! Alguém usa a API do Fundamentus?

Link: https://github.com/mv/fundamentus-api/

@rafakwolf
Copy link

@matheusbnas parece muito legal, mas tah abandonada a um tempo, não tem manutenção

@Joaoalen98
Copy link

Esse endpoint não é uma api, mas no navegador é possível acessar os dados da composição da carteira do ibov. dá pra fazer um web scraping. a Hash é uma conversão base64. Já deixei configurada para listar todos os ativos da carteira.

GET https://sistemaswebb3-listados.b3.com.br/indexProxy/indexCall/GetPortfolioDay/eyJsYW5ndWFnZSI6ImVuLXVzIiwicGFnZU51bWJlciI6MSwicGFnZVNpemUiOjEyMCwiaW5kZXgiOiJJQk9WIiwic2VnbWVudCI6IjEifQ==

Essa é a api pública da B3. Dá pra usar uma ferramenta para vasculhar os endpoints disponíveis (Endpoint Application Discovery Tool) GET https://cotacao.b3.com.br/mds/api/v1/InstrumentPriceFluctuation/ibov

Também encontrei esse projeto bem documentado que pode ser útil https://mfinance.com.br/swagger/index.html

Essa cotacao.b3 mencionada por você parece ser uma das melhores soluções gratuitas para se utilizar, pelo fato de ser a única das mencionadas que retornam informações sobre opções. Mas gostaria de saber se você tem mais informações sobre os endpoints que essa API possui, por exemplo, pra mim ficaria interessante se tivesse um endpoint que eu possa recuperar todas as opções por ativo.

@veceme
Copy link

veceme commented Apr 24, 2025

Ola, tudo bem?
Alguem pode me ajudar?
Adaptei esse sketch em um ESP32, tem conecção WI-FI direto com reset pino 4.
Cotação STOCK EUA
CRIPITO
B3

Porem a B3 parou de funcionar.
Com a API do nosso amigo
@felipemarinho97 com o link: https://felipemarinho.vercel.app/api/b3/prices/
Vou colocar o Sketch para analizarem.
Agradeço a atenção.
Fico no aguardo.

//Cotação
// display: 8-pin 128160 SPI TFT (SD card reader not used) controller ST7735S
// Example in the Adafruit ST7735 and ST7789 library
// pin assignment
// NODEMCU ESP32 ============================= 128
160 SPI TFT ECRÃ LCD
// 3V --------------------------------------------------- VCC
// GND --------------------------------------------------- GND
// GPIO5 VSPI SS (Slave Select/ Chip Select) ------------ CS
// GPIO4 ------------------------------------------------ RESET
// GPIO2 (labelled as DC in Adafruit code) -------------- A0
// GPIO23 VSPI MOSI (MOSI, Data to Screen) -------------- SDA
// GPIO18 VSPI SCK (SPI Clock) -------------------------- SCK
// 3V --------------------------------------------------- LED

//Programa: WifiManager com e ESP32
//Autor: Arduino e Cia

#include <WiFi.h>
#include <WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_DC 2 // register select (stands for Data Control perhaps!)
#define TFT_RST 15 // Display reset pin, you can also connect this to the ESP32 reset
// in which case, set this #define pin to -1!
#define TFT_CS 5 // Display enable (Chip select), if not enabled will not talk on SPI bus

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void resettft() {
tft.fillScreen(ST77XX_BLACK);
}

//Define o pino para reset das definicoes de wifi
int pino_reset = 4;

// Array of cryptocurrencies you want to track
const char* cryptoSymbols[] = {
"bitcoin",
"ethereum",
// "cardano",
// "cardano",
};

// Number of cryptocurrencies in the array
const int numCryptoSymbols = sizeof(cryptoSymbols) / sizeof(cryptoSymbols[0]);

void readPriceBR(int x, int y, const String& Acao) {
String httpRequestAddress = "https://felipemarinho.vercel.app/api/b3/prices/" + Acao;
// https://felipemarinho.vercel.app/api/b3/prices/petr3 Site onde encontrei o link: https://gist.github.com/ThiagoAnunciacao/cc54b806d4a10bf3408f?permalink_comment_id=4198272
HTTPClient http;
int httpCode;

http.begin(httpRequestAddress);
httpCode = http.GET();

if (httpCode > 0) {
DynamicJsonDocument doc(1024);
String payload = http.getString();
Serial.println(payload);
deserializeJson(doc, payload);

// float currentsymbol = doc["symbol"];
// float currentname = doc["name"];
// float currentopeningPrice = doc["openingPrice"];
// float currentminPrice = doc["minPrice"];
// float currentmaxPrice = doc["maxPrice"];
// float currentaveragePrice = doc["averagePrice"];
float Price = doc["currentPrice"];
float Variation = doc["priceVariation"];

tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(3);
tft.println(Acao);
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(1,2);
tft.println("R$");
tft.setCursor(12, 24);
tft.setTextSize(2,5);
tft.println(Price, 2);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2,5);
tft.println(Variation, 2);
tft.setTextSize(1,2);
tft.setCursor(110, 85);
tft.println("%");

} else {

tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_RED);
tft.setTextSize(1);
tft.println("Error in HTTP request");

}

}

void readPriceUSA(int x, int y, const String& stockName) {
String httpRequestAddress = "https://finnhub.io/api/v1/quote?symbol=" + stockName + "&token=cmgs2lpr01qilgs0uohgcmgs2lpr01qilgs0uoi0";
HTTPClient http;
int httpCode;

http.begin(httpRequestAddress);
httpCode = http.GET();

if (httpCode > 0) {
DynamicJsonDocument doc(1024);
String payload = http.getString();
Serial.println(payload);
deserializeJson(doc, payload);

float previousClosePrice = doc["pc"];
float currentPrice = doc["c"];
float differenceInPrice = ((currentPrice - previousClosePrice) / previousClosePrice) * 100.0;

tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(3);
tft.println(stockName);

if (differenceInPrice < 0.0) {
  tft.setTextColor (ST77XX_WHITE);
} else {
  tft.setTextColor (ST77XX_WHITE);
}

tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(1,2);
tft.println("$ ");
tft.setCursor(12, 24);
tft.setTextSize(2,5);
tft.println(currentPrice, 2);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2,5);
tft.println(differenceInPrice, 2);
tft.setTextSize(1,2);
tft.setCursor(110, 85);
tft.println("%");

} else {

tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_RED);
tft.setTextSize(1);
tft.println("Error in HTTP request");

}

http.end();
}

void setup() {
// Start Serial for debugging
Serial.begin(115200);
delay(10);

tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab

pinMode(pino_reset, INPUT);

WiFiManager wifiManager;

wifiManager.setConfigPortalTimeout(240);

//Cria um AP (Access Point) com: ("nome da rede", "senha da rede")
if (!wifiManager.autoConnect("Cotação", "12345678")) {
Serial.println(F("Falha na conexao. Resetar e tentar novamente..."));
delay(3000);
ESP.restart();
delay(5000);
}

//Mensagem caso conexao Ok
Serial.println(F("Conectado na rede Wifi."));
Serial.print(F("Endereco IP: "));
Serial.println(WiFi.localIP());

tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(1,2);
tft.println("Conectado WI-FI");
tft.println(WiFi.localIP());
tft.println(WiFi.SSID());
delay (2000);

}

void loop() {
//Verifica se o botao foi pressionado
int valor = digitalRead(pino_reset);
if (valor == 1) {
//Apaga os dados da rede wifi gravados na memoria e reinicia o ESP
WiFiManager wifiManager;
wifiManager.resetSettings();
Serial.println("Configuracoes zeradas!");
ESP.restart();
}

// Loop through all the cryptocurrencies
for (int i = 0; i < numCryptoSymbols; i++) {

// Get crypto price from API
float price = getCryptoPrice(cryptoSymbols[i]);

tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(2,5);
tft.println(cryptoSymbols[i]);
tft.setTextColor(ST77XX_GREEN);
tft.setTextSize(1,2);
tft.print("$");
tft.setTextSize(2);
tft.println(price, 3);

delay(10000); // Delay in milliseconds between each cryptocurrency display

}
}

float getCryptoPrice(const char* cryptoSymbol) {
String url = "https://api.coingecko.com/api/v3/simple/price";
url += "?ids=";
url += cryptoSymbol;
url += "&vs_currencies=usd";

HTTPClient http;
http.begin(url);

int httpResponseCode = http.GET();
float price = 0;

if (httpResponseCode == 200) {
String payload = http.getString();
const size_t capacity = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(1) + 20;
DynamicJsonDocument doc(capacity);
deserializeJson(doc, payload);
price = doc[cryptoSymbol]["usd"].as();
}

readPriceBR(0, 0, "B3SA3");
delay(10000);
readPriceBR(0, 0, "CMIG4");
delay(10000);
readPriceUSA(0, 0, "AGNC");
delay(10000);
readPriceUSA(0, 0, "BXMT");
delay(10000);

return price;

}

Pelo que entendi, teria como colocar um comando para que o site achei que é Android ou windows, pois neste caso acho que funciona , pois ao link abre e diz verificar o sistema operacional.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment