mercoledì 27 ottobre 2010

homework1: Valentina Tranquilli

ESERCIZIO PREZZI



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)

    Dim ListaMedieMobili_BID As List(Of Osservazione)
    Dim ListaMedieMobili_ASK As List(Of Osservazione)

    Dim ListaSigmaPositivi As List(Of Osservazione)
    Dim ListaSigmaNegativi As List(Of Osservazione)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        '---------------
        'apriamo il file
        '---------------

        Dim q As New OpenFileDialog

        Dim FileDeiPrezzi As String

        With q
            .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)
        ListaMedieMobili_BID = New List(Of Osservazione)
        ListaMedieMobili_ASK = New List(Of Osservazione)
        ListaSigmaPositivi = New List(Of Osservazione)
        ListaSigmaNegativi = New List(Of Osservazione)

        For Each Riga As String In RigheDelFile

            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
            'Dim anno As Integer = Now.Year
            'Dim mese As Integer = Now.Month
            'Dim giorno As Integer = Now.Day
            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))

            Dim oss As New Osservazione

            With oss
                .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(oss)
                ElseIf .TipoPrezzo = 2 Then
                    ListaOsservazioni_ASK.Add(oss)
                End If
            End With

        Next Riga

        'Dim ListaMedieMobili As New List(Of Osservazione)
        'Dim ListaSigmaPositivi As New List(Of Osservazione)
        'Dim ListaSigmaNegativi As New List(Of Osservazione)

        '------------------------
        'Media mobili prezzi ASK
        '------------------------

        For i As Integer = k + 1 To ListaOsservazioni_ASK.Count - k - 2
            Dim mASK As Double = Me.MediaMobile(ListaOsservazioni_ASK, i)
            Dim sASK As Double = Me.sigma(ListaOsservazioni_ASK, i)
            Dim oASK As New Osservazione
            Dim s1ASK As New Osservazione
            Dim s2ASK As New Osservazione

            With oASK
                .Prezzo = mASK
                .Istante = ListaOsservazioni_ASK(i).Istante
            End With

            ListaMedieMobili_ASK.Add(oASK)

            With s1ASK
                .Prezzo = mASK + 2 * sASK
                .Istante = ListaOsservazioni_ASK(i).Istante
            End With

            ListaSigmaPositivi.Add(s1ASK)

            With s2ASK
                .Prezzo = mASK - 2 * sASK
                .Istante = ListaOsservazioni_ASK(i).Istante
            End With

            ListaSigmaNegativi.Add(s2ASK)

        Next

        '-----------------------
        'Media mobile prezzi BID
        '-----------------------

        For j As Integer = k + 1 To ListaOsservazioni_BID.Count - k - 2
            Dim mBID As Double = Me.MediaMobile(ListaOsservazioni_BID, j)
            Dim sBID As Double = Me.sigma(ListaOsservazioni_BID, j)
            Dim oBID As New Osservazione
            Dim s1BID As New Osservazione
            Dim s2BID As New Osservazione

            With oBID
                .Prezzo = mBID
                .Istante = ListaOsservazioni_BID(j).Istante
            End With

            ListaMedieMobili_BID.Add(oBID)

            With s1BID
                .Prezzo = mBID + 2 * sBID
                .Istante = ListaOsservazioni_BID(j).Istante
            End With

            ListaSigmaPositivi.Add(s1BID)

            With s2BID
                .Prezzo = mBID - 2 * sBID
                .Istante = ListaOsservazioni_BID(j).Istante
            End With

            ListaSigmaNegativi.Add(s2BID)

        Next

        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 listaDiPunti_MEDIA_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaMedieMobili_ASK)
        Dim listaDiPunti_MEDIA_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaMedieMobili_BID)

        'Dim listaDiPuntiSigmaPositivi As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaSigmaPositivi)
        'Dim ListaDiPuntiSigmaNegativi As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaSigmaNegativi)

        '------------------
        'Visualizzo margini
        '------------------

        g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))

        '----------------
        '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)

        'MEDIA BID
        Dim p_MEDIA_BID As New Pen(Color.Magenta, 1)
        g.DrawLines(p_MEDIA_BID, listaDiPunti_MEDIA_BID.ToArray)

        'MEDIA ASK
        Dim p_MEDIA_ASK As New Pen(Color.LightBlue, 1)
        g.DrawLines(p_MEDIA_ASK, listaDiPunti_MEDIA_ASK.ToArray)


        ''SIGMA POSITIVI
        'Dim p_SIGMAPOSITIVI As New Pen(Color.ForestGreen, 1)
        'g.DrawLines(p_SIGMAPOSITIVI, listaDiPuntiSigmaPositivi.ToArray)

        ''SIGMA NEGATIVI
        'Dim p_SIGMANEGATIVI As New Pen(Color.Cornsilk, 1)
        'g.DrawLines(p_SIGMANEGATIVI, ListaDiPuntiSigmaNegativi.ToArray)


        '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 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 h As Osservazione In ListaOsservazioni

            With h

                '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 h

        Dim ListaPunti As New List(Of Point)

        For Each o As Osservazione In ListaOsservazioni

            With o

                'Determinazione il punto
                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo

                'Trasformarmazione il punto per rappresentarlo sul bitmap
                Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)

                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)

                ListaPunti.Add(p)

            End With

        Next o

        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.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 Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged

        Me.k = Me.NumericUpDown1.Value

        Me.DisegnaGRafico()

    End Sub

    Public k As Integer

    Function MediaMobile(ByVal v As List(Of Osservazione), ByVal posizione As Integer)

        Dim somma As Double
        Dim media As Double
        Dim conta As Double

        For i As Integer = posizione - k To posizione + k
            somma += v(i).Prezzo
            conta += 1
        Next

        media = somma / conta

        Return media

    End Function

    Function sigma(ByVal v As List(Of Osservazione), ByVal posizione As Integer)
        Dim somma As Double
        Dim media As Double
        Dim conta As Double
        Dim Scarti As Double
        Dim scartiQuadrati As Double
        Dim varianza As Double
        Dim deviazione As Double

        For i As Integer = posizione - k To posizione + k
            somma += v(i).Prezzo
            conta += 1
            media = somma / conta
            Scarti = v(i).Prezzo - media
            scartiQuadrati = Scarti ^ 2
            varianza = scartiQuadrati / conta

        Next

        deviazione = Math.Sqrt(varianza)

        Return deviazione

    End Function

    Public Class Osservazione

        Public Istante As Date
        Public TipoPrezzo As Integer
        Public Prezzo As Decimal

    End Class
End Class

Nessun commento:

Posta un commento

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