Visão Geral
Neste artigo vemos como acessar o serviõ de tickers do Yahoo para capturar informações como cotação de moedas, bolsa, etc..
O Yahoo oferece um site web - Yahoo Finance - que permite consultas a diversos tipos de índices de bolsa de valores, cotações de moedas, etc... Por exemplo a cotação do ouro pode ser acessada, via página web, através deste link :
Uma necessidade de sistema seria poder obter as informações oferecidas pelo Yahoo Finance para serem utilizadas em uma aplicação em particular.
Para isso o Yahoo oferece uma url que pode ser acessada via http e retorna como saída um texto com as informações do ticker requisitado no formato CSV.
Por exemplo, para a URL de acesso :
http://download.finance.yahoo.com/d/quotes.csv?s=BRLUSD%3DX+SN11.CBT+SF11.CBT+CN11.CBT&f=snl1d1t1ohgdr
O retorno do Yahoo é uma estrutura de dados deste tipo :
"BRLUSD=X","BRL to USD",0.6385,"8/2/2011","11:56am",N/A,N/A,N/A,N/A,N/A
"SN11.CBT","Soybean Futures,J",1396.00,"7/14/2011","12:21pm",1390.25,1396.75,1352.50,0.00,N/A
"SF11.CBT","SF11.CBT",0.00,"N/A","N/A",N/A,N/A,N/A,N/A,N/A
"CN11.CBT","Corn Futures,Jul-",718.00,"7/14/2011","1:00pm",724.00,742.00,711.50,0.00,N/A
Assim para que possamos recuperar a informação de uma cotação do Yahoo devemos formatar corretamente a URL de acesso e depois realizar a extração dos dados da estrutura de dados CSV retornada pelo Yahoo.
A estrutura da URL de acesso permite diversos parâmetros. Neste link é possível encontrar uma explicação sobre a URL de acesso do Yahoo :
Exemplo de Uso em GeneXus
Basicamente o que devemos fazer em GeneXus é utilizar o HTTPClient Data Type e, após recuperar o seu retorno (neste exemplo seria a estrutura de dados no formato CSV) processar esta informação utilizando as funções/recursos para manipular texto.
Abaixo vemos um código em GeneXus para realizar este trabalho onde o resultado final estará armazenado em uma variável string do tipo collection denominada &campoCol.
Um XPZ está disponível ao final da página e para realizar um teste basta apenas compilar e executar esta Procedure. Se trata de uma Procedure Main - Command Line e que apresentará o resultado da consulta diretamente na janela OutPut do GeneXus X.
//exemplo de url para acessar desde o browser
//http://download.finance.yahoo.com/d/quotes.csv?s=BRLUSD%3DX+SN11.CBT+SF11.CBT+CN11.CBT&f=snl1d1t1ohgdr
//acessa página inicial
&httpClient.Host = "download.finance.yahoo.com"
&httpClient.Port = 80
&httpClient.Secure = False
&urlString = "/d/quotes.csv?s="
//tickers para real para dolar, real para euro, e euro para dolar
&urlString += "BRLUSD%3DX+BRLEUR=X+EURUSD=X"
//parâmetros adicionas da consulta
&urlString += "&f=snl1d1t1ohgdr"
&httpClient.Execute("GET",&urlString)
&httpClient.Timeout = 5000
if &httpClient.ErrCode <> 0
msg(Format("Erro : %1 - %2", &httpClient.ErrCode.ToString(), &httpClient.ErrDescription), nowait)
else
msg(Format("+++ Yahoo Tickers ! - %1", ServerNow()), nowait)
msg(Format("http://%1%2",&httpClient.Host, &urlString),nowait)
&linhaCol = &httpClient.ToString().SplitRegEx(NewLine())
For &linha in &linhaCol
//exemplo de string de retorno
//"SN11.CBT","Soybeans Jul 11",1370.50,"1/11/2011","2:36pm",1393.00,1400.00,1368.75,0.00,N/A
//elimina a vírgula dentro de uma string delimitada por ""
&linhaVirgula = &linha
&linha.SetEmpty()
&isString = False
For &i = 1 to &linhaVirgula.Length()
&char = &linhaVirgula.Substring(&i ,1)
&isString = iif( &char= '"', not &isString, &isString)
&char = iif( &isString and &char= ',', ' ', &char)
&linha += &char
EndFor
&linha = &linha.Replace('"','')
&campoCol = &linha.SplitRegEx(",")
//não processa linhas onde a data ou a hora estão com o valor N/A
if &campoCol.Item(4).IndexOf("N/A") = 0 and &campoCol.Item(5).IndexOf("N/A") = 0
Msg(" ------------------------------",nowait)
Msg(Format(" Simbolo = %1", &campoCol.Item(1)),nowait)
Msg(Format(" Descricao = %1", &campoCol.Item(2)),nowait)
Msg(Format(" Valor = %1", &campoCol.Item(3)),nowait)
Msg(Format(" Data = %1", &campoCol.Item(4)),nowait)
Msg(Format(" Hora = %1", &campoCol.Item(5)),nowait)
Msg(Format(" ValorAbertura = %1", &campoCol.Item(6)),nowait)
Msg(Format(" ValorMaximo = %1", &campoCol.Item(7)),nowait)
Msg(Format(" ValorMinimo = %1", &campoCol.Item(8)),nowait)
Msg(" ------------------------------",nowait)
endif
EndFor
commit
endif