using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace ChartSample { public partial class Form1 : Form { public class SimpleCandleSeries { public string Name { get; set; } public List Series { get; set; } } public class SimpleCandle { public decimal High { get; set; } public decimal Low { get; set; } public decimal Open { get; set; } public decimal Close { get; set; } public decimal Volume { get; set; } public DateTime dateTime { get; set; } } Random rnd = new Random(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Random candledata var data = new SimpleCandleSeries() { Name = "CandleData", Series = new List() }; decimal initopen = 10m; for (int i = 0; i < 120; i++) { if (i > 0) { initopen = data.Series[i - 1].Close; } int randompricechange = rnd.Next(-6, 8); data.Series.Add(new SimpleCandle() { dateTime = DateTime.Now.AddHours(i), Open = initopen, Close = initopen+ randompricechange, High = initopen+1, Low = initopen + randompricechange - 1, Volume = 1m }); } //Paint candles CandleMain(data); //calc ema List CandleAsSkendersQuote = ConvertToSkendersQuote(data); List emaresult = Skender.Stock.Indicators.Indicator.GetEma(CandleAsSkendersQuote, 2).ToList(); var decimals = emaresult.Select(f => f.Ema.GetValueOrDefault()).ToList(); //paint ema PaintDecimalSeries("EMA ", decimals); } public List ConvertToSkendersQuote(SimpleCandleSeries simpleCandleSeries) { List quotes = new List(); foreach (var item in simpleCandleSeries.Series) { quotes.Add(ConvertToSkendersQuote(item)); } return quotes; } public Skender.Stock.Indicators.Quote ConvertToSkendersQuote(SimpleCandle simpleCandleSeries) { return new Skender.Stock.Indicators.Quote() { Close = simpleCandleSeries.Close, High = simpleCandleSeries.High, Date = simpleCandleSeries.dateTime, Low = simpleCandleSeries.Low, Open = simpleCandleSeries.Open, Volume = simpleCandleSeries.Volume }; } public void CandleMain(SimpleCandleSeries simpleCandleSeries) { var find = chart1.Series.IndexOf(simpleCandleSeries.Name); if (find >= 0) { chart1.Series.RemoveAt(find); } chart1.Series.Add(simpleCandleSeries.Name); chart1.Series[simpleCandleSeries.Name].LegendText = simpleCandleSeries.Name; chart1.Series[simpleCandleSeries.Name].ChartType = SeriesChartType.Candlestick; chart1.Series[simpleCandleSeries.Name].XValueType = ChartValueType.String; chart1.Series[simpleCandleSeries.Name].YValueType = ChartValueType.Single; chart1.Series[simpleCandleSeries.Name].CustomProperties = "PriceDownColor=Green, PriceUpColor=Red"; for (int i = 0; i < simpleCandleSeries.Series.Count; i++) { var ser = simpleCandleSeries.Series; chart1.Series[simpleCandleSeries.Name].Points.AddXY(ser[i].dateTime.ToLocalTime().ToString("ddd HH:mm"), ser[i].High, ser[i].Low, ser[i].Close, ser[i].Open); } } public void PaintDecimalSeries(string seriesname,List values) { var find = chart1.Series.IndexOf(seriesname); if (find >= 0) { chart1.Series.RemoveAt(find); } chart1.Series.Add(seriesname); chart1.Series[seriesname].ChartType = SeriesChartType.Line; chart1.Series[seriesname].YValueType = ChartValueType.Single; chart1.Series[seriesname].BorderWidth = 2; chart1.Series[seriesname].Color = Color.Blue; chart1.Series[seriesname].BorderDashStyle = ChartDashStyle.Solid; for (int i = 0; i < values.Count; i++) { chart1.Series[seriesname].Points.Add(new DataPoint() { YValues = new double[] { (double)values[i] } }); } } } }