2012-10-19 23 views
7

Sono in missione per creare un grafico a candela utilizzando MSChart in un modulo di Windows. Sono già riuscito a creare un grafico a barre 3D senza problemi. Ma dopo una lunga ricerca su internet, il codice sorgente di Microsoft (WinSamples) e un sacco di headscratching non riesco a trovare il modo giusto per creare un grafico a candela.Candlestick valori Y multipli

Quello che potrebbe aiutarmi è un chiaro esempio di aggiunta di una serie al grafico con più valori Y o una correzione del mio codice (quando eseguo, il debug non mostra nulla per l'etichetta della legenda).

Un bonus sarebbe che l'esempio è basato su OleDB (i miei valori sono in un database di Access).

Quindi la mia domanda: se hai esperienza con la creazione di un grafico a Candela in C# in un modulo di Windows puoi darmi un suggerimento o (ancora meglio) puoi fornirmi un codice C#?

Ecco il mio attuale (non funzionante) Codice:

using System.Windows.Forms.DataVisualization.Charting; 
public partial class CandleStick : Form 
{ 
    public CandleStick() 
    { 
     InitializeComponent(); 
    } 

    private void CandleStick_Load(object sender, EventArgs e) 
    { 
     GrafiekLaden(); 
    } 

    public void GrafiekLaden() 
    { 

     Koers k = new Koers(); 
     // This method fills up a list, the data comes from my database 
     // it contains Date, High, Low, Open, Close 
     k.meerdereOphalen(); 

     Series price = new Series(); 
     chart1.Series.Add(price); 

     // Set series chart type 
     chart1.Series["price"].ChartType = SeriesChartType.Candlestick; 

     // Set the style of the open-close marks 
     chart1.Series["price"]["OpenCloseStyle"] = "Triangle"; 

     // Show both open and close marks 
     chart1.Series["price"]["ShowOpenClose"] = "Both"; 

     // Set point width 
     chart1.Series["price"]["PointWidth"] = "1.0"; 

     // Set colors bars 
     chart1.Series[0]["PriceUpColor"] = "Green"; 
     chart1.Series[0]["PriceDownColor"] = "Red"; 

     for (int i = 0; i < k.Lijst.Count; i++) 
     { 
      // adding date and high 
      chart1.Series["price"].Points.AddXY(DateTime.Parse(k.Lijst[i].Datum), k.Lijst[i].Hoog); 
      // adding low 
      chart1.Series["price"].Points[i].YValues[1] = k.Lijst[i].Laag; 
      //adding open 
      chart1.Series["price"].Points[i].YValues[2] = k.Lijst[i].PrijsOpen; 
      // adding close 
      chart1.Series["price"].Points[i].YValues[3] = k.Lijst[i].PrijsGesloten; 
     } 
    } 

risposta

11

Il codice aggiunge un "prezzo" Series non di nome, allora sia Series["price"] e Series[0] che non sarà la stessa cosa se altre serie già esistono riferimenti . Ho eseguito una versione leggermente modificata (falsi dati DB con un List<>) senza alcun problema. Dovresti verificare che i dati provenienti dal tuo DB siano ok.

enter image description here

public partial class Form3 : Form 
{ 
    public Form3() 
    { 
     InitializeComponent(); 
    } 

    private void CandleStick_Load(object sender, EventArgs e) 
    { 
     GrafiekLaden(); 
    } 

    public void GrafiekLaden() 
    { 
     // fake the DB data with a simple list 
     List<dbdata> k = new List<dbdata> { 
      new dbdata("1/1/2012", 10f, 8f, 9f, 9.5f), 
      new dbdata("2/1/2012", 15F, 10F, 12F, 13F), 
      new dbdata("3/1/2012", 5F, 10F, 8F, 6F), 
      new dbdata("4/1/2012", 25F, 10F, 18F, 16F) 
     }; 

     Series price = new Series("price"); // <<== make sure to name the series "price" 
     chart1.Series.Add(price); 

     // Set series chart type 
     chart1.Series["price"].ChartType = SeriesChartType.Candlestick; 

     // Set the style of the open-close marks 
     chart1.Series["price"]["OpenCloseStyle"] = "Triangle"; 

     // Show both open and close marks 
     chart1.Series["price"]["ShowOpenClose"] = "Both"; 

     // Set point width 
     chart1.Series["price"]["PointWidth"] = "1.0"; 

     // Set colors bars 
     chart1.Series["price"]["PriceUpColor"] = "Green"; // <<== use text indexer for series 
     chart1.Series["price"]["PriceDownColor"] = "Red"; // <<== use text indexer for series 

     for (int i = 0; i < k.Count; i++) 
     { 
      // adding date and high 
      chart1.Series["price"].Points.AddXY(DateTime.Parse(k[i].Datum), k[i].Hoog); 
      // adding low 
      chart1.Series["price"].Points[i].YValues[1] = k[i].Laag; 
      //adding open 
      chart1.Series["price"].Points[i].YValues[2] = k[i].PrijsOpen; 
      // adding close 
      chart1.Series["price"].Points[i].YValues[3] = k[i].PrijsGesloten; 
     } 
    } 
} 

class dbdata 
{ 
    public string Datum; 
    public float Hoog; 
    public float Laag; 
    public float PrijsOpen; 
    public float PrijsGesloten; 
    public dbdata(string d, float h, float l, float o, float c) { Datum = d; Hoog = h; Laag = l; PrijsOpen = o; PrijsGesloten = c; } 
} 
+0

Grazie mille! Si scopre che il mio database ha restituito alcuni valori vuoti (risolto quello) E con i tuoi suggerimenti/correzioni extra sono finalmente riuscito a creare il mio grafico a candele. U sono i migliori! – Jens

Problemi correlati