public void Render(Graphics g, PlotCollectionSet dataset, int nLookahead) { PlotCollection plots = dataset[m_config.DataIndexOnRender]; List <int> rgX = m_gx.TickPositions; int nStartIdx = m_gx.StartPosition; Plot plotLast = null; float fXLast = 0; float fYLast = 0; double dfMinX = 0; double dfMaxX = 0; double dfMinY = 0; double dfMaxY = 1; double dfParamMin = 0; double dfParamMax = 0; string strDataParam = null; bool bNative = false; if (!string.IsNullOrEmpty(m_config.DataParam)) { string[] rgstr = m_config.DataParam.Split(':'); strDataParam = rgstr[0]; if (rgstr.Length > 1 && rgstr[1] == "native") { bNative = true; } else { plots.GetParamMinMax(strDataParam, out dfParamMin, out dfParamMax); } if (rgstr.Length > 1 && rgstr[1] == "r") { plots.GetMinMaxOverWindow(0, plots.Count, out dfMinX, out dfMinY, out dfMaxX, out dfMaxY); } } double dfScaleHigh = m_config.GetExtraSetting("ScaleHigh", 70); double dfScaleLow = m_config.GetExtraSetting("ScaleLow", 30); float fLevel70 = m_gy.ScaleValue(dfScaleHigh, true); float fLevel30 = m_gy.ScaleValue(dfScaleLow, true); for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; float fX = rgX[i]; float?fY1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParam, bNative); if (!fY1.HasValue) { continue; } float fY = fY1.Value; if (float.IsNaN(fY) || float.IsInfinity(fY)) { fY = fYLast; } if (m_config.LineColor != Color.Transparent) { if (plotLast != null && plotLast.Active && plot.Active && ((plot.LookaheadActive && m_config.LookaheadActive) || i < rgX.Count - nLookahead)) { g.DrawLine(m_style.LinePen, fXLast, fYLast, fX, fY); Color clr = Color.Transparent; m_rgpt.Clear(); if (fY < fLevel70) { m_rgpt.Add(new PointF(fXLast, fLevel70)); if (fYLast < fLevel70) { m_rgpt.Add(new PointF(fXLast, fYLast)); } if (fY < fLevel70) { m_rgpt.Add(new PointF(fX, fY)); } m_rgpt.Add(new PointF(fX, fLevel70)); m_rgpt.Add(m_rgpt[0]); clr = Color.FromArgb(64, Color.Green); } else if (fY > fLevel30) { m_rgpt.Add(new PointF(fXLast, fLevel30)); if (fYLast > fLevel30) { m_rgpt.Add(new PointF(fXLast, fYLast)); } if (fY > fLevel30) { m_rgpt.Add(new PointF(fX, fY)); } m_rgpt.Add(new PointF(fX, fLevel30)); m_rgpt.Add(m_rgpt[0]); clr = Color.FromArgb(64, Color.Red); } if (clr != Color.Transparent && m_rgpt.Count > 0) { if (!m_style.Brushes.ContainsKey(clr)) { m_style.Brushes.Add(clr, new SolidBrush(clr)); } g.FillPolygon(m_style.Brushes[clr], m_rgpt.ToArray()); } } } plotLast = plot; fXLast = fX; if (!float.IsNaN(fY) && !float.IsInfinity(fY)) { fYLast = fY; } } } for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; float fX = rgX[i]; float?fY1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParam, bNative); if (!fY1.HasValue) { continue; } float fY = fY1.Value; RectangleF rcPlot = new RectangleF(fX - 2.0f, fY - 2.0f, 4.0f, 4.0f); if (isValid(rcPlot)) { if (m_config.PlotFillColor != Color.Transparent) { Brush brFill = (plot.Active) ? m_style.PlotFillBrush : Brushes.Transparent; g.FillEllipse(brFill, rcPlot); } if (m_config.PlotLineColor != Color.Transparent) { Pen pLine = (plot.Active) ? m_style.PlotLinePen : Pens.Transparent; g.DrawEllipse(pLine, rcPlot); } } } } }
public void Render(Graphics g, PlotCollectionSet dataset, int nLookahead) { if (m_config.DataIndexOnRender >= dataset.Count) { return; } PlotCollection plots = dataset[m_config.DataIndexOnRender]; List <int> rgX = m_gx.TickPositions; int nStartIdx = m_gx.StartPosition; Plot plotLast = null; float fXLast = 0; float fYLast = 0; double dfMinX = 0; double dfMaxX = 0; double dfMinY = 0; double dfMaxY = 1; double dfParamMin = 0; double dfParamMax = 0; string strDataParam = null; bool bNative = false; Pen pLineThin = null; if (!string.IsNullOrEmpty(m_config.DataParam)) { string[] rgstr = m_config.DataParam.Split(':'); strDataParam = rgstr[0]; if (rgstr.Length > 1 && rgstr[1] == "native") { bNative = true; } else { plots.GetParamMinMax(strDataParam, out dfParamMin, out dfParamMax); } if (rgstr.Length > 1 && rgstr[1] == "r") { plots.GetMinMaxOverWindow(0, plots.Count, out dfMinX, out dfMinY, out dfMaxX, out dfMaxY); } } for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; float fX = rgX[i]; float?fY1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParam, bNative); if (!fY1.HasValue) { continue; } float fY = fY1.Value; if (float.IsNaN(fY) || float.IsInfinity(fY)) { fY = fYLast; } if (m_config.LineColor != Color.Transparent) { if (plotLast != null && plotLast.Active && plot.Active && ((plot.LookaheadActive && m_config.LookaheadActive) || i < rgX.Count - nLookahead)) { g.DrawLine(m_style.LinePen, fXLast, fYLast, fX, fY); } } plotLast = plot; fXLast = fX; if (!float.IsNaN(fY) && !float.IsInfinity(fY)) { fYLast = fY; } } } for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; float fX = rgX[i]; float?fY1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParam, bNative); if (!fY1.HasValue) { continue; } float fY = fY1.Value; float frcY = fY - 2.0f; if (isValid(frcY)) { float frcX = fX - 2.0f; float frcW = 4.0f; float frcH = 4.0f; if (m_config.PlotFillColor != Color.Transparent) { Brush brFill = (plot.Active) ? m_style.PlotFillBrush : Brushes.Transparent; if ((m_config.PlotShape & ConfigurationPlot.PLOTSHAPE.SQUARE) == ConfigurationPlot.PLOTSHAPE.SQUARE) { g.FillRectangle(brFill, frcX, frcY, frcW, frcH); } else { g.FillEllipse(brFill, frcX, frcY, frcW, frcH); } } if (m_config.PlotLineColor != Color.Transparent) { if (plot.Active) { Pen pLine = (plot.UseOverrideColors) ? m_style.PlotLinePenOverride : m_style.PlotLinePen; if ((m_config.PlotShape & ConfigurationPlot.PLOTSHAPE.SQUARE) == ConfigurationPlot.PLOTSHAPE.SQUARE) { g.DrawRectangle(pLine, frcX, frcY, frcW, frcH); if ((m_config.PlotShape & ConfigurationPlot.PLOTSHAPE.ARROW_DOWN) == ConfigurationPlot.PLOTSHAPE.ARROW_DOWN) { if (pLineThin == null) { pLineThin = new Pen(pLine.Color, 1.0f); } g.DrawLine(pLineThin, frcX, frcY + frcH + 3, frcX + (frcW / 2), frcY + frcH + 6); g.DrawLine(pLineThin, frcX + frcW, frcY + frcH + 3, frcX + (frcW / 2), frcY + frcH + 6); } else if ((m_config.PlotShape & ConfigurationPlot.PLOTSHAPE.ARROW_UP) == ConfigurationPlot.PLOTSHAPE.ARROW_UP) { if (pLineThin == null) { pLineThin = new Pen(pLine.Color, 1.0f); } g.DrawLine(pLineThin, frcX, frcX - 3, frcX + (frcW / 2), frcX - 6); g.DrawLine(pLineThin, frcX + frcW, frcX - 3, frcX + (frcW / 2), frcX - 6); } } else { g.DrawEllipse(pLine, frcX, frcY, frcW, frcH); } } } } } } if (pLineThin != null) { pLineThin.Dispose(); } }
public void Render(Graphics g, PlotCollectionSet dataset, int nLookahead) { PlotCollection plots = dataset[m_config.DataIndexOnRender]; List <int> rgX = m_gx.TickPositions; int nStartIdx = m_gx.StartPosition; Plot plotLast = null; float fXLast = 0; float fYLast = 0; double dfMinX = 0; double dfMaxX = 0; double dfMinY = 0; double dfMaxY = 1; double dfParamMin = 0; double dfParamMax = 0; string strDataParam = null; bool bNative = false; int nAlpha = Math.Max(0, Math.Min(255, (int)(255 * m_config.Transparency))); bool bTransparentFill = (m_config.GetExtraSetting("TransparentFill", 0) != 0) ? true : false; Color clrFillUp = (bTransparentFill) ? Color.Transparent : Color.FromArgb(nAlpha, m_config.LineColor); Color clrFillDn = (bTransparentFill) ? Color.Transparent : Color.FromArgb(nAlpha, m_config.PlotLineColor); if (!m_rgBrushes.ContainsKey(clrFillUp)) { m_rgBrushes.Add(clrFillUp, new SolidBrush(clrFillUp)); } Brush brUp = m_rgBrushes[clrFillUp]; if (!m_rgBrushes.ContainsKey(clrFillDn)) { m_rgBrushes.Add(clrFillDn, new SolidBrush(clrFillDn)); } Brush brDn = m_rgBrushes[clrFillDn]; bool bTransparentLine = (m_config.GetExtraSetting("TransparentLine", 0) != 0) ? true : false; Color clrLineUp = (bTransparentLine) ? Color.Transparent : m_config.LineColor; Color clrLineDn = (bTransparentLine) ? Color.Transparent : m_config.PlotLineColor; if (!m_rgPens1.ContainsKey(m_config.LineWidth)) { m_rgPens1.Add(m_config.LineWidth, new Dictionary <Color, Pen>()); } if (!m_rgPens1[m_config.LineWidth].ContainsKey(clrLineUp)) { m_rgPens1[m_config.LineWidth].Add(clrLineUp, new Pen(clrLineUp, m_config.LineWidth)); } if (!m_rgPens1[m_config.LineWidth].ContainsKey(clrLineDn)) { m_rgPens1[m_config.LineWidth].Add(clrLineDn, new Pen(clrLineDn, m_config.LineWidth)); } Pen penUp = m_rgPens1[m_config.LineWidth][clrLineUp]; Pen penDn = m_rgPens1[m_config.LineWidth][clrLineDn]; double dfMidPoint = m_config.MidPoint; bool bMidPointReady = false; if (!string.IsNullOrEmpty(m_config.DataParam)) { string[] rgstrParam = m_config.DataParam.Split(';'); string[] rgstr = rgstrParam[0].Split(':'); strDataParam = rgstr[0]; if (rgstr.Length > 1 && rgstr[1] == "native") { bNative = true; } else { plots.GetParamMinMax(strDataParam, out dfParamMin, out dfParamMax); } if (rgstr.Length > 1 && rgstr[1] == "r") { plots.GetMinMaxOverWindow(0, plots.Count, out dfMinX, out dfMinY, out dfMaxX, out dfMaxY); } if (rgstrParam.Length > 1 && rgstrParam[1].Contains("midpoint")) { rgstr = rgstrParam[1].Split(':'); if (rgstr.Length > 1 && rgstr[0] == "midpoint") { double dfMidMin; double dfMidMax; plots.GetParamMinMax(rgstr[1], out dfMidMin, out dfMidMax); if (dfMidMin == double.MaxValue) { dfMidMin = 0; } dfMidPoint = dfMidMin; bMidPointReady = true; } } } float fYMid = (bMidPointReady) ? (float)m_gy.ScaleValue(dfMidPoint, true) : getYValue(dfMinY, dfMaxY, dfParamMin, dfParamMax, dfMidPoint, bNative); if (float.IsNaN(fYMid) || float.IsInfinity(fYMid)) { fYMid = 0; } for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; if (plot.Active) { float?fY1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParam, bNative); if (!fY1.HasValue) { continue; } float fX = rgX[i]; float fY = fY1.Value; if (float.IsNaN(fY) || float.IsInfinity(fY)) { fY = fYLast; } if (plotLast != null && plotLast.Active && plot.Active && ((plot.LookaheadActive && m_config.LookaheadActive) || i < rgX.Count - nLookahead)) { if ((fYLast > fYMid && fY > fYMid) || (fYLast < fYMid && fY < fYMid)) { m_rgpts5[0].X = fXLast; m_rgpts5[0].Y = fYMid; m_rgpts5[1].X = fXLast; m_rgpts5[1].Y = fYLast; m_rgpts5[2].X = fX; m_rgpts5[2].Y = fY; m_rgpts5[3].X = fX; m_rgpts5[3].Y = fYMid; m_rgpts5[4].X = m_rgpts5[0].X; m_rgpts5[4].Y = m_rgpts5[0].Y; if (fY > fYMid) { g.FillPolygon(brDn, m_rgpts5); } else { g.FillPolygon(brUp, m_rgpts5); } } else { float fYMid1 = fYLast + (Math.Abs(fY - fYLast) / 2.0f); float fXMid1 = fXLast + (Math.Abs(fX - fXLast) / 2.0f); m_rgpts4[0].X = fXLast; m_rgpts4[0].Y = fYMid; m_rgpts4[1].X = fXLast; m_rgpts4[1].Y = fYLast; m_rgpts4[2].X = fXMid1; m_rgpts4[2].Y = fYMid; m_rgpts4[3].X = m_rgpts4[0].X; m_rgpts4[3].Y = m_rgpts4[0].Y; if (fYLast < fYMid) { g.FillPolygon(brUp, m_rgpts4); } else { g.FillPolygon(brDn, m_rgpts4); } } } plotLast = plot; fXLast = fX; if (!float.IsNaN(fY) && !float.IsInfinity(fY)) { fYLast = fY; } } } } plotLast = null; fXLast = 0; fYLast = 0; for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; if (plot.Active) { float?fY1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParam, bNative); if (!fY1.HasValue) { continue; } float fX = rgX[i]; float fY = fY1.Value; if (float.IsNaN(fY) || float.IsInfinity(fY)) { fY = fYLast; } if (plotLast != null && plotLast.Active && plot.Active && ((plot.LookaheadActive && m_config.LookaheadActive) || i < rgX.Count - nLookahead)) { if (fYLast > fYMid && fY > fYMid) { g.DrawLine(penDn, fXLast, fYLast, fX, fY); } else if (fYLast < fYMid && fY < fYMid) { g.DrawLine(penUp, fXLast, fYLast, fX, fY); } else { float fYMid1 = fYLast + (Math.Abs(fY - fYLast) / 2.0f); float fXMid1 = fXLast + (Math.Abs(fX - fXLast) / 2.0f); if (fYLast < fY) { g.DrawLine(penUp, fXLast, fYLast, fXMid1, fYMid); g.DrawLine(penDn, fXMid1, fYMid, fX, fY); } else { g.DrawLine(penDn, fXLast, fYLast, fXMid1, fYMid); g.DrawLine(penUp, fXMid1, fYMid, fX, fY); } } } plotLast = plot; fXLast = fX; if (!float.IsNaN(fY) && !float.IsInfinity(fY)) { fYLast = fY; } } } } }
public void Render(Graphics g, PlotCollectionSet dataset, int nLookahead) { PlotCollection plots = dataset[m_config.DataIndexOnRender]; List <int> rgX = m_gx.TickPositions; int nStartIdx = m_gx.StartPosition; Plot plotLast = null; float fXLast = 0; float fYtLast = 0; float fYaLast = 0; float fYbLast = 0; double dfMinX = 0; double dfMaxX = 0; double dfMinY = 0; double dfMaxY = 0; double dfParamMin = 0; double dfParamMax = 0; string strDataParam = null; bool bNative = false; if (!string.IsNullOrEmpty(m_config.DataParam)) { string[] rgstr = m_config.DataParam.Split(':'); strDataParam = rgstr[0]; if (rgstr.Length > 1 && rgstr[1] == "native") { bNative = true; } else { plots.GetParamMinMax(strDataParam, out dfParamMin, out dfParamMax); } if (rgstr.Length > 1 && rgstr[1] == "r") { plots.GetMinMaxOverWindow(0, plots.Count, out dfMinX, out dfMinY, out dfMaxX, out dfMaxY); } } else { plots.GetMinMaxOverWindow(0, plots.Count, out dfMinX, out dfMinY, out dfMaxX, out dfMaxY); } string strDataParamBelow = (string.IsNullOrEmpty(strDataParam)) ? null : strDataParam + " Below"; string strDataParamAve = (string.IsNullOrEmpty(strDataParam)) ? null : strDataParam + " Ave"; string strDataParamAbove = (string.IsNullOrEmpty(strDataParam)) ? null : strDataParam + " Above"; int nTopOpacity = (int)m_config.GetExtraSetting("BollingerBandTopOpacity", 32); if (nTopOpacity < 0 || nTopOpacity > 255) { nTopOpacity = 32; } int nBtmOpacity = (int)m_config.GetExtraSetting("BollingerBandBtmOpacity", 64); if (nBtmOpacity < 0 || nBtmOpacity > 255) { nBtmOpacity = 64; } for (int i = 0; i < rgX.Count; i++) { int nIdx = nStartIdx + i; if (nIdx < plots.Count) { Plot plot = plots[nStartIdx + i]; float fX = rgX[i]; float?fYb1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParamBelow, bNative, 0); float?fYa1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParamAve, bNative, 1); float?fYt1 = getYValue(plot, dfMinY, dfMaxY, dfParamMin, dfParamMax, strDataParamAbove, bNative, 2); if (!fYt1.HasValue && !fYa1.HasValue && !fYb1.HasValue) { continue; } float fYt = fYt1.Value; float fYa = fYa1.Value; float fYb = fYb1.Value; if (float.IsNaN(fYt) || float.IsInfinity(fYt) || float.IsNaN(fYa) || float.IsInfinity(fYa) || float.IsNaN(fYb) || float.IsInfinity(fYb)) { fYt = fYtLast; fYa = fYaLast; fYb = fYbLast; } if (m_config.LineColor != Color.Transparent) { if (plotLast != null && plotLast.Active && plot.Active && ((plot.LookaheadActive && m_config.LookaheadActive) || i < rgX.Count - nLookahead)) { g.DrawLine(m_style.LinePen, fXLast, fYtLast, fX, fYt); g.DrawLine(m_style.LinePen, fXLast, fYbLast, fX, fYb); m_style.LinePen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; g.DrawLine(m_style.PlotLinePen, fXLast, fYaLast, fX, fYa); m_style.LinePen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; Color clr = Color.Transparent; m_rgpt[0].X = fXLast; m_rgpt[0].Y = fYtLast; m_rgpt[1].X = fX; m_rgpt[1].Y = fYt; m_rgpt[2].X = fX; m_rgpt[2].Y = fYa; m_rgpt[3].X = fXLast; m_rgpt[3].Y = fYaLast; m_rgpt[4].X = m_rgpt[0].X; m_rgpt[4].Y = m_rgpt[0].Y; clr = Color.FromArgb(nTopOpacity, m_config.PlotFillColor); if (!m_style.Brushes.ContainsKey(clr)) { m_style.Brushes.Add(clr, new SolidBrush(clr)); } g.FillPolygon(m_style.Brushes[clr], m_rgpt); m_rgpt[0].X = fXLast; m_rgpt[0].Y = fYbLast; m_rgpt[1].X = fX; m_rgpt[1].Y = fYb; m_rgpt[2].X = fX; m_rgpt[2].Y = fYa; m_rgpt[3].X = fXLast; m_rgpt[3].Y = fYaLast; m_rgpt[4].X = m_rgpt[0].X; m_rgpt[4].Y = m_rgpt[0].Y; clr = Color.FromArgb(nBtmOpacity, m_config.PlotFillColor); if (!m_style.Brushes.ContainsKey(clr)) { m_style.Brushes.Add(clr, new SolidBrush(clr)); } g.FillPolygon(m_style.Brushes[clr], m_rgpt); if (clr != Color.Transparent) { if (!m_style.Brushes.ContainsKey(clr)) { m_style.Brushes.Add(clr, new SolidBrush(clr)); } g.FillPolygon(m_style.Brushes[clr], m_rgpt); } } } plotLast = plot; fXLast = fX; if (!float.IsNaN(fYt) && !float.IsInfinity(fYt) || !float.IsNaN(fYa) && !float.IsInfinity(fYa) || !float.IsNaN(fYb) && !float.IsInfinity(fYb)) { fYtLast = fYt; fYaLast = fYa; fYbLast = fYb; } } } }