vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
ChartControl Skalierung 
Autor: Maas
Datum: 12.04.09 17:50

Hallo,

Ich versuche mich gerade an meinem eigenen ChartControl. Bisher habe ich zwei Images. Im unteren wird der komplette Chart gezeichnet. Man kann im unteren Image einen rechteckigen Bereich auswählen. Dieser wird dann im oberen abgebildet. Als Datenbasis dient mir eine DataTable. Die Table wird durch die YahooFinance-API gefüllt. Es gibt von Januar 2000 bis zum jüngsten Handelstag eine Row pro Handelstag. (BASF-Daten)

Ein Bild sagt mehr als tausend Worte:



Jetzt möchte ich eine Skalierung zeichnen, erstmal nur die X-Achse also die Zeit-Werte. Eine statische Skalierung mit daran angepassten Datumswerten wäre kein Problem. Ich möchte es aber genau anders herum. Die Skalierung soll sich "gewissermaßen intelligent" verhalten, also an die Datumswerte im ausgewählten Bereich anpassen. Den Bereich stelle ich intern über Prozentwerte dar(beginX,endX,beginY,endY -> 0 bis 1).
Wenn z.B. der Bereich ein Jahr ist soll er am ersten Handelstag jedes zweiten Monats eine Linie zeichnen (die Funktion an sich soll bloß eine Liste mit Prozentwerten zurückgeben, nichts zeichnen).
Ich habe schon so einiges ausprobiert, aber im Endeffekt hat alles nicht wirklich was gebracht oder war zu Ressourcenfressend.
Hier mal ein Ansatz:
    Private Function ScaleDatePercents(ByVal perc1 As Double, ByVal perc2 As _
      Double) As Double()
        Dim lst As New List(Of Double)
        Dim totalDays As Integer = (GetDateAtPercent(perc2) - GetDateAtPercent( _
          perc1)).TotalDays
        Const month As Double = 30.4375 ' 365,25 / 12
 
        If totalDays <= 1 * month Then
            '...
        ElseIf totalDays > 1 * month AndAlso totalDays <= 2 * month Then
            '...
        ElseIf totalDays > 2 * month AndAlso totalDays <= 6 * month Then
            '...
        ElseIf totalDays > 6 * month AndAlso totalDays <= 10 * month Then
            '...
        ElseIf totalDays > 10 * month AndAlso totalDays <= 14 * month Then
            Dim startIndex As Integer = CInt((table.Rows.Count - 1) * perc1)
            Dim endIndex As Integer = CInt((table.Rows.Count - 1) * perc2)
            Dim i As Integer = startIndex
            Do
                i += 1
            Loop Until CDate(table.Rows(i)("Date")).Day < CDate(table.Rows(i - _
              1)("Date")).Day
 
            Dim p As Double = (i - startIndex) / (endIndex - startIndex) 'der 
            ' erste Handelstag im ersten "angefangenen" Monat als Prozentwert 
            ' des Bereichs
            lst.Add(p)
 
            '...
        Else
            '...
        End If
 
        '...
 
        Return lst.ToArray
    End Function
Hilfsfunktionen:
    Private Function GetDateAtPercent(ByVal percent As Double) As Date
        Return CDate(table.Rows(CInt((table.Rows.Count - 1) * percent))("Date"))
    End Function
Imports System.Net
Imports System.Data
 
    Public Function DownloadData() As DataTable
        If Not IO.File.Exists(My.Computer.FileSystem.SpecialDirectories.Temp & _
          "\Schema.ini") Then
            Dim s As String = "[table.csv]" & vbCrLf & "ColNameHeader=TRUE" & _
            vbCrLf & "DecimalSymbol=." & vbCrLf & "Format=Delimited(,)"
            IO.File.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Temp _
            & "\Schema.ini", s)
        End If
        Dim wc As New WebClient
        Dim url As String = _
          "http://ichart.yahoo.com/table.csv?s=BAS.DE&a=00&b=3&c=2000&d=03&e=1" & _
          "&f=2009&g=d&ignore=.csv"
        wc.DownloadFile(New Uri(url), _
        My.Computer.FileSystem.SpecialDirectories.Temp & "\table.csv")
        Dim connectionStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data" & _
        "Source=" & My.Computer.FileSystem.SpecialDirectories.Temp & ";Extended" & _
        "Properties=""text;HDR=YES;FMT=Delimited"""
        Dim dataSet = New DataSet
        Dim connection As New OleDb.OleDbConnection(connectionStr)
        Dim dataAdapter As New OleDb.OleDbDataAdapter("select * from" & _
          "[table.csv]", connection)
        dataAdapter.Fill(dataSet)
        connection.Close()
        Return dataSet.Tables(0)
    End Function
Ich könnte jetzt noch mit weiteren Schleifen die anderen ersten Handelstage herausfinden, aber ehrlich gesagt ist das doch alles Mist. Solch eine Table hat ca. 2400 Datensätze. Wenn perc1 = 0 und perc2 = 1 ist, dann dauert das doch eine halbe Ewigkeit. Die Funktion ist ja nur ein kleiner Teil des Zeichenvorgangs. Ich kann die weiteren Punkte auch nicht wirklich brechnen, da es ja 5 Tage/Woche sind und es auch in unregelmäßigen Abständen Tage gibt an denen die Börse geschlossen hatte.

Ich hoffe jemand von euch kennt eine bessere Methode.

Frohe Ostern noch

Maas

Beitrag wurde zuletzt am 12.04.09 um 18:01:51 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
ChartControl Skalierung3.518Maas12.04.09 17:50
Re: ChartControl Skalierung2.595Snof12.04.09 23:59
Re: ChartControl Skalierung2.414Maas13.04.09 01:38
Re: ChartControl Skalierung2.690Maas10.05.09 20:28
Re: ChartControl Skalierung2.449Snof11.05.09 10:25
Re: ChartControl Skalierung2.403Maas11.05.09 17:43

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel