Si avvisano i colleghi/ghe che si svolgeranno regolarmente le lezioni il giorno 2 Novembre a partire dalle ore 9:00
Saluti
giovedì 28 ottobre 2010
homework 1 di Angelo Spina
Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
'Dim MinPrezzo = 1075
'Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
'Dim indice As Integer = 0
'Dim somma As Integer
'For Each elemento As Integer In listaDiY
' If (indice + 1) >= NumeroTerminiMediaMobile Then
' For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
' somma += listaDiY(indice - j)
' Next j
' mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
' Else : mmobile.Insert(indice, Nothing)
' End If
' somma = 0
' indice += 1
'Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
'Dim MinPrezzo = 1075
'Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
'Dim indice As Integer = 0
'Dim somma As Integer
'For Each elemento As Integer In listaDiY
' If (indice + 1) >= NumeroTerminiMediaMobile Then
' For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
' somma += listaDiY(indice - j)
' Next j
' mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
' Else : mmobile.Insert(indice, Nothing)
' End If
' somma = 0
' indice += 1
'Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
homework 1 di Emilio Venditti
Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
'Dim MinPrezzo = 1075
'Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
'Dim indice As Integer = 0
'Dim somma As Integer
'For Each elemento As Integer In listaDiY
' If (indice + 1) >= NumeroTerminiMediaMobile Then
' For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
' somma += listaDiY(indice - j)
' Next j
' mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
' Else : mmobile.Insert(indice, Nothing)
' End If
' somma = 0
' indice += 1
'Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
'Dim MinPrezzo = 1075
'Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
'Dim indice As Integer = 0
'Dim somma As Integer
'For Each elemento As Integer In listaDiY
' If (indice + 1) >= NumeroTerminiMediaMobile Then
' For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
' somma += listaDiY(indice - j)
' Next j
' mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
' Else : mmobile.Insert(indice, Nothing)
' End If
' somma = 0
' indice += 1
'Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Marco Orsi (Homework 1)
Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
Dim MinPrezzo = 1075
Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
Dim indice As Integer = 0
Dim somma As Integer
For Each elemento As Integer In listaDiY
If (indice + 1) >= NumeroTerminiMediaMobile Then
For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
somma += listaDiY(indice - j)
Next j
mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
Else : mmobile.Insert(indice, Nothing)
End If
somma = 0
indice += 1
Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
Dim MinPrezzo = 1075
Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
Dim indice As Integer = 0
Dim somma As Integer
For Each elemento As Integer In listaDiY
If (indice + 1) >= NumeroTerminiMediaMobile Then
For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
somma += listaDiY(indice - j)
Next j
mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
Else : mmobile.Insert(indice, Nothing)
End If
somma = 0
indice += 1
Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Homework di Carla Ferrara
Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
Dim MinPrezzo = 1075
Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
Dim indice As Integer = 0
Dim somma As Integer
For Each elemento As Integer In listaDiY
If (indice + 1) >= NumeroTerminiMediaMobile Then
For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
somma += listaDiY(indice - j)
Next j
mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
Else : mmobile.Insert(indice, Nothing)
End If
somma = 0
indice += 1
Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
Dim MinPrezzo = 1075
Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
Dim indice As Integer = 0
Dim somma As Integer
For Each elemento As Integer In listaDiY
If (indice + 1) >= NumeroTerminiMediaMobile Then
For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
somma += listaDiY(indice - j)
Next j
mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
Else : mmobile.Insert(indice, Nothing)
End If
somma = 0
indice += 1
Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Homework 1 di Plateroti Cinzia
Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 10
Private MargineDestro As Integer = 10
Private MargineAlto As Integer = 10
Private MargineBasso As Integer = 10
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Private Y_MM As New List(Of Integer)
Private X_MM As New List(Of Integer)
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
'Visualizzo margini
g.DrawRectangle(Pens.Black, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 0.5)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
'Medie mobili
g.DrawLines(New Pen(Color.Yellow, 3), Me.MediaMobile(ListaOsservazioni_ASK, NumeroTerminiMediaMobile).ToArray)
g.DrawLines(New Pen(Color.Chocolate, 1), Me.MediaMobile(ListaOsservazioni_BID, NumeroTerminiMediaMobile).ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'Determinazione del minimo e massimo prezzo
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
X_MM.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
Y_MM.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Black, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
'Funzione per il calcolo della Media Mobile
Function MediaMobile(ByVal ListaTermini As List(Of Osservazione), ByVal NumTermMM As Integer) As List(Of Point)
Dim MMobili As New List(Of Integer)
Dim sum As Double = 0
Dim i As Integer = 0
Dim j As Integer = 0
For i = 0 To ListaTermini.Count
If (i = NumTermMM) Then
For j = i - NumeroTerminiMediaMobile To i
sum += Y_MM.Item(j)
Next j
MMobili.Add(CInt(sum / NumeroTerminiMediaMobile))
sum = 0
NumTermMM += 1
End If
Next i
Dim PuntiMediaMobile As New List(Of Point)
For i = 0 To (MMobili.Count - 1)
Dim InserisciPunto As New Point(X_MM.Item(i), MMobili.Item(i))
PuntiMediaMobile.Add(InserisciPunto)
Next
Return PuntiMediaMobile
End Function
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 10
Private MargineDestro As Integer = 10
Private MargineAlto As Integer = 10
Private MargineBasso As Integer = 10
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Private Y_MM As New List(Of Integer)
Private X_MM As New List(Of Integer)
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
'Visualizzo margini
g.DrawRectangle(Pens.Black, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 0.5)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
'Medie mobili
g.DrawLines(New Pen(Color.Yellow, 3), Me.MediaMobile(ListaOsservazioni_ASK, NumeroTerminiMediaMobile).ToArray)
g.DrawLines(New Pen(Color.Chocolate, 1), Me.MediaMobile(ListaOsservazioni_BID, NumeroTerminiMediaMobile).ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'Determinazione del minimo e massimo prezzo
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
X_MM.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
Y_MM.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Black, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
'Funzione per il calcolo della Media Mobile
Function MediaMobile(ByVal ListaTermini As List(Of Osservazione), ByVal NumTermMM As Integer) As List(Of Point)
Dim MMobili As New List(Of Integer)
Dim sum As Double = 0
Dim i As Integer = 0
Dim j As Integer = 0
For i = 0 To ListaTermini.Count
If (i = NumTermMM) Then
For j = i - NumeroTerminiMediaMobile To i
sum += Y_MM.Item(j)
Next j
MMobili.Add(CInt(sum / NumeroTerminiMediaMobile))
sum = 0
NumTermMM += 1
End If
Next i
Dim PuntiMediaMobile As New List(Of Point)
For i = 0 To (MMobili.Count - 1)
Dim InserisciPunto As New Point(X_MM.Item(i), MMobili.Item(i))
PuntiMediaMobile.Add(InserisciPunto)
Next
Return PuntiMediaMobile
End Function
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Di Salvo Rosanna - Homework 1
Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
Dim MinPrezzo = 1075
Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
Dim indice As Integer = 0
Dim somma As Integer
For Each elemento As Integer In listaDiY
If (indice + 1) >= NumeroTerminiMediaMobile Then
For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
somma += listaDiY(indice - j)
Next j
mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
Else : mmobile.Insert(indice, Nothing)
End If
somma = 0
indice += 1
Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 40
Private MargineDestro As Integer = 40
Private MargineAlto As Integer = 40
Private MargineBasso As Integer = 40
Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal
Private MinimoTempo As Double
Private MassimoTempo As Double
Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()
If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName
End With
Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------
Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)
For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione
Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
.TipoPrezzo = CInt(ValoriInUnaRiga(4))
.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
If .TipoPrezzo = 1 Then
ListaOsservazioni_BID.Add(Osservazione)
ElseIf .TipoPrezzo = 2 Then
ListaOsservazioni_ASK.Add(Osservazione)
Else
'Throw New Exception("inatteso")
End If
End With
Next Riga
Me.DisegnaGRafico()
End Sub
Sub DisegnaGRafico()
If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)
'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------
Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)
'Visualizzo margini
g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))
'Usare drawlines per il plot delle 2 curve
'Curve dei prezzi
'BID
Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Blue, 1)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
'Disegno asse dei prezzi
Me.DrawPriceRuler()
Me.PictureBox1.Image = b
End Sub
Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
'da fare
'Determinazione del minimo e massimo prezzo
Dim MinPrezzo = 1075
Dim MaxPrezzo As Double = 1090
Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue
Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'prezzo
If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
'tempo
Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo
End With
Next Osservazione
Dim ListaPunti As New List(Of Point)
For Each Osservazione As Osservazione In ListaOsservazioni
With Osservazione
'Determinare il punto!
Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo
'Trasformare il punto per rappresentarlo sul bitmap!
Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
listaDiX.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
listaDiY.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)
End With
Next Osservazione
Return ListaPunti
End Function
Private listaDiY As New List(Of Integer)
Private listaDiX As New List(Of Integer)
Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata
End Function
Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
Return Y_Trasformata
End Function
Private mmobile As New List(Of Integer)
Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)
Dim puntmobili As New List(Of Integer)
Dim somma As Integer = 0
Dim i As Integer = 0
Dim k As Integer = 0
Dim passo As Integer = NumeroTerminiMediaMobile
For i = 0 To lista.Count
If (i = passo) Then
For k = i - NumeroTerminiMediaMobile To i
somma += listaDiY.Item(k)
Next k
puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
somma = 0
passo += 1
End If
Next i
Dim indice As Integer = 0
Dim somma As Integer
For Each elemento As Integer In listaDiY
If (indice + 1) >= NumeroTerminiMediaMobile Then
For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
somma += listaDiY(indice - j)
Next j
mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))
Else : mmobile.Insert(indice, Nothing)
End If
somma = 0
indice += 1
Next elemento
Dim listaPuntiMobile As New List(Of Point)
For a = 0 To (puntmobili.Count - 1)
Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
listaPuntiMobile.Add(nuovopunto)
Next
Return listaPuntiMobile
End Function
Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo
Do
Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do
'Disegno della tacca e del prezzo
'...
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
Loop
End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()
End Sub
Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()
End Sub
End Class
Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal
End Class
Iscriviti a:
Post (Atom)