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(); }
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(); }
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(); }