giovedì 28 ottobre 2010

Medie mobili (Clarissa Mattia&Alessia Rossi&FabioLazzarini)



Public Class Form1

    Private b As Bitmap
    Private g As Graphics

    Private MargineSinistro As Integer = 65
    Private MargineDestro As Integer = 40

    Private MargineAlto As Integer = 30
    Private MargineBasso As Integer = 30

    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 MedieMobili_BID As List(Of Osservazione)
    Dim MedieMobili_ASK As List(Of Osservazione)
    Public numeroinput As Integer

    Dim Tempo As Double


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



        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)


        Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")

        ListaOsservazioni_BID = New List(Of Osservazione)
        ListaOsservazioni_ASK = New List(Of Osservazione)
        MedieMobili_BID = New List(Of Osservazione)
        MedieMobili_ASK = New List(Of Osservazione)

        For Each Riga As String In RigheDelFile

            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
            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


        For i As Integer = numeroinput + 1 To ListaOsservazioni_ASK.Count - numeroinput - 2
            Dim m As Double = Double.Parse(CStr(Me.MediaMobile(ListaOsservazioni_ASK, i)))

            Dim o As New Osservazione

            With o
                .Prezzo = CDec(m)
                .Istante = ListaOsservazioni_ASK(i).Istante
            End With

            MedieMobili_ASK.Add(o)

        Next



        For j As Integer = numeroinput + 1 To ListaOsservazioni_BID.Count - numeroinput - 2
            Dim m As Double = Double.Parse(CStr(Me.MediaMobile(ListaOsservazioni_BID, j)))
            Dim o As New Osservazione

            With o
                .Prezzo = CDec(m)
                .Istante = ListaOsservazioni_BID(j).Istante
            End With

            MedieMobili_BID.Add(o)


        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)

        Dim MEDIA_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(MedieMobili_ASK)
        Dim MEDIA_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(MedieMobili_BID)


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

        Dim puntibid As New Pen(Color.Blue, 3)
        g.DrawLines(puntibid, MEDIA_BID.ToArray)

        Dim puntiask As New Pen(Color.DarkMagenta, 3)
        g.DrawLines(puntiask, MEDIA_ASK.ToArray)

         Me.DrawPriceRuler()

        Me.PictureBox1.Image = b

    End Sub


    Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)


        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

                If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
                If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo

                Tempo = .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

                                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo

                              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 P As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
        Dim Prezzo As Double = Me.MinimoPrezzo

        Do
            Prezzo += P
            If Prezzo > Me.MassimoPrezzo Then Exit Do

            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)

            Me.g.DrawString((CInt(Prezzo)).ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro - 50, 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.numeroinput = CInt(Me.NumericUpDown1.Value)

        Me.DisegnaGRafico()

    End Sub



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

        Dim somma As Double
        Dim media As Double
        Dim c As Double

        For i As Integer = p - numeroinput To p + numeroinput
            somma += v(i).Prezzo
            c += 1
        Next

        media = somma / c

        Return media

    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.