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