using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization; using System.Windows.Forms.DataVisualization.Charting; using Skender.Stock.Indicators; namespace TestCharCore5 { public partial class Form1 : Form { private System.Windows.Forms.DataVisualization.Charting.Chart chart1; 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(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); this.SuspendLayout(); // // chart1 // chartArea1.Name = "ChartArea1"; chartArea2.Name = "ChartArea2"; this.chart1.ChartAreas.Add(chartArea1); this.chart1.ChartAreas.Add(chartArea2); legend1.Name = "Legend1"; this.chart1.Legends.Add(legend1); this.chart1.Location = new System.Drawing.Point(0, 0); this.chart1.Name = "chart1"; series1.ChartArea = "ChartArea1"; series1.Legend = "Legend1"; series1.Name = "Series1"; series2.ChartArea = "ChartArea1"; series2.Legend = "Legend1"; series2.Name = "EMA"; this.chart1.Series.Add(series1); this.chart1.Series.Add(series2); this.chart1.Size = new System.Drawing.Size(300, 300); this.chart1.TabIndex = 0; this.chart1.Text = "chart1"; //chart1.ChartAreas[0].Position.Y = 60; //chart1.ChartAreas[0].Position.Height = 60; this.chart1.Size = new System.Drawing.Size(353, 428); this.Controls.Add(this.chart1); ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); this.ResumeLayout(false); } private void button1_Click(object sender, EventArgs e) { chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.LineWidth = 0; chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.LineWidth = 0; // chart1.ChartAreas["ChartArea1"].AxisY.Maximum = 350; //chart1.ChartAreas["ChartArea1"].AxisY.Minimum = 100; // Random candledata var data = new SimpleCandleSeries() { //Name = "CandleData", Name = "Series1", 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 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.Purple; 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] } }); } } public void CandleMain(SimpleCandleSeries simpleCandleSeries) { try { 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].BorderWidth = 3; 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); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } 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 }; } } }