1: public static Telerik.Reporting.Chart CompareTwoStocks()
2: {
3: Telerik.Reporting.Chart mychart = new Telerik.Reporting.Chart();
4: mychart.Skin = "Office2007";
5: string[] Stocks = new string[] { "MSFT", "AAPL"};
6: System.Drawing.Color[] seriesColor = new Color[]{ Color.Red, Color.Blue };
7: List<HistoricalStock>[] stockitems = new List<HistoricalStock>[2];
8:
9: int size = 0;
10: foreach(string symbol in Stocks)
11: {
12: stockitems[size++] = new List<HistoricalStock>(YahooHistoricalLoader.DownloadData(symbol, 2012).Where(f => f.Date >= new DateTime(2012, 1, 1)).OrderBy(t => t.Date).Select(m => m));
13: }
14:
15: #region XAxis and YAxis Labels
16: mychart.PlotArea.XAxis.AxisLabel.TextBlock.Visible = true;
17: mychart.PlotArea.YAxis.AxisLabel.TextBlock.Visible = true;
18: mychart.PlotArea.XAxis.AxisLabel.Visible = true;
19: mychart.PlotArea.YAxis.AxisLabel.Visible = true;
20: mychart.PlotArea.XAxis.AxisLabel.TextBlock.Text = "Period";
21: mychart.PlotArea.YAxis.AxisLabel.TextBlock.Text = "Price Per Share ($)";
22: mychart.PlotArea.XAxis.AxisLabel.Appearance.Position.Auto = true;
23: mychart.PlotArea.YAxis.AxisLabel.Appearance.Position.Auto = true;
24: #endregion
25:
26: mychart.ChartTitle.TextBlock.Text = string.Join(" Vs. ", Stocks);
27: mychart.ChartTitle.TextBlock.Appearance.TextProperties.Color = Color.Blue;
28: #region Generate Chart Series
29: for (int i = 0; i < size; i++)
30: {
31: ChartSeries series = new ChartSeries();
32: int seriesItemPosition = 0;
33: foreach (HistoricalStock hs in stockitems[i])
34: {
35: ChartSeriesItem seriesItem = new ChartSeriesItem();
36: seriesItem.YValue = hs.Close;
37: seriesItem.XValue = seriesItemPosition++;
38: //seriesItem.Appearance.FillStyle.MainColor = seriesColor[i];
39: // Hide the Graph Values on Series Item
40: seriesItem.Label.TextBlock.Visible = false;
41: series.Items.Add(seriesItem);
42: }
43: series.YAxisType = (i == 0) ? ChartYAxisType.Primary : ChartYAxisType.Secondary;
44: series.Appearance.FillStyle.MainColor = seriesColor[i];
45: series.Name = Stocks[i];
46: series.Appearance.LegendDisplayMode = ChartSeriesLegendDisplayMode.Nothing;
47: series.Type = ChartSeriesType.Spline;
48: mychart.Series.Add(series);
49:
50: }
51: #endregion
52:
53: #region Custom Legend
54: int seq = 0;
55: foreach (string symbol in Stocks)
56: {
57: LabelItem LegenItem = new LabelItem();
58: LegenItem.Marker.Visible = true;
59: LegenItem.Marker.Appearance.Figure = Telerik.Reporting.Charting.Styles.DefaultFigures.Rectangle;
60: LegenItem.Marker.Appearance.FillStyle.MainColor = seriesColor[seq++];
61: LegenItem.Marker.Appearance.FillStyle.FillType = Telerik.Reporting.Charting.Styles.FillType.Solid;
62: LegenItem.TextBlock.Text = symbol;
63:
64: mychart.Legend.Items.Add(LegenItem);
65: }
66: #region Legend Location
67: mychart.Legend.Appearance.Location = Telerik.Reporting.Charting.Styles.LabelLocation.OutsidePlotArea;
68: mychart.Legend.Appearance.Overflow = Telerik.Reporting.Charting.Styles.Overflow.Row;
69: mychart.Legend.Appearance.Position.AlignedPosition = Telerik.Reporting.Charting.Styles.AlignedPositions.Bottom;
70: #endregion
71: #endregion
72: #region EliminateGridlines
73: mychart.PlotArea.YAxis.Appearance.MajorGridLines.Visible = false;
74: mychart.PlotArea.YAxis.Appearance.MinorGridLines.Visible = false;
75: mychart.PlotArea.XAxis.Appearance.MajorGridLines.Visible = false;
76: mychart.PlotArea.XAxis.Appearance.MinorGridLines.Visible = false;
77: #endregion
78:
79: #region Conguring XAxis
80: mychart.PlotArea.XAxis.Appearance.MinorTick.Visible = false;
81: mychart.PlotArea.XAxis.Appearance.MajorTick.Visible = false;
82: mychart.PlotArea.XAxis.Appearance.TextAppearance.TextProperties.Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 6, FontStyle.Regular);
83: mychart.PlotArea.XAxis.LayoutMode = Telerik.Reporting.Charting.Styles.ChartAxisLayoutMode.Between;
84: mychart.PlotArea.XAxis.IsZeroBased = true;
85: mychart.PlotArea.XAxis.AutoScale = false;
86: mychart.PlotArea.XAxis.AddRange(1, stockitems[0].Count(), 1);
87: int sequence = 0;
88: foreach (HistoricalStock h in stockitems[0])
89: {
90:
91: mychart.PlotArea.XAxis[sequence].TextBlock.Text = h.Date.ToString("MMM, yyyy");
92: mychart.PlotArea.XAxis[sequence].TextBlock.Visible = false;
93:
94: //if (sequence > 0 && sequence % 50 == 0)
95: //{
96: // //mychart.PlotArea.XAxis[sequence].TextBlock.Visible = true;
97: // mychart.PlotArea.XAxis[sequence].Appearance.RotationAngle = 45f;
98:
99: //}
100: sequence++;
101:
102: }
103:
104: #endregion
105:
106: #region Scaling Chart YAxis
107: Double MaxValue = stockitems[0].Select(p => p.Close).Max() + 5;
108: Double MinValue = stockitems[0].Select(p => p.Close).Min() - 5;
109: mychart.PlotArea.YAxis.IsZeroBased = false;
110: mychart.PlotArea.YAxis.AutoScale = false;
111: mychart.PlotArea.YAxis.AddRange(MinValue, MaxValue, 5);
112: /// second
113: Double MaxValue2 = stockitems[1].Select(p => p.Close).Max() + 5;
114: Double MinValue2 = stockitems[1].Select(p => p.Close).Min() - 5;
115: mychart.PlotArea.YAxis2.IsZeroBased = false;
116: mychart.PlotArea.YAxis2.AutoScale = false;
117: mychart.PlotArea.YAxis2.AddRange(MinValue2, MaxValue2, 50);
118: #endregion
119:
120: #region Zonification
121: int[] ZoningSize = stockitems[0].GroupBy(p => p.Date.Month).Select(t => t.Count()).ToArray();
122: int counter = 0;
123: int monthSeq = 1;
124: foreach (int z in ZoningSize)
125: {
126: ChartMarkedZone zone = new ChartMarkedZone();
127: zone.ValueStartX = counter;
128: zone.ValueEndX = counter + z;
129: counter = counter + z;
130: zone.Label.TextBlock.Text = new DateTime(2012, monthSeq, 1).ToString("MMM");
131: zone.Appearance.Border.Color = Color.LightBlue;
132: zone.Label.Appearance.Position.AlignedPosition = Telerik.Reporting.Charting.Styles.AlignedPositions.Bottom;
133: zone.Label.TextBlock.Appearance.TextProperties.Font = new System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 5, FontStyle.Bold);
134: monthSeq++;
135: mychart.PlotArea.MarkedZones.Add(zone);
136: }
137: #endregion
138:
139: #region Chart Location and Customization
140: Telerik.Reporting.Drawing.Unit Height = new Telerik.Reporting.Drawing.Unit(8, ((Telerik.Reporting.Drawing.UnitType)(Telerik.Reporting.Drawing.UnitType.Cm)));
141: Telerik.Reporting.Drawing.Unit Width = new Telerik.Reporting.Drawing.Unit(15, ((Telerik.Reporting.Drawing.UnitType)(Telerik.Reporting.Drawing.UnitType.Cm)));
142: mychart.PlotArea.XAxis.AutoShrink = false;
143: mychart.Size = new Telerik.Reporting.Drawing.SizeU(Width, Height);
144: mychart.Location = new Telerik.Reporting.Drawing.PointU(new Telerik.Reporting.Drawing.Unit(0.32, ((Telerik.Reporting.Drawing.UnitType)(Telerik.Reporting.Drawing.UnitType.Cm))), new Telerik.Reporting.Drawing.Unit(0.8, ((Telerik.Reporting.Drawing.UnitType)(Telerik.Reporting.Drawing.UnitType.Cm))));
145:
146: #region Reposition XAxis Label
147: mychart.PlotArea.XAxis.AxisLabel.Appearance.Position.Auto = false;
148: mychart.PlotArea.XAxis.AxisLabel.Appearance.Position.X = 320;
149: mychart.PlotArea.XAxis.AxisLabel.Appearance.Position.Y = 320;
150: #endregion
151: #region Reposition Graph
152: mychart.PlotArea.Appearance.Dimensions.Margins.Bottom = 90;
153: mychart.PlotArea.Appearance.Dimensions.Margins.Right = 80;
154: mychart.PlotArea.Appearance.Dimensions.Margins.Left = 90;
155: #endregion
156: #endregion
157:
158: return mychart;
159: }