Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
        }
Beispiel #4
0
        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());
            }
        }
Beispiel #5
0
        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();
        }