protected override void OnBarUpdate() { if (BarsArray == null || BarsArray.Length == 0) { return; } if (supportsRange) { double high = High.GetValueAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); double low = Low.GetValueAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); double close = Close.GetValueAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); int actualRange = (int)Math.Round(Math.Max(close - low, high - close) / Bars.Instrument.MasterInstrument.TickSize); double rangeCount = CountDown ? (isAdvancedType ? BarsPeriod.BaseBarsPeriodValue : BarsPeriod.Value) - actualRange : actualRange; rangeString = CountDown ? string.Format(NinjaTrader.Custom.Resource.RangeCounterRemaing, rangeCount) : string.Format(NinjaTrader.Custom.Resource.RangerCounterCount, rangeCount); } else { rangeString = NinjaTrader.Custom.Resource.RangeCounterBarError; } Draw.TextFixed(this, "NinjaScriptInfo", rangeString, TextPosition.BottomRight); }
protected override void OnBarUpdate() { if (BarsArray == null || BarsArray.Length == 0) { return; } if (BarsArray[0].BarsType.BuiltFrom == BarsPeriodType.Tick && BarsArray[0].BarsPeriod.ToString().IndexOf("Range") >= 0) { isRangeDerivate = true; } double high = High.GetValueAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); double low = Low.GetValueAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); double close = Close.GetValueAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); int actualRange = (int)Math.Round(Math.Max(close - low, high - close) / Bars.Instrument.MasterInstrument.TickSize); double rangeCount = CountDown ? BarsPeriod.Value - actualRange : actualRange; string range1 = (BarsPeriod.BarsPeriodType == BarsPeriodType.Range || isRangeDerivate ? CountDown ? string.Format(NinjaTrader.Custom.Resource.RangeCounterRemaing, rangeCount) : string.Format(NinjaTrader.Custom.Resource.RangerCounterCount, rangeCount) : NinjaTrader.Custom.Resource.RangeCounterBarError); Draw.TextFixed(this, "NinjaScriptInfo", range1, TextPosition.BottomRight); }
protected override void OnRender(ChartControl chartControl, ChartScale chartScale) { bool overlay = false; // Call base.OnRender() to ensure plots get rendered appropriately. base.OnRender(chartControl, chartScale); if (Bars == null || ChartControl == null) { return; } // Set AntiAlias mode for smoothing SharpDX.Direct2D1.AntialiasMode oldAntialiasMode = RenderTarget.AntialiasMode; RenderTarget.AntialiasMode = SharpDX.Direct2D1.AntialiasMode.PerPrimitive; // Check if we are in hit test for chartScale lines to ignore mouse clicks on these drawings if (!IsInHitTest) { double top = Instrument.MasterInstrument.RoundToTickSize(chartScale.GetValueByY(ChartPanel.Y)); double bot = Instrument.MasterInstrument.RoundToTickSize(chartScale.GetValueByY(ChartPanel.H)); double lastPos = chartScale.GetYByValue(bot - 2 * TickSize); int j = 0; // Loop through each tick level to draw lines with alternating DashStyles for (double i = bot - TickSize; i <= top; i += TickSize) { // This check makes sure lines have a distance greater than 1 pixel. if (lastPos - chartScale.GetYByValue(i) > 1) { // Iterate our DashStyle type ++j; // Draw our alternating tick lines DXH.DrawLine(RenderTarget, "LineBrush", ChartPanel.X, chartScale.GetYByValue(i), ChartPanel.W, chartScale.GetYByValue(i), LineBrushWidth, (DashStyleHelper)(j % 4)); lastPos = chartScale.GetYByValue(i); } } } // Limit Custom Rendering to ChartBars.FromIndex and ChartBars.ToIndex // Each index can be used for rendering per bar for (int idx = ChartBars.FromIndex; idx <= ChartBars.ToIndex; idx++) { // Reference Series objects with GetValueAt(idx) for each up bar marked in our "DrawSeries". // It is best to determine what should be rendered outside of OnRender() as much as possible to reduce repeated calculations in OnRender(). if (DrawSeries.GetValueAt(idx)) { // Set a bool for overlay drawing to be done last overlay = true; // DXMBrush Dictionary Reference for up bars DXH.DrawLine(RenderTarget, "LineBrush", ChartControl.GetXByBarIndex(ChartBars, idx) - 0.5, chartScale.GetYByValue(Close.GetValueAt(idx)) - 0.5, ChartControl.GetXByBarIndex(ChartBars, idx) - 0.5, chartScale.GetYByValue(Open.GetValueAt(idx)) - 0.5, (float)ChartControl.BarWidth * 2, DashStyleHelper.Solid); } // Demonstrate DrawText using DXMediaBrush DXH.DrawText(RenderTarget, idx.ToString(), new SimpleFont("Arial", 10), chartControl.GetXByBarIndex(ChartBars, idx), chartScale.GetYByValue(High.GetValueAt(idx) + 3 * TickSize), idx.ToString().Length *10, 10, DXMBrush); // Demonstrate DrawText Layout using DXMediaBrush DXH.DrawTextLayout(RenderTarget, ChartPanel, chartControl.GetXByBarIndex(ChartBars, idx), chartScale.GetYByValue(Low.GetValueAt(idx) - 3 * TickSize), idx.ToString(), new SimpleFont("Arial", 10), DXMBrush); // Demonstrate FillEllipse using DXMediaBrush Dictionary reference DXH.FillEllipse(RenderTarget, chartControl.GetXByBarIndex(ChartBars, idx), chartScale.GetYByValue((High.GetValueAt(idx) + 5 * TickSize)), (float)chartControl.BarWidth * 2, (float)chartControl.BarWidth * 2, "EllipseBrush"); // Demonstrate DrawEllipse using DXMediaBrush Dictionary reference DXH.DrawEllipse(RenderTarget, chartControl.GetXByBarIndex(ChartBars, idx), chartScale.GetYByValue(Low.GetValueAt(idx) - 5 * TickSize), (float)chartControl.BarWidth * 2, (float)chartControl.BarWidth * 2, "EllipseBrush", 2, DashStyleHelper.Dash); } // Draw items that should be overlayed once after all other drawing so the overlay remains on top and ignore mouse clicks if (overlay && !IsInHitTest) { // Draw some images DXH.DrawBitmap(RenderTarget, Image1Path, ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, Image1Opacity); DXH.DrawBitmap(RenderTarget, Image2Path, ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, Image2Opacity); // Draw a filled rectangle and a rectangle border DXH.FillRectangle(RenderTarget, ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, "RectBrush"); DXH.DrawRectangle(RenderTarget, ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, "RectBorderBrush", 10, DashStyleHelper.Dash); // Draw a filled rounded rectangle and a rounded rectangle border DXH.FillRoundedRectangle(RenderTarget, ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, ChartPanel.W / 2, ChartPanel.H / 2, "RoundedRectBrush"); DXH.DrawRoundedRectangle(RenderTarget, ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, ChartPanel.W / 2, ChartPanel.H / 2, "RoundedRectBorderBrush", 10, DashStyleHelper.Dash); // Line 1 DXMediaBrush Dictionary Reference DXH.DrawLine(RenderTarget, "LineBrush", ChartPanel.X, ChartPanel.Y, ChartPanel.W, ChartPanel.H, LineBrushWidth, DashStyleHelper.Solid); // Line 2 DXMediaBrush reference DXH.DrawLine(RenderTarget, DXMBrush, ChartPanel.X - 20, ChartPanel.Y, ChartPanel.W - 20, ChartPanel.H, LineBrushWidth, DashStyleHelper.Dash); // Line 3 DXMediaBrush.DxBrush reference from DXMediaBrush DXH.DrawLine(RenderTarget, DXMBrush.DxBrush, ChartPanel.X - 40, ChartPanel.Y, ChartPanel.W - 40, ChartPanel.H, LineBrushWidth, DashStyleHelper.DashDot); // Line 4 Windows Media Brush reference from DXMediaBrush DXH.DrawLine(RenderTarget, DXMBrush.MediaBrush, ChartPanel.X - 60, ChartPanel.Y, ChartPanel.W - 60, ChartPanel.H, LineBrushWidth, DashStyleHelper.DashDotDot); // Line 5 Windows Media Brush reference from User Defined Brush (Media Brushes must be cloned and refrozen for opacity to have effect) DXH.DrawLine(RenderTarget, LineBrush, ChartPanel.X - 80, ChartPanel.Y, ChartPanel.W - 80, ChartPanel.H, LineBrushWidth, DashStyleHelper.Solid); } //Reset AntiAlias mode RenderTarget.AntialiasMode = oldAntialiasMode; }
protected override void OnRender(ChartControl chartControl, ChartScale chartScale) { base.OnRender(chartControl, chartScale); try { if (Bars == null) { return; } if (isRangeChart) { int actualRange = (int)Math.Round(Math.Max(Close.GetValueAt(CurrentBar) - Low.GetValueAt(CurrentBar), High.GetValueAt(CurrentBar) - Close.GetValueAt(CurrentBar)) / Bars.Instrument.MasterInstrument.TickSize); int rangeCount = BarsPeriod.Value - actualRange; // determine wiggle room in ticks int barRange = (int)Math.Round((High.GetValueAt(CurrentBar) - Low.GetValueAt(CurrentBar)) / Bars.Instrument.MasterInstrument.TickSize); int margin = (BarsPeriod.Value - barRange); // calc our rectangle properties double highPrice = High.GetValueAt(CurrentBar) + (margin * TickSize); double lowPrice = Low.GetValueAt(CurrentBar) - (margin * TickSize); int rangeHighY = (ChartPanel.Y + ChartPanel.H) - ((int)(((highPrice - ChartPanel.MinValue) / Math.Max(Math.Abs(ChartPanel.MaxValue - ChartPanel.MinValue), 1E-05)) * ChartPanel.H)) - 1; int rangeLowY = (ChartPanel.Y + ChartPanel.H) - ((int)(((lowPrice - ChartPanel.MinValue) / Math.Max(Math.Abs(ChartPanel.MaxValue - ChartPanel.MinValue), 1E-05)) * ChartPanel.H)) - 1; int height = rangeLowY - rangeHighY; int rangeX = ChartControl.GetXByBarIndex(ChartBars, CurrentBar) - (int)(ChartControl.Properties.BarDistance / 2); int width = (int)(ChartControl.Properties.BarDistance); switch (margin) { case 0: SharpDX.RectangleF PLBoundRect0 = new SharpDX.RectangleF(rangeX, rangeHighY, width + 1, height); RenderTarget.DrawRectangle(PLBoundRect0, dxmBrushes["LockedBrush"].DxBrush, 2f); break; case 1: SharpDX.RectangleF PLBoundRect1 = new SharpDX.RectangleF(rangeX, rangeHighY, width + 1, height); RenderTarget.DrawRectangle(PLBoundRect1, dxmBrushes["WarningBrush"].DxBrush, 2f); break; } if (ShowPrices) { int lineH = (int)ChartControl.Properties.LabelFont.TextFormatHeight; DrawString(highPrice.ToString("F" + digits), ChartControl.Properties.LabelFont, "ChartFontBrush", rangeX, rangeHighY - lineH); DrawString("R:" + rangeCount.ToString(), ChartControl.Properties.LabelFont, "ChartFontBrush", rangeX + width, rangeHighY); DrawString(lowPrice.ToString("F" + digits), ChartControl.Properties.LabelFont, "ChartFontBrush", rangeX, rangeLowY); DrawString("C:" + barRange.ToString(), ChartControl.Properties.LabelFont, "ChartFontBrush", rangeX + width, rangeLowY - lineH); } } else { // Create a TextLayout so we can use Metrics for MeasureString() SharpDX.DirectWrite.TextFormat textFormat = ChartControl.Properties.LabelFont.ToDirectWriteTextFormat(); SharpDX.DirectWrite.TextLayout textLayout = new SharpDX.DirectWrite.TextLayout(NinjaTrader.Core.Globals.DirectWriteFactory, noRangeMessage, textFormat, ChartPanel.X + ChartPanel.W, textFormat.FontSize, 1, true); DrawString(noRangeMessage, ChartControl.Properties.LabelFont, "ChartFontBrush", ChartPanel.X + ChartPanel.W - textLayout.Metrics.Width - 10, ChartPanel.Y + ChartPanel.H - textLayout.Metrics.Height - 10); } } catch (Exception ex) { Print(ex.ToString()); } }
void ChartControl_MouseDown(object sender, System.Windows.Input.MouseEventArgs e) { if (myChartScale == null) { return; } if (!System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.RightAlt) && !System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.LeftAlt)) { return; } if (_fDragging == false) { //start a new one RemoveDrawObjects(); //delete all object from this application _iBarStart = BarFromX((int)e.GetPosition(ChartPanel).X); _priceStart = Low.GetValueAt(CurrentBar - BarFromX((int)e.GetPosition(ChartPanel).X)); _fDrawAB = true; _fDrawBC = false; _fDragging = true; _ABbarStart = _iBarStart; //place 'A' text double midBarAdd = (High.GetValueAt(CurrentBar - _iBarStart) - Low.GetValueAt(CurrentBar - _iBarStart)) * 0.5; swingDir = _priceStart <= myChartScale.GetValueByY((int)e.GetPosition(ChartPanel).Y) + midBarAdd ? -1 : 1; //Low.GetValueAt(CurrentBar - _iBarStart) + midBarAdd ? -1 : 1; swingColor = swingDir > 0 ? SwingColorUp : SwingColorDn; _ABpriceStart = _priceStart; TriggerCustomEvent(o => { Draw.Text(this, "dDwALabel", IsAutoScale, "A", _iBarStart, _priceStart, textOffset2 * swingDir * -1, swingColor, textFontLabel, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); Draw.Text(this, "dDwAPct", IsAutoScale, _priceStart.ToString(), _iBarStart, _priceStart, textOffset * swingDir * -1, swingColor, textFont, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); }, null); } else if (_fDrawAB == true) { //finish AB, start BC //save points for first time restore APDate = lineAB.StartAnchor.Time; APVal = lineAB.StartAnchor.Price; BPDate = lineAB.EndAnchor.Time; BPVal = lineAB.EndAnchor.Price; _fDrawAB = false; _fDrawBC = true; _ABbarEnd = _iBarEnd; //current position from mousemove _ABpriceEnd = _priceEnd; _BCbarStart = _ABbarEnd; //current position _BCpriceStart = _ABpriceEnd; //reset line start to draw BC _iBarStart = _BCbarStart; _priceStart = _BCpriceStart; //Place 'B' text on bar H or low double moveVal = RoundInst(Math.Abs(_ABpriceStart - _ABpriceEnd)); Draw.Text(this, "dDwBLabel", IsAutoScale, "B", _iBarStart, _priceStart, textOffset2 * swingDir, swingColor, textFontLabel, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); Draw.Text(this, "dDwBPrice", IsAutoScale, moveVal.ToString() + "c - " + _priceStart.ToString(), _iBarStart, _priceStart, textOffset * swingDir, swingColor, textFont, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); } else if (_fDrawBC) { CPDate = lineBC.EndAnchor.Time; CPVal = lineBC.EndAnchor.Price; //finish BC draw _fDrawBC = false; _fDragging = false; _BCbarEnd = _iBarEnd; //current position from mousemove _BCpriceEnd = _priceEnd; DoDrawFibs(1, FibABRets, FibABExtends, FibABColor); DoDrawFibs(2, FibBCRets, FibBCExtends, FibBCColor); DoDrawFibs(3, FibMMRets, FibMMExtends, swingColor); Draw.Text(this, "dDwCLabel", IsAutoScale, "C", _iBarEnd, _priceEnd, textOffset3 * swingDir * -1, swingColor, textFontLabel, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); //move value and % double moveVal = RoundInst(Math.Abs(_BCpriceStart - _BCpriceEnd)); double movePct = (moveVal / Math.Abs(_ABpriceStart - _ABpriceEnd)) * 100; Draw.Text(this, "dDwCPct", IsAutoScale, movePct.ToString("f1") + "%", _iBarEnd, _priceEnd, textOffset2 * swingDir * -1, swingColor, textFont, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); Draw.Text(this, "dDwCPrice", IsAutoScale, moveVal.ToString() + "c - " + _priceEnd.ToString(), _iBarEnd, _priceEnd, textOffset * swingDir * -1, swingColor, textFont, TextAlignment.Center, Brushes.Transparent, Brushes.Transparent, 0); } else { _fDragging = false; //error, turn off sequence } ChartControl.InvalidateVisual(); }