private void DrawRegion(BarRegion r, Graphics g, RectangleD worldRect, Rectangle canvasRect) { double x1 = r.IndexStart.HasValue ? r.IndexStart.Value : r.Start.HasValue ? Chart.CandleRange.GetXCoord(r.Start.Value) : worldRect.Left; double x2 = r.IndexEnd.HasValue ? r.IndexEnd.Value : r.End.HasValue ? Chart.CandleRange.GetXCoord(r.End.Value) : worldRect.Right; if (x2 == x2) { x1 -= singleBarRegionWidth; x2 += singleBarRegionWidth; } double y1 = r.UpperBound.HasValue ? r.UpperBound.Value : worldRect.Bottom; double y2 = r.LowerBound.HasValue ? r.LowerBound.Value : worldRect.Top; PointD p1 = Conversion.WorldToScreen(new PointD(x1, y1), worldRect, canvasRect); PointD p2 = Conversion.WorldToScreen(new PointD(x2, y2), worldRect, canvasRect); if (!DrawAsFrame) { var color = CustomAlphaChannel ? r.Color : Color.FromArgb(regionAlpha, r.Color); using (var brush = new SolidBrush(color)) { g.FillRectangle(brush, (float)p1.X, (float)p1.Y, (float)p2.X - (float)p1.X, (float)p2.Y - (float)p1.Y); } } else { using (var pen = r.MakePen()) { g.DrawRectangle(pen, (float)p1.X, (float)p1.Y, (float)p2.X - (float)p1.X, (float)p2.Y - (float)p1.Y); } } }
public void BuildSeries(ChartControl chart) { seriesRSI.Data.Clear(); seriesBound.data.Clear(); // границы var reg = new BarRegion { Color = Color.Black, UpperBound = 100 - marginPercent, LowerBound = marginPercent }; seriesBound.data.Add(reg); // RSI for (var i = 0; i < Period; i++) seriesRSI.Data.Add(50); var dataCount = GetSourceDataCount(); for (var i = Period; i < dataCount; i++) { double sumU = 0, sumD = 0; for (var j = 0; j < Period; j++) { var delta = GetSourcePrice(i - j) - GetSourcePrice(i - j - 1); if (delta < 0) sumD -= delta; else sumU += delta; } double RSI; if (sumU == sumD && sumU == 0) RSI = 50; else if (sumD == 0) RSI = 100; else RSI = 100 - 100.0 / (1 + sumU / sumD); seriesRSI.Data.Add(RSI); } }
private void DrawRegion(BarRegion r, Graphics g, RectangleD worldRect, Rectangle canvasRect) { double x1 = r.IndexStart.HasValue ? r.IndexStart.Value : r.Start.HasValue ? Chart.CandleRange.GetXCoord(r.Start.Value) : worldRect.Left; double x2 = r.IndexEnd.HasValue ? r.IndexEnd.Value : r.End.HasValue ? Chart.CandleRange.GetXCoord(r.End.Value) : worldRect.Right; if (x2 == x2) { x1 -= singleBarRegionWidth; x2 += singleBarRegionWidth; } double y1 = r.UpperBound.HasValue ? r.UpperBound.Value : worldRect.Bottom; double y2 = r.LowerBound.HasValue ? r.LowerBound.Value : worldRect.Top; PointD p1 = Conversion.WorldToScreen(new PointD(x1, y1), worldRect, canvasRect); PointD p2 = Conversion.WorldToScreen(new PointD(x2, y2), worldRect, canvasRect); if (!DrawAsFrame) { var color = CustomAlphaChannel ? r.Color : Color.FromArgb(regionAlpha, r.Color); using (var brush = new SolidBrush(color)) { g.FillRectangle(brush, (float) p1.X, (float) p1.Y, (float) p2.X - (float) p1.X, (float) p2.Y - (float) p1.Y); } } else { using (var pen = r.MakePen()) { g.DrawRectangle(pen, (float)p1.X, (float)p1.Y, (float)p2.X - (float)p1.X, (float)p2.Y - (float)p1.Y); } } }