giovedì 28 ottobre 2010

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

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.