Is there a built-in way or could anybody point me to the right direction to go about creating Ichimoku cloud areas in [presumably] RadChart. For clarification, there's essentially two line series, one green, one red. When the red one's higher, the area between the two is highlighted red, when the green one's higher the area between's highlighted green.
Text version follows; R = red line, r = red shading, G = green line, g = green shading
RRRRRRRR GGGGGG
rrrrrrrrrrrrrrrrrRRRRRRR GGGGGgggggggg
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrRR GGGGggggggggggggggg
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrRGGGGgggggggggggggggggRRR
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrGGGRggggggggggggggRRRRR
GGGGGGGGGGGGGG RRRRRRRRRRR
Any help/pointers will be much appreciated.
Justin
Text version follows; R = red line, r = red shading, G = green line, g = green shading
RRRRRRRR GGGGGG
rrrrrrrrrrrrrrrrrRRRRRRR GGGGGgggggggg
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrRR GGGGggggggggggggggg
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrRGGGGgggggggggggggggggRRR
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrGGGRggggggggggggggRRRRR
GGGGGGGGGGGGGG RRRRRRRRRRR
Any help/pointers will be much appreciated.
Justin
4 Answers, 1 is accepted
0
Justin
Top achievements
Rank 1
answered on 10 Feb 2012, 01:08 PM
FWIW I've gone down a route of overlaid area chart series. This works so long as values remain positive, but fails where one of the values is positive and one's negative.
I've posted code to date, suggestions to further deal with the above issue would be great (more from a puritanical desire than a must have need as I don't expect the issue is consequential to my use case).
I've posted code to date, suggestions to further deal with the above issue would be great (more from a puritanical desire than a must have need as I don't expect the issue is consequential to my use case).
using System;using System.Collections.Generic;using System.Windows;using System.Windows.Documents;using System.Windows.Media;namespace IchimokuCloudArea{ public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List<IchimokuCloudDataPoint> dataPoints = new List<IchimokuCloudDataPoint>(); dataPoints.Add(new IchimokuCloudDataPoint(0, 4, 3)); dataPoints.Add(new IchimokuCloudDataPoint(1, 5, 3)); dataPoints.Add(new IchimokuCloudDataPoint(2, 5, 3)); dataPoints.Add(new IchimokuCloudDataPoint(3, 6, 2)); dataPoints.Add(new IchimokuCloudDataPoint(4, 6, 1)); dataPoints.Add(new IchimokuCloudDataPoint(5, 7, -1)); dataPoints.Add(new IchimokuCloudDataPoint(6, 8, 0)); dataPoints.Add(new IchimokuCloudDataPoint(7, 7, 1)); dataPoints.Add(new IchimokuCloudDataPoint(8, 6, 3)); dataPoints.Add(new IchimokuCloudDataPoint(9, 6, 4)); dataPoints.Add(new IchimokuCloudDataPoint(10, 5, 5)); dataPoints.Add(new IchimokuCloudDataPoint(11, 4, 5)); dataPoints.Add(new IchimokuCloudDataPoint(12, 3, 6)); dataPoints.Add(new IchimokuCloudDataPoint(13, 2, 6)); dataPoints.Add(new IchimokuCloudDataPoint(14, 2, 7)); dataPoints.Add(new IchimokuCloudDataPoint(15, 2, 8)); dataPoints.Add(new IchimokuCloudDataPoint(16, 1, 9)); dataPoints.Add(new IchimokuCloudDataPoint(17, 0, 10)); dataPoints.Add(new IchimokuCloudDataPoint(18, -1, 10)); dataPoints.Add(new IchimokuCloudDataPoint(19, -2, 9)); dataPoints.Add(new IchimokuCloudDataPoint(20, -2, 6)); Telerik.Windows.Controls.Charting.DataSeries redSeries = IchimokuSeries(Brushes.LightSalmon); Telerik.Windows.Controls.Charting.DataSeries greenSeries = IchimokuSeries(Brushes.LightGreen); Telerik.Windows.Controls.Charting.DataSeries baseSeries = IchimokuSeries(Brushes.White); baseSeries.Definition.LegendDisplayMode = Telerik.Windows.Controls.Charting.LegendDisplayMode.None; foreach (IchimokuCloudDataPoint dp in dataPoints) { greenSeries.Add(dp.GreenDataPoint); redSeries.Add(dp.RedDataPoint); baseSeries.Add(dp.BaseDataPoint); } this.radchart1.DefaultView.ChartArea.DataSeries.Add(redSeries); this.radchart1.DefaultView.ChartArea.DataSeries.Add(greenSeries); this.radchart1.DefaultView.ChartArea.DataSeries.Add(baseSeries); } private Telerik.Windows.Controls.Charting.DataSeries IchimokuSeries(Brush brush) { Telerik.Windows.Controls.Charting.DataSeries result = new Telerik.Windows.Controls.Charting.DataSeries(); Telerik.Windows.Controls.Charting.AreaSeriesDefinition asd = new Telerik.Windows.Controls.Charting.AreaSeriesDefinition(); asd.ShowPointMarks = false; asd.ShowItemLabels = false; asd.ShowItemToolTips = true; result.Definition = asd; result.Definition.Appearance.Fill = brush; return result; } } public class IchimokuCloudDataPoint { public Double X; public Double RedY; public Double GreenY; public Double BaseY { get { return Math.Min(RedY, GreenY); } } public IchimokuCloudDataPoint(Double x, Double redY, Double greenY) { X = x; RedY = redY; GreenY = greenY; } public Telerik.Windows.Controls.Charting.DataPoint RedDataPoint { get { return new Telerik.Windows.Controls.Charting.DataPoint(X, RedY); } } public Telerik.Windows.Controls.Charting.DataPoint GreenDataPoint { get { return new Telerik.Windows.Controls.Charting.DataPoint(X, GreenY); } } public Telerik.Windows.Controls.Charting.DataPoint BaseDataPoint { get { return new Telerik.Windows.Controls.Charting.DataPoint(X, BaseY); } } }}0
Accepted
Hello Justin,
Why don't you try to use Range Series Definitions and modify your code as follows:
You will get the result in the attached image.
Greetings,
Sia
the Telerik team
Why don't you try to use Range Series Definitions and modify your code as follows:
- Creating the range series:
Telerik.Windows.Controls.Charting.DataSeries rangeSeries1 = IchimokuSeries(Brushes.LightSalmon);Telerik.Windows.Controls.Charting.DataSeries rangeSeries2 = IchimokuSeries(Brushes.LightGreen);- adding data points to them:
foreach (IchimokuCloudDataPoint dp in dataPoints){ if (dp.GreenDataPoint.YValue >= dp.RedDataPoint.YValue) { rangeSeries2.Add(new DataPoint() { XValue = dp.X, High = dp.GreenDataPoint.YValue, Low = dp.RedDataPoint.YValue }); } if (dp.GreenDataPoint.YValue <= dp.RedDataPoint.YValue) { rangeSeries1.Add(new DataPoint() { XValue = dp.X, High = dp.RedDataPoint.YValue, Low = dp.GreenDataPoint.YValue }); }}You will get the result in the attached image.
Greetings,
Sia
the Telerik team
Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
0
Justin
Top achievements
Rank 1
answered on 16 Feb 2012, 06:38 PM
Excellent, that's exactly the sort of pointer I needed - hadn't found the RangedDataSeries myself. In addition to your pointer I needed to pull out a few dusty trigonometry functions to locate and add more points to cover zero intercepts, crossovers and inversions to get the right shape on the cloud but all working now.
The code's got a lot bigger so not posting this time the full working version; pity zip's aren't allowed as attachments. If you're interested, ask.
Many thanks again!
The code's got a lot bigger so not posting this time the full working version; pity zip's aren't allowed as attachments. If you're interested, ask.
Many thanks again!
0
Hi Justin,
I am glad to hear that now everything works as expected.
Kind regards,
Sia
the Telerik team
I am glad to hear that now everything works as expected.
Kind regards,
Sia
the Telerik team
Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>