/// <summary>
        /// уточнить цену
        /// </summary>        
        private float RefinePrice(CandleChartControl chart, PointD worldCoords)
        {
            var price = (float) worldCoords.Y;
            if (RefineType == PriceRefineType.КакЕсть) return price;

            var candleIndex = (int) (worldCoords.X + 0.5);
            if (candleIndex < 0 || candleIndex >= chart.chart.StockSeries.DataCount) return price;
            var candle = chart.chart.StockSeries.Data.Candles[candleIndex];

            if (RefineType == PriceRefineType.Закрытия) return candle.close;

            var deltas = new []
                             {
                                 Math.Abs(candle.open - price), Math.Abs(candle.high - price),
                                 Math.Abs(candle.low - price), Math.Abs(candle.close - price)
                             };

            var minIndex = deltas.IndexOfMin();
            return minIndex == 0 ? candle.open : minIndex == 1 ? candle.high : minIndex == 2 ? candle.low : candle.close;
        }
Exemplo n.º 2
0
        private void DrawCommentForSelected(Graphics g,
            RectangleD worldRect, Rectangle canvasRect,
            PenStorage pens, BrushesStorage brushes)
        {
            if (string.IsNullOrEmpty(Comment)) return;

            var commentBox = new ChartComment
                {
                    Color = LineColor,
                    ColorFill = ShapeFillColor,
                    Text = Comment,
                    HideArrow = true,
                    FillTransparency = 160
                };
            var textRect = commentBox.GetCommentRectangle(g, worldRect, canvasRect);

            // прикинуть, куда лучше захреначить комментарий - в центр или в конец
            // спроецировать координаты курсора на линию
            var cursorPoint = Owner.Owner.PointToClient(Control.MousePosition);
            var screenPoints = linePoints.Select(p => Conversion.WorldToScreenF(p, worldRect, canvasRect)).ToList();
            var pivot = Geometry.GetProjectionPointOnLine(cursorPoint, screenPoints[0], screenPoints[1]);

            // пробуем два варианта размещения - привязываем левый верхний или
            // правый нижний углы комментария, смотрим, какой вариант ближе к центру экрана
            var potentialPivots = new []
                {
                    new PointF(pivot.X,
                               pivot.Y + textRect.Height/2),
                    new PointF(pivot.X - textRect.Width,
                               pivot.Y - textRect.Height/2)
                };
            var cx = canvasRect.Left + canvasRect.Width / 2;
            var cy = canvasRect.Top + canvasRect.Height / 2;
            var bestPivotIndex = potentialPivots.IndexOfMin(p => (p.X - cx)*(p.X - cx) + (p.Y - cy)*(p.Y - cy));
            pivot = potentialPivots[bestPivotIndex];
            var worldPivotPoint = Conversion.ScreenToWorld(pivot, worldRect, canvasRect);

            commentBox.PivotPrice = worldPivotPoint.Y;
            commentBox.PivotIndex = worldPivotPoint.X;

            // таки нарисовать
            using (var fonts = new FontStorage(Owner.Owner.Owner.Font))
                commentBox.DrawComment(g, fonts, worldRect, canvasRect, pens, brushes,
                    new List<Rectangle>());
        }