예제 #1
0
        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);
                        }
                    }
                }
            }
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        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;
                        }
                    }
                }
            }
        }
예제 #4
0
        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;
                    }
                }
            }
        }