Esempio n. 1
0
        protected override void UpdateGfxCore()
        {
            var line_colour   = (Selected ? Settings.Colour.Lerp(Color.Gray, 0.2f) : Settings.Colour).ToArgbU();
            var region_colour = (Selected ? Settings.RegionColour.Lerp(Color.Gray, 0.2f) : Settings.RegionColour).ToArgbU();
            var width         = (float)Chart.XAxis.Span;

            // Create graphics for the horizontal line
            m_vbuf.Resize(2 + (Level.WidthPips != 0 ? 4 : 0));
            m_ibuf.Resize(2 + (Level.WidthPips != 0 ? 6 : 0));
            m_nbuf.Resize(1 + (Level.WidthPips != 0 ? 1 : 0));

            m_vbuf[0] = new View3d.Vertex(new v4(0, 0, 0, 1), line_colour);
            m_vbuf[1] = new View3d.Vertex(new v4(width, 0, 0, 1), line_colour);
            m_ibuf[0] = 0;
            m_ibuf[1] = 1;

            var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new int[4] {
                Settings.LineWidth, 0, 0, 0
            });

            m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, 2, 0, 2, !Bit.AllSet(line_colour, 0xFF000000), mat);

            if (Level.WidthPips != 0)
            {
                var hh = (float)(Instrument.PriceData.PipSize * Level.WidthPips / 2.0);
                m_vbuf[2] = new View3d.Vertex(new v4(0, -hh, 0, 1), region_colour);
                m_vbuf[3] = new View3d.Vertex(new v4(width, -hh, 0, 1), region_colour);
                m_vbuf[4] = new View3d.Vertex(new v4(0, +hh, 0, 1), region_colour);
                m_vbuf[5] = new View3d.Vertex(new v4(width, +hh, 0, 1), region_colour);
                m_ibuf[2] = 2;
                m_ibuf[3] = 3;
                m_ibuf[4] = 5;
                m_ibuf[5] = 5;
                m_ibuf[6] = 4;
                m_ibuf[7] = 2;

                m_nbuf[1] = new View3d.Nugget(View3d.EPrim.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, 2, 6, 2, 8, !Bit.AllSet(region_colour, 0xFF000000));
            }

            // Create the graphics
            Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray());

            base.UpdateGfxCore();
        }
Esempio n. 2
0
        protected override void UpdateGfxCore()
        {
            // Generate the line plot for the visible area of the chart

            // Get the visible X axis range, and convert it to positive indices
            var first_idx = Instrument.FirstIdx;
            var rng       = Instrument.IndexRange((int)(Chart.XAxis.Min - 1), (int)(Chart.XAxis.Max + 1));

            rng.Beg = Maths.Clamp(rng.Beg - first_idx, 0, m_trend.Count);
            rng.End = Maths.Clamp(rng.End - first_idx, 0, m_trend.Count);
            if (rng.Counti == 0)
            {
                Gfx = null;
                return;
            }

            m_vbuf.Clear();
            m_ibuf.Clear();
            m_nbuf.Clear();

            var bullish_colour = Settings.BullishColour.ToArgbU();
            var bearish_colour = Settings.BearishColour.ToArgbU();
            var y_scale        = Chart.YAxis.Span * Settings.Scale;

            for (var i = rng.Begi; i < rng.Endi - 1; ++i)
            {
                var trend0 = m_trend[i];
                var trend1 = m_trend[i + 1];
                m_vbuf.Add(new View3d.Vertex(new v4(first_idx + i + 0, (float)Math.Abs(trend0 * y_scale), 0, 1f), trend0 >= 0 ? bullish_colour : bearish_colour));
                m_vbuf.Add(new View3d.Vertex(new v4(first_idx + i + 1, (float)Math.Abs(trend1 * y_scale), 0, 1f), trend0 >= 0 ? bullish_colour : bearish_colour));
                m_ibuf.Add((ushort)(m_vbuf.Count - 2));
                m_ibuf.Add((ushort)(m_vbuf.Count - 1));
            }
            var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new[] { Settings.Width, 0, 0, 0 });

            m_nbuf.Add(new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, (uint)m_vbuf.Count, 0, (uint)m_ibuf.Count, false, mat));

            // Create the graphics
            Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray());

            base.UpdateGfxCore();
        }
Esempio n. 3
0
        protected override void UpdateGfxCore()
        {
            // Generate the EMA line for the visible area of the chart
            var ema_colour = Settings.ColourEMA.ToArgbU();
            var bol_colour = Settings.ColourBollingerBands.ToArgbU();

            // Get the visible X axis range, and convert it to positive indices
            var first_idx = Instrument.FirstIdx;
            var rng       = Instrument.IndexRange((int)(Chart.XAxis.Min - 1), (int)(Chart.XAxis.Max + 1));

            rng.Beg = Maths.Clamp(rng.Beg - first_idx, 0, m_ema.Count);
            rng.End = Maths.Clamp(rng.End - first_idx, 0, m_ema.Count);
            if (rng.Counti == 0)
            {
                Gfx = null;
                return;
            }

            var count = rng.Counti;

            m_vbuf.Resize(count);
            m_ibuf.Resize((count - 1) * 2);
            m_nbuf.Resize(1);

            // EMA model
            var v = 0; var i = 0;

            foreach (var candle_index in rng)
            {
                var ema = m_ema[(int)candle_index];
                m_vbuf[v++] = new View3d.Vertex(new v4(candle_index + first_idx, (float)ema.Mean, ChartUI.Z.Indicators, 1f), ema_colour);
            }
            for (var vi = 0; i != m_ibuf.Count; ++vi)
            {
                m_ibuf[i++] = (ushort)(vi);
                m_ibuf[i++] = (ushort)(vi + 1);
            }
            var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new[] { Settings.Width, 0, 0, 0 });

            m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, (uint)v, 0, (uint)i, false, mat);

            // Add geometry for Bollinger bands
            if (Settings.BollingerBands != 0)
            {
                m_vbuf.Resize(m_vbuf.Count + 2 * count);
                m_ibuf.Resize(m_ibuf.Count + 2 * count);
                m_nbuf.Resize(m_nbuf.Count + 2);

                // Lower/Upper band
                foreach (var candle_index in rng)
                {
                    var ema = m_ema[(int)candle_index];
                    m_vbuf[v++] = new View3d.Vertex(new v4(candle_index + first_idx, (float)(ema.Mean - Settings.BollingerBands * ema.PopStdDev), ChartUI.Z.Indicators, 1f), bol_colour);
                    m_ibuf[i++] = (ushort)(v - 1);
                }
                m_nbuf[1] = new View3d.Nugget(View3d.EPrim.LineStrip, View3d.EGeom.Vert | View3d.EGeom.Colr, (uint)(v - count), (uint)v, (uint)(i - count), (uint)i);
                foreach (var candle_index in rng)
                {
                    var ema = m_ema[(int)candle_index];
                    m_vbuf[v++] = new View3d.Vertex(new v4(candle_index + first_idx, (float)(ema.Mean + Settings.BollingerBands * ema.PopStdDev), ChartUI.Z.Indicators, 1f), bol_colour);
                    m_ibuf[i++] = (ushort)(v - 1);
                }
                m_nbuf[2] = new View3d.Nugget(View3d.EPrim.LineStrip, View3d.EGeom.Vert | View3d.EGeom.Colr, (uint)(v - count), (uint)v, (uint)(i - count), (uint)i);
            }

            // Create the graphics
            Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray());

            base.UpdateGfxCore();
        }