Trabalho prático 2005/2006
Alexandre Bragança
Paulo Ferreira
Luı́s Nogueira
23 de Março de 2006
Ideia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Código Auxiliar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Código 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Código 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Código 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Busca + CM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Busca + CM - fig.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
DCs + CDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
DCs + CDs - fig. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Clientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Clientes + CD - fig. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Compra e Venda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Cliente + Banco - fig. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Exemplo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Distribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1
Ideia
●
Pretende-se desenvolver um sistema distribuı́do que implemente um sistema de simulação do
mercado de valores
●
Trabalho a entregar por correio electrónico ao docente das aulas práticas, até às 24 horas do dia 28
de Maio de 2006.
●
Ver apresentação da disciplina para mais detalhes.
ORGC
Trabalho Prático 2006 – slide 2
Código Auxiliar
●
%%%
%%%
%%%
%%%
A informação é retirada de http://finance.yahoo.com usando código similar ao que aparece no
exemplo anexo.
File
: bolsa.erl
Author : Luis Nogueira
Description : Obter lista de cotações
Created : 19 Mar 2006 by Luis Nogueira
-module(bolsa).
-export([go/0,go/1]).
-record(accao,{codigo,valor,data,hora,variacao,
valor_abertura,min_dia,max_dia,volume}).
go() ->
Url = "http://finance.yahoo.com/d/quotes.csv?"
++ "s=bpi.ls,BCP.LS&f=sl1d1t1c1ohgv&e=.csv",
getUrl(Url).
go(L) ->
Url = "http://finance.yahoo.com/d/quotes.csv?s="
++ buildUrl(L) ++ "&f=sl1d1t1c1ohgv&e=.csv",
getUrl(Url).
ORGC
Trabalho Prático 2006 – slide 3
Código 2
buildUrl([]) ->
[];
buildUrl([H]) ->
atom_to_list(H);
buildUrl([H|T]) ->
atom_to_list(H) ++ "," ++ buildUrl(T).
getUrl(Url) ->
application:start(inets),
X = http:request(get,{Url,[]},[],[]),
result(X).
result({ok,{_,_,Body}}) ->
B = remove_aspas(Body),
format_data(string:tokens(B,"\r\n"));
result({error,Reason}) ->
{erro,Reason}.
ORGC
Trabalho Prático 2006 – slide 4
2
Código 3
remove_aspas([]) ->
[];
remove_aspas([34|T]) ->
remove_aspas(T);
remove_aspas([H|T]) ->
[H|remove_aspas(T)].
format_data([]) ->
[];
format_data([H|T]) ->
Accao = transform_data(H),
[Accao|format_data(T)].
ORGC
Trabalho Prático 2006 – slide 5
Código 4
transform_data(String) ->
Tokens = string:tokens(String,","),
#accao{codigo = list_to_atom(lists:nth(1,Tokens)),
valor = list_to_float(lists:nth(2,Tokens)),
data = list_to_atom(lists:nth(3,Tokens)),
hora = list_to_atom(lists:nth(4,Tokens)),
variacao = list_to_float(lists:nth(5,Tokens)),
valor_abertura = list_to_float(lists:nth(6,Tokens)),
max_dia = list_to_float(lists:nth(7,Tokens)),
min_dia = list_to_float(lists:nth(8,Tokens)),
volume = list_to_integer(lists:nth(9,Tokens))
}.
ORGC
Trabalho Prático 2006 – slide 6
Busca + CM
●
Existe um processo chamado busca que é composto por dois subprocessos (master +slave) por
razões de robustez, que tem a missão de ir ao Yahoo buscar a informação actualizada de uma dada
cotação ou cotações.
●
Este processo vai ser utilizado pela Central de Monitorização (CM) que lhe envia as siglas das
cotações que pretende receber. O processo CM também é composto por dois subprocessos
(master +slave) por razões de robustez.
●
A CM tem por obrigação usar o processo busca com uma periodicidade parametrizável para manter
uma lista das cotações actualizadas. As cotações a pedir são todas as que já lhe foram solicitadas
pelo processo banco (ver mais à frente).
ORGC
Trabalho Prático 2006 – slide 7
3
Busca + CM - fig.
C
Y
a
h
o
o
b
u
s
c
e
n
t
r
a
a
l
d
e
M
C
o
n
i
t
o
r
i
z
a
ç
ã
o
M
ORGC
Trabalho Prático 2006 – slide 8
DCs + CDs
●
Existem ainda Distribuidores de Cotações (DC) que comunicam com a Central de Monitorização.
●
Existe um processo chamado Coordenador de Distribuidores (CD) que é responsável por criar um
número pré-definido de distribuidores (DC), mantê-los activos e distribuir uniformemente a carga de
pedidos entre eles.
ORGC
Trabalho Prático 2006 – slide 9
DCs + CDs - fig.
C
C
e
n
t
r
a
l
d
e
M
o
n
i
t
o
r
i
z
a
ç
ã
o
o
r
d
e
d
D
C
n
C
i
s
t
r
i
b
u
i
d
o
r
e
s
d
o
r
i
s
t
r
i
b
u
i
d
o
r
e
s
M
D
D
d
e
C
D
a
o
C
e
D
C
o
t
a
ç
õ
e
D
C
s
ORGC
Trabalho Prático 2006 – slide 10
Clientes
●
Quando um cliente quiser monitorizar uma cotação deve fornecer a sigla dessa cotação, o limite
mı́nimo da cotação, e o Pid do processo que quer informar da passagem do limite, e um intervalo de
tempo máximo a esperar pela entrada da cotação nesse intervalo.
●
Para cada pedido de monitorização será criado pelo cliente com a informação anterior um Processo
de Monitorização (PM) que receberá informação do Distribuidor de Cotações que lhe tenha sido
atribuı́do pelo Coordenador de Distribuidores (CD).
●
Os Distribuidores de Cotações recebem a lista completa das cotações, mas apenas enviam para os
Processos de Monitorização, a cotação que interessa a cada Processo de Monitorização
ORGC
Trabalho Prático 2006 – slide 11
4
Clientes + CD - fig.
C
o
o
r
d
e
d
D
i
s
t
r
i
b
n
a
d
o
r
e
u
i
d
o
r
e
s
C
D
D
i
s
t
r
i
b
u
C
i
d
D
o
r
e
s
d
e
C
o
t
a
ç
õ
e
C
D
D
C
s
P
M
C
ORGC
l
i
e
n
t
e
Trabalho Prático 2006 – slide 12
Compra e Venda
Os processos de monitorização devem ser utilizados pelos clientes para tentar ganhar dinheiro da
seguinte forma:
●
Um cliente pode comprar acções ao seu valor actual, e criar um Processo de Monitorização que o
avise da passagem dessas acções pelo limite especificado, ou do fim do prazo temporal.
●
Em qualquer dos casos acima referidos, o cliente vende as acções. Se o prazo especificado tiver
chegado ao fim, as acções são vendidas à cotação corrente na altura.
●
A compra e venda passam por um processo chamado banco implementado com uma arquitectura
master-slave) por razões de robustez.
ORGC
Trabalho Prático 2006 – slide 13
Banco
●
O processo banco recebe inicialmente uma lista dos clientes que aceita, existindo nessa lista para
cada cliente os seguintes dados:
1.
O nome do cliente
2.
A sua password
3.
O saldo inicial da sua conta
●
Os pedidos de compra e venda são feitos ao processo banco, sendo autenticados através da
password, e sendo a actualização do saldo feita pelo processo banco através de pedidos directos à
Central de Monitorização.
●
Os pedidos de venda têm sempre sucesso, mas os pedidos de compra estão sujeitos à existência
prévia de saldo por parte do cliente.
ORGC
Trabalho Prático 2006 – slide 14
5
Cliente
Um cliente pode diversificar os seus investimentos, devendo devolver o seu saldo final, e os
ganhos/perdas quando vender todas as acções que comprou. Assim um cliente é inicializado com o
seu nome, a sua password e uma lista das acções em que pretende investir tendo para cada uma:
●
1.
A sua sigla
2.
A quantidade pretendida
3.
O limite mı́nimo da cotação
4.
O tempo máximo de espera
ORGC
Trabalho Prático 2006 – slide 15
Cliente + Banco - fig.
C
M
e
o
n
n
i
t
t
o
C
r
l
a
i
r
z
d
a
e
ç
ã
o
B
a
n
c
o
M
C
l
i
e
n
t
e
ORGC
Trabalho Prático 2006 – slide 16
Exemplo
Cliente
Banco
Banco
⇒ comprar Acções ⇒
⇒ pede Cotação ⇒
⇐ Resultado ⇐
Cliente
Cliente
Cliente
Cliente cria PM
...
...
Cliente
Cliente
Cliente
⇐ Resultado ⇐
⇒ pede DC ⇒
⇐ Pid DC ⇐
Banco
CM
CM
CM guarda Sigla
Banco
CD
CD
⇐ recebe mensagem ⇐
⇒ vende Acções ⇒
⇐ saldo ⇐
PM
Banco
Banco
ORGC
Trabalho Prático 2006 – slide 17
6
Distribuição
●
A Central de Monitorização, o processo busca e o Banco correm num nó Erlang próprio, não
havendo outros processos do sistema a implementar nesse nó.
●
Noutro nó estão localizados os Distribuidores de cotações e o seu Coordenador.
●
Cada cliente tem um nó para si e para os seus processos de monitorização.
ORGC
Trabalho Prático 2006 – slide 18
7