SlideShare uma empresa Scribd logo
1 de 48
Roma Martina
Prof. Gastaldi Tommaso
IN GENERALE
In informatica e matematica, il termine algoritmo indica un procedimento che risolve
un determinato problema attraverso un numero finito di passi. Un problema
risolvibile mediante un algoritmo si dice computabile.
LA STORIA
Il termine "algoritmo" deriva dalla trascrizione latina del nome del matematico persiano
Al-Khwarizmi, che è considerato uno dei primi autori ad aver fatto riferimento a
questo concetto.
DEFINIZIONE
Esistono diverse ed innumerevoli definizioni di algoritmo, ognuna delle quali fa
riferimento a svariati campi, ne riportiamo una su tutte:
"Un algoritmo è un insieme ordinato di passi eseguibili e non ambigui, il cui
unico scopo è la risoluzione di problemi tra loro simili e il cui processo (di
risoluzione) deve essere temporalmente limitato".
In senso più ampio l'algoritmo è:
 Un metodo per risolvere un insieme di problemi tra loro simili (non
necessariamente uguali), dove per problema si intende la definizione di una
situazione problematica che può variare dall’usuale problema di
matematica, all’obiettivo da raggiungere in un qualsiasi gioco, allo scopo
che ci si propone in un qualsiasi lavoro (basti pensare agli algoritmi di
decrittografia che venivano usati nella Seconda Guerra Mondiale per
intercettare i movimenti nemici).
 Un’insieme ordinato di passi eseguibili e non ambigui, dove per passi
intendiamo anche le istruzioni. Pensiamo, per esempio, al gioco degli
scacchi presente nelle settimane enigmistiche quando si chiede di vincere in
un certo numero di mosse.
 Un processo che deve avere comunque un limite temporale (cioè deve
“produrre” una soluzione in un tempo finito). Non consideriamo algoritmo
un insieme di istruzioni che fanno riferimento a cicli infiniti. Così diciamo
con assoluta certezza che un’istruzione del tipo “gira su te stesso” non potrà
mai costituire un algoritmo se non verrà specificato con precisione un
termine, per esempio “gira su te stesso per tre volte”.
 L’algoritmo non è un programma: mentre un algoritmo è il procedimento
da seguire per risolvere un problema a prescindere dal linguaggio utilizzato,
un programma consiste nella descrizione di un algoritmo in uno specifico
linguaggio di programmazione (l’algoritmo in questa punto è
inteso come“oggetto” esclusivamente informatico).
ALCUNE PROPRIETA' FONDAMENTALI DEGLI
ALGORITMI
 i passi costituenti devono essere "elementari", ovvero non
ulteriormente scomponibili (atomicità);
 i passi costituenti devono essere interpretabili in modo
univoco dall'esecutore, sia esso umano o artificiale (non
ambiguità);
 l'algoritmo deve essere composto da un numero finito di
passi e richiedere una quantità finita di dati in ingresso
(finitezza)
 l'esecuzione deve avere termine dopo un tempo finito
(terminazione);
 l'esecuzione deve portare ad un risultato univoco
(effettività);
 ad ogni un passo, il successivo deve essere uno ed uno
solo, ben determinato (determinismo).
ESEMPIO
Il calcolo delle radici di una equazione di secondo grado:
ax2 + bx + c = 0
Si generano una sequenza di passi che possano portare alla
soluzione del problema.
Si calcola il delta dell’equazione e si distinguono i tre casi;
Caso delta negativo: esistono due soluzioni complesse coniugate;
Caso delta nullo: esiste una soluzione doppia pari a –b/2a;
Caso delta positivo: si calcolano le due soluzioni secondo la
formula nota;
Si ottengono x1 e x2.
Questo è un semplicissimo algoritmo matematico.
!!!ATTENZIONE!!!
Molto spesso si considera l’algoritmo come un qualcosa da legare
esclusivamente all’utilizzo del computer per cui risulta difficile
riconoscerlo nelle sue più svariate forme ed applicazioni
APPROCCIO INFORMATICO
Se per ottenere un certo risultato (risolvere un certo
problema) esiste un procedimento infallibile, che
può essere descritto in modo non ambiguo fino ai
dettagli, e conduce sempre all'obiettivo desiderato
in un tempo finito, allora esistono le condizioni per
affidare questo compito a un computer,
semplicemente descrivendo l'algoritmo in
questione in un programma scritto in un opportuno
linguaggio comprensibile alla macchina.
La complessità 
Con complessità di un algoritmo o efficienza di un algoritmo ci si riferisce alle risorse di calcolo
da esso richieste.
Per complessità si intende una funzione che associa il numero di dati da trattare al numero di
operazioni da eseguire per trattare i suddetti dati. Il simbolo utilizzato è una o minuscola "o"
seguito da una parentesi dove è indicata la complessità come una funzione che dipende da N,
dove N è il numero che rappresenta i dati in ingresso.
Quindi o(N) rappresenta un algoritmo la cui funzione che cresce il modo lineare (cresce come una
retta).
Così o(N2) rappresenta un algoritmo la cui funzione complessità cresce come un quadrato quindi
un raddoppio dei dati in ingresso provoca una quadruplicazione delle operazioni da eseguire.
La complessità di molti algoritmi è pesantemente influenzata dai dati in ingresso. In questo caso
quando si calcola la complessità si considera il caso ottimo, il caso pessimo e il caso medio.
Il caso ottimo è il caso in cui i dati sono i migliori dati possibili per l'algoritmo, cioè quelli che
richiedono meno elaborazioni per essere trattati.
Il caso pessimo invece prevede i dati più sfavorevoli per l'algoritmo.
Il caso medio è il caso più utile da analizzare perché fornisce un reale indicatore della complessità
dell'algoritmo ma tendenzialmente è anche quello più complesso da analizzare dato che spesso
è difficile determinare quali sono i dati medi. A volte per risolvere il problema del caso medio
si preferisce eseguire molte simulazioni dell'algoritmo e poi dai tempi ottenuti con le
simulazioni estrarre una formula che approssimi adeguatamente l'andamento medio.
Lo pseudo-codice
In informatica per pseudocodice, pseudolinguaggio o linguaggio di
progetto si intende un linguaggio di programmazione fittizio, non
direttamente compilabile o interpretabile da un programma compilatore o
interprete, il cui scopo è quello di rappresentare algoritmi. Lo
pseudolinguaggio può essere utilizzato alternativamente al diagramma di
flusso e non è soggetto a molte limitazioni intrinseche di quest'ultimo tipo
di rappresentazione.
Non esiste uno pseudolinguaggio standard e convenzionalmente usato: gli
autori di libri o corsi di programmazione definiscono spesso un proprio
pseudolinguaggio, utilizzato nelle loro pubblicazioni; inoltre ciascun
programmatore può essere portato ad utilizzare una propria variante. Ogni
pseudolinguaggio ha un proprio lessico, una propria sintassi e una propria
semantica, ma la progettazione di questo tipo di formalismo è volta alla
comprensibilità e alla leggibilità del codice; la sintassi sarà quindi meno
rigorosa rispetto ad un vero linguaggio e le parole chiave saranno
evocative, in modo da rendere più intuitiva la sua interpretazione.
Lo pseudolinguaggio è strettamente dipendente dal paradigma di
programmazione scelto per risolvere un problema, mentre dovrebbe essere
pressoché indipendente dal linguaggio di programmazione, purché
quest'ultimo rispetti naturalmente il paradigma scelto. Tuttavia, ciascun
linguaggio di programmazione possiede istruzioni e/o caratteristiche
proprie, che potrebbero essere sfruttate per una migliore implementazione
dell'algoritmo, ad esempio più efficiente.
Spesso si usano le caratteristiche del Pascal come base per definire uno
pseudolinguaggio.
La deviazione standard è un indice statistico che consente di
misurare la dispersione delle singole osservazioni
intorno alla media aritmetica.
Tale indicatore si calcola applicando la seguente formula:
 "xi" è il singolo valore che assume il fenomeno da
valutare;
 "n" il numero dei dati della serie storica.
 "x barrato" rappresenta la media aritmetica dei valori.
Esempio: un semplice algoritmo per calcolare lo scarto
quadratico medio.
La conseguenza più grave della rappresentazione con
precisione finita dei numeri reali è senza dubbio il
fenomeno della cancellazione numerica, ovvero la perdita
di cifre significative dovuta ad operazioni di sottrazione
quando il risultato è più piccolo di ciascuno dei due
operandi; questo fenomeno si verifica quando i due
operandi sono “quasi uguali” ed è anche conosciuto come
Catastrophical cancellation.
ESEMPIO:
Abbiamo i seguenti due numeri reali:
p1=0.12345789
p2=0.12345666
Supponiamo che l'architettura del calcolatore ci permetta di
memorizzare solo le prime 6 cifre dopo la virgola, quindi i
due numeri per essere rappresentati all'interno del
calcolatore, verrebbero troncati (supponiamo per
semplicità mediante chopping) appena dopo la sesta cifra:
p1=0.123457
p2=0.123456
Effettuando la sottrazione e riscrivendo il risultato nella
notazione floating point, si ha:
d=p1-p2=0.000001=1*10^-6
Mentre il risultato reale è pari a: 0.00000123.
In statistica, una serie storica (o temporale) si definisce come un insieme di
variabili casuali ordinate rispetto al tempo, ed esprime la dinamica di un
certo fenomeno nel tempo. Le serie storiche vengono studiate sia per
interpretare un fenomeno, individuando componenti di trend, di ciclicità,
di stagionalità e/o di accidentalità, sia per prevedere il suo andamento
futuro.
In generale, per serie si intende la classificazione di diverse osservazioni di
un fenomeno rispetto ad un carattere qualitativo. Se tale carattere è il
tempo, la serie viene detta storica o temporale.
Il fenomeno osservato, detto variabile, può essere osservato in dati istanti di
tempo (variabile di stato: numero dei dipendenti di un'azienda,
quotazione di chiusura di un titolo negoziato in borsa, livello di un tasso
di interesse ecc.) o alla fine di periodi di lunghezza definita (variabili di
flusso: vendite annuali di un'azienda, PIL trimestrale ecc.).
Indicando con Y il fenomeno, si indica con Yt un'osservazione al tempo t,
potendo t variare da 1 a T, dove T è il numero complessivo degli intervalli
o dei periodi temporali considerati.
In generale una serie storica è così definita yt={y1,y2,y3,....,yT};la serie
storica avrà dimensione T.
AZIONI, CIOE' PEZZI D’IMPRESA
Che Cosa sono le azioni o Titoli Azionari? Cosa sono e come funzionano questi
valori che ci consentono di guadagnare denaro investendo sui prodotti più vari,
magari proprio su quelli che consumiamo e usiamo tutti i giorni, dal dentifricio
all'automobile?
Un titolo azionario altro non è che un certificato che fa diventare il suo possessore
socio di una determinata società. Le azioni, che rappresentano una parte del capitale
sociale di un'impresa, danno al titolare una serie di diritti: diritto alla partecipazione
agli utili (dividendo), diritto di partecipare agli aumenti di capitale sottoscrivendo
nuove azioni o di acquistare obbligazioni convertibili di nuova emissione, diritto di
partecipare all'assemblea degli azionisti esercitando il diritto di voto che è
proporzionale al numero di azioni possedute.
Il Trading per eccellenza si effettua sui titoli azionari. Del resto possono dare ottime
soddisfazioni così come grandi delusioni. Ma forse sta proprio in questo il fascino
che cattura tantissimi investitori e ormai in larga parte anche piccoli investitori.
Soprattutto con i titoli azionari viene fuori l'emotività degli investitori e del mercato
stesso. Per questo risulta importante identificare quei titoli che danno maggiori
chance di profitto.
Non si direbbe ma ogni titolo ha un suo "stile" di movimento caratteristico, quindi
riuscire ad identificarlo ci permette di scegliere i migliori di ogni paniere, sui quali
operare. Non devo operare su di un titolo perché mi piace la società che ci sta dietro
o perché me lo hanno consigliato. Naturalmente questo criterio è perseguibile solo se
si hanno a disposizione le serie storiche dei titoli o dei grafici di almeno un paio di
anni.
Con VB.NET per generare numeri pseudo-casuali si utilizza la
classe Random, che produce una sequenza di numeri che
soddisfano determinati requisiti statistici di casualità.
Utilizzare un calcolatore, che è un oggetto puramente
deterministico e quindi prevedibile, per generare un numero
casuale e quindi imprevedibile sembra essere problematico. In
effetti nessun calcolatore è in grado di generare numeri
puramente casuali, ma solo numeri pseudo – casuali ossia
numeri generati da algoritmi numerici deterministici in grado di
superare una serie di test statistici che conferiscono a tali
numeri un’apparente casualità. L’algoritmo restituisce una
sequenza di valori che dipendono da un numero specificato,
detto seme della sequenza, caricato nel generatore stesso. Il
seme viene poi trasformato per ottenere il primo valore della
sequenza, e applicando la stessa trasformazione si ottiene il
valore successivo della sequenza, e così via.
Se lo stesso valore di inizializzazione è utilizzato ripetutamente, viene generata
la stessa serie di numeri, perché anche le operazioni matematiche sono
uguali. Un modo per produrre sequenze diverse consiste nel rendere il valore
di inizializzazione dipendente da un fattore temporale, producendo così una
diversa serie a ogni nuova istanza di Random. Per impostazione predefinita,
il costruttore senza parametri della classe Random utilizza il clock di sistema
(ossia l’ora corrente del giorno) per generare il valore di inizializzazione, ma
è possibile passare un valore di base come argomento inserendolo tra
parentesi dopo New Random. È meglio utilizzare l’ora corrente come valore
di base, perché è molto probabile che cambi l’istante di tempo ogni volta che
creiamo un oggetto Random.
Tuttavia, poiché il clock ha una risoluzione limitata, l’utilizzo del costruttore
senza parametri per creare oggetti Random diversi in stretta successione dà
origine a generatori di numeri casuali che producono sequenze identiche di
numeri casuali. Questo problema può essere evitato creando un unico
oggetto Random che generi molti numeri casuali nel tempo, anziché creare
ripetutamente nuovi oggetti Random che generino un solo numero casuale.
Si possono generare numeri pseudo – casuali aventi diverse distribuzioni (ossia
ogni numero ha una determinata probabilità di cadere in un dato intervallo).
Ad esempio si possono generare numeri distribuiti in modo uniforme se in
tale distribuzione ogni numero in un dato intervallo ha la stessa probabilità di
essere selezionato.
PROGRAMMAZIONE
Generare una sequenza di numeri casuali per i prezzi
bid e ask al variare del tempo. Il risultato, cioè la
serie storica, viene mostrato da un grafico:
Link: www.box.com/s/s8rierzv101n6ja40a7f
Le medie mobili (moving average) sono uno strumento per depurare i prezzi
dagli elementi erratici (rumore di fondo). Stimano il ciclo trend attraverso
trasformazioni (filtri) lineari della serie, che hanno lo scopo di annullare
l’effetto delle altre componenti per evidenziare il trend.
dove:
 m1 è il numero dei periodi precedenti t;
 m2 è il numero dei periodi successivi a t;
 θi è un peso attribuito agli m1 + m2 + 1 termini della somma;
 k = m1 + m2 + 1 è il periodo o l'ordine della media mobile.
Una media mobile viene detta:
 semplice se i pesi θi sono tutti uguali a 1 / k (in tal caso, si tratta di una
normale media aritmetica);
 centrata se m1 = m2;
 simmetrica se centrata e se θi − m = θi + m per ogni compreso tra 1
e m1 = m2.
Quanti più elementi sono presenti nella serie storica alla quale la Media Mobile
è applicata, tanto meno reattiva sarà la media (ad esempio una media mobile
a 20 periodi è più reattiva di una media mobile a 60 periodi). Uno strategia
molto utilizzata è il crossover tra due medie mobili (crossover doppio) o tra
tre medie mobili (crossover triplo).
Nel caso del crossover tra due medie mobili:
Il segnale di acquisto (B=buy) si ha quando la media mobile più veloce
incrocia al rialzo la media mobile più lenta.
Il segnale di vendita (S=sell) si ha quando la media mobile più veloce
incrocia al ribasso la media mobile più lenta.
La media mobile è, quindi, un indicatore usato molto spesso in analisi
tecnica per mostrare il valore medio di un prezzo in un certo periodo
di tempo.
La media mobile dei valori è utile dal punto di vista grafico per mettere
in rilievo la direzione di un trend, attenuando le fluttuazioni del
prezzo che possono confondere il trader nell'interpretazione del
grafico.
Il termine media mobile deriva dal fatto che il numero di osservazioni
rimane costante nel tempo e che l'aggiornamento del valore della
media avviene alimentando l'algoritmo con l'introduzione del dato più
recente con l'eliminazione del valore più vecchio che rientrava nel
calcolo relativo al giorno precedente, in caso di rilevazioni
giornaliere. Le medie mobili si suddividono in medie mobili semplici
e medie mobili ponderate. Le medie mobili semplici si costruiscono
sommando i dati di chiusura per un periodo variabile a propria scelta,
si divide il risultato ottenuto per il numero di giorni considerati. Le
medie mobili ponderate si calcolano assegnando un peso maggiore ai
dati più recenti con una ponderazione aritmetica.
La formula generale per la compilazione della media mobile è la
seguente:
Mt = (Pt + Pt-1 + Pt-2 + .....+ Pt-n+1) / n
 Mt = valore della media mobile al tempo t.
 P = prezzo o valore dell'indice di riferimento.
 n = numero delle osservazioni (ampiezza della media mobile).
La formula per procedere all'aggiornamento è la seguente:
Mt+1 = Mt + ((Pt+1 - Pt-n+1) / n)
 Mt+1 = Valore della media mobile dell'ultimo giorno.
Questo tipo di funzione tende a smorzare l' erraticità dei prezzi e
questo effetto è tanto più evidente quanto maggiore è la media
mobile. La sua rappresentazione grafica è una curva che segue
la linea dei prezzi con un andamento più regolare eliminando i
"rumori" .Uno tra i principali obiettivi che ci si pone con
l'utilizzazione di questo algoritmo è proprio quello di eliminare
gli elementi casuali che entrano nella formazione del prezzo,
provocando delle esasperazioni nei movimenti.
Media mobile semplice:
Questa media mobile è calcolata sommando un determinato numero di prezzi di
chiusura recenti e dividendo il totale per il numero di selezioni effettuate. Per
chiarire meglio, sommando gli ultimi 20 prezzi di chiusura di un titolo e dividendo il
totale per 20, si otterrà la media mobile a 20 giorni. Su un grafico, questo calcolo è
eseguito per ciascun periodo indicato sullo stesso.
Media mobile esponenziale:
Una media mobile esponenziale differisce da quella "semplice" in quanto attribuisce
maggior peso ai dati più recenti.
Sono disponibili sei differenti periodi per entrambe le tipologia di media mobile (a 5,
10, 20, 50, 100 e 200 giorni).
Come sappiamo esistono grosso modo tre tipi di medie mobili: aritmetica, ponderata ed
esponenziale. La media più usata in assoluto rimane sempre la media aritmetica,
anche se l’esponenziale sta prendendo sempre più piede, tanto che anche nella
costruzione dei più comuni oscillatori la media che ha dato i migliori risultati
operativi è quella esponenziale, infatti in ambito algoritmico è sempre la più
utilizzata.
Spesso comunque, indipendentemente dal tipo le medie mobili possono dare dei falsi
segnali operativi. Ma esiste un sistema per rendere la media mobile, non infallibile,
ma quasi. Si tratta di accostare alla media mobile lo studio dei cicli. Usando una
media a medio termine è possibile catturare il ciclo semestrale. Infatti la media,
osservandola a lungo periodo, si muoverà ciclicamente non per forza con la stessa
ampiezza ed estensione, ma comunque con la stessa forma. Usando una media a
breve è possibile invece tracciare dei cicli trimestrali. Questi “mini-cilci”si trovano
all’interno dei cicli a 6 mesi e sono complementari ad esso, nel senso che un ciclo di
6 mesi ne contiene al suo interno due a 3 mesi. Perciò si usano le medie mobili in
primo luogo per bloccare le fluttuazioni di prezzo ed osservare chiaramente i cicli
che si susseguono.
Le medie mobili possono essere utilizzate per costruire dei canali, noti
come bande di Bollinger o canali di medie mobili, che racchiudono
le oscillazioni dei prezzi.
Le bande di Bollinger rappresentano un indicatore tecnico che
appartiene alla famiglia degli indicatori di volatilità.
Un'ampiezza maggiore delle bande di Bollinger è determinata da
un'elevata volatilità dei prezzi, al contrario una minore ampiezza
delle bande di Bollinger è determinata da una volatilità dei prezzi in
diminuzione.
Le bande di Bollinger sono composte da curve ottenute esclusivamente
con la serie storica dei prezzi di un titolo:
 Media Mobile Lineare a N giorni (la linea centrale)
 La Media Mobile a cui si somma 2 volte la deviazione standard
(banda superiore)
 La Media Mobile a cui si sottrae 2 volte la deviazione standard
(banda inferiore)
Sovrapponendo la curva dei prezzi del titolo a queste tre linee si ottiene
una figura funzione del tempo in cui i valori del titolo sono
generalmente compresi fra la banda superiore e quella inferiore, con
casi di trapasso della banda superiore o inferiore.
Dal punto di vista operativo alcune regole stabiliscono che:
 se le bande di Bollinger si restringono ("strozzatura") è probabile che
a breve ci possa essere una forte esplosione di volatilità
 se il prezzo oltrepassa una banda di Bollinger è probabile che la
tendenza continui
 se il prezzo oltrepassa una banda di Bollinger e si forma una figura di
inversione allora è probabile aspettarsi un'inversione di tendenza
Le formule che definiscono le bande di Bollinger sono funzione di 3
parametri:
 Il parametro della Medie Mobile, ossia il numero di osservazioni
prese in considerazione. Solitamente si usa una media mobile
semplice a 20 gg, come suggerito dallo stesso Bollinger.
 Il moltiplicatore della deviazione standard applicata alla serie
storiche dei prezzi, solitamente 2 o 3.
 La definizione di serie storiche dei prezzi. Solitamente si usano i
prezzi di chiusura del titolo, ma è possibile utilizzare altri valori che
possano essere maggiormente esplicativi del valore del titolo per una
data osservazione. In tal senso si può far riferimento ad valori tipici
della sessione i-esima, dunque alla media sui prezzi di apertura e
chiusura , oppure utilizzando la media del range coperto durante la
sessione (massimo e minimo) , od ancora una media fra i prezzi di
apertura/chiusura/minimo/massimo.
Per quanto visto sopra le Bande di Bollinger possono essere
utilizzate per misurare:
 la volatilità
 il trend
La misura della volatilità è un elemento molto importante
sia per valutare il rischio di investimento sia per
riconoscere fasi potenziali di accumulazione/distribuzione
del titolo o meglio di trend/congestione dei prezzi.
In questo senso il segnale operativo di sell/buy deve essere
offerto da altri indicatori o metodologie di trading, dato
che queste misure di volatilità non possono offrire nessun
segnale operativo.
Alla base di ogni linguaggio di programmazione orientato
agli oggetti c’è il concetto di classe. Le classi di VB
.NET mantengono tutte le caratteristiche dei moduli di
classe, ma ne aggiungono numerose altre. In prima
approssimazione, una classe è una collezione di
variabili, metodi e proprietà; è possibile creare una
classe usando il costrutto Class:
Class esempio
'variabili'
Dim Nome As String
Public Sub MostraNome()
'.......'
End Sub
End Class
Una classe è anche un tipo, quindi può essere assegnata
ad una variabile.
I costruttori sono metodi che vengono automaticamente richiamati quando si crea
un’istanza della classe stessa; servono a creare un oggetto, un'istanza materiale della
classe. Ogni costruttore, poichè ce ne può essere anche più di uno, è sempre
dichiarato usando la keyword New e non può essere altrimenti. Una delle
caratteristiche più importanti del costruttore è che esso consente di specificare le
proprietà iniziali della classe. Si possono passare parametri al costruttore allo stesso
modo di come si passano alle normali procedure o funzioni, specificandoli tra
parentesi. Il codice scritto nel costruttore viene eseguito prima di ogni altro metodo
nella classe, perciò può anche modificare le variabili read-only (in sola lettura).
Anche i moduli possono avere un costruttore e questo viene eseguito prima della
procedura Main. Una cosa da tenere bene a mente è che, nonostante New sia
eseguito prima di ogni altra istruzione, sia le costanti sia i campi con inizializzatore
(ad esempio Dim I As Int32 = 50) sono già stati inizializzati e contengono già il loro
valore.
Ricordiamo che il costruttore è una particolare Sub, il cui nome deve obbligatoriamente
essere New.
Creiamo un costruttore per la classe esempio:
Class esempio
Dim Nome As String
'variabili'
Sub New(ByVal strNome As String)
'Imposta le proprietà iniziali'
Nome = strNome
End Sub
Public Sub VisualizzaNome()
'…'
End Sub
End Class
Come possiamo vedere, la routine New prende come argomento la variabile strNome e
la assegna alla sua variabile interna Nome.
Scopo delle Interfacce
Le interfacce sono un'entità davvero singolare all'interno del
.NET Framework. La loro funzione è assimilabile a quella
delle classi astratte, ma il modo con cui esse la svolgono è
molto diverso.
Il principale scopo di un'interfaccia è definire lo scheletro di una
classe; potrebbe essere scherzosamente assimilata alla ricetta
con cui si prepara un dolce. Quello che l'interfaccia X fa, ad
esempio, consiste nel dire che per costruire una classe Y che
rispetti "la ricetta" descritta in X servono una proprietà Id di
tipo Integer, una funzione GetSomething senza parametri che
restituisce una stringa e una procedura DoSomething con un
singolo parametro Double. Tutte le classi che avranno
intenzione di seguire i precetti di X (in gergo implementare
X) dovranno definire, allo stesso modo, quella proprietà di
quel tipo e quei metodi con quelle specifiche signature (il
nome ha importanza relativa).
Dichiarazione e implementazione
La sintassi usata per dichiarare un'interfaccia è la seguente:
Interface [nome]
'membri’
End Interface
I membri delle interfacce, tuttavia, sono un po' diversi dai membri di una
classe, e nello scriverli bisogna rispettare queste regole:
 Nel caso di metodi, proprietà od eventi, il corpo non va specificato;
 Non si possono mai usare gli specificatori di accesso;
 Si possono comunque usare dei modificatori come Shared, ReadOnly e
WriteOnly.
Il primo ed il secondo punto saranno ben compresi se ci si sofferma a pensare
che l'interfaccia ha il solo scopo di definire quali membri una classe debba
implementare: per questo motivo, non se ne può scrivere il corpo, dato che
spetta espressamente alle classi implementanti, e non ci si preoccupa dello
specificatore di accesso, dato che si sta specificando solo il "cosa" e non il
"come".
Ora che sappiamo come dichiarare un'interfaccia, dobbiamo scoprire come
usarla. Per implementare un'interfaccia in una classe, si usa questa sintassi:
Class Esempio
Implements (Nome Interfaccia)
[Membro] Implements [Nome Interfaccia].[Membro]
End Class
Definizione di tipi in un'interfaccia
Così come è possibile dichiarare una nuova classe all'interno di un'altra,
o una struttura in una classe, o un'interfaccia in una classe, o una
struttura in una struttura, o tutte le altre possibili combinazioni, è
anche possibile dichiarare un nuovo tipo in un'interfaccia. In questo
caso, solo le classi che implementeranno quell'interfaccia saranno in
grado di usare quel tipo.
Perchè preferire un'interfaccia a una classe astratta
Ci sono casi e casi. In genere, un'interfaccia va preferita quando si
dovranno abbracciare grandi quantità di classi diverse: con grandi mi
riferisco a numeri abbastanza grandi da rendere difficile l'uso di una
sola classe astratta. È bene usare le interfacce anche quando si
progetta di usarne più di una: una classe, infatti, può implementare
quante interfacce vuole, ma può ereditare da una sola classe base.
Proprio per questi motivi, è ideale usare un'interfaccia quando si
vuole delineare una caratteristica o un particolare comportamento
che può essere comune a più tipi, mentre è meglio puntare a una
classe astratta quando si vuole sottolineare l'appartenenza di molti
tipi ad un unico archetipo base.
Andiamo ad analizzare due interfacce: IComparer e
IComparable.
Queste interfacce sono spesso utilizzate insieme e anche
se le interfacce sono simili e hanno nomi simili, gli
scopi che essi servono sono leggermente diversi.
In generale, se si dispone di una matrice di tipi (ad
esempio la stringa o i tipi integer ) che già supportano
IComparer, è possibile ordinare la matrice senza fornire
alcun riferimento esplicito a IComparer. In questo caso,
gli elementi della matrice vengono proiettati per
l’implementazione predefinita di
IComparer(Comparer.Default) per l’utente.
Tuttavia, se desidera eseguire l'ordinamento e per
confrontare gli oggetti personalizzati, è necessario
implementare una o entrambe queste interfacce.
 Un oggetto che implementa IComparable comunica implicitamente
al .NET Framework che può essere confrontato con altri oggetti,
stabilendo se uno di essi è maggiore, minore o uguale all'altro e
abilitando in questo modo l'ordinamento automatico attraverso il
metodo Sort di una collection. Infatti, tale metodo confronta uno ad
uno ogni elemento di una collezione o di un array e tramite la
funzione CompareTo che ogni interfaccia IComparable espone e li
ordina in ordine crescente o decrescente. CompareTo è una funzione
di istanza che implementa IComparable. CompareTo e ha dei
risultati predefiniti:
 restituisce 1 se l'oggetto passato come parametro è minore
dell'oggetto dalla quale viene richiamata;
 0 se è uguale e -1 se è maggiore.
 IComparer rappresenta un oggetto che deve eseguire la
comparazione tra due altri oggetti, facendo quindi da tramite
nell'ordinamento. Dato che Sort accetta in una delle sue versioni un
oggetto IComparer, è possibile ordinare una lista di elementi con
qualsiasi criterio si voglia semplicemente cambiando il parametro.
Usando questo meccanismo è possibile ordinare qualsiasi tipo di lista o
collezione (tranne SortedList, che si ordina automaticamente), in
modo semplice e veloce, particolarmente utile nell'ambito delle liste
visuali a colonne.
OLE DB (Object Linking and Embedding, database), una API
progettato da Microsoft, consente l'accesso ai dati da una varietà di
fonti in modo uniforme. L'API fornisce un insieme di interfacce
implementate utilizzando il Component Object Model (COM).
Microsoft OLE DB originariamente inteso come un più alto livello di
sostituzione, e successore, ODBC, estendendo il suo set di funzioni
per supportare una più ampia fogli di calcolo che non
necessariamente implementano SQL.
METODOLOGIA
OLE DB separa l'archivio dati dal ricorso che deve accedere ad esso
attraverso un insieme di astrazioni che includono il datasource,
session, comando e set di righe. Questo è stato fatto perché diverse
applicazioni hanno bisogno di accedere a diversi tipi e fonti di dati, e
non necessariamente vogliono sapere come accedere alle funzionalità
con la tecnologia metodi specifici.
OLE DB è concettualmente diviso in consumatori e fornitori. I
consumatori sono le applicazioni che richiedono l'accesso ai dati, ed i
fornitori sono i componenti software che implementano l'interfaccia
e quindi fornisce i dati al consumatore.
http://martinaroma.blogspot.it/p/esercizi.html
Generare una serie storica casuale dei prezzi per un
strumento finanziario.
Rappresentare la serie storica con:
 Linee delle medie mobili;
 Medie running;
 Bande di bollinger
LINK: www.box.com/s/x0hgqvkszv6v2pjk1toa
Il risultato grafico finale ottenuto è il seguente:
 la nostra serie storica presentata in blu;
 le bande di bollinger in rosso;
 la media moving in verde e la media running in rosa.
 Dopo aver inizializzate una serie di variabili;
 Inserisco una serie di comandi che mi consentono di
resettare gli oggetti ogni volta che clicco sul bottone Serie
Storica:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.SS.Clear()
Me.SSMoving.Clear()
Me.SSRunning.Clear()
Me.SSBandaBollingerInf.Clear()
Me.SSBandaBollingerSup.Clear()
Dim random As New Random
Dim SS As New List(Of Osservazione)
1°STEP
 Creo un loop e al suo interno vengono definite:
• la serie storica casuale (random) dei prezzi;
• la media running;
• e la media moving.
Dim prezzoIniziale As Decimal = 500
Dim tick As Decimal = 1
Dim passoTempominuti As Integer = 5
Dim istanteCorrente = istanteIniziale
Dim prezzoCorrente = prezzoIniziale
Dim MediaRunning As Double
• A seconda del valore casuale si sottrae o si aggiunge il tick:
Do
If random.NextDouble < 0.5 Then
prezzoCorrente = prezzoCorrente - tick
Else
prezzoCorrente = prezzoCorrente + tick
End If
• Vado a impostare l’arco temporale alla giornata odierna, definendo un ciclo
che termina quando finisce la giornata:
If istanteCorrente.Subtract(istanteIniziale).TotalDays > 1 Then Exit Do
Dim osservazione As New osservazione
osservazione.istante = istanteCorrente
osservazione.Prezzo = prezzoCorrente
osservazione.X =
osservazione.Istante.Subtract(istanteIniziale).TotalMilliseconds
osservazione.Y = osservazione.Prezzo
•avanziamo il tempo
istanteCorrente = istanteCorrente.AddMinutes(passoTempominuti)
2°STEP
 Vado a calcolare la media running:
MediaRunning = (MediaRunning * SS.Count + prezzoCorrente) / (SS.Count + 1)
Dim O_R As New Osservazione()
O_R.Prezzo = MediaRunning
O_R.Istante = osservazione.Istante
O_R.X = osservazione.X
O_R.Y = O_R.Prezzo
SSRunning.Add(O_R)
SS.Add(osservazione)
 Calcolo la media moving (utilizzando la condizione if che mi gestisce la
possibile eccezione nel caso di NumericUpDown1=0, per il quale la media mobile non si
potrebbe calcolare, imponendo, in tal caso, un NumericUpDown1=1 si va ad ovviare al
problema).
Dim NUP As Integer = NumericUpDown1.Value
If (NumericUpDown1.Value = 0) Then
NUP = 1
Else
NUP = NumericUpDown1.Value
End If
Dim O_M As New Osservazione()
If SS.Count > NUP Then
MediaMoving = MediaMoving + (SS(SS.Count - 1).Prezzo / NUP) -
(SS(SS.Count - NUP - 1).Prezzo / NUP)
O_M.Prezzo = MediaMoving
O_M.Istante = osservazione.Istante
O_M.X = osservazione.X
O_M.Y = O_M.Prezzo
SSMoving.Add(O_M)
SS.Add(osservazione)
Else
O_M.Prezzo = MediaMoving
O_M.Istante = osservazione.Istante
O_M.X = osservazione.X
O_M.Y = O_M.Prezzo
SSMoving.Add(O_M)
End If
SS.Add(osservazione)
Loop
 Calcoliamo le bande di bollinger (NUMERICUPDOWN2
* DEVSTD):
Dim NUP2 As Integer = NumericUpDown2.Value
If (NumericUpDown2.Value = 0) Then
NUP = 1
Else
NUP = NumericUpDown2.Value
End If
Dim i As Integer = 0
For i = i To SSMoving.Count - 1
• Si calcola la deviazione standard della serie moving:
Dim devstd As Double = Me.CalcoloDevStd(SSMoving, i)
Dim b1 As New Osservazione
Dim b2 As New Osservazione
With b1
.Prezzo = SSMoving(i).Prezzo + NUP2 * devstd
.Istante = SSMoving(i).Istante
End With
Me.SSBandaBollingerSup.Add(b1)
With b2
.Prezzo = SSMoving(i).Prezzo - NUP2 * devstd
.Istante = SSMoving(i).Istante
End With
Me.SSBandaBollingerInf.Add(b2)
Next
Funzione CalcolaDevStd
• calcolo coordinate reali della serie storica dei prezzi
For Each osservazione As Osservazione In SS
osservazione.Y = osservazione.Prezzo
osservazione.X =
osservazione.Istante.Subtract(istanteIniziale).TotalMilliseconds
If MinX > osservazione.X Then MinX = osservazione.X
If MaxX < osservazione.X Then MaxX = osservazione.X
If MinY > osservazione.Prezzo Then MinY = osservazione.Prezzo
If MaxY < osservazione.Prezzo Then MaxY = osservazione.Prezzo
Application.DoEvents()
Me.SS.Add(osservazione)
Next
' si richiamano le su definite per la trasformsazione della serie e per il disegno
Me.TrasfomaCoordInPnt()
Me.DisegnaLeSerie()
End Sub
3°STEP
 Non resta che andare disegnare la nostra serie storica, le
bande di bollinger e le medie.
 Per prima cosa abbiamo voluto riportare tutto in un rettangolo
all’interno della pictureBox; abbiamo quindi calcolato le coordinate
virtuali, trasferendo quelle originali in un rettangolo.
TrasfomaCoordInPnt()
PuntiSS = New List(Of Point)
For Each osservazione As Osservazione In SS
Dim Punto As New Point
Punto.X = Rettangolo.Left + CInt(Rettangolo.Width * (osservazione.X -
Me.MinX) / (Me.MaxX - Me.MinX))
Punto.Y = (Rettangolo.Top + CInt(Rettangolo.Height)) -
(Rettangolo.Height * (osservazione.Y - Me.MinY) / (Me.MaxY - Me.MinY))
PuntiSS.Add(Punto)
Next
!!Abbiamo ripetuto il codice per i punti della serie storica running, moving e per le
bande di bollinger
• Siamo quindi andati a scrivere i comandi per disegnare la
serie, le medie e le bande, scegliendo i colori e il tipo di
linee da utilizzare:
Sub DisegnaLeSerie()
bitmap = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
grafico = Graphics.FromImage(bitmap)
Dim PennaTratteggiata As Pen
PennaTratteggiata = New Pen(Color.Orange, 1)
PennaTratteggiata.DashStyle = Drawing2D.DashStyle.Dot
grafico.Clear(Color.White)
grafico.DrawRectangle(Pens.Black, Rettangolo)
grafico.DrawLines(Pens.SkyBlue, PuntiSS.ToArray)
grafico.DrawLines(Pens.YellowGreen, PuntiSSMoving.ToArray)
grafico.DrawLines(Pens.Fuchsia, PuntiSSRunning.ToArray)
grafico.DrawLines(PennaTratteggiata, PuntiSSBBSUP.ToArray)
grafico.DrawLines(PennaTratteggiata, PuntiSSBBINF.ToArray)
• abbiamo inserito l’intestazione e la leggenda:
Dim drawFont2 As New Font("Arial", 12, FontStyle.Bold)
grafico.DrawString("SERIE STORICA", drawFont2, Brushes.Purple, 380, 10)
Dim drawfont3 As New Font("arial", 8)
grafico.FillRectangle(Brushes.SkyBlue, Me.PictureBox1.Width - 605,
Me.PictureBox1.Height - 88, 6, 6)
grafico.DrawString("Serie Storica", drawfont3, Brushes.Gray,
Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 92)
grafico.FillRectangle(Brushes.YellowGreen, Me.PictureBox1.Width - 605,
Me.PictureBox1.Height - 72, 6, 6)
grafico.DrawString("Media Moving", drawfont3, Brushes.Gray,
Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 75)
grafico.FillRectangle(Brushes.Fuchsia, Me.PictureBox1.Width - 605,
Me.PictureBox1.Height - 55, 6, 6)
grafico.DrawString("Media Running", drawfont3, Brushes.Gray,
Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 58)
grafico.FillRectangle(Brushes.Orange, Me.PictureBox1.Width - 605,
Me.PictureBox1.Height - 38, 6, 6)
grafico.DrawString("Bande Bollinger", drawfont3, Brushes.Gray,
Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 41)
Me.PictureBox1.Image = Me.bitmap
End Sub
• abbiamo infine inserito dei comandi per poter muovere il
rettangolo e ridimensionarlo a nostro piacimento all’interno della
pictureBox.
Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
If Me.SS Is Nothing Then Exit Sub
Me.MouseTastoPremuto = True
Me.XinizialeMOUSE = e.X
Me.YinizialeMOUSE = e.Y
Me.XinizialeRETT = Rettangolo.X
Me.YinizialeRETT = Rettangolo.Y
Me.WInizialeRETT = Rettangolo.Width
Me.HInizialeRETT = Rettangolo.Height
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If Me.grafico Is Nothing Then Exit Sub
If Not Me.MouseTastoPremuto Then Exit Sub
If e.Button = Windows.Forms.MouseButtons.Left Then
Rettangolo.X = Me.XinizialeRETT + (e.X - Me.XinizialeMOUSE)
Rettangolo.Y = Me.YinizialeRETT + (e.Y - Me.YinizialeMOUSE)
Else
Rettangolo.Width = Me.WInizialeRETT + (e.X - Me.XinizialeMOUSE)
Rettangolo.Height = Me.HInizialeRETT + (e.X - Me.XinizialeMOUSE)
End If
Me.TrasfomaCoordInPnt()
Me.DisegnaLeSerie()
End Sub
Function CalcoloDevStd(ByVal serie As List(Of Osservazione), ByVal Posto As
Integer)
If (NumericUpDown1.Value = 0) Then
DistanzaDallaMedia = 1
Else
Me.DistanzaDallaMedia = CInt(Me.NumericUpDown1.Value - 1)
End If
Dim somma As Double
Dim count As Double
Dim scarti As Double
Dim scartiquadrati As Double
Dim media As Double
Dim var As Double
Dim deviazionestandard As Double
For i As Integer = i To serie.Count - 1
somma += serie(i).Prezzo
count += 1
media = somma / count
scarti = serie(i).Prezzo - media
scartiquadrati = scarti ^ 2
var = scartiquadrati / count
Next
deviazionestandard = Math.Sqrt(var)
Return deviazionestandard
End Function
Funzione utilizzata per calcolare la deviazione standard

Mais conteúdo relacionado

Destaque

Metode kerja concrete
Metode kerja concreteMetode kerja concrete
Metode kerja concretedennysayudhi
 
Hp proliant slideshow_copyedited and ready for final design
Hp proliant slideshow_copyedited and ready for final designHp proliant slideshow_copyedited and ready for final design
Hp proliant slideshow_copyedited and ready for final designsarahdoran
 
The Real Estate Book of Solano and Yolo County
The Real Estate Book of Solano and Yolo CountyThe Real Estate Book of Solano and Yolo County
The Real Estate Book of Solano and Yolo Countyyolotreb
 
El guerrero pacífico
El guerrero pacíficoEl guerrero pacífico
El guerrero pacíficorosalfer1
 
Hp proliant slideshow_v2
Hp proliant slideshow_v2Hp proliant slideshow_v2
Hp proliant slideshow_v2sarahdoran
 

Destaque (8)

Metode kerja concrete
Metode kerja concreteMetode kerja concrete
Metode kerja concrete
 
Clorofila
ClorofilaClorofila
Clorofila
 
Hp proliant slideshow_copyedited and ready for final design
Hp proliant slideshow_copyedited and ready for final designHp proliant slideshow_copyedited and ready for final design
Hp proliant slideshow_copyedited and ready for final design
 
The Real Estate Book of Solano and Yolo County
The Real Estate Book of Solano and Yolo CountyThe Real Estate Book of Solano and Yolo County
The Real Estate Book of Solano and Yolo County
 
El guerrero pacífico
El guerrero pacíficoEl guerrero pacífico
El guerrero pacífico
 
συμβουλευτικη
συμβουλευτικησυμβουλευτικη
συμβουλευτικη
 
Hp proliant slideshow_v2
Hp proliant slideshow_v2Hp proliant slideshow_v2
Hp proliant slideshow_v2
 
Presentación1
Presentación1Presentación1
Presentación1
 

Semelhante a Presentazione

Semelhante a Presentazione (20)

1 Programmazione
1   Programmazione1   Programmazione
1 Programmazione
 
Algoritmi
Algoritmi Algoritmi
Algoritmi
 
Algoritmi
AlgoritmiAlgoritmi
Algoritmi
 
Presentazione corretta algoritmi
Presentazione corretta algoritmiPresentazione corretta algoritmi
Presentazione corretta algoritmi
 
Algoritmi
Algoritmi Algoritmi
Algoritmi
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
come costruire un algoritmo
come costruire un algoritmocome costruire un algoritmo
come costruire un algoritmo
 
L'algoritmo
L'algoritmoL'algoritmo
L'algoritmo
 
Complessita computazionalee
Complessita computazionaleeComplessita computazionalee
Complessita computazionalee
 
Modulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ictModulo 1 concetti di base dell'ict
Modulo 1 concetti di base dell'ict
 
Capire il DoE con Minitab
Capire il DoE con MinitabCapire il DoE con Minitab
Capire il DoE con Minitab
 
15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterative
 
Ecdl modulo 1 -Fondamenti
Ecdl modulo 1 -FondamentiEcdl modulo 1 -Fondamenti
Ecdl modulo 1 -Fondamenti
 
Informatica prime classi
Informatica prime classiInformatica prime classi
Informatica prime classi
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Lezione 3 metodo monte carlo
Lezione 3   metodo monte carloLezione 3   metodo monte carlo
Lezione 3 metodo monte carlo
 
Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
 
Capitolo 6a elementi di valutazione dei prodotti derivati
Capitolo 6a   elementi di valutazione dei prodotti derivatiCapitolo 6a   elementi di valutazione dei prodotti derivati
Capitolo 6a elementi di valutazione dei prodotti derivati
 
Modulo 1 - Dispensa
Modulo 1 - DispensaModulo 1 - Dispensa
Modulo 1 - Dispensa
 

Presentazione

  • 2.
  • 3. IN GENERALE In informatica e matematica, il termine algoritmo indica un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo si dice computabile. LA STORIA Il termine "algoritmo" deriva dalla trascrizione latina del nome del matematico persiano Al-Khwarizmi, che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto. DEFINIZIONE Esistono diverse ed innumerevoli definizioni di algoritmo, ognuna delle quali fa riferimento a svariati campi, ne riportiamo una su tutte: "Un algoritmo è un insieme ordinato di passi eseguibili e non ambigui, il cui unico scopo è la risoluzione di problemi tra loro simili e il cui processo (di risoluzione) deve essere temporalmente limitato".
  • 4. In senso più ampio l'algoritmo è:  Un metodo per risolvere un insieme di problemi tra loro simili (non necessariamente uguali), dove per problema si intende la definizione di una situazione problematica che può variare dall’usuale problema di matematica, all’obiettivo da raggiungere in un qualsiasi gioco, allo scopo che ci si propone in un qualsiasi lavoro (basti pensare agli algoritmi di decrittografia che venivano usati nella Seconda Guerra Mondiale per intercettare i movimenti nemici).  Un’insieme ordinato di passi eseguibili e non ambigui, dove per passi intendiamo anche le istruzioni. Pensiamo, per esempio, al gioco degli scacchi presente nelle settimane enigmistiche quando si chiede di vincere in un certo numero di mosse.  Un processo che deve avere comunque un limite temporale (cioè deve “produrre” una soluzione in un tempo finito). Non consideriamo algoritmo un insieme di istruzioni che fanno riferimento a cicli infiniti. Così diciamo con assoluta certezza che un’istruzione del tipo “gira su te stesso” non potrà mai costituire un algoritmo se non verrà specificato con precisione un termine, per esempio “gira su te stesso per tre volte”.  L’algoritmo non è un programma: mentre un algoritmo è il procedimento da seguire per risolvere un problema a prescindere dal linguaggio utilizzato, un programma consiste nella descrizione di un algoritmo in uno specifico linguaggio di programmazione (l’algoritmo in questa punto è inteso come“oggetto” esclusivamente informatico).
  • 5. ALCUNE PROPRIETA' FONDAMENTALI DEGLI ALGORITMI  i passi costituenti devono essere "elementari", ovvero non ulteriormente scomponibili (atomicità);  i passi costituenti devono essere interpretabili in modo univoco dall'esecutore, sia esso umano o artificiale (non ambiguità);  l'algoritmo deve essere composto da un numero finito di passi e richiedere una quantità finita di dati in ingresso (finitezza)  l'esecuzione deve avere termine dopo un tempo finito (terminazione);  l'esecuzione deve portare ad un risultato univoco (effettività);  ad ogni un passo, il successivo deve essere uno ed uno solo, ben determinato (determinismo).
  • 6. ESEMPIO Il calcolo delle radici di una equazione di secondo grado: ax2 + bx + c = 0 Si generano una sequenza di passi che possano portare alla soluzione del problema. Si calcola il delta dell’equazione e si distinguono i tre casi; Caso delta negativo: esistono due soluzioni complesse coniugate; Caso delta nullo: esiste una soluzione doppia pari a –b/2a; Caso delta positivo: si calcolano le due soluzioni secondo la formula nota; Si ottengono x1 e x2. Questo è un semplicissimo algoritmo matematico. !!!ATTENZIONE!!! Molto spesso si considera l’algoritmo come un qualcosa da legare esclusivamente all’utilizzo del computer per cui risulta difficile riconoscerlo nelle sue più svariate forme ed applicazioni
  • 7. APPROCCIO INFORMATICO Se per ottenere un certo risultato (risolvere un certo problema) esiste un procedimento infallibile, che può essere descritto in modo non ambiguo fino ai dettagli, e conduce sempre all'obiettivo desiderato in un tempo finito, allora esistono le condizioni per affidare questo compito a un computer, semplicemente descrivendo l'algoritmo in questione in un programma scritto in un opportuno linguaggio comprensibile alla macchina.
  • 8. La complessità  Con complessità di un algoritmo o efficienza di un algoritmo ci si riferisce alle risorse di calcolo da esso richieste. Per complessità si intende una funzione che associa il numero di dati da trattare al numero di operazioni da eseguire per trattare i suddetti dati. Il simbolo utilizzato è una o minuscola "o" seguito da una parentesi dove è indicata la complessità come una funzione che dipende da N, dove N è il numero che rappresenta i dati in ingresso. Quindi o(N) rappresenta un algoritmo la cui funzione che cresce il modo lineare (cresce come una retta). Così o(N2) rappresenta un algoritmo la cui funzione complessità cresce come un quadrato quindi un raddoppio dei dati in ingresso provoca una quadruplicazione delle operazioni da eseguire. La complessità di molti algoritmi è pesantemente influenzata dai dati in ingresso. In questo caso quando si calcola la complessità si considera il caso ottimo, il caso pessimo e il caso medio. Il caso ottimo è il caso in cui i dati sono i migliori dati possibili per l'algoritmo, cioè quelli che richiedono meno elaborazioni per essere trattati. Il caso pessimo invece prevede i dati più sfavorevoli per l'algoritmo. Il caso medio è il caso più utile da analizzare perché fornisce un reale indicatore della complessità dell'algoritmo ma tendenzialmente è anche quello più complesso da analizzare dato che spesso è difficile determinare quali sono i dati medi. A volte per risolvere il problema del caso medio si preferisce eseguire molte simulazioni dell'algoritmo e poi dai tempi ottenuti con le simulazioni estrarre una formula che approssimi adeguatamente l'andamento medio.
  • 9. Lo pseudo-codice In informatica per pseudocodice, pseudolinguaggio o linguaggio di progetto si intende un linguaggio di programmazione fittizio, non direttamente compilabile o interpretabile da un programma compilatore o interprete, il cui scopo è quello di rappresentare algoritmi. Lo pseudolinguaggio può essere utilizzato alternativamente al diagramma di flusso e non è soggetto a molte limitazioni intrinseche di quest'ultimo tipo di rappresentazione. Non esiste uno pseudolinguaggio standard e convenzionalmente usato: gli autori di libri o corsi di programmazione definiscono spesso un proprio pseudolinguaggio, utilizzato nelle loro pubblicazioni; inoltre ciascun programmatore può essere portato ad utilizzare una propria variante. Ogni pseudolinguaggio ha un proprio lessico, una propria sintassi e una propria semantica, ma la progettazione di questo tipo di formalismo è volta alla comprensibilità e alla leggibilità del codice; la sintassi sarà quindi meno rigorosa rispetto ad un vero linguaggio e le parole chiave saranno evocative, in modo da rendere più intuitiva la sua interpretazione. Lo pseudolinguaggio è strettamente dipendente dal paradigma di programmazione scelto per risolvere un problema, mentre dovrebbe essere pressoché indipendente dal linguaggio di programmazione, purché quest'ultimo rispetti naturalmente il paradigma scelto. Tuttavia, ciascun linguaggio di programmazione possiede istruzioni e/o caratteristiche proprie, che potrebbero essere sfruttate per una migliore implementazione dell'algoritmo, ad esempio più efficiente. Spesso si usano le caratteristiche del Pascal come base per definire uno pseudolinguaggio.
  • 10. La deviazione standard è un indice statistico che consente di misurare la dispersione delle singole osservazioni intorno alla media aritmetica. Tale indicatore si calcola applicando la seguente formula:  "xi" è il singolo valore che assume il fenomeno da valutare;  "n" il numero dei dati della serie storica.  "x barrato" rappresenta la media aritmetica dei valori. Esempio: un semplice algoritmo per calcolare lo scarto quadratico medio.
  • 11. La conseguenza più grave della rappresentazione con precisione finita dei numeri reali è senza dubbio il fenomeno della cancellazione numerica, ovvero la perdita di cifre significative dovuta ad operazioni di sottrazione quando il risultato è più piccolo di ciascuno dei due operandi; questo fenomeno si verifica quando i due operandi sono “quasi uguali” ed è anche conosciuto come Catastrophical cancellation.
  • 12. ESEMPIO: Abbiamo i seguenti due numeri reali: p1=0.12345789 p2=0.12345666 Supponiamo che l'architettura del calcolatore ci permetta di memorizzare solo le prime 6 cifre dopo la virgola, quindi i due numeri per essere rappresentati all'interno del calcolatore, verrebbero troncati (supponiamo per semplicità mediante chopping) appena dopo la sesta cifra: p1=0.123457 p2=0.123456 Effettuando la sottrazione e riscrivendo il risultato nella notazione floating point, si ha: d=p1-p2=0.000001=1*10^-6 Mentre il risultato reale è pari a: 0.00000123.
  • 13. In statistica, una serie storica (o temporale) si definisce come un insieme di variabili casuali ordinate rispetto al tempo, ed esprime la dinamica di un certo fenomeno nel tempo. Le serie storiche vengono studiate sia per interpretare un fenomeno, individuando componenti di trend, di ciclicità, di stagionalità e/o di accidentalità, sia per prevedere il suo andamento futuro. In generale, per serie si intende la classificazione di diverse osservazioni di un fenomeno rispetto ad un carattere qualitativo. Se tale carattere è il tempo, la serie viene detta storica o temporale. Il fenomeno osservato, detto variabile, può essere osservato in dati istanti di tempo (variabile di stato: numero dei dipendenti di un'azienda, quotazione di chiusura di un titolo negoziato in borsa, livello di un tasso di interesse ecc.) o alla fine di periodi di lunghezza definita (variabili di flusso: vendite annuali di un'azienda, PIL trimestrale ecc.). Indicando con Y il fenomeno, si indica con Yt un'osservazione al tempo t, potendo t variare da 1 a T, dove T è il numero complessivo degli intervalli o dei periodi temporali considerati. In generale una serie storica è così definita yt={y1,y2,y3,....,yT};la serie storica avrà dimensione T.
  • 14. AZIONI, CIOE' PEZZI D’IMPRESA Che Cosa sono le azioni o Titoli Azionari? Cosa sono e come funzionano questi valori che ci consentono di guadagnare denaro investendo sui prodotti più vari, magari proprio su quelli che consumiamo e usiamo tutti i giorni, dal dentifricio all'automobile? Un titolo azionario altro non è che un certificato che fa diventare il suo possessore socio di una determinata società. Le azioni, che rappresentano una parte del capitale sociale di un'impresa, danno al titolare una serie di diritti: diritto alla partecipazione agli utili (dividendo), diritto di partecipare agli aumenti di capitale sottoscrivendo nuove azioni o di acquistare obbligazioni convertibili di nuova emissione, diritto di partecipare all'assemblea degli azionisti esercitando il diritto di voto che è proporzionale al numero di azioni possedute. Il Trading per eccellenza si effettua sui titoli azionari. Del resto possono dare ottime soddisfazioni così come grandi delusioni. Ma forse sta proprio in questo il fascino che cattura tantissimi investitori e ormai in larga parte anche piccoli investitori. Soprattutto con i titoli azionari viene fuori l'emotività degli investitori e del mercato stesso. Per questo risulta importante identificare quei titoli che danno maggiori chance di profitto. Non si direbbe ma ogni titolo ha un suo "stile" di movimento caratteristico, quindi riuscire ad identificarlo ci permette di scegliere i migliori di ogni paniere, sui quali operare. Non devo operare su di un titolo perché mi piace la società che ci sta dietro o perché me lo hanno consigliato. Naturalmente questo criterio è perseguibile solo se si hanno a disposizione le serie storiche dei titoli o dei grafici di almeno un paio di anni.
  • 15. Con VB.NET per generare numeri pseudo-casuali si utilizza la classe Random, che produce una sequenza di numeri che soddisfano determinati requisiti statistici di casualità. Utilizzare un calcolatore, che è un oggetto puramente deterministico e quindi prevedibile, per generare un numero casuale e quindi imprevedibile sembra essere problematico. In effetti nessun calcolatore è in grado di generare numeri puramente casuali, ma solo numeri pseudo – casuali ossia numeri generati da algoritmi numerici deterministici in grado di superare una serie di test statistici che conferiscono a tali numeri un’apparente casualità. L’algoritmo restituisce una sequenza di valori che dipendono da un numero specificato, detto seme della sequenza, caricato nel generatore stesso. Il seme viene poi trasformato per ottenere il primo valore della sequenza, e applicando la stessa trasformazione si ottiene il valore successivo della sequenza, e così via.
  • 16. Se lo stesso valore di inizializzazione è utilizzato ripetutamente, viene generata la stessa serie di numeri, perché anche le operazioni matematiche sono uguali. Un modo per produrre sequenze diverse consiste nel rendere il valore di inizializzazione dipendente da un fattore temporale, producendo così una diversa serie a ogni nuova istanza di Random. Per impostazione predefinita, il costruttore senza parametri della classe Random utilizza il clock di sistema (ossia l’ora corrente del giorno) per generare il valore di inizializzazione, ma è possibile passare un valore di base come argomento inserendolo tra parentesi dopo New Random. È meglio utilizzare l’ora corrente come valore di base, perché è molto probabile che cambi l’istante di tempo ogni volta che creiamo un oggetto Random. Tuttavia, poiché il clock ha una risoluzione limitata, l’utilizzo del costruttore senza parametri per creare oggetti Random diversi in stretta successione dà origine a generatori di numeri casuali che producono sequenze identiche di numeri casuali. Questo problema può essere evitato creando un unico oggetto Random che generi molti numeri casuali nel tempo, anziché creare ripetutamente nuovi oggetti Random che generino un solo numero casuale. Si possono generare numeri pseudo – casuali aventi diverse distribuzioni (ossia ogni numero ha una determinata probabilità di cadere in un dato intervallo). Ad esempio si possono generare numeri distribuiti in modo uniforme se in tale distribuzione ogni numero in un dato intervallo ha la stessa probabilità di essere selezionato.
  • 17. PROGRAMMAZIONE Generare una sequenza di numeri casuali per i prezzi bid e ask al variare del tempo. Il risultato, cioè la serie storica, viene mostrato da un grafico: Link: www.box.com/s/s8rierzv101n6ja40a7f
  • 18. Le medie mobili (moving average) sono uno strumento per depurare i prezzi dagli elementi erratici (rumore di fondo). Stimano il ciclo trend attraverso trasformazioni (filtri) lineari della serie, che hanno lo scopo di annullare l’effetto delle altre componenti per evidenziare il trend. dove:  m1 è il numero dei periodi precedenti t;  m2 è il numero dei periodi successivi a t;  θi è un peso attribuito agli m1 + m2 + 1 termini della somma;  k = m1 + m2 + 1 è il periodo o l'ordine della media mobile. Una media mobile viene detta:  semplice se i pesi θi sono tutti uguali a 1 / k (in tal caso, si tratta di una normale media aritmetica);  centrata se m1 = m2;  simmetrica se centrata e se θi − m = θi + m per ogni compreso tra 1 e m1 = m2. Quanti più elementi sono presenti nella serie storica alla quale la Media Mobile è applicata, tanto meno reattiva sarà la media (ad esempio una media mobile a 20 periodi è più reattiva di una media mobile a 60 periodi). Uno strategia molto utilizzata è il crossover tra due medie mobili (crossover doppio) o tra tre medie mobili (crossover triplo).
  • 19. Nel caso del crossover tra due medie mobili: Il segnale di acquisto (B=buy) si ha quando la media mobile più veloce incrocia al rialzo la media mobile più lenta. Il segnale di vendita (S=sell) si ha quando la media mobile più veloce incrocia al ribasso la media mobile più lenta. La media mobile è, quindi, un indicatore usato molto spesso in analisi tecnica per mostrare il valore medio di un prezzo in un certo periodo di tempo. La media mobile dei valori è utile dal punto di vista grafico per mettere in rilievo la direzione di un trend, attenuando le fluttuazioni del prezzo che possono confondere il trader nell'interpretazione del grafico. Il termine media mobile deriva dal fatto che il numero di osservazioni rimane costante nel tempo e che l'aggiornamento del valore della media avviene alimentando l'algoritmo con l'introduzione del dato più recente con l'eliminazione del valore più vecchio che rientrava nel calcolo relativo al giorno precedente, in caso di rilevazioni giornaliere. Le medie mobili si suddividono in medie mobili semplici e medie mobili ponderate. Le medie mobili semplici si costruiscono sommando i dati di chiusura per un periodo variabile a propria scelta, si divide il risultato ottenuto per il numero di giorni considerati. Le medie mobili ponderate si calcolano assegnando un peso maggiore ai dati più recenti con una ponderazione aritmetica.
  • 20. La formula generale per la compilazione della media mobile è la seguente: Mt = (Pt + Pt-1 + Pt-2 + .....+ Pt-n+1) / n  Mt = valore della media mobile al tempo t.  P = prezzo o valore dell'indice di riferimento.  n = numero delle osservazioni (ampiezza della media mobile). La formula per procedere all'aggiornamento è la seguente: Mt+1 = Mt + ((Pt+1 - Pt-n+1) / n)  Mt+1 = Valore della media mobile dell'ultimo giorno. Questo tipo di funzione tende a smorzare l' erraticità dei prezzi e questo effetto è tanto più evidente quanto maggiore è la media mobile. La sua rappresentazione grafica è una curva che segue la linea dei prezzi con un andamento più regolare eliminando i "rumori" .Uno tra i principali obiettivi che ci si pone con l'utilizzazione di questo algoritmo è proprio quello di eliminare gli elementi casuali che entrano nella formazione del prezzo, provocando delle esasperazioni nei movimenti.
  • 21. Media mobile semplice: Questa media mobile è calcolata sommando un determinato numero di prezzi di chiusura recenti e dividendo il totale per il numero di selezioni effettuate. Per chiarire meglio, sommando gli ultimi 20 prezzi di chiusura di un titolo e dividendo il totale per 20, si otterrà la media mobile a 20 giorni. Su un grafico, questo calcolo è eseguito per ciascun periodo indicato sullo stesso. Media mobile esponenziale: Una media mobile esponenziale differisce da quella "semplice" in quanto attribuisce maggior peso ai dati più recenti. Sono disponibili sei differenti periodi per entrambe le tipologia di media mobile (a 5, 10, 20, 50, 100 e 200 giorni). Come sappiamo esistono grosso modo tre tipi di medie mobili: aritmetica, ponderata ed esponenziale. La media più usata in assoluto rimane sempre la media aritmetica, anche se l’esponenziale sta prendendo sempre più piede, tanto che anche nella costruzione dei più comuni oscillatori la media che ha dato i migliori risultati operativi è quella esponenziale, infatti in ambito algoritmico è sempre la più utilizzata. Spesso comunque, indipendentemente dal tipo le medie mobili possono dare dei falsi segnali operativi. Ma esiste un sistema per rendere la media mobile, non infallibile, ma quasi. Si tratta di accostare alla media mobile lo studio dei cicli. Usando una media a medio termine è possibile catturare il ciclo semestrale. Infatti la media, osservandola a lungo periodo, si muoverà ciclicamente non per forza con la stessa ampiezza ed estensione, ma comunque con la stessa forma. Usando una media a breve è possibile invece tracciare dei cicli trimestrali. Questi “mini-cilci”si trovano all’interno dei cicli a 6 mesi e sono complementari ad esso, nel senso che un ciclo di 6 mesi ne contiene al suo interno due a 3 mesi. Perciò si usano le medie mobili in primo luogo per bloccare le fluttuazioni di prezzo ed osservare chiaramente i cicli che si susseguono.
  • 22. Le medie mobili possono essere utilizzate per costruire dei canali, noti come bande di Bollinger o canali di medie mobili, che racchiudono le oscillazioni dei prezzi. Le bande di Bollinger rappresentano un indicatore tecnico che appartiene alla famiglia degli indicatori di volatilità. Un'ampiezza maggiore delle bande di Bollinger è determinata da un'elevata volatilità dei prezzi, al contrario una minore ampiezza delle bande di Bollinger è determinata da una volatilità dei prezzi in diminuzione. Le bande di Bollinger sono composte da curve ottenute esclusivamente con la serie storica dei prezzi di un titolo:  Media Mobile Lineare a N giorni (la linea centrale)  La Media Mobile a cui si somma 2 volte la deviazione standard (banda superiore)  La Media Mobile a cui si sottrae 2 volte la deviazione standard (banda inferiore) Sovrapponendo la curva dei prezzi del titolo a queste tre linee si ottiene una figura funzione del tempo in cui i valori del titolo sono generalmente compresi fra la banda superiore e quella inferiore, con casi di trapasso della banda superiore o inferiore.
  • 23. Dal punto di vista operativo alcune regole stabiliscono che:  se le bande di Bollinger si restringono ("strozzatura") è probabile che a breve ci possa essere una forte esplosione di volatilità  se il prezzo oltrepassa una banda di Bollinger è probabile che la tendenza continui  se il prezzo oltrepassa una banda di Bollinger e si forma una figura di inversione allora è probabile aspettarsi un'inversione di tendenza Le formule che definiscono le bande di Bollinger sono funzione di 3 parametri:  Il parametro della Medie Mobile, ossia il numero di osservazioni prese in considerazione. Solitamente si usa una media mobile semplice a 20 gg, come suggerito dallo stesso Bollinger.  Il moltiplicatore della deviazione standard applicata alla serie storiche dei prezzi, solitamente 2 o 3.  La definizione di serie storiche dei prezzi. Solitamente si usano i prezzi di chiusura del titolo, ma è possibile utilizzare altri valori che possano essere maggiormente esplicativi del valore del titolo per una data osservazione. In tal senso si può far riferimento ad valori tipici della sessione i-esima, dunque alla media sui prezzi di apertura e chiusura , oppure utilizzando la media del range coperto durante la sessione (massimo e minimo) , od ancora una media fra i prezzi di apertura/chiusura/minimo/massimo.
  • 24. Per quanto visto sopra le Bande di Bollinger possono essere utilizzate per misurare:  la volatilità  il trend La misura della volatilità è un elemento molto importante sia per valutare il rischio di investimento sia per riconoscere fasi potenziali di accumulazione/distribuzione del titolo o meglio di trend/congestione dei prezzi. In questo senso il segnale operativo di sell/buy deve essere offerto da altri indicatori o metodologie di trading, dato che queste misure di volatilità non possono offrire nessun segnale operativo.
  • 25. Alla base di ogni linguaggio di programmazione orientato agli oggetti c’è il concetto di classe. Le classi di VB .NET mantengono tutte le caratteristiche dei moduli di classe, ma ne aggiungono numerose altre. In prima approssimazione, una classe è una collezione di variabili, metodi e proprietà; è possibile creare una classe usando il costrutto Class: Class esempio 'variabili' Dim Nome As String Public Sub MostraNome() '.......' End Sub End Class Una classe è anche un tipo, quindi può essere assegnata ad una variabile.
  • 26. I costruttori sono metodi che vengono automaticamente richiamati quando si crea un’istanza della classe stessa; servono a creare un oggetto, un'istanza materiale della classe. Ogni costruttore, poichè ce ne può essere anche più di uno, è sempre dichiarato usando la keyword New e non può essere altrimenti. Una delle caratteristiche più importanti del costruttore è che esso consente di specificare le proprietà iniziali della classe. Si possono passare parametri al costruttore allo stesso modo di come si passano alle normali procedure o funzioni, specificandoli tra parentesi. Il codice scritto nel costruttore viene eseguito prima di ogni altro metodo nella classe, perciò può anche modificare le variabili read-only (in sola lettura). Anche i moduli possono avere un costruttore e questo viene eseguito prima della procedura Main. Una cosa da tenere bene a mente è che, nonostante New sia eseguito prima di ogni altra istruzione, sia le costanti sia i campi con inizializzatore (ad esempio Dim I As Int32 = 50) sono già stati inizializzati e contengono già il loro valore. Ricordiamo che il costruttore è una particolare Sub, il cui nome deve obbligatoriamente essere New. Creiamo un costruttore per la classe esempio: Class esempio Dim Nome As String 'variabili' Sub New(ByVal strNome As String) 'Imposta le proprietà iniziali' Nome = strNome End Sub Public Sub VisualizzaNome() '…' End Sub End Class Come possiamo vedere, la routine New prende come argomento la variabile strNome e la assegna alla sua variabile interna Nome.
  • 27. Scopo delle Interfacce Le interfacce sono un'entità davvero singolare all'interno del .NET Framework. La loro funzione è assimilabile a quella delle classi astratte, ma il modo con cui esse la svolgono è molto diverso. Il principale scopo di un'interfaccia è definire lo scheletro di una classe; potrebbe essere scherzosamente assimilata alla ricetta con cui si prepara un dolce. Quello che l'interfaccia X fa, ad esempio, consiste nel dire che per costruire una classe Y che rispetti "la ricetta" descritta in X servono una proprietà Id di tipo Integer, una funzione GetSomething senza parametri che restituisce una stringa e una procedura DoSomething con un singolo parametro Double. Tutte le classi che avranno intenzione di seguire i precetti di X (in gergo implementare X) dovranno definire, allo stesso modo, quella proprietà di quel tipo e quei metodi con quelle specifiche signature (il nome ha importanza relativa).
  • 28. Dichiarazione e implementazione La sintassi usata per dichiarare un'interfaccia è la seguente: Interface [nome] 'membri’ End Interface I membri delle interfacce, tuttavia, sono un po' diversi dai membri di una classe, e nello scriverli bisogna rispettare queste regole:  Nel caso di metodi, proprietà od eventi, il corpo non va specificato;  Non si possono mai usare gli specificatori di accesso;  Si possono comunque usare dei modificatori come Shared, ReadOnly e WriteOnly. Il primo ed il secondo punto saranno ben compresi se ci si sofferma a pensare che l'interfaccia ha il solo scopo di definire quali membri una classe debba implementare: per questo motivo, non se ne può scrivere il corpo, dato che spetta espressamente alle classi implementanti, e non ci si preoccupa dello specificatore di accesso, dato che si sta specificando solo il "cosa" e non il "come". Ora che sappiamo come dichiarare un'interfaccia, dobbiamo scoprire come usarla. Per implementare un'interfaccia in una classe, si usa questa sintassi: Class Esempio Implements (Nome Interfaccia) [Membro] Implements [Nome Interfaccia].[Membro] End Class
  • 29. Definizione di tipi in un'interfaccia Così come è possibile dichiarare una nuova classe all'interno di un'altra, o una struttura in una classe, o un'interfaccia in una classe, o una struttura in una struttura, o tutte le altre possibili combinazioni, è anche possibile dichiarare un nuovo tipo in un'interfaccia. In questo caso, solo le classi che implementeranno quell'interfaccia saranno in grado di usare quel tipo. Perchè preferire un'interfaccia a una classe astratta Ci sono casi e casi. In genere, un'interfaccia va preferita quando si dovranno abbracciare grandi quantità di classi diverse: con grandi mi riferisco a numeri abbastanza grandi da rendere difficile l'uso di una sola classe astratta. È bene usare le interfacce anche quando si progetta di usarne più di una: una classe, infatti, può implementare quante interfacce vuole, ma può ereditare da una sola classe base. Proprio per questi motivi, è ideale usare un'interfaccia quando si vuole delineare una caratteristica o un particolare comportamento che può essere comune a più tipi, mentre è meglio puntare a una classe astratta quando si vuole sottolineare l'appartenenza di molti tipi ad un unico archetipo base.
  • 30. Andiamo ad analizzare due interfacce: IComparer e IComparable. Queste interfacce sono spesso utilizzate insieme e anche se le interfacce sono simili e hanno nomi simili, gli scopi che essi servono sono leggermente diversi. In generale, se si dispone di una matrice di tipi (ad esempio la stringa o i tipi integer ) che già supportano IComparer, è possibile ordinare la matrice senza fornire alcun riferimento esplicito a IComparer. In questo caso, gli elementi della matrice vengono proiettati per l’implementazione predefinita di IComparer(Comparer.Default) per l’utente. Tuttavia, se desidera eseguire l'ordinamento e per confrontare gli oggetti personalizzati, è necessario implementare una o entrambe queste interfacce.
  • 31.  Un oggetto che implementa IComparable comunica implicitamente al .NET Framework che può essere confrontato con altri oggetti, stabilendo se uno di essi è maggiore, minore o uguale all'altro e abilitando in questo modo l'ordinamento automatico attraverso il metodo Sort di una collection. Infatti, tale metodo confronta uno ad uno ogni elemento di una collezione o di un array e tramite la funzione CompareTo che ogni interfaccia IComparable espone e li ordina in ordine crescente o decrescente. CompareTo è una funzione di istanza che implementa IComparable. CompareTo e ha dei risultati predefiniti:  restituisce 1 se l'oggetto passato come parametro è minore dell'oggetto dalla quale viene richiamata;  0 se è uguale e -1 se è maggiore.  IComparer rappresenta un oggetto che deve eseguire la comparazione tra due altri oggetti, facendo quindi da tramite nell'ordinamento. Dato che Sort accetta in una delle sue versioni un oggetto IComparer, è possibile ordinare una lista di elementi con qualsiasi criterio si voglia semplicemente cambiando il parametro. Usando questo meccanismo è possibile ordinare qualsiasi tipo di lista o collezione (tranne SortedList, che si ordina automaticamente), in modo semplice e veloce, particolarmente utile nell'ambito delle liste visuali a colonne.
  • 32. OLE DB (Object Linking and Embedding, database), una API progettato da Microsoft, consente l'accesso ai dati da una varietà di fonti in modo uniforme. L'API fornisce un insieme di interfacce implementate utilizzando il Component Object Model (COM). Microsoft OLE DB originariamente inteso come un più alto livello di sostituzione, e successore, ODBC, estendendo il suo set di funzioni per supportare una più ampia fogli di calcolo che non necessariamente implementano SQL. METODOLOGIA OLE DB separa l'archivio dati dal ricorso che deve accedere ad esso attraverso un insieme di astrazioni che includono il datasource, session, comando e set di righe. Questo è stato fatto perché diverse applicazioni hanno bisogno di accedere a diversi tipi e fonti di dati, e non necessariamente vogliono sapere come accedere alle funzionalità con la tecnologia metodi specifici. OLE DB è concettualmente diviso in consumatori e fornitori. I consumatori sono le applicazioni che richiedono l'accesso ai dati, ed i fornitori sono i componenti software che implementano l'interfaccia e quindi fornisce i dati al consumatore.
  • 33.
  • 35. Generare una serie storica casuale dei prezzi per un strumento finanziario. Rappresentare la serie storica con:  Linee delle medie mobili;  Medie running;  Bande di bollinger LINK: www.box.com/s/x0hgqvkszv6v2pjk1toa
  • 36. Il risultato grafico finale ottenuto è il seguente:  la nostra serie storica presentata in blu;  le bande di bollinger in rosso;  la media moving in verde e la media running in rosa.
  • 37.  Dopo aver inizializzate una serie di variabili;  Inserisco una serie di comandi che mi consentono di resettare gli oggetti ogni volta che clicco sul bottone Serie Storica: Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.SS.Clear() Me.SSMoving.Clear() Me.SSRunning.Clear() Me.SSBandaBollingerInf.Clear() Me.SSBandaBollingerSup.Clear() Dim random As New Random Dim SS As New List(Of Osservazione) 1°STEP
  • 38.  Creo un loop e al suo interno vengono definite: • la serie storica casuale (random) dei prezzi; • la media running; • e la media moving. Dim prezzoIniziale As Decimal = 500 Dim tick As Decimal = 1 Dim passoTempominuti As Integer = 5 Dim istanteCorrente = istanteIniziale Dim prezzoCorrente = prezzoIniziale Dim MediaRunning As Double • A seconda del valore casuale si sottrae o si aggiunge il tick: Do If random.NextDouble < 0.5 Then prezzoCorrente = prezzoCorrente - tick Else prezzoCorrente = prezzoCorrente + tick End If • Vado a impostare l’arco temporale alla giornata odierna, definendo un ciclo che termina quando finisce la giornata:
  • 39. If istanteCorrente.Subtract(istanteIniziale).TotalDays > 1 Then Exit Do Dim osservazione As New osservazione osservazione.istante = istanteCorrente osservazione.Prezzo = prezzoCorrente osservazione.X = osservazione.Istante.Subtract(istanteIniziale).TotalMilliseconds osservazione.Y = osservazione.Prezzo •avanziamo il tempo istanteCorrente = istanteCorrente.AddMinutes(passoTempominuti)
  • 40. 2°STEP  Vado a calcolare la media running: MediaRunning = (MediaRunning * SS.Count + prezzoCorrente) / (SS.Count + 1) Dim O_R As New Osservazione() O_R.Prezzo = MediaRunning O_R.Istante = osservazione.Istante O_R.X = osservazione.X O_R.Y = O_R.Prezzo SSRunning.Add(O_R) SS.Add(osservazione)  Calcolo la media moving (utilizzando la condizione if che mi gestisce la possibile eccezione nel caso di NumericUpDown1=0, per il quale la media mobile non si potrebbe calcolare, imponendo, in tal caso, un NumericUpDown1=1 si va ad ovviare al problema). Dim NUP As Integer = NumericUpDown1.Value If (NumericUpDown1.Value = 0) Then NUP = 1 Else NUP = NumericUpDown1.Value End If Dim O_M As New Osservazione()
  • 41. If SS.Count > NUP Then MediaMoving = MediaMoving + (SS(SS.Count - 1).Prezzo / NUP) - (SS(SS.Count - NUP - 1).Prezzo / NUP) O_M.Prezzo = MediaMoving O_M.Istante = osservazione.Istante O_M.X = osservazione.X O_M.Y = O_M.Prezzo SSMoving.Add(O_M) SS.Add(osservazione) Else O_M.Prezzo = MediaMoving O_M.Istante = osservazione.Istante O_M.X = osservazione.X O_M.Y = O_M.Prezzo SSMoving.Add(O_M) End If SS.Add(osservazione) Loop
  • 42.  Calcoliamo le bande di bollinger (NUMERICUPDOWN2 * DEVSTD): Dim NUP2 As Integer = NumericUpDown2.Value If (NumericUpDown2.Value = 0) Then NUP = 1 Else NUP = NumericUpDown2.Value End If Dim i As Integer = 0 For i = i To SSMoving.Count - 1 • Si calcola la deviazione standard della serie moving: Dim devstd As Double = Me.CalcoloDevStd(SSMoving, i) Dim b1 As New Osservazione Dim b2 As New Osservazione With b1 .Prezzo = SSMoving(i).Prezzo + NUP2 * devstd .Istante = SSMoving(i).Istante End With Me.SSBandaBollingerSup.Add(b1) With b2 .Prezzo = SSMoving(i).Prezzo - NUP2 * devstd .Istante = SSMoving(i).Istante End With Me.SSBandaBollingerInf.Add(b2) Next Funzione CalcolaDevStd
  • 43. • calcolo coordinate reali della serie storica dei prezzi For Each osservazione As Osservazione In SS osservazione.Y = osservazione.Prezzo osservazione.X = osservazione.Istante.Subtract(istanteIniziale).TotalMilliseconds If MinX > osservazione.X Then MinX = osservazione.X If MaxX < osservazione.X Then MaxX = osservazione.X If MinY > osservazione.Prezzo Then MinY = osservazione.Prezzo If MaxY < osservazione.Prezzo Then MaxY = osservazione.Prezzo Application.DoEvents() Me.SS.Add(osservazione) Next ' si richiamano le su definite per la trasformsazione della serie e per il disegno Me.TrasfomaCoordInPnt() Me.DisegnaLeSerie() End Sub
  • 44. 3°STEP  Non resta che andare disegnare la nostra serie storica, le bande di bollinger e le medie.  Per prima cosa abbiamo voluto riportare tutto in un rettangolo all’interno della pictureBox; abbiamo quindi calcolato le coordinate virtuali, trasferendo quelle originali in un rettangolo. TrasfomaCoordInPnt() PuntiSS = New List(Of Point) For Each osservazione As Osservazione In SS Dim Punto As New Point Punto.X = Rettangolo.Left + CInt(Rettangolo.Width * (osservazione.X - Me.MinX) / (Me.MaxX - Me.MinX)) Punto.Y = (Rettangolo.Top + CInt(Rettangolo.Height)) - (Rettangolo.Height * (osservazione.Y - Me.MinY) / (Me.MaxY - Me.MinY)) PuntiSS.Add(Punto) Next !!Abbiamo ripetuto il codice per i punti della serie storica running, moving e per le bande di bollinger
  • 45. • Siamo quindi andati a scrivere i comandi per disegnare la serie, le medie e le bande, scegliendo i colori e il tipo di linee da utilizzare: Sub DisegnaLeSerie() bitmap = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height) grafico = Graphics.FromImage(bitmap) Dim PennaTratteggiata As Pen PennaTratteggiata = New Pen(Color.Orange, 1) PennaTratteggiata.DashStyle = Drawing2D.DashStyle.Dot grafico.Clear(Color.White) grafico.DrawRectangle(Pens.Black, Rettangolo) grafico.DrawLines(Pens.SkyBlue, PuntiSS.ToArray) grafico.DrawLines(Pens.YellowGreen, PuntiSSMoving.ToArray) grafico.DrawLines(Pens.Fuchsia, PuntiSSRunning.ToArray) grafico.DrawLines(PennaTratteggiata, PuntiSSBBSUP.ToArray) grafico.DrawLines(PennaTratteggiata, PuntiSSBBINF.ToArray)
  • 46. • abbiamo inserito l’intestazione e la leggenda: Dim drawFont2 As New Font("Arial", 12, FontStyle.Bold) grafico.DrawString("SERIE STORICA", drawFont2, Brushes.Purple, 380, 10) Dim drawfont3 As New Font("arial", 8) grafico.FillRectangle(Brushes.SkyBlue, Me.PictureBox1.Width - 605, Me.PictureBox1.Height - 88, 6, 6) grafico.DrawString("Serie Storica", drawfont3, Brushes.Gray, Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 92) grafico.FillRectangle(Brushes.YellowGreen, Me.PictureBox1.Width - 605, Me.PictureBox1.Height - 72, 6, 6) grafico.DrawString("Media Moving", drawfont3, Brushes.Gray, Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 75) grafico.FillRectangle(Brushes.Fuchsia, Me.PictureBox1.Width - 605, Me.PictureBox1.Height - 55, 6, 6) grafico.DrawString("Media Running", drawfont3, Brushes.Gray, Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 58) grafico.FillRectangle(Brushes.Orange, Me.PictureBox1.Width - 605, Me.PictureBox1.Height - 38, 6, 6) grafico.DrawString("Bande Bollinger", drawfont3, Brushes.Gray, Me.PictureBox1.Width - 600, Me.PictureBox1.Height - 41) Me.PictureBox1.Image = Me.bitmap End Sub
  • 47. • abbiamo infine inserito dei comandi per poter muovere il rettangolo e ridimensionarlo a nostro piacimento all’interno della pictureBox. Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If Me.SS Is Nothing Then Exit Sub Me.MouseTastoPremuto = True Me.XinizialeMOUSE = e.X Me.YinizialeMOUSE = e.Y Me.XinizialeRETT = Rettangolo.X Me.YinizialeRETT = Rettangolo.Y Me.WInizialeRETT = Rettangolo.Width Me.HInizialeRETT = Rettangolo.Height End Sub Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If Me.grafico Is Nothing Then Exit Sub If Not Me.MouseTastoPremuto Then Exit Sub If e.Button = Windows.Forms.MouseButtons.Left Then Rettangolo.X = Me.XinizialeRETT + (e.X - Me.XinizialeMOUSE) Rettangolo.Y = Me.YinizialeRETT + (e.Y - Me.YinizialeMOUSE) Else Rettangolo.Width = Me.WInizialeRETT + (e.X - Me.XinizialeMOUSE) Rettangolo.Height = Me.HInizialeRETT + (e.X - Me.XinizialeMOUSE) End If Me.TrasfomaCoordInPnt() Me.DisegnaLeSerie() End Sub
  • 48. Function CalcoloDevStd(ByVal serie As List(Of Osservazione), ByVal Posto As Integer) If (NumericUpDown1.Value = 0) Then DistanzaDallaMedia = 1 Else Me.DistanzaDallaMedia = CInt(Me.NumericUpDown1.Value - 1) End If Dim somma As Double Dim count As Double Dim scarti As Double Dim scartiquadrati As Double Dim media As Double Dim var As Double Dim deviazionestandard As Double For i As Integer = i To serie.Count - 1 somma += serie(i).Prezzo count += 1 media = somma / count scarti = serie(i).Prezzo - media scartiquadrati = scarti ^ 2 var = scartiquadrati / count Next deviazionestandard = Math.Sqrt(var) Return deviazionestandard End Function Funzione utilizzata per calcolare la deviazione standard