Siamo a questo punto in grado di passare alla rappresentazione grafica di serie storiche generate casualmente, estendendo il programma già costruito in precedenza. Innanzi tutto, creiamo la classe Osservazione: tramite questa nuova funzione saranno inseriti i diversi prezzi che andranno a costituire la serie storica da rappresentare. Ad ogni osservazione sarà associato il valore del prezzo, nonché l'istante temporale corrispondente:
Public Class Osservazione
Public Istante As Date
Public Prezzo As Decimal
Public Sub New(ByVal Istante As Date, ByVal Prezzo As Decimal)
Me.Istante = istante
Me.Prezzo = prezzo
End Sub
End Class
Procediamo, a questo punto, con la creazione della casella immagini e del bottone, assegnando a quest'ultimo le istruzioni necessarie per generare i valori casuali di prezzi ed associare a ciascuno di essi ad un determinato istante appartenente all'intervallo temporale che parta dalla data odierna. Nell'esempio riportato di seguito, le osservazioni generate risultano mille:
Public Class Form1
Public B As New Bitmap(600, 400)
Public G As Graphics = Graphics.FromImage(B)
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim R As New Random
Dim SerieStorica As New List(Of Osservazione)
Dim PrezzoIniziale As Decimal = 100
Dim IstanteIniziale As Date = Now
Dim Incremento As Decimal = 10
Dim PrezzoCorrente As Decimal = PrezzoIniziale
Dim IstanteCorrente As Date = IstanteIniziale
For i = 1 To 1000
Dim O As New Osservazione(IstanteCorrente, PrezzoCorrente)
SerieStorica.Add(O)
If R.NextDouble < 0.5 Then
PrezzoCorrente = PrezzoCorrente + Incremento
Else
PrezzoCorrente = PrezzoCorrente - Incremento
End If
IstanteCorrente = IstanteCorrente.AddSeconds(1)
Next
E' possibile ora tracciare il grafico di tali osservazioni, inizializzando una nuova lista di punti che associ ascissa ed ordinata a ciascuna osservazione:
Dim ListaPunti As New List(Of Point)
For Each O As Osservazione In SerieStorica
Dim X As Integer
Dim Y As Integer
Y = B.Height - O.Prezzo
X = O.Istante.Subtract(IstanteIniziale).TotalSeconds
Dim Punto As New Point(X, Y)
ListaPunti.Add(Punto)
Next
Dim MaxX As Double = Double.MinValue
Dim MinX As Double = Double.MaxValue
Dim MaxY As Double = Double.MinValue
Dim MinY As Double = Double.MaxValue
For Each Punto As Point In ListaPunti
If Punto.X > MaxX Then MaxX = Punto.X
If Punto.Y > MaxY Then MaxY = Punto.Y
If Punto.X < MinX Then MinX = Punto.X
If Punto.Y < MinY Then MinY = Punto.Y
Next
E' opportuno considerare che le osservazioni ottenute potrebbero fuoriuscire dalla casella immagini; a questo proposito, imponiamo che il grafico sia interamente contenuto nella schermata, effettuando una normalizzazione delle coordinate:
Dim Lista As New List(Of Point)
For Each Punto As Point In ListaPunti
Dim Xt As Integer = ((Punto.X - MinX) / (MaxX - MinX)) * B.Width
Dim Yt As Integer = B.Height - ((Punto.Y - MinY) / (MaxY - MinY)) * B.Height
Dim Pt As New Point(Xt, Yt)
Lista.Add(Pt)
Next
G.Clear(Color.White)
G.DrawLines(Pens.CornflowerBlue, Lista.ToArray)
PictureBox1.Image = B
End Sub
End Class
Ogni qual volta si cliccherà sul bottone, si otterrà pertanto la rappresentazione di una serie temporale con andamento aleatorio dei prezzi. Di seguito, alcuni esempi:
Nessun commento:
Posta un commento