Public Class Form1
Private b As Bitmap
Private g As Graphics
Private MargineSinistro As Integer = 60
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("lucida", 9, 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)
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)
ListaMedieMobili_BID = New List(Of Osservazione)
ListaMedieMobili_ASK = New List(Of Osservazione)
' Scorre ogni riga del file di prezzi e memorizza le oss. Bid ed Asl
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
' Media mobili _BID
For i As Integer = k + 1 To ListaOsservazioni_BID.Count - k - 2
Dim mm_BID As Double = Me.MediaMobile(ListaOsservazioni_BID, i)
Dim oss_BID As New Osservazione
With oss_BID
.Prezzo = mm_BID
.Istante = ListaOsservazioni_BID(i).Istante
End With
ListaMedieMobili_BID.Add(oss_BID)
Next
' Media mobili _ASK
For i As Integer = k + 1 To ListaOsservazioni_ASK.Count - k - 2
Dim mm_ASK As Double = Me.MediaMobile(ListaOsservazioni_ASK, i)
Dim oss_ASK As New Osservazione
With oss_ASK
.Prezzo = mm_ASK
.Istante = ListaOsservazioni_ASK(i).Istante
End With
ListaMedieMobili_ASK.Add(oss_ASK)
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)
'Visualizzo margini
g.DrawRectangle(Pens.Black, 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.Olive, 2)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
'ASK
Dim p_ASK As New Pen(Color.Gray, 2)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
' Media_BID
Dim p_MEDIA_BID As New Pen(Color.DarkOliveGreen, 1)
g.DrawLines(p_MEDIA_BID, listaDiPunti_MEDIA_BID.ToArray)
' Media_ASK
Dim p_MEDIA_ASK As New Pen(Color.DarkGray, 1)
g.DrawLines(p_MEDIA_ASK, listaDiPunti_MEDIA_ASK.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)
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
'Trovo il minimo ed il massimo per gestire la grafica
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)
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 Osservazione
Return ListaPunti
End Function
'rende la X relativa per usarla nel grafico
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
'rende la Y relativa per usarla nel grafico
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
Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Red, 0, 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
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
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.