ZedGraph масштаб все перепутал - PullRequest
2 голосов
/ 16 января 2012

Использование ZedGraph для отображения цены с течением времени.Очевидно, что я делаю что-то не так при настройке графика.Есть идеи?

Вот код, который я делаю

private void Form1_Load(object sender, EventArgs e)
{
    myPane = zgc.GraphPane;

    // Set the Titles
    myPane.Title.Text = "Forex";
    myPane.XAxis.Title.Text = "Date/Time";
    myPane.YAxis.Title.Text = "Price";

    myPane.XAxis.Type = AxisType.Date;
    myPane.XAxis.Scale.MajorUnit = DateUnit.Minute;
    myPane.XAxis.Scale.Format = "T";
}

private void QueryDB(ref PointPairList lst)
{
    if (connection == null)
        connection = new MySql.Data.MySqlClient.MySqlConnection(connStr);

    try
    {
        if (connection.State == ConnectionState.Closed)
            connection.Open();

        string pair = cboPair.Text;
        string sql = "SELECT bid, ask, price_datetime FROM forex.prices WHERE pair='" + pair + "' and price_datetime > (NOW() - INTERVAL 1 MINUTE) ORDER BY price_datetime desc;";
        MySqlCommand cmd = new MySqlCommand(sql, connection);
        MySqlDataReader rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {
            DateTime tm = rdr.GetDateTime("price_datetime");
            double bid = rdr.GetDouble("bid");
            lst.Add(tm.ToOADate(), bid);
        }
        rdr.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
    }
}

private void cmdRefresh_Click(object sender, EventArgs e)
{
    PointPairList bidPrice = new PointPairList();

    QueryDB(ref bidPrice);

    LineItem myCurve = myPane.AddCurve("Bid", bidPrice, Color.Red);

    myPane.YAxis.Scale.MinAuto = true;
    myPane.YAxis.Scale.MaxAuto = true;

    myPane.XAxis.Scale.MinAuto = true;
    myPane.XAxis.Scale.MaxAuto = true;

    zgc.AxisChange();

    // just points not lines. bigger points and colored based on
    // buy or sell. red for sell, green for buy
    //PointPairList tradeEntries = new PointPairList();
}

Ответы [ 2 ]

1 голос
/ 16 января 2012

после прочтения вашего кода я нашел фрагмент кода, который не выглядел правильно для значения zedgraph.

lst.Add(tm.ToOADate(), bid);

вам нужно проанализировать дату в OADate?если вы сделаете это XDate, вы можете использовать его как double

XDate tm = rdr.GetDateTime("price_datetime");
double bid = rdr.GetDouble("bid");
lst.Add((double)tm, bid);
0 голосов
/ 18 января 2012

Один из вариантов - использовать другой тип оси: myPane.XAxis.Type = AxisType.DateAsOrdinal -> вместо AxisType.Date

Это означает, что все точки на графике будутбыть равномерно распределены по оси X.ZedGraph не будет использовать дату / время для определения значений X точки, но вы все равно сможете ее увидеть (всплывающая подсказка, может быть, также на метках оси)

Кроме того, возможно, вам нужноустановите myPane.XAxis.Scale.MinorUnit в DateUnit. Во-вторых, я не знаю

удачи

...