private void update() { GraphPane variablePane = this.grpGraph.GraphPane; variablePane.CurveList.Clear(); variablePane.Title.Text = this.stock.StockName; variablePane.XAxis.Title.Text = "Time"; variablePane.YAxis.Title.Text = this.stock.StockName; variablePane.XAxis.Type = AxisType.Text; variablePane.XAxis.Scale.TextLabels = data.Time.ToArray(); StockPointList stockList = new StockPointList(); for (int i = 0; i < this.data.NumberObservations; i++) { XDate date = new XDate(this.data.XTime[i]); StockPt point = new StockPt(date.XLDate, this.stock.High[i], this.stock.Low[i], this.stock.Open[i], this.stock.Close[i], this.stock.Volume[i]); stockList.Add(point); } JapaneseCandleStickItem candle = variablePane.AddJapaneseCandleStick(this.stock.StockName, stockList); candle.Stick.RisingFill = new Fill(Color.Blue, Color.LightBlue); candle.Stick.FallingFill = new Fill(Color.Red, Color.IndianRed); candle.Stick.IsAutoSize = true; variablePane.Chart.Fill = new Fill(Color.FromArgb(255, 255, 245), Color.FromArgb(255, 255, 190), 90F); variablePane.Fill = new Fill(Color.White, Color.LightBlue, 135.0f); grpGraph.AxisChange(); zedGraphToolstrip1.SetData(grpGraph, variablePane); }
private static StockPointList <StockPt> CreateStockPointList(long valueStepSizeMinutes) { var spl = new StockPointList <StockPt>(); Random rand = new Random(); XDate xDate = new XDate(2013, 1, 1); var open = 50.0f; for (int i = 0; i < 50; i++) { double x = xDate.XLDate; var close = (float)(open + rand.NextDouble() * 10.0 - 5.0); var hi = (float)(Math.Max(open, close) + rand.NextDouble() * 5.0); var low = (float)(Math.Min(open, close) - rand.NextDouble() * 5.0); StockPt pt = new StockPt(x, open, hi, low, close, 50000, 50000); spl.Add(pt); open = close; xDate.AddMinutes(valueStepSizeMinutes); if (XDate.XLDateToDayOfWeek(xDate.XLDate) == 6) { xDate.AddDays(2.0); } } return(spl); }
private static StockPointList CreateStockPointList(long valueStepSizeMinutes) { StockPointList spl = new StockPointList(); Random rand = new Random(); XDate xDate = new XDate(2013, 1, 1); double open = 50.0; for (int i = 0; i < 50; i++) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max(open, close) + rand.NextDouble() * 5.0; double low = Math.Min(open, close) - rand.NextDouble() * 5.0; StockPt pt = new StockPt(x, hi, low, open, close, 100000); spl.Add(pt); open = close; xDate.AddMinutes(valueStepSizeMinutes); if (XDate.XLDateToDayOfWeek(xDate.XLDate) == 6) { xDate.AddDays(2.0); } } return(spl); }
public CandleStickDemo() : base("Demonstration of the Candlestick Chart Type", "CandleStick Demo", DemoType.Bar) { GraphPane myPane = base.GraphPane; myPane.Title.Text = "Candlestick Chart Demo"; myPane.XAxis.Title.Text = "Trading Date"; myPane.YAxis.Title.Text = "Share Price, $US"; StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate( 2006, 1, 1 ); double open = 50.0; for ( int i = 0; i < 50; i++ ) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; StockPt pt = new StockPt( x, hi, low, open, close, 100000 ); spl.Add( pt ); open = close; // Advance one day xDate.AddDays( 1.0 ); // but skip the weekends if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) xDate.AddDays( 2.0 ); } CandleStickItem myCurve = myPane.AddCandleStick( "trades", spl, Color.Black ); myCurve.Stick.IsAutoSize = true; myCurve.Stick.Color = Color.Blue; // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; myPane.XAxis.Scale.Min = new XDate( 2006, 1, 1 ); // pretty it up a little myPane.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); myPane.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); base.ZedGraphControl.AxisChange(); }
public void CreateGraph_junk5( ZedGraphControl zgc ) { GraphPane myPane = zgc.GraphPane; // Set the title and axis labels myPane.Title.Text = "Japanese Candlestick Chart Demo"; myPane.XAxis.Title.Text = "Trading Date"; myPane.YAxis.Title.Text = "Share Price, $US"; StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate( 2006, 1, 1 ); double open = 50.0; for ( int i = 0; i < 1000; i++ ) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; StockPt pt = new StockPt( x, hi, low, open, close, 100000 ); spl.Add( pt ); open = close; if ( xDate.DateTime.Hour < 23 ) xDate.AddHours( 1.0 ); else { // Advance one day xDate.AddHours( 1.0 ); // but skip the weekends if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) xDate.AddDays( 2.0 ); } } JapaneseCandleStickItem myCurve = myPane.AddJapaneseCandleStick( "trades", spl ); myCurve.Stick.IsAutoSize = true; myCurve.Stick.Color = Color.Blue; // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; myPane.XAxis.Scale.Min = new XDate( 2006, 1, 1 ); myPane.XAxis.Scale.Format = "dd-MMM-yy hh:mm"; // pretty it up a little myPane.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); myPane.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); PointPairList ppl = new PointPairList(); for ( int i = 19; i < spl.Count; i++ ) { double avg = 0.0; for ( int j = 0; j < 20; j++ ) avg += spl.GetAt( i - j ).Close; ppl.Add( i + 1, avg / 20.0 ); } LineItem item = myPane.AddCurve( "MA-20", ppl, Color.Red ); item.IsOverrideOrdinal = true; item.Line.Width = 3; item.Symbol.Type = SymbolType.None; item.Line.IsSmooth = true; // Tell ZedGraph to calculate the axis ranges zgc.AxisChange(); zgc.Invalidate(); }
// OHLC Bar Test private void CreateGraph_OHLCBarTest( ZedGraphControl z1 ) { GraphPane myPane = z1.GraphPane; myPane.Title.Text = "OHLC Chart Demo"; myPane.XAxis.Title.Text = "Trading Date"; myPane.YAxis.Title.Text = "Share Price, $US"; StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate( 2006, 1, 1 ); double open = 50.0; for ( int i = 0; i < 50; i++ ) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; StockPt pt = new StockPt( x, hi, low, open, close, 100000 ); spl.Add( pt ); open = close; // Advance one day //xDate.AddMinutes( 1.0 ); xDate.AddDays( 1.0 ); // but skip the weekends //if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) // xDate.AddMinutes( 2.0 ); } OHLCBarItem myCurve = myPane.AddOHLCBar( "trades", spl, Color.Blue); //myCurve.Bar.IsAutoSize = true; myCurve.Bar.Color = Color.Blue; // Use DateAsOrdinal to skip weekend gaps //myPane.XAxis.Type = AxisType.DateAsOrdinal; myPane.XAxis.Type = AxisType.Date; //myPane.XAxis.Scale.Min = new XDate( 2006, 1, 1 ); // pretty it up a little myPane.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); myPane.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); // Tell ZedGraph to calculate the axis ranges z1.AxisChange(); z1.Invalidate(); //z1.PointValueEvent += new ZedGraphControl.PointValueHandler( z1_PointValueEvent ); }
// Traditional Open-High-Low-Close Bar chart private void CreateGraph_OHLCBar( ZedGraphControl z1 ) { GraphPane myPane = z1.GraphPane; myPane.Title.Text = "OHLC Chart Demo"; myPane.XAxis.Title.Text = "Trading Date"; myPane.YAxis.Title.Text = "Share Price, $US"; StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is feb 1st XDate xDate = new XDate( 2006, 2, 1 ); double open = 50.0; for ( int i = 0; i < 20; i++ ) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; StockPt pt = new StockPt( x, hi, low, open, close, 100000 ); spl.Add( pt ); open = close; // Advance one day xDate.AddDays( 1.0 ); // but skip the weekends if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) xDate.AddDays( 2.0 ); } //OHLCBarItem myCurve = myPane.AddOHLCBar( "trades", spl, Color.Black ); OHLCBarItem myCurve = myPane.AddOHLCBar( "trades", spl, Color.Blue ); //myCurve.Bar.Size = 20; myCurve.Bar.IsAutoSize = true; //myCurve.Bar.PenWidth = 2; //myCurve.Bar.IsOpenCloseVisible = false; Fill fill = new Fill( Color.Red, Color.Yellow, Color.Blue ); fill.RangeMin = 40; fill.RangeMax = 70; fill.Type = FillType.GradientByY; myCurve.Bar.GradientFill = fill; // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; //myPane.XAxis.Type = AxisType.Date; //myPane.XAxis.Scale.MajorStep = 1.0; // pretty it up a little myPane.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); myPane.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); //BoxObj box = new BoxObj( 4, 60, 5, 50000 ); //myPane.GraphObjList.Add( box ); // Tell ZedGraph to calculate the axis ranges z1.AxisChange(); z1.Invalidate(); }
// Call this method from the Form_Load method, passing your ZedGraphControl public void CreateGraph_JapaneseCandleStickDemo( ZedGraphControl zgc ) { GraphPane myPane = zgc.GraphPane; // Set the title and axis labels myPane.Title.Text = "Japanese Candlestick Chart Demo"; myPane.XAxis.Title.Text = "Trading Date"; myPane.YAxis.Title.Text = "Share Price, $US"; StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate( 2006, 1, 1 ); double open = 50.0; for ( int i = 0; i < 50; i++ ) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; StockPt pt = new StockPt( x, hi, low, open, close, 100000 ); spl.Add( pt ); open = close; // Advance one day //xDate.AddDays( 1 + 0.4 * rand.NextDouble() - 0.2 ); xDate.AddDays( 1 ); // but skip the weekends if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) xDate.AddDays( 2.0 ); } JapaneseCandleStickItem myCurve = myPane.AddJapaneseCandleStick( "trades", spl ); myCurve.Stick.IsAutoSize = true; myCurve.Stick.Color = Color.Blue; // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; //myPane.XAxis.Type = AxisType.Date; //myPane.XAxis.Scale.Min = new XDate( 2006, 1, 1 ); // pretty it up a little myPane.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); myPane.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); // Tell ZedGraph to calculate the axis ranges zgc.AxisChange(); zgc.Invalidate(); }
// Make a masterpane with 3 charts // Top = OHLC Bar Chart // Mid = Volume Chart // Bot = Price Change public void CreateGraph_OHLCBarMaster( ZedGraphControl zgc ) { // ================================================ // First, set up some lists with random data... // ================================================ StockPointList spl = new StockPointList(); PointPairList volList = new PointPairList(); PointPairList changeList = new PointPairList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate( 2006, 1, 1 ); double open = 50.0; double prevClose = 50.0; const int numDays = 365; // Loop to make 365 days of data for ( int i = 0; i < numDays; i++ ) { double x = xDate.XLDate; //double close = open + rand.NextDouble() * 10.0 - 5.0; double close = open * ( 0.95 + rand.NextDouble() * 0.1 ); //double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; //double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; double hi = Math.Max( open, close ) * ( 1.0 + rand.NextDouble() * 0.05 ); double low = Math.Min( open, close ) * ( 0.95 + rand.NextDouble() * 0.05 ); double vol = 25.0 + rand.NextDouble() * 100.0; double change = close - prevClose; // Create a StockPt instead of a PointPair so we can carry 6 properties StockPt pt = new StockPt( x, hi, low, open, close, vol ); //if price is increasing color=black, else color=red pt.ColorValue = close > prevClose ? 2 : 1; spl.Add( pt ); volList.Add( x, vol ); changeList.Add( x, change ); prevClose = close; open = close; // Advance one day xDate.AddDays( 1.0 ); // but skip the weekends if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) xDate.AddDays( 2.0 ); } // ================================================ // Create 3 GraphPanes to display the data // ================================================ // get a reference to the masterpane MasterPane master = zgc.MasterPane; // The first chart is already in the MasterPane, so add the other two charts master.Add( new GraphPane() ); master.Add( new GraphPane() ); // ================================================ // The first pane is an OHLCBarItem // ================================================ // Get a reference to the pane GraphPane pane = master[0]; // Set the title and axis labels pane.Title.Text = "Open-High-Low-Close History"; pane.XAxis.Title.Text = "Date"; pane.YAxis.Title.Text = "Price"; // Setup the gradient fill... // Use Red for negative days and black for positive days Color[] colors = { Color.Red, Color.Black }; Fill myFill = new Fill( colors ); myFill.Type = FillType.GradientByColorValue; myFill.SecondaryValueGradientColor = Color.Empty; myFill.RangeMin = 1; myFill.RangeMax = 2; //Create the OHLC and assign it a Fill OHLCBarItem ohlcCurve = pane.AddOHLCBar( "Price", spl, Color.Empty ); ohlcCurve.Bar.GradientFill = myFill; ohlcCurve.Bar.IsAutoSize = true; // Create a JapaneseCandleStick //JapaneseCandleStickItem jcsCurve = pane.AddJapaneseCandleStick( "Price", spl ); //jcsCurve.Stick.IsAutoSize = false; // ================================================ // The second pane is a regular BarItem to show daily volume // ================================================ // Get a reference to the pane pane = master[1]; // Set the title and axis labels pane.Title.Text = "Daily Volume"; pane.XAxis.Title.Text = "Date"; pane.YAxis.Title.Text = "Volume, thousands"; BarItem volBar = pane.AddBar( "Volume", volList, Color.Blue ); // ================================================ // The third pane is a LineItem to show daily price change // ================================================ // Get a reference to the pane pane = master[2]; // Set the title and axis labels pane.Title.Text = "Price Change"; pane.XAxis.Title.Text = "Date"; pane.YAxis.Title.Text = "Price Change, $"; LineItem changeCurve = pane.AddCurve( "Price Change", changeList, Color.Green, SymbolType.None ); // ================================================ // These settings are common to all three panes // ================================================ foreach ( GraphPane paneT in master.PaneList ) { // Use DateAsOrdinal to skip weekend gaps paneT.XAxis.Type = AxisType.DateAsOrdinal; // Use only visible data to define Y scale range paneT.IsBoundedRanges = true; // Define a minimum buffer space to the axes can be aligned paneT.YAxis.MinSpace = 80; paneT.Y2Axis.MinSpace = 50; // pretty it up a little paneT.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); paneT.Title.FontSpec.Size = 20.0f; paneT.XAxis.Title.FontSpec.Size = 18.0f; paneT.XAxis.Scale.FontSpec.Size = 16.0f; paneT.YAxis.Title.FontSpec.Size = 18.0f; paneT.YAxis.Scale.FontSpec.Size = 16.0f; paneT.Legend.IsVisible = false; paneT.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); // Set the initial scroll position and range // Note that the min and max for DateAsOrdinal scale will be ordinal values, not dates paneT.XAxis.Scale.Min = 1.0; // default range is 30 days paneT.XAxis.Scale.Max = 30.0; } // ================================================ // Set up the MasterPane Layout // ================================================ // Make sure that fonts and dimensions are the same for all three charts master.IsCommonScaleFactor = true; // Show the masterpane title master.Title.IsVisible = true; master.Title.Text = "Wacky Widget Company Stock Performance"; master.Fill = new Fill( Color.White, Color.SlateBlue, 45.0f ); // Leave a margin around the masterpane, but only a small gap between panes master.Margin.All = 10; master.InnerPaneGap = 5; using ( Graphics g = this.CreateGraphics() ) { master.SetLayout( g, PaneLayout.SingleColumn ); // Synchronize the Axes zgc.IsAutoScrollRange = true; zgc.IsShowHScrollBar = true; zgc.IsSynchronizeXAxes = true; // Scale range will extend about 1 day before and after the actual data range zgc.ScrollGrace = 1.0 / numDays; } // Tell ZedGraph to calculate the axis ranges zgc.AxisChange(); // master[0].XAxis.Scale.Min = new XDate( 2006, 1, 1 ).XLDate; // master[0].XAxis.Scale.Max = master[0].XAxis.Scale.Min + 30.0; // master[1].XAxis.Scale.Min = new XDate( 2006, 1, 1 ).XLDate; // master[1].XAxis.Scale.Max = master[1].XAxis.Scale.Min + 30.0; // master[2].XAxis.Scale.Min = new XDate( 2006, 1, 1 ).XLDate; // master[2].XAxis.Scale.Max = master[2].XAxis.Scale.Min + 30.0; //zgc.ScrollDoneEvent += new ZedGraphControl.ScrollDoneHandler( zgc_ScrollDoneEvent ); zgc.ScrollProgressEvent += new ZedGraphControl.ScrollProgressHandler( zgc_ScrollProgressEvent ); }
public void CreateGraph_OHLCBarGradient( ZedGraphControl zgc ) { GraphPane myPane = zgc.GraphPane; // Set the title and axis labels myPane.Title.Text = "OHLC Chart Demo"; myPane.XAxis.Title.Text = "Date"; myPane.YAxis.Title.Text = "Price"; //Load a StockPointList with random data......................... StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate( 2006, 1, 1 ); double open = 50.0; double prevClose = 0; // Loop to make 50 days of data for ( int i = 0; i < 50; i++ ) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max( open, close ) + rand.NextDouble() * 5.0; double low = Math.Min( open, close ) - rand.NextDouble() * 5.0; // Create a StockPt instead of a PointPair so we can carry 6 properties StockPt pt = new StockPt( x, hi, low, open, close, 100000 ); //if price is increasing color=black, else color=red pt.ColorValue = close > prevClose ? 2 : 1; spl.Add( pt ); prevClose = close; open = close; // Advance one day xDate.AddDays( 1.0 ); // but skip the weekends if ( XDate.XLDateToDayOfWeek( xDate.XLDate ) == 6 ) xDate.AddDays( 2.0 ); } // Setup the gradient fill... // Use Red for negative days and black for positive days Color[] colors = { Color.Red, Color.Black }; Fill myFill = new Fill( colors ); myFill.Type = FillType.GradientByColorValue; myFill.SecondaryValueGradientColor = Color.Empty; myFill.RangeMin = 1; myFill.RangeMax = 2; //Create the OHLC and assign it a Fill OHLCBarItem myCurve = myPane.AddOHLCBar( "Price", spl, Color.Empty ); myCurve.Bar.GradientFill = myFill; myCurve.Bar.IsAutoSize = true; // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; //myPane.XAxis.Scale.Min = new XDate( 2006, 1, 1 ); // pretty it up a little myPane.Chart.Fill = new Fill( Color.White, Color.LightGoldenrodYellow, 45.0f ); myPane.Fill = new Fill( Color.White, Color.FromArgb( 220, 220, 255 ), 45.0f ); myPane.Title.FontSpec.Size = 20.0f; myPane.XAxis.Title.FontSpec.Size = 18.0f; myPane.XAxis.Scale.FontSpec.Size = 16.0f; myPane.YAxis.Title.FontSpec.Size = 18.0f; myPane.YAxis.Scale.FontSpec.Size = 16.0f; myPane.Legend.IsVisible = false; // BoxObj box = new BoxObj( 4.5, 0.0, 1.0, 1.0, Color.Transparent, // Color.FromArgb( 100, Color.LightBlue ) ); // box.Location.CoordinateFrame = CoordType.XScaleYChartFraction; // myPane.GraphObjList.Add( box ); // Tell ZedGraph to calculate the axis ranges zgc.AxisChange(); zgc.Invalidate(); }
public JapaneseCandleStickItem AddCandleStick(string name, double[] seriesHigh, double[] seriesLow, double[] seriesOpen, double[] seriesClose, double[] seriesVolume, Color barUpColor, Color barDownColor, Color risingFillColor, Color risingBorderColor, Color fallingFillColor, Color fallingBorderColor) { if (this.mySeriesX == null) return null; StockPointList spl = new StockPointList(); for (int idx = 0; idx < this.mySeriesX.Length; idx++) { StockPt pt = new StockPt(this.mySeriesX[idx], seriesHigh[idx], seriesLow[idx], seriesOpen[idx], seriesClose[idx], seriesVolume[idx]); spl.Add(pt); } JapaneseCandleStickItem myCurve = myGraphPane.AddJapaneseCandleStick(name, spl); myCurve.Stick.IsAutoSize = true; myCurve.Stick.Color = barUpColor; //Bar up myCurve.Stick.FallingColor = barDownColor; //Bar down //myCurve.Color = Color.Pink; // Unknown myCurve.Stick.FallingFill.Color = fallingFillColor; myCurve.Stick.FallingBorder.Color = fallingBorderColor; myCurve.Stick.RisingFill.Color = risingFillColor; myCurve.Stick.RisingBorder.Color = risingBorderColor; return myCurve; }
private void CreateGraph(ZedGraphControl zgc, int iDayChart) { // get a reference to the GraphPane GraphPane myPane = zgc.GraphPane; myPane.CurveList.Clear(); DiaNegocio diaChart = new DiaNegocio(); myPane.Title.Text = "Japanese Candlestick Chart Demo"; myPane.XAxis.Title.Text = "Trading Date"; myPane.YAxis.Title.Text = "Share Price, $US"; StockPointList spl = new StockPointList(); Random rand = new Random(); // First day is jan 1st XDate xDate = new XDate(2006, 1, 1); for (int i = 0; dia[iDayChart].Ticker[i] != null; i++) { CriarPontodeEntradaDia(iDayChart); diaChart = dia[iDayChart]; myPane.Title.Text = "WINFUT " + diaChart.dtData.ToString(); double x = diaChart.Ticker[i].dtData.ToOADate();//xDate.XLDate; double open = diaChart.Ticker[i].iAbertura; double close = diaChart.Ticker[i].iFechamento;//open + rand.NextDouble() * 10.0 - 5.0; double hi = diaChart.Ticker[i].iMaximo;// Math.Max(open, close) + rand.NextDouble() * 5.0; double low = diaChart.Ticker[i].iMinimo;// Math.Min(open, close) - rand.NextDouble() * 5.0; StockPt pt = new StockPt(x, hi, low, open, close, 100000); spl.Add(pt); //open = close; // Advance one day //xDate.AddDays(1.0); // but skip the weekends //if (XDate.XLDateToDayOfWeek(xDate.XLDate) == 6) // xDate.AddDays(2.0); } JapaneseCandleStickItem myCurve = myPane.AddJapaneseCandleStick("trades", spl); myCurve.Stick.IsAutoSize = true; myCurve.Stick.Color = Color.Blue; double[] dbentradavenda = new double[500]; for( int i = 0; i < 500; i++) dbentradavenda[i] = (double)diaChart.iEntradaVenda; LineItem entradaVenda = myPane.AddCurve("Venda", null, dbentradavenda, Color.Red,SymbolType.None); double[] dbentradacompra = new double[500]; for (int i = 0; i < 500; i++) dbentradacompra[i] = (double)diaChart.iEntradaCompra; LineItem entradaCompra = myPane.AddCurve("Compra", null, dbentradacompra, Color.Green, SymbolType.None); // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; // pretty it up a little myPane.Chart.Fill = new Fill(Color.White, Color.LightGoldenrodYellow, 45.0f); myPane.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0f); // Tell ZedGraph to refigure the // axes since the data have changed zgc.AxisChange(); zgc.Invalidate(); //ATENÇÃO, OBSERVAR QUE QUANDO RETORNA À PRIMEIRA ENTRADA COMUMENTE EMBARCA NO SENTIDO CONTRÁRIO!!! VERIFICAR SE COMPORTAMENTO SE //REPETE SEGUIDAS VEZES PRO ÍNDICE, PODE SER UMA FORMA DE GANHO COM UM ALVO MENOR DE ~300, 400 PTOS }
public static ZedGraphControl KresliJednoduchyGraf(string forecastGraf, List<ObchodnyDen> getDataPreGraf, ZedGraphControl zg1) { try { zg1.GraphPane.CurveList.Clear(); zg1.GraphPane.GraphObjList.Clear(); GraphPane myPane = zg1.GraphPane; // Set the titles and axis labels myPane.Title.Text = forecastGraf; myPane.XAxis.Title.Text = "Date"; myPane.YAxis.Title.Text = "$"; myPane.XAxis.Type = AxisType.Date; var spl = new StockPointList(); int rok = getDataPreGraf.First().Date.Year; DateTime predchadzDatum = getDataPreGraf.First().Date; foreach (var den in getDataPreGraf) { var x = (double)new XDate(DateTime.Parse(den.Date.ToShortDateString())); double open = den.Open; double close = den.Settle; double hi = den.High; double low = den.Low; var pt = new StockPt(x, hi, low, open, close, 100000); spl.Add(pt); if (den.Date.Year != predchadzDatum.Year) { LineItem line = new LineItem(String.Empty, new[] { x, x }, new[] { myPane.YAxis.Scale.Min, myPane.YAxis.Scale.Max }, Color.Black, SymbolType.None); line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; line.Line.Width = 1f; //myPane.CurveList.Add(line); Console.WriteLine("Datum " + den.Date); } predchadzDatum = den.Date; } JapaneseCandleStickItem myCurve = myPane.AddJapaneseCandleStick("trades", spl); myCurve.Stick.IsAutoSize = true; myCurve.Stick.Color = Color.Blue; // Use DateAsOrdinal to skip weekend gaps myPane.XAxis.Type = AxisType.DateAsOrdinal; // pretty it up a little //myPane.Chart.Fill = new Fill(Color.White, Color.LightGoldenrodYellow, 45.0f); //myPane.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0f); // Tell ZedGraph to calculate the axis ranges zg1.AxisChange(); zg1.Invalidate(); return zg1; }catch (Exception) { } return null; }
/// <summary> /// Draws the Open High Low Close graph. /// </summary> /// <param name="data">The stock points to plot.</param> /// <param name="control">The control to plot on.</param> public void DrawOHLCGraph(ref StockPoints data, ref ZedGraph.ZedGraphControl control) { StockPointList pointList = new StockPointList(); XDate date = new XDate(); foreach (StockPoint s in data) { date = new XDate(s.PointDateTime.Year, s.PointDateTime.Month, s.PointDateTime.Day, s.PointDateTime.Hour, s.PointDateTime.Minute, 0); StockPt p = new StockPt(date.XLDate, s.High, s.Low, s.Open, s.Close, s.Volume); pointList.Add(p); } Color[] colors = { Color.Red, Color.Black }; Fill myFill = new Fill(colors); myFill.Type = FillType.GradientByColorValue; myFill.SecondaryValueGradientColor = Color.Empty; myFill.RangeMin = 1; myFill.RangeMax = 2; MasterPane masterPane = control.MasterPane; masterPane.Margin.All = 10; masterPane.InnerPaneGap = 5; GraphPane ohlcPane = new GraphPane(new Rectangle(10, 10, 10, 10), "OHLC", "Time", "Price"); ohlcPane.IsBoundedRanges = true; OHLCBarItem bar = ohlcPane.AddOHLCBar("Price", pointList, Color.Empty); bar.Bar.GradientFill = myFill; bar.Bar.IsAutoSize = true; bar.Bar.Size = 5; ohlcPane.Title.Text = "OHLC Graph"; ohlcPane.XAxis.Type = AxisType.DateAsOrdinal; ohlcPane.XAxis.Title.Text = "Date"; ohlcPane.YAxis.Title.Text = "Price"; ohlcPane.Margin.All = 0; ohlcPane.Margin.Top = 10; ohlcPane.YAxis.MinSpace = 10; ohlcPane.Y2Axis.MinSpace = 10; ohlcPane.AxisChange(); masterPane.Add(ohlcPane); control.IsShowHScrollBar = true; control.ScrollMinX = 0; control.ScrollMaxX = data.Count; control.GraphPane.XAxis.Scale.Max = data.Count; if (data.Count >= 99) { control.GraphPane.XAxis.Scale.Min = data.Count - 99; } else { control.GraphPane.XAxis.Scale.Min = 0; } using (Graphics g = control.CreateGraphics()) { masterPane.SetLayout(g, PaneLayout.SingleColumn); masterPane.AxisChange(g); // Synchronize the Axes //// g.Dispose(); } }
private static StockPointList CreateStockPointList(long valueStepSizeMinutes) { StockPointList spl = new StockPointList(); Random rand = new Random(); XDate xDate = new XDate(2013, 1, 1); double open = 50.0; for (int i = 0; i < 50; i++) { double x = xDate.XLDate; double close = open + rand.NextDouble() * 10.0 - 5.0; double hi = Math.Max(open, close) + rand.NextDouble() * 5.0; double low = Math.Min(open, close) - rand.NextDouble() * 5.0; StockPt pt = new StockPt(x, hi, low, open, close, 100000); spl.Add(pt); open = close; xDate.AddMinutes(valueStepSizeMinutes); if (XDate.XLDateToDayOfWeek(xDate.XLDate) == 6) { xDate.AddDays(2.0); } } return spl; }
private void Form_StockChart_Load(object sender, EventArgs e) { // Get a reference to the GraphPane instance in the ZedGraphControl GraphPane myPane = zg1.GraphPane; // Set the titles and axis labels myPane.Title.Text = this.Text = title; myPane.XAxis.Title.Text = "Date"; myPane.YAxis.Title.Text = "Close price"; foreach (Model_ShockChart eachModel in stockLineList) { // Make up some data points based on the Sine function StockPointList spl = new StockPointList(); foreach (Tick eachTick in eachModel.stock.priceList) { double x = new XDate(eachTick.Time); double open = ((NumericTick)eachTick).open; double close = ((NumericTick)eachTick).close; double high = ((NumericTick)eachTick).high; double low = ((NumericTick)eachTick).low; double vol = 0.0; try { vol = double.Parse(((NumericTick)eachTick).volume); } catch (Exception ex) { LogHelper.GetLogger(typeof(MainForm)).FullLog(ex.ToString(), "IGNORE"); } spl.Add(new StockPt(x, high, low, open, close, vol)); } // Generate a blue curve with circle symbols, and "Beta" in the legend myPane.AddCurve(eachModel.stock.stockCode + ".HK", spl, eachModel.color, SymbolType.None); } // JapaneseCandleStickItem myCurve = myPane.AddJapaneseCandleStick(baseStock.stockCode + ".HK", spl); // myCurve.Stick.IsAutoSize = true; // myCurve.Stick.Color = Color.Blue; // myCurve = myPane.AddCurve("Beta", list2, Color.Blue, SymbolType.Circle); // Fill the symbols with white // myCurve.Symbol.Fill = new Fill(Color.White); // Associate this curve with the Y2 axis // myCurve.IsY2Axis = true; // Show the x axis grid myPane.XAxis.MajorGrid.IsVisible = true; // Make the Y axis scale red // myPane.YAxis.Scale.FontSpec.FontColor = Color.Red; // myPane.YAxis.Title.FontSpec.FontColor = Color.Red; // turn off the opposite tics so the Y tics don't show up on the Y2 axis myPane.YAxis.MajorTic.IsOpposite = false; myPane.YAxis.MinorTic.IsOpposite = false; // Don't display the Y zero line myPane.YAxis.MajorGrid.IsZeroLine = false; // Align the Y axis labels so they are flush to the axis myPane.YAxis.Scale.Align = AlignP.Inside; // Manually set the axis range // myPane.YAxis.Scale.Min = -30; // myPane.YAxis.Scale.Max = 30; // myPane.XAxis.Scale.Max = baseStock.priceList.Count; // Set the XAxis to date type myPane.XAxis.Type = AxisType.Date; // Enable the Y2 axis display // myPane.Y2Axis.IsVisible = true; // Make the Y2 axis scale blue // myPane.Y2Axis.Scale.FontSpec.FontColor = Color.Blue; // myPane.Y2Axis.Title.FontSpec.FontColor = Color.Blue; // turn off the opposite tics so the Y2 tics don't show up on the Y axis // myPane.Y2Axis.MajorTic.IsOpposite = false; // myPane.Y2Axis.MinorTic.IsOpposite = false; // Display the Y2 axis grid lines // myPane.Y2Axis.MajorGrid.IsVisible = true; // Align the Y2 axis labels so they are flush to the axis // myPane.Y2Axis.Scale.Align = AlignP.Inside; // Fill the axis background with a gradient myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f); // Add a text box with instructions // TextObj text = new TextObj( // "Zoom: left mouse & drag\nPan: middle mouse & drag\nContext Menu: right mouse", // 0.05f, 0.95f, CoordType.ChartFraction, AlignH.Left, AlignV.Bottom); // text.FontSpec.StringAlignment = StringAlignment.Near; // myPane.GraphObjList.Add(text); // Enable scrollbars if needed zg1.IsShowHScrollBar = true; zg1.IsShowVScrollBar = true; zg1.IsAutoScrollRange = true; zg1.IsScrollY2 = true; // OPTIONAL: Show tooltips when the mouse hovers over a point zg1.IsShowPointValues = true; zg1.PointValueEvent += new ZedGraphControl.PointValueHandler(MyPointValueHandler); // OPTIONAL: Add a custom context menu item // zg1.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder); // OPTIONAL: Handle the Zoom Event zg1.ZoomEvent += new ZedGraphControl.ZoomEventHandler(MyZoomEvent); // Size the control to fit the window // SetSize(); // Tell ZedGraph to calculate the axis ranges // Note that you MUST call this after enabling IsAutoScrollRange, since AxisChange() sets // up the proper scrolling parameters zg1.AxisChange(); // Make sure the Graph gets redrawn zg1.Invalidate(); }
// 讀取完歷史資料一次畫出歷史 public void DrawGraphOnce( List<KLine> _klLst, List<double> ema11Lst, List<double> ema22Lst) { GraphPane myPane = zg1.GraphPane; StockPointList _ema11Plist = new StockPointList(); StockPointList _ema22Plist = new StockPointList(); List<StockPt> KLPnts = (List<StockPt>)jpnCandle.Points; KLPnts.Clear(); foreach (KLine _kl in _klLst) { XDate xDate = new XDate(_kl.datetime.Year, _kl.datetime.Month, _kl.datetime.Day, _kl.datetime.Hour, _kl.datetime.Minute, 0); StockPt pt_kl = new StockPt(xDate.XLDate, _kl.highest, _kl.lowest, _kl.open, _kl.close, _kl.amount); KLPnts.Add(pt_kl); } // Ema 11 更新 _ema11Plist.Clear(); for (int k = 0; k < _klLst.Count; k++) { KLine _kl = _klLst[k]; double _ema11val = ema11Lst[k]; XDate xDate = new XDate(_kl.datetime.Year, _kl.datetime.Month, _kl.datetime.Day, _kl.datetime.Hour, _kl.datetime.Minute, 0); StockPt pt_ema11 = new StockPt(xDate.XLDate, _ema11val, _ema11val, _ema11val, _ema11val, _ema11val); _ema11Plist.Add(pt_ema11); } // Ema 22 更新 _ema22Plist.Clear(); for (int k = 0; k < _klLst.Count; k++) { KLine _kl = _klLst[k]; double _ema22val = ema22Lst[k]; XDate xDate = new XDate(_kl.datetime.Year, _kl.datetime.Month, _kl.datetime.Day, _kl.datetime.Hour, _kl.datetime.Minute, 0); StockPt pt_ema11 = new StockPt(xDate.XLDate, _ema22val, _ema22val, _ema22val, _ema22val, _ema22val); _ema22Plist.Add(pt_ema11); } ema11LineGr = myPane.AddCurve("ema11", _ema11Plist, Color.Aqua, SymbolType.None); ema22LineGr = myPane.AddCurve("ema22", _ema22Plist, Color.Magenta, SymbolType.None); edtNumFocus_TextChanged(null, null); }