コード例 #1
0
        public override void OnRender(ChartControl chartControl, ChartScale chartScale)
        {
            try
            {
                if (model != null)
                {
                    SharpDX.Direct2D1.AntialiasMode oldAntialiasMode = RenderTarget.AntialiasMode;
                    RenderTarget.AntialiasMode = SharpDX.Direct2D1.AntialiasMode.PerPrimitive;

                    ChartPanel panel = chartControl.ChartPanels[chartScale.PanelIndex];

                    Point startPoint = StartAnchor.GetPoint(chartControl, panel, chartScale);

                    // align to full pixel to avoid unneeded aliasing
                    double strokePixAdj   = ((double)(1 % 2)).ApproxCompare(0) == 0 ? 0.5d : 0d;
                    Vector pixelAdjustVec = new Vector(strokePixAdj, strokePixAdj);

                    Point endPoint = EndAnchor.GetPoint(chartControl, panel, chartScale);

                    // convert our start / end pixel points to directx 2d vectors
                    Point           startPointAdjusted = startPoint + pixelAdjustVec;
                    Point           endPointAdjusted   = endPoint + pixelAdjustVec;
                    SharpDX.Vector2 startVec           = startPointAdjusted.ToVector2();
                    SharpDX.Vector2 endVec             = endPointAdjusted.ToVector2();
                    //SharpDX.Direct2D1.Brush	tmpBrush			= chartControl.SelectionBrush;
                    SharpDX.Vector2 tmpVect = startVec - endVec;

                    brush0DX          = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Black);
                    brush0DX.Opacity  = (float)0.01;
                    brush1DX          = model.Input_ProfileRange_Border_Color.ToDxBrush(RenderTarget);
                    brush2DX          = model.Input_ProfileRange_Inside_Color.ToDxBrush(RenderTarget);
                    brush2DX.Opacity  = model.Profile_Opacity / (float)100d;
                    brush3DX          = model.Input_ProfileRange_POC_Color.ToDxBrush(RenderTarget);
                    brush3DX.Opacity  = model.Profile_Opacity / (float)100d;
                    brush4DX          = model.Range_Profile_Text_Color.ToDxBrush(RenderTarget);
                    brush4DX.Opacity  = model.Profile_Text_Opacity / (float)100d;
                    brush5DX          = model.Input_ProfileRange_Inside_Bid_Color.ToDxBrush(RenderTarget);
                    brush5DX.Opacity  = model.Profile_Opacity / (float)100d;
                    brush6DX          = model.Input_ProfileRange_Inside_Ask_Color.ToDxBrush(RenderTarget);
                    brush6DX.Opacity  = model.Profile_Opacity / (float)100d;
                    brush7DX          = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.WhiteSmoke);
                    brush8DX          = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Gray);
                    brush9DX          = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Gray);
                    brush9DX.Opacity  = (float)0.5;
                    brush10DX         = model.Input_ProfileRange_POC_Color.ToDxBrush(RenderTarget);
                    brush10DX.Opacity = model.Profile_Text_Opacity / (float)100d;
                    // if a plain ol' line, then we're all done
                    // if we're an arrow line, make sure to draw the actual line. for extended lines, only a single
                    // line to extended points is drawn below, to avoid unneeded multiple DrawLine calls
                    //RenderTarget.DrawLine(startVec, endVec, model.Input_ProfileRange_Inside_Color.ToDxBrush(RenderTarget), 2);

                    RenderTarget.DrawRectangle(new SharpDX.RectangleF(endVec.X, endVec.Y, tmpVect.X, tmpVect.Y), brush1DX, (float)1);
                    RenderTarget.FillRectangle(new SharpDX.RectangleF(endVec.X, endVec.Y, tmpVect.X, tmpVect.Y), brush0DX);

                    //int firstindex = ((int)model.parent.ChartControl.GetSlotIndexByTime(StartAnchor.Time));
                    //int lastIndex = ((int)model.parent.ChartControl.GetSlotIndexByTime(EndAnchor.Time));
                    int firstindex = model.parent.ChartBars.GetBarIdxByTime(chartControl, StartAnchor.Time);            //Edited by PD
                    int lastIndex  = model.parent.ChartBars.GetBarIdxByTime(chartControl, EndAnchor.Time);              //Edited by PD
                    Model.HistogrammClass profile = new Model.HistogrammClass();
                    int count = 0;

                    IEnumerable <Model.Bar> bars;
                    if (firstindex <= lastIndex)
                    {
                        bars = model.GetBarRange(firstindex, lastIndex);
                    }
                    else
                    {
                        bars = model.GetBarRange(lastIndex, firstindex);
                    }

                    int leftPosition = 0;
                    int topPosition  = 0;
                    if (startVec.X < endVec.X)
                    {
                        leftPosition = (int)startVec.X;
                    }
                    else
                    {
                        leftPosition = (int)endVec.X;
                    }
                    if (startVec.Y < endVec.Y)
                    {
                        topPosition = (int)startVec.Y;
                    }
                    else
                    {
                        topPosition = (int)endVec.Y;
                    }

                    foreach (Model.Bar bar in bars)
                    {
                        IEnumerable <KeyValuePair <double, Model.Claster> > clasters;
                        if (StartAnchor.Price >= EndAnchor.Price)
                        {
                            clasters = bar.ListOfClasters.Where(c => c.Key <= StartAnchor.Price && c.Key >= EndAnchor.Price);
                        }
                        else
                        {
                            clasters = bar.ListOfClasters.Where(c => c.Key >= StartAnchor.Price && c.Key <= EndAnchor.Price);
                        }

                        foreach (KeyValuePair <double, Model.Claster> claster in clasters)
                        {
                            profile.AddPrintToHistogramm(claster.Key, claster.Value.Volume_Ask_sum, PrintType.ASK);
                            profile.AddPrintToHistogramm(claster.Key, claster.Value.Volume_Bid_sum, PrintType.BID);
                        }
                    }

                    //textToRender+=" : "+profile.ListOfCurrentBar.Count.ToString();
                    Dictionary <double, int> deltaProfile = new Dictionary <double, int>();
                    double maxDeltaPrice = int.MinValue;
                    int    prevdelta     = 0;
                    int    volumeSum     = 0;

                    foreach (KeyValuePair <double, Model.CurrentClaster> claster in profile.ListOfCurrentBar)
                    {
                        volumeSum += claster.Value.Volume_sum;
                        int delta = Math.Abs(claster.Value.Volume_Bid_sum - claster.Value.Volume_Ask_sum);
                        deltaProfile.Add(claster.Key, delta);
                        if (prevdelta <= delta)
                        {
                            prevdelta     = delta;
                            maxDeltaPrice = claster.Key;
                        }
                    }

                    SharpDX.DirectWrite.TextFormat Claster_textFormat = chartControl.Properties.LabelFont.ToDirectWriteTextFormat();
                    Claster_textFormat.ParagraphAlignment = SharpDX.DirectWrite.ParagraphAlignment.Center;
                    int vol1 = ProfileType != 1 ? (int)Math.Abs(tmpVect.X) : (int)Math.Abs(tmpVect.X / 2);

                    float fontSize1 = Math.Max(7, Math.Min(vol1 / 2, Math.Min(14, model.Claster_Height - 1)));
                    SharpDX.DirectWrite.TextFormat Claster_textFormatEach = new SharpDX.DirectWrite.TextFormat(Core.Globals.DirectWriteFactory, "Arial", SharpDX.DirectWrite.FontWeight.Normal, SharpDX.DirectWrite.FontStyle.Normal, fontSize1);
                    Claster_textFormatEach.TextAlignment      = SharpDX.DirectWrite.TextAlignment.Leading;
                    Claster_textFormatEach.ParagraphAlignment = SharpDX.DirectWrite.ParagraphAlignment.Center;
                    Claster_textFormatEach.WordWrapping       = SharpDX.DirectWrite.WordWrapping.NoWrap;

                    if (ProfileType == 1 || ProfileType == 0)
                    {
                        foreach (KeyValuePair <double, Model.CurrentClaster> claster in profile.ListOfCurrentBar)
                        {
                            int Y_histogramm = chartScale.GetYByValue(claster.Key) - model.Claster_Height / 2;

                            int vol = claster.Value.Volume_sum * (int)Math.Abs(tmpVect.X) / profile.ListOfCurrentBar[profile.pocPrice].Volume_sum;

                            if (ProfileType == 0)
                            {
                                if (claster.Key == profile.pocPrice)
                                {
                                    if (ExtendedLine)
                                    {
                                        vol = (int)ChartPanel.MaxWidth - Math.Abs(leftPosition);
                                    }
                                    RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol, model.Claster_Height), brush3DX);

                                    int text_Y     = chartScale.GetYByValue(profile.pocPrice) - model.Claster_Height / 2;
                                    int text_width = profile.pocPrice.ToString().Length *7;
                                    RenderTarget.DrawText(profile.pocPrice.ToString(), Claster_textFormat,
                                                          new SharpDX.RectangleF(leftPosition - text_width, text_Y, text_width, model.Claster_Height), brush10DX);

                                    //RenderTarget.DrawRectangle(new SharpDX.RectangleF(leftPosition-text_width, text_Y,text_width ,model.Claster_Height), Brushes.Red.ToDxBrush(RenderTarget), 1f); //
                                }
                                else
                                {
                                    RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol, model.Claster_Height), brush2DX);
                                }

                                if (model.Range_Profile_Text_OnOff && vol1 > 10 && model.Claster_Height > 5)
                                {
                                    SharpDX.RectangleF rectText = new SharpDX.RectangleF(leftPosition + 2, Y_histogramm, vol1, model.Claster_Height);
                                    //RenderTarget.DrawRectangle(rectText, model.Range_Profile_Text_Color.ToDxBrush(RenderTarget), 1f);
                                    RenderTarget.DrawText(claster.Value.Volume_sum.ToString(), Claster_textFormatEach, rectText, brush4DX);
                                }
                            }
                            if (ProfileType == 1)
                            {
                                int vol_bid = claster.Value.Volume_Bid_sum * vol / claster.Value.Volume_sum;
                                RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol_bid, model.Claster_Height), brush5DX);
                                RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition + vol_bid, Y_histogramm, vol - vol_bid, model.Claster_Height), brush6DX);

                                if (claster.Key == profile.pocPrice && ExtendedLine)
                                {
                                    RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition + vol, Y_histogramm, (int)ChartPanel.MaxWidth - Math.Abs(leftPosition + vol), model.Claster_Height), brush3DX);
                                }
                                if (claster.Key == profile.pocPrice)
                                {
                                    int text_Y     = chartScale.GetYByValue(profile.pocPrice) - model.Claster_Height / 2;
                                    int text_width = profile.pocPrice.ToString().Length *7;
                                    RenderTarget.DrawText(profile.pocPrice.ToString(), Claster_textFormat,
                                                          new SharpDX.RectangleF(leftPosition - text_width, text_Y, text_width, model.Claster_Height), brush10DX);
                                    //RenderTarget.DrawRectangle(new SharpDX.RectangleF(leftPosition-text_width, text_Y,text_width ,model.Claster_Height), Brushes.Red.ToDxBrush(RenderTarget), 1f);
                                }
                                if (model.Range_Profile_Text_OnOff && vol1 > 10 && model.Claster_Height > 5)
                                {
                                    SharpDX.RectangleF rectText = new SharpDX.RectangleF(leftPosition + 2, Y_histogramm, vol1, model.Claster_Height);
                                    //RenderTarget.DrawRectangle(rectText, model.Range_Profile_Text_Color.ToDxBrush(RenderTarget), 1f);
                                    RenderTarget.DrawText(claster.Value.Volume_Bid_sum.ToString() + " x " + claster.Value.Volume_Ask_sum.ToString(), Claster_textFormatEach, rectText, brush4DX);
                                }
                            }
                        }
                    }
                    if (ProfileType == 2)
                    {
                        foreach (KeyValuePair <double, int> claster in deltaProfile)
                        {
                            int Y_histogramm = chartScale.GetYByValue(claster.Key) - model.Claster_Height / 2;

                            int vol_delta = claster.Value * (int)Math.Abs(tmpVect.X) / (int)prevdelta;

                            if (profile.ListOfCurrentBar[claster.Key].Volume_Bid_sum == profile.ListOfCurrentBar[claster.Key].Volume_Ask_sum)
                            {
                                vol_delta = 0;
                            }
                            else if (profile.ListOfCurrentBar[claster.Key].Volume_Bid_sum > profile.ListOfCurrentBar[claster.Key].Volume_Ask_sum)
                            {
                                RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol_delta, model.Claster_Height), brush5DX);
                            }
                            else if (profile.ListOfCurrentBar[claster.Key].Volume_Bid_sum < profile.ListOfCurrentBar[claster.Key].Volume_Ask_sum)
                            {
                                RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol_delta, model.Claster_Height), brush6DX);
                            }

                            if (model.Range_Profile_Text_OnOff && vol1 > 10 && model.Claster_Height > 5)
                            {
                                SharpDX.RectangleF rectText = new SharpDX.RectangleF(leftPosition + 2, Y_histogramm, vol1, model.Claster_Height);
                                //RenderTarget.DrawRectangle(rectText, model.Range_Profile_Text_Color.ToDxBrush(RenderTarget), 1f);
                                RenderTarget.DrawText((profile.ListOfCurrentBar[claster.Key].Volume_Ask_sum - profile.ListOfCurrentBar[claster.Key].Volume_Bid_sum).ToString(),
                                                      Claster_textFormatEach, rectText, brush4DX);
                            }
                        }
                        int text_Y     = chartScale.GetYByValue(maxDeltaPrice) - model.Claster_Height / 2;
                        int text_width = maxDeltaPrice.ToString().Length *7;
                        RenderTarget.DrawText(maxDeltaPrice.ToString(), Claster_textFormat, new SharpDX.RectangleF(leftPosition - text_width, text_Y, text_width, model.Claster_Height), brush10DX);
                    }

                    RenderTarget.DrawText("Σ " + volumeSum.ToString(), Claster_textFormat, new SharpDX.RectangleF(leftPosition, topPosition + Math.Abs(tmpVect.Y) + 3, volumeSum.ToString().Length *8 + 10, 10), brush10DX);
                    if (Claster_textFormat != null)
                    {
                        Claster_textFormat.Dispose();
                    }
                    if (Claster_textFormatEach != null)
                    {
                        Claster_textFormatEach.Dispose();
                    }

                    if (IsSelected)
                    {
                        SharpDX.Vector2 tempVector1 = new Point(leftPosition + 2, topPosition + 2 - 20).ToVector2();
                        SharpDX.Vector2 tempVector2 = new Point(leftPosition - 2 + 15, topPosition - 2 - 20 + 15).ToVector2();
                        RenderTarget.DrawLine(tempVector1, tempVector2, brush8DX, 2);
                        tempVector1.X += 11;
                        tempVector2.X -= 11;
                        RenderTarget.DrawLine(tempVector1, tempVector2, brush8DX, 2);
                        RenderTarget.DrawRectangle(new SharpDX.RectangleF(leftPosition, topPosition - 20, 15, 15), brush8DX, (float)1);

                        RenderTarget.DrawRectangle(new SharpDX.RectangleF(leftPosition + 20, topPosition - 20, 15, 15), brush8DX, (float)1);
                        string str = "";
                        switch (ProfileType)
                        {
                        case 0: str = "V"; break;

                        case 1: str = "P"; break;

                        case 2: str = "D"; break;
                        }

                        SharpDX.DirectWrite.Factory    fontFactory = new SharpDX.DirectWrite.Factory();
                        SharpDX.DirectWrite.TextFormat textFormat  = new SharpDX.DirectWrite.TextFormat(fontFactory, "Segoe UI", 15);
                        RenderTarget.DrawText(str, textFormat, new SharpDX.RectangleF(leftPosition + 23, topPosition - 23, 15, 15), brush7DX);
                        fontFactory.Dispose();
                        textFormat.Dispose();
                        if (ExtendedLine)
                        {
                            RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition + 42, topPosition - 18, 11, 11), brush9DX);
                        }
                        RenderTarget.DrawRectangle(new SharpDX.RectangleF(leftPosition + 40, topPosition - 20, 15, 15), brush8DX, (float)1);
                    }
                    RenderTarget.AntialiasMode = oldAntialiasMode;
                    if (brush0DX != null)
                    {
                        brush0DX.Dispose();
                    }
                    if (brush1DX != null)
                    {
                        brush1DX.Dispose();
                    }
                    if (brush2DX != null)
                    {
                        brush2DX.Dispose();
                    }
                    if (brush3DX != null)
                    {
                        brush3DX.Dispose();
                    }
                    if (brush4DX != null)
                    {
                        brush4DX.Dispose();
                    }
                    if (brush5DX != null)
                    {
                        brush5DX.Dispose();
                    }
                    if (brush6DX != null)
                    {
                        brush6DX.Dispose();
                    }
                    if (brush7DX != null)
                    {
                        brush7DX.Dispose();
                    }
                    if (brush8DX != null)
                    {
                        brush8DX.Dispose();
                    }
                    if (brush9DX != null)
                    {
                        brush9DX.Dispose();
                    }
                    if (brush10DX != null)
                    {
                        brush10DX.Dispose();
                    }
                }
            }
            catch (Exception ex) { Print("Range Profile2 OnRender 663: " + ex); }
            return;
        }
コード例 #2
0
        public override void OnRender(ChartControl chartControl, ChartScale chartScale)
        {
            if (model == null)
            {
                return;
            }
            try
            {
                // first of all, turn on anti-aliasing to smooth out our line
                RenderTarget.AntialiasMode = SharpDX.Direct2D1.AntialiasMode.PerPrimitive;

                ChartPanel panel = chartControl.ChartPanels[chartScale.PanelIndex];

                Point startPoint = StartAnchor.GetPoint(chartControl, panel, chartScale);


                Point endPoint = EndAnchor.GetPoint(chartControl, panel, chartScale);

                // convert our start / end pixel points to directx 2d vectors
                Point           startPointAdjusted = startPoint /*+ pixelAdjustVec*/;
                Point           endPointAdjusted   = endPoint /*+ pixelAdjustVec*/;
                SharpDX.Vector2 startVec           = startPointAdjusted.ToVector2();
                SharpDX.Vector2 endVec             = endPointAdjusted.ToVector2();
                //SharpDX.Direct2D1.Brush	tmpBrush			= IsInHitTest ? chartControl.SelectionBrush : LineStroke.BrushDX;

                SharpDX.Vector2 tmpVect = startVec - endVec;

                SharpDX.Direct2D1.Brush brush = Brushes.Red.ToDxBrush(RenderTarget);
                brush.Opacity = IsSelected ? (float)0.3 : 0;

                RenderTarget.DrawRectangle(new SharpDX.RectangleF(endVec.X, endVec.Y, tmpVect.X, tmpVect.Y), model.Input_ProfileRange_Border_Color.ToDxBrush(RenderTarget), (float)1);
                //RenderTarget.FillRectangle(new SharpDX.RectangleF(endVec.X, endVec.Y, tmpVect.X, tmpVect.Y),brush);

                int firstindex = ((int)model.parent.ChartControl.GetSlotIndexByTime(StartAnchor.Time));
                int lastIndex  = ((int)model.parent.ChartControl.GetSlotIndexByTime(EndAnchor.Time));



                IEnumerable <Model.Bar> bars;
                if (firstindex <= lastIndex)
                {
                    bars = model.GetBarRange(firstindex, lastIndex);
                }
                else
                {
                    bars = model.GetBarRange(lastIndex, firstindex);
                }

                int leftPosition = 0;
                int topPosition  = 0;
                if (startVec.X < endVec.X)
                {
                    leftPosition = (int)startVec.X;
                }
                else
                {
                    leftPosition = (int)endVec.X;
                }
                if (startVec.Y < endVec.Y)
                {
                    topPosition = (int)startVec.Y;
                }
                else
                {
                    topPosition = (int)endVec.Y;
                }


                Model.HistogrammClass profile = new Model.HistogrammClass();

                int count = 0;

                foreach (Model.Bar bar in bars)
                {
                    IEnumerable <KeyValuePair <double, Model.Claster> > clasters;
                    if (StartAnchor.Price >= EndAnchor.Price)
                    {
                        clasters = bar.ListOfClasters.Where(c => c.Key <= StartAnchor.Price && c.Key >= EndAnchor.Price);
                    }
                    else
                    {
                        clasters = bar.ListOfClasters.Where(c => c.Key >= StartAnchor.Price && c.Key <= EndAnchor.Price);
                    }

                    foreach (KeyValuePair <double, Model.Claster> claster in clasters)
                    {
                        profile.AddPrintToHistogramm(claster.Key, claster.Value.Volume_Ask_sum, PrintType.ASK);
                        profile.AddPrintToHistogramm(claster.Key, claster.Value.Volume_Bid_sum, PrintType.BID);
                    }
                }
                //textToRender+=" : "+profile.ListOfCurrentBar.Count.ToString();


                SharpDX.Direct2D1.Brush profile_Claster_Color = model.Input_ProfileRange_Inside_Color.ToDxBrush(RenderTarget);
                profile_Claster_Color.Opacity = (float)0.5;

                int volumeSum = 0;

                foreach (KeyValuePair <double, Model.CurrentClaster> claster in profile.ListOfCurrentBar)
                {
                    int Y_histogramm = chartScale.GetYByValue(claster.Key) - model.Claster_Height / 2;
                    int vol          = claster.Value.Volume_sum * (int)Math.Abs(tmpVect.X) / profile.ListOfCurrentBar[profile.pocPrice].Volume_sum;
                    volumeSum += claster.Value.Volume_sum;
                    if (claster.Key == profile.pocPrice)
                    {
                        RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol, model.Claster_Height), model.Input_ProfileRange_POC_Color.ToDxBrush(RenderTarget));
                    }
                    else
                    {
                        RenderTarget.FillRectangle(new SharpDX.RectangleF(leftPosition, Y_histogramm, vol, model.Claster_Height), profile_Claster_Color);
                    }
                }

                SharpDX.DirectWrite.TextFormat Claster_textFormat = chartControl.Properties.LabelFont.ToDirectWriteTextFormat();


                RenderTarget.DrawText("Σ " + volumeSum.ToString(), Claster_textFormat, new SharpDX.RectangleF(leftPosition, topPosition + Math.Abs(tmpVect.Y) + 3, volumeSum.ToString().Length *8 + 10, 10), Brushes.WhiteSmoke.ToDxBrush(RenderTarget));

                int text_Y     = chartScale.GetYByValue(profile.pocPrice) - model.Claster_Height / 2;
                int text_width = profile.pocPrice.ToString().Length *7;
                RenderTarget.DrawText(profile.pocPrice.ToString(), Claster_textFormat, new SharpDX.RectangleF(leftPosition - text_width, text_Y, text_width, 10), model.Input_ProfileRange_POC_Color.ToDxBrush(RenderTarget));


                if (false)
                {
                    RenderTarget.DrawRectangle(new SharpDX.RectangleF(leftPosition, topPosition - 20, 15, 15), Brushes.Gray.ToDxBrush(RenderTarget), (float)1);
                }



                return;
            }
            catch (Exception ex) { Print("MR CustomProfile 414: " + ex); }
        }