Google Finance

Como não imaginei isso antes? Se temos o Yahoo Finance, por que não teriamos Google Finance? E eis que hoje descubro o Google Finance. Porém, um pequeno detalhe, ainda não tem as cotações da Bovespa. Mas até podemos colocar um “ainda” nesta história.

Assim como no Yahoo, no Google você também pode baixar um arquivo CSV e importar os dados para seu banco. Exemplo: aqui. Mas qual é a boa? Pelo post do blog do Google as cotações serão real-time.

Descobri através do blog do Google.

Estou devendo o código de um agente em java, usando jade, para recuperar os dados do Yahoo Finance.

Straw Dogs

Segundo post da categoria filmes é sobre Straw Dogs (1971). Diferentemente do primeiro post, onde fiz uma forte recomendação, este ficará enquadrado como uma sugestão. Acredito que por ter pouco conhecimento sobre filmes desta época não tenha compreendido a dimensão das cenas violentas contidas em seu final, que para mim, enquanto assistia ao filme, pareciam totalmente normais. Talvez por nos dias de hoje estarmos acostumados com filmes tipo Hostel ( Albergue ) e Saw ( Jogos Mortais ).

Enfim, o filme retrata a vida de um matemático que se muda para a Escócia com sua esposa afim de procurar sossego. Contudo, ao contratar quatro homens para fazerem a reforma em sua garagem, incluindo entre eles um antigo relacionamento de sua mulher, as coisas acabam não saindo como o esperado. E pela minha opinião pessoal por dois fatos: o mais óbvio pela má índole dos homens que estão fazendo o serviço em sua casa; e segundo pela sua própria mulher, que é uma mescla de atitudes infantis e dignas de uma senhora de bordel ( tá, eu procurei outro adjetivo mas só veio esse). O final do filme é um tanto quanto angustiante, pois não temos heróis, apenas uma matemático tentando salvar a pele do “bobo” da cidade contra cinco mau-caráters.

Biblioteca de Análise Técnica

TA Lib, uma biblioteca com:

  • Mais de 150 algoritmos de indicadores de análise técnica.
  • Inclui reconhecimento de candles
  • API abstrata para adição de novos algoritmos

De fato, para mim esta biblioteca foi uma descoberta genial. Vai facilitar e muito meu trabalho de sistemas multi-agentes com o MASSES ( próxima semana já terá site ).

Variações de estratégias com esses 150 indicadores não irão faltar. Fica aí uma excelente recomendação. Falarei mais sobre esta biblioteca após utilizá-la melhor.

Novo participante

Bom, agora o blog vai ter um novo participante que também irá escrever sobre seus projetos e assuntos de interesse. Vai ser uma fase de experimentação, pois ele, assim como eu, quer criar o hábito de escrever e expor suas idéias. Se der certo, provavelmente ele irá criar seu blog.

Badu graduou-se comigo na UFAL em ciência da computação e está atualmente fazendo seu mestrado, assim como eu, em Engenharia de Software na Puc-Rio.

Bem-vindo Badu. Espero que você se lembre de postar. ehehhe.

Recuperando Dados do Yahoo Finance

Voltando ao papo anterior sobre recuperar dados da Bovespa do dia anterior.

Implementei hoje a tarde um método que irá fazer parte de um agente para a recuperação dos dados de uma ação da Bovespa. Está feito em Java e estou pegando os dados do Yahoo Finace.

Infelizmente, não tenho ainda o plugin do wordpress para highlight code. Quem se interessar pode entrar em contato. Provavelmente, irei editar este post e colocar o código.

Em breve falo sobre o HackGol, que tem uma funcionalidade parecida.

Edit: Como percebi que esse é um post de alguns acessos no blog, vou colocar o código para recuperar dados de uma página Web. Esse exemplo eu usava para pegar os preços das passagens no site da GOL. Não funciona mais e não está completo.

private void capture(){
// url
String urlString = “http://compre3.voegol.com.br/skylights/cgi-bin/skylights.cgi”;

// Datas necessárias

int mesIda = Calendar.getInstance().get(Calendar.MONTH) + 1; // Mês do segundo dia do intervalo
int diaIda = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); // Dia do segundo dia do intervalo
int anoIda = Calendar.getInstance().get(Calendar.YEAR); // Ano do segundo dia do intervalo

GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();

if( gc.getActualMaximum(Calendar.DAY_OF_MONTH) == diaIda ) {
gc.set(Calendar.DAY_OF_MONTH, 1);
gc.set(Calendar.MONTH, mesIda );
} else {
gc.set(Calendar.DAY_OF_MONTH, diaIda + 1);
}

int mesVolta = gc.get(Calendar.MONTH) + 1;
int diaVolta = gc.get(Calendar.DAY_OF_MONTH);
int anoVolta = gc.get(Calendar.YEAR);

// Parâmetros
Properties parametros = new Properties();
try {
parametros.setProperty(“travel_type”, URLEncoder.encode(“on”, “UTF-8″) );
parametros.setProperty(“sector1_o”, URLEncoder.encode(this.origem, “UTF-8″));
parametros.setProperty(“sector1_d”,    URLEncoder.encode(this.destino.substring(1), “UTF-8″));
parametros.setProperty(“sector_1_d”,URLEncoder.encode((diaIda<10?”0″:”") + String.valueOf(diaIda), “UTF-8″) );  // Data da IDA
parametros.setProperty(“sector_1_m”,URLEncoder.encode((mesIda<10?”0″:”") + String.valueOf( mesIda )+ “” + String.valueOf( anoIda ), “UTF-8″) ); // Mês e Ano da IDA (mmaaaa)
parametros.setProperty(“sector_2_d”,URLEncoder.encode((diaVolta<10?”0″:”") + String.valueOf(diaVolta), “UTF-8″) ); // Data da Volta
parametros.setProperty(“sector_2_m”,URLEncoder.encode((mesVolta<10?”0″:”") + String.valueOf( mesVolta ) + “” + String.valueOf(anoVolta), “UTF-8″) ); // Mês e Ano da Volta
parametros.setProperty(“ADULT”,     URLEncoder.encode(“1″, “UTF-8″) ); // Quantidade de Adultos
parametros.setProperty(“CHILD”,     URLEncoder.encode(“0″, “UTF-8″) ); // Quantidade de Crianças
parametros.setProperty(“INFANT”,    URLEncoder.encode(“0″, “UTF-8″) ); // Quantidade de Bebês
parametros.setProperty(“oP”,         URLEncoder.encode(“”, “UTF-8″));
//parametros.setProperty(“rP”,         URLEncoder.encode(“”, “UTF-8″));
parametros.setProperty(“pT”,         URLEncoder.encode(“1ADULT0CHILD”, “UTF-8″));
parametros.setProperty(“nom”,        URLEncoder.encode(“2″, “UTF-8″));
parametros.setProperty(“pM”,         URLEncoder.encode(“0″, “UTF-8″));
parametros.setProperty(“tc”,         URLEncoder.encode(“1″, “UTF-8″));
parametros.setProperty(“sid”,         URLEncoder.encode(“”, “UTF-8″));
parametros.setProperty(“language”,    URLEncoder.encode(“PT”, “UTF-8″));
parametros.setProperty(“mode”,        URLEncoder.encode(“JURO”, “UTF-8″)); // PIDO ou JURO
parametros.setProperty(“module”,     URLEncoder.encode(“SB”, “UTF-8″));
parametros.setProperty(“page”,        URLEncoder.encode(“SELECT”, “UTF-8″));
parametros.setProperty(“openjaw_flag”,URLEncoder.encode(“true”, “UTF-8″) );
parametros.setProperty(“m1″, URLEncoder.encode(String.valueOf( anoIda ) + (mesIda<10?”0″:”") + String.valueOf( mesIda ) + (diaIda<10?”0″:”") + String.valueOf(diaIda) + this.origem.substring(1) + this.destino.substring(1), “UTF-8″) );
parametros.setProperty(“m1DP”,         URLEncoder.encode(“0″, “UTF-8″));
parametros.setProperty(“m1DO”,         URLEncoder.encode(“0″, “UTF-8″));
parametros.setProperty(“m2″, URLEncoder.encode(String.valueOf( anoVolta ) + (mesVolta<10?”0″:”") + String.valueOf( mesVolta ) + (diaVolta<10?”0″:”") + String.valueOf( diaVolta ) + this.destino.substring(1) + this.origem.substring(1), “UTF-8″));
parametros.setProperty(“m2DP”,         URLEncoder.encode(“0″, “UTF-8″));
parametros.setProperty(“m2DO”,         URLEncoder.encode(“0″, “UTF-8″));

} catch(Exception e){
e.printStackTrace();
}

int contador = 0;
String dados = “”;
for( Iterator i = parametros.keySet().iterator(); i.hasNext(); ){

String nome = (String) i.next();
String valor = parametros.getProperty(nome);
//System.out.println(nome + ” = “+ valor);
dados += (++contador == 1 ? “?” : “&”)
+ nome + “=” + valor;
}

//System.out.println(dados);

/*  GET  */

try{

URL url = new URL(urlString+dados);
//System.out.println(urlString+dados);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setRequestProperty(“Request-Method”, “GET”);
connection.setDoInput(true);
connection.setDoOutput(false);

connection.connect();

BufferedReader br = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
StringBuffer newData = new StringBuffer(10000);
String s = “”;
br.readLine();
boolean copiar = false;
while(null != ( (s = br.readLine()) )) {
if( copiar ) {
newData.append(s + “n”);
//System.out.println(s);
}
if( !copiar && s.equals(“</head>”))
copiar = true;

}
br.close();

Processamento.process(new String(newData));

//System.out.println(new String(newData));
//String x = new String(newData);
System.out.println(“Resultado: ” + connection.getResponseCode() + “/” + connection.getResponseMessage());

} catch (Exception e){
//e.printStackTrace();
System.out.println(“Dados não disponíveis no momento!”);
}

}

The Oxford Murders

Poster

Para estrear uma categoria nova e já pretendida de meu blog, a de filmes, comentarei um filme que acabo de assistir, The Oxford Murders.

Antes de tudo, o filme é genial. Martin (Elijah Wood) e seu professor Arthur Seldom (John Hurt) procuram desvendar uma série de assassinatos que são baseados em uma série lógica construida pelo assassino. Num contexto bem matemático e com muita lógica e revelações, os dois tentam desvendar este mistério. O final é uma reviravolta, muito bem elaborado e consistente.

Em uma pesquisa na Internet encontrei detalhes no Wikipedia e descobri que o filme é baseado em um romance de Guilermo Martinez, provavelmente também valerá a leitura.

O mais interessante é que dois dias atrás eu pensava sobre um dos temas principais do filme e muitas idéias que tive são comentadas durante o filme. O tema não é relevante falar por enquanto, não decidi se o torno conteúdo para este blog, mas senti uma vontade enorme de escrever tudo o que havia pensado, praticamente uma hora de divagações (viagem de ônibus do Ap para a Puc).

Bom, a idéia do post é essa, ser concisa e sem delongas, para que a sugestão seja feita e o filme seja uma descoberta e não uma espera dos fatos que você já sabe que vão acontecer.

Mercado de Ações

Este é o tema da vez no meu mestrado. Das matérias de Engenharia de Software que estou pagando todas tenho trabalho relacionado a ele. Em sistemas multi-agentes estou trabalhando no MASSES, que irei apresentá-los mais a frente, em outro post. Em resumo o MASSES é um ambiente de simulação de uma Bolsa de Valores onde agentes podem atuar comprando ou vendendo as ações. Em Processo de Sistema de Software resolvi desenvolver um sistema baseado no MASSES, onde a idéia seria o apoio ao usuário na tomada de decisão da compra e da venda de um papel na bolsa.

Para o desenvolvimento deste último preciso de um banco de dados com as informações das ações de 120 dias anteriores ao dia atual, para a realização de alguns algorítmos de análise técnica e indicadores. Ou seja, um webservice com os dados da BOVESPA, seria genial. Porém, fazendo uma breve pesquisa notei que estes dados não são disponibilizados gratuitamente, e nem tão pouco baratos. Dentre as soluções que encontrei foram:

Eclipse Trade, um excelente software que já possui uma série de indicadores para o mercado de ações. Ele recupera os dados de sites que o fornecem gratuitamente, dentre eles o Yahoo Finance, que disponibiliza justamente os dados da BOVESPA. Vale até um post.

WebService do HoloCoCos, buscando do google encontrei este WebService em seu blog. Parece estar funcionando legal, e suspeito que ele esteja resgatando os dados do Yahoo também. Não testei, mas se tiver um tempinho irei testar. Também não entrei em contato com ele, e achei este projetinho dele bem parecido com o meu HackGol (coisa nerd). :P

Ainda não tomei a decisão de qual fonte usar, provavelmente meu agente ( Utilizarei um agente para recuperar essas informações) irá realizar a mesma proeza dos citados acima, buscar os dados do Yahoo Finance, só não encontrei ainda onde recuperar os dados anteriores, achei apenas os dados do dia.

Falarei mais sobre este assunto, bem como algoritmos de análise técnica nos próximo posts.

ScrapBook

ScrapBook é uma extensão do firefox utilizada para capturar páginas da Web.

ScrapBook is a Firefox extension, which helps you to save Web pages and easily manage collections. Key features are lightness, speed, accuracy and multi-language support. Major features are:
* Save Web page
* Save snippet of Web page
* Save Web site
* Organize the collection in the same way as Bookmarks
* Full text search and quick filtering search of the collection
* Editing of the collected Web page
* Text/HTML edit feature resembling Opera’s Notes

Agora a pergunta, e daí?

Bom, fiquei encarregado de fazer um manual de um sistema ( :S ), e o primeiro requisito era que fosse HTML e que outras pessoas pudessem trabalhar nele. Então, a escolha foi o wiki. Contudo, o material a ser entregue ao cliente deveria ser apenas HTML, logo, não poderia entrar o wiki para ele, visto que teria que instalar os serviços mysql e apache. Então pensei em utilizar o TeleportPro, que tem uma funcionalidade parecida com o ScrapBook, salva todo o conteúdo de um website, criando uma réplica. Porém, Teleport é pago, e não atendeu a alguns critérios, como falha no css e links com acento na url. ScrapBook está sendo, por enquanto, a solução para este caso.

Aceito sugestões quanto a outras ferramentas de fácil criação de manual, que tenha exportação para formato html. Word?