public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            PointF drawingPoint = new PointF();

            if (this.Visible == false)
            {
                return;
            }

            lock (this)
            {
                Image image;
                foreach (float value in _values)
                {// Images mode does not apply unit unification
                    if (double.IsNaN(value) == false && drawingPoint.X >= clippingRectangle.X && drawingPoint.X <= clippingRectangle.X + clippingRectangle.Width &&
                        _images.ContainsKey((int)value))
                    {
                        image = _images[(int)value];
                        g.DrawImage(image, drawingPoint.X + _imagesDisplacement.X - image.Width / 2, drawingPoint.Y + _imagesDisplacement.Y + (float)value);
                    }

                    drawingPoint.X += itemMargin + itemWidth;
                }
            }
        }
Пример #2
0
        /// <summary>
        /// This is a chance for the Series to draw custom messages on the given location (typically top left corner).
        /// The result must be the next valid drawing point down (how much space was used for drawing by current series).
        /// </summary>
        public virtual PointF DrawCustomMessages(ChartPane managingPane, GraphicsWrapper g, PointF drawingLocation)
        {
            if (Visible == false)
            {
                return(drawingLocation);
            }

            foreach (KeyValuePair <string, Color> pair in CustomMessages)
            {
                Brush brush = managingPane.TitleFontBrush;
                if (pair.Value.IsEmpty == false)
                {
                    brush = new SolidBrush(pair.Value);
                }

                Font font = managingPane.TitleFont;
                if (CustomMessagesFont != null)
                {
                    font = CustomMessagesFont;
                }

                drawingLocation = DrawCustomMessage(g, font, brush, pair.Key, drawingLocation);
            }

            return(drawingLocation);
        }
Пример #3
0
 private void masterPane_AppearanceSchemeChangedEvent(ChartPane pane, ChartPane.AppearanceSchemeEnum scheme)
 {
     if (masterPane.XAxisLabelsFontBrush is SolidBrush)
     {
         this.toolStripMain.ForeColor = ((SolidBrush)masterPane.XAxisLabelsFontBrush).Color;
     }
 }
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            PointF drawingPoint = new PointF();

            if (this.Visible == false)
            {
                return;
            }

            lock (this)
            {
                Image image;
                foreach (float value in _values)
                {// Images mode does not apply unit unification
                    if (double.IsNaN(value) == false && drawingPoint.X >= clippingRectangle.X && drawingPoint.X <= clippingRectangle.X + clippingRectangle.Width
                        && _images.ContainsKey((int)value))
                    {
                        image = _images[(int)value];
                        g.DrawImage(image, drawingPoint.X + _imagesDisplacement.X - image.Width / 2, drawingPoint.Y + _imagesDisplacement.Y + (float)value);
                    }

                    drawingPoint.X += itemMargin + itemWidth;
                }
            }
        }
Пример #5
0
 void masterPane_ParametersUpdatedEvent(ChartPane pane)
 {
     if (this.IsHandleCreated == false)
     {
         return;
     }
     UpdateMasterPaneToolbar();
 }
Пример #6
0
        ///// <summary>
        ///// Take over *persistent only* information from another instance.
        ///// </summary>
        ///// <param name="manager"></param>
        //public void ScapeObjectsFrom(CustomObjectsManager manager)
        //{
        //    _selectedDynamicCustomObjects.Clear();

        //    foreach(CustomObject customObject in _staticCustomObjects.ToArray())
        //    {
        //        this.Remove(customObject);
        //    }

        //    foreach(CustomObject customObject in _dynamicCustomObjects.ToArray())
        //    {
        //        this.Remove(customObject);
        //    }

        //    foreach (CustomObject customObject in manager._staticCustomObjects)
        //    {
        //        manager.Remove(customObject);
        //        this.Add(customObject);
        //    }

        //    foreach (CustomObject customObject in manager._dynamicCustomObjects)
        //    {
        //        manager.Remove(customObject);
        //        this.Add(customObject);
        //    }
        //}

        #region IDisposable Members

        public void Dispose()
        {
            _pane = null;
            _currentObjectBuilt = null;
            _dragLastDrawingSpaceMouseLocation = null;
            _dynamicCustomObjects.Clear();
            _selectedDynamicCustomObjects.Clear();
            _staticCustomObjects.Clear();
        }
        /// <summary>
        /// Main drawing routine.
        /// </summary>
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification,
            RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            TracerHelper.Trace(ReflectionHelper.GetCallingMethod(2).Name);

            if (Visible == false)
            {
                return;
            }

            lock (this)
            {
                base.Draw(g, _data.AsReadOnly(), unitsUnification, clippingRectangle, itemWidth, itemMargin, _maxVolume, null);
            }
        }
        /// <summary>
        /// Main drawing routine.
        /// </summary>
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification,
                                  RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            TracerHelper.Trace(ReflectionHelper.GetCallingMethod(2).Name);

            if (Visible == false)
            {
                return;
            }

            lock (this)
            {
                base.Draw(g, _data.AsReadOnly(), unitsUnification, clippingRectangle, itemWidth, itemMargin, _maxVolume, null);
            }
        }
Пример #9
0
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification,
                                  RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            if (this.Visible == false)
            {
                return;
            }

            lock (this)
            {
                for (int i = 0; i < _valueSets.Count; i++)
                {
                    Pen pen = _defaultPen;
                    if (_valueSetsPens[i] == null)
                    {
                        pen = _valueSetsPens[i];
                    }

                    base.DrawItemSet(_chartType, g, pen, _defaultFill, unitsUnification, clippingRectangle, itemWidth, itemMargin, _valueSets[i]);
                }
            } // Lock
        }
Пример #10
0
        /// <summary>
        /// This is a chance for the Series to draw custom messages on the given location (typically top left corner).
        /// The result must be the next valid drawing point down (how much space was used for drawing by current series).
        /// </summary>
        public virtual PointF DrawCustomMessages(ChartPane managingPane, GraphicsWrapper g, PointF drawingLocation)
        {
            if (Visible == false)
            {
                return drawingLocation;
            }

            foreach (KeyValuePair<string, Color> pair in CustomMessages)
            {
                Brush brush = managingPane.TitleFontBrush;
                if (pair.Value.IsEmpty == false)
                {
                    brush = new SolidBrush(pair.Value);
                }

                Font font = managingPane.TitleFont;
                if (CustomMessagesFont != null)
                {
                    font = CustomMessagesFont;
                }

                drawingLocation = DrawCustomMessage(g, font, brush, pair.Key, drawingLocation);
            }

            return drawingLocation;
        }
Пример #11
0
 void _masterPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, Matrix previousTransformation, Matrix currentTransformation)
 {
     SynchronizeWithMasterPane();
 }
Пример #12
0
 private void masterPane_AppearanceSchemeChangedEvent(ChartPane pane, ChartPane.AppearanceSchemeEnum scheme)
 {
     if (masterPane.XAxisLabelsFontBrush is SolidBrush)
     {
         this.toolStripMain.ForeColor = ((SolidBrush)masterPane.XAxisLabelsFontBrush).Color;
     }
 }
 void _masterPane_AppearanceSchemeChangedEvent(ChartPane pane, AppearanceSchemeEnum scheme)
 {
     this.SetAppearanceScheme(scheme);
     this.Refresh();
     //this.Invalidate();
 }
Пример #14
0
 void graphicPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, System.Drawing.Drawing2D.Matrix previousTransformation, System.Drawing.Drawing2D.Matrix currentTransformation)
 {// Pane has changed its view.
     graphicPane_DrawingSpaceUpdatedEvent(pane);
     toolStripLabelUnitUnification.Text = "Scale: 1 / " + masterPane.CurrentUnitUnification;
 }
 void control_AddIndicatorEvent(PlatformIndicator indicator, ChartPane pane)
 {
     if (pane == null)
     {
         pane = chartControl.CreateSlavePane(indicator.Name, SlaveChartPane.MasterPaneSynchronizationModeEnum.XAxis, this.Height / 4);
         pane.RightMouseButtonSelectionMode = ChartPane.SelectionModeEnum.HorizontalZoom;
         pane.Add(indicator.ChartSeries);
         // Establish proper Y axis values.
         //pane.FitDrawingSpaceToScreen(true, true);
     }
     else
     {
         pane.Add(indicator.ChartSeries);
     }
 }
        /// <summary>
        /// Override this routine, to add the price labels at the space outside of the current drawing pane.
        /// </summary>
        /// <param name="managingPane"></param>
        /// <param name="g"></param>
        public override void DrawInitialActualSpaceOverlays(ChartPane managingPane, GraphicsWrapper g)
        {
            base.DrawInitialActualSpaceOverlays(managingPane, g);

            if (_dataProvider == null || _dataProvider.OperationalState != OperationalStateEnum.Operational)
            {
                return;
            }

            decimal?ask = _dataProvider.Quotes.Ask;
            decimal?bid = _dataProvider.Quotes.Bid;

            if (ask.HasValue == false ||
                bid.HasValue == false)
            {
                return;
            }

            // Measure based on a default format of 6 symbols.
            SizeF size = g.MeasureString("00.0000", managingPane.LabelsFont);

            Brush fillBrush = managingPane.LabelsFill;

            if (fillBrush == null)
            {
                fillBrush = managingPane.ActualDrawingSpaceAreaFill;
            }

            if (_showCurrentAskLine)
            {
                PointF position = managingPane.GraphicsWrapper.DrawingSpaceToActualSpace(new PointF(0, (float)_dataProvider.Quotes.Ask), true);
                position.X  = managingPane.Width - managingPane.ActualDrawingSpaceAreaMarginRight;
                position.Y -= size.Height;

                if (fillBrush != null)
                {
                    g.FillRectangle(fillBrush, new RectangleF(position.X, position.Y, size.Width, size.Height));
                }

                if (managingPane.LabelsFont != null && managingPane.LabelsFontBrush != null)
                {
                    g.DrawString(ask.Value.ToString(_dataProvider.SessionInfo.ValueFormat), managingPane.LabelsFont, managingPane.LabelsFontBrush, position);
                    g.DrawRectangle(managingPane.ActualDrawingSpaceAreaBorderPen, new RectangleF(position.X, position.Y, size.Width /* - 2*/, size.Height));
                }
            }

            if (_showCurrentBidLine)
            {
                PointF position = managingPane.GraphicsWrapper.DrawingSpaceToActualSpace(new PointF(0, (float)_dataProvider.Quotes.Bid), true);
                position.X = managingPane.Width - managingPane.ActualDrawingSpaceAreaMarginRight;

                if (fillBrush != null)
                {
                    g.FillRectangle(fillBrush, new RectangleF(position.X, position.Y, size.Width, size.Height));
                }

                if (managingPane.LabelsFont != null && managingPane.LabelsFontBrush != null)
                {
                    g.DrawString(bid.Value.ToString(_dataProvider.SessionInfo.ValueFormat), managingPane.LabelsFont, managingPane.LabelsFontBrush, position);
                    g.DrawRectangle(managingPane.ActualDrawingSpaceAreaBorderPen, new RectangleF(position.X, position.Y, size.Width /* - 2*/, size.Height));
                }
            }
        }
Пример #17
0
 void _masterPane_AppearanceSchemeChangedEvent(ChartPane pane, AppearanceSchemeEnum scheme)
 {
     this.SetAppearanceScheme(scheme);
     this.Refresh();
     //this.Invalidate();
 }
 public void UnInitialize()
 {
     _pane = null;
 }
 public void Initialize(ChartPane pane)
 {
     SystemMonitor.CheckThrow(_pane == null);
     _pane = pane;
 }
 public void Dispose()
 {
     _pane = null;
     _currentObjectBuilt = null;
     _dragLastDrawingSpaceMouseLocation = null;
     _dynamicCustomObjects.Clear();
     _selectedDynamicCustomObjects.Clear();
     _staticCustomObjects.Clear();
 }
 /// <summary>
 /// 
 /// </summary>
 void _masterPane_ParametersUpdatedEvent(ChartPane pane)
 {
     SynchronizeWithMasterPane();
 }
 void _masterPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, Matrix previousTransformation, Matrix currentTransformation)
 {
     SynchronizeWithMasterPane();
 }
Пример #23
0
 /// <summary>
 /// Allows the chart series to render information on the external overlaying part of the chart pane.
 /// </summary>
 /// <param name="g"></param>
 /// <param name="clippingRectangle">Rectangle describing the entire drawing area.</param>
 public virtual void DrawInitialActualSpaceOverlays(ChartPane managingPane, GraphicsWrapper g)
 {
 }
Пример #24
0
 /// <summary>
 /// Allows the chart series to render information on the external overlaying part of the chart pane.
 /// </summary>
 /// <param name="g"></param>
 /// <param name="clippingRectangle">Rectangle describing the entire drawing area.</param>
 public virtual void DrawInitialActualSpaceOverlays(ChartPane managingPane, GraphicsWrapper g)
 {
 }
        /// <summary>
        /// Main drawing routine.
        /// </summary>
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification,
                                  RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            //TracerHelper.Trace(TracerHelper.GetCallingMethod(2).Name);

            if (Visible == false)
            {
                return;
            }

            if (_dataProvider == null)
            {
                return;
            }

            IDataBarHistoryProvider dataBarProvider = CurrentDataBarProvider;

            if (dataBarProvider == null)
            {
                return;
            }

            lock (dataBarProvider)
            {
                base.Draw(g, dataBarProvider.BarsUnsafe, unitsUnification, clippingRectangle, itemWidth, itemMargin, _maxVolume, null);
            }

            // Draw ask/bid line.
            if (_dataProvider.OperationalState == CommonSupport.OperationalStateEnum.Operational && _dataProvider.Quotes != null &&
                _dataProvider.Quotes.Bid.HasValue && _dataProvider.Quotes.Ask.HasValue)
            {
                if (_showCurrentAskLine)
                {
                    float price = (float)_dataProvider.Quotes.Ask;
                    g.DrawLine(_priceLevelPen, clippingRectangle.X, price, clippingRectangle.X + clippingRectangle.Width, price);
                }

                if (_showCurrentBidLine)
                {
                    float price = (float)_dataProvider.Quotes.Bid;
                    g.DrawLine(_priceLevelPen, clippingRectangle.X, price, clippingRectangle.X + clippingRectangle.Width, price);
                }
            }

            List <Order> ordersOpening;

            // Draw orders locations on chart.
            lock (this)
            {
                if (_orderExecutionProvider == null)
                {
                    return;
                }
            }
            // Render orders.
            ordersOpening = new List <Order>();

            ITradeEntityManagement history = _orderExecutionProvider.TradeEntities;

            if (history != null && _dataProvider != null)
            {
                lock (history)
                {
                    ordersOpening.AddRange(history.GetOrdersBySymbol(_dataProvider.SessionInfo.Symbol));
                }
            }

            // Use for orders closes.
            List <Order> ordersClosing = new List <Order>();

            foreach (Order order in ordersOpening)
            {
                if (order.State == OrderStateEnum.Closed)
                {// Only add orders already closed.
                    ordersClosing.Add(order);
                }
            }

            // This is used later on, since ordersClosing is modified.
            List <Order> ordersClosed = new List <Order>(ordersClosing);

            // TradeEntities opening at current bar.
            List <Order> pendingOpeningOrders = new List <Order>();
            // Order closing at current bar.
            List <Order> pendingClosingOrders = new List <Order>();

            PointF drawingPoint = new PointF();
            int    startIndex, endIndex;

            GetDrawingRangeIndecesFromClippingRectange(clippingRectangle, drawingPoint, unitsUnification, out startIndex, out endIndex, itemWidth, itemMargin);

            lock (dataBarProvider)
            {
                float lastBarX = (itemMargin + itemWidth) * dataBarProvider.BarCount;
                for (int i = startIndex; i < endIndex && i < dataBarProvider.BarCount &&
                     (ordersOpening.Count > 0 || ordersClosing.Count > 0); i++)
                {         // Foreach bar, draw orders (and closeVolume).
                    while (ordersOpening.Count > 0)
                    {     // All orders before now.
                        if (ordersOpening[0].OpenTime < (dataBarProvider.BarsUnsafe[i].DateTime - Period))
                        { // Order before time period.
                            if ((ordersOpening[0].State == OrderStateEnum.Executed /*||
                                                                                    * ordersOpening[0].State == OrderInformation.OrderStateEnum.Submitted*/) &&
                                _showPendingOrdersTracing)
                            {// Since it is an open pending order, we shall also need to draw it as well.
                                pendingOpeningOrders.Add(ordersOpening[0]);
                            }
                            ordersOpening.RemoveAt(0);
                            continue;
                        }

                        if (ordersOpening[0].OpenTime > dataBarProvider.BarsUnsafe[i].DateTime)
                        {// Order after time period - look no further.
                            break;
                        }

                        // Order open is within the current period.
                        // Only if order is part of the current period - add to pending.
                        pendingOpeningOrders.Add(ordersOpening[0]);
                        ordersOpening.RemoveAt(0);
                    }

                    for (int j = ordersClosing.Count - 1; j >= 0; j--)
                    {
                        if (ordersClosing[j].CloseTime >= (dataBarProvider.BarsUnsafe[i].DateTime - dataBarProvider.Period) &&
                            ordersClosing[j].CloseTime <= dataBarProvider.BarsUnsafe[i].DateTime)
                        {// Order close is within the current period.
                            pendingClosingOrders.Add(ordersClosing[j]);
                            ordersClosing.RemoveAt(j);
                        }
                    }

                    drawingPoint.X = i * (itemMargin + itemWidth);
                    DrawOrders(g, i, drawingPoint, itemWidth, itemMargin, pendingOpeningOrders, pendingClosingOrders, dataBarProvider.BarsUnsafe[i], lastBarX);
                    pendingOpeningOrders.Clear();
                    pendingClosingOrders.Clear();
                }

                if (_showClosedOrdersTracing && dataBarProvider.BarCount > 0 && startIndex < dataBarProvider.BarCount)
                {// Since a closed order may be before or after (or during) the curren set of periods - make a special search and render for them.
                    endIndex = Math.Max(0, endIndex);
                    endIndex = Math.Min(dataBarProvider.BarCount - 1, endIndex);

                    foreach (Order order in ordersClosed)
                    {
                        if (order.OpenTime.HasValue &&
                            order.CloseTime.HasValue &&
                            order.OpenTime.Value <= dataBarProvider.BarsUnsafe[endIndex].DateTime &&
                            order.CloseTime.Value >= dataBarProvider.BarsUnsafe[startIndex].DateTime - dataBarProvider.Period)
                        {
                            int openIndex  = dataBarProvider.GetIndexAtTime(order.OpenTime.Value);
                            int closeIndex = dataBarProvider.GetIndexAtTime(order.CloseTime.Value);

                            Pen pen = _buyDashedPen;
                            if (order.IsBuy == false)
                            {
                                pen = _sellDashedPen;
                            }

                            Decimal?doubleOpenValue  = order.OpenPrice;
                            Decimal?doubleCloseValue = order.ClosePrice;

                            if (doubleOpenValue.HasValue == false)
                            {
                                SystemMonitor.Error("Invalid open price value for closed order to draw.");
                                continue;
                            }

                            if (doubleCloseValue.HasValue == false)
                            {
                                SystemMonitor.Error("Invalid close price value for closed order to draw.");
                                continue;
                            }

                            g.DrawLine(pen, new PointF(openIndex * (itemWidth + itemMargin), (float)doubleOpenValue),
                                       new PointF(closeIndex * (itemWidth + itemMargin), (float)doubleCloseValue));
                        }
                    }
                }
            } // Lock
        }
Пример #26
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="g"></param>
 /// <param name="unitsUnification">Draw a few units as one. Used when zooming is too big to show each unit - so unify them. 1 means no unification, 10 means unify 10 units together</param>
 /// <param name="clippingRectangle"></param>
 /// <param name="itemWidth"></param>
 /// <param name="itemMargin"></param>
 public abstract void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, RectangleF clippingRectangle, float itemWidth, float itemMargin);
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, 
            RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            if (this.Visible == false)
            {
                return;
            }

            lock (this)
            {
                for (int i = 0; i < _valueSets.Count; i++)
                {
                    Pen pen = _defaultPen;
                    if (_valueSetsPens[i] == null)
                    {
                        pen = _valueSetsPens[i];
                    }

                    base.DrawItemSet(_chartType, g, pen, _defaultFill, unitsUnification, clippingRectangle, itemWidth, itemMargin, _valueSets[i]);
                }
            } // Lock
        }
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            if (this.Visible == false || Indicator == null)
            {
                return;
            }

            lock (Indicator.Results)
            {
                foreach (string name in Indicator.Results.SetsNamesUnsafe)
                {
                    LinesChartSeries.ChartTypeEnum? chartType = Indicator.Results.GetResultSetChartType(name);
                    if (chartType.HasValue == false)
                    {// No specific value assigned means go for default.
                        chartType = DefaultChartType;
                    }

                    base.DrawItemSet(chartType.Value, g, _outputResultSetsPens[name], _defaultBrush,
                        unitsUnification, clippingRectangle, itemWidth, itemMargin, name);
                }
            }

            foreach(string name in Indicator.Parameters.DynamicNames)
            {// Render fixed lines.
                if (name.Contains(FixedLinePrefix))
                {
                    object value = Indicator.Parameters.GetDynamic(name);
                    if (value == null)
                    {
                        continue;
                    }

                    float floatValue = Convert.ToSingle(value);
                    int dashMove = 0;// ((int)x % DashSize);
                    g.DrawLine(_defaultDashedPen, clippingRectangle.X + dashMove, floatValue, clippingRectangle.X + clippingRectangle.Width, floatValue);
                }
            }
        }
Пример #29
0
        void graphicPane_DrawingSpaceUpdatedEvent(ChartPane pane)
        {// Drawing space or Drawing space view was changed - update.
            RectangleF actualDrawingSpaceView = masterPane.GraphicsWrapper.ActualSpaceToDrawingSpace(masterPane.ActualDrawingSpaceArea);

            int width  = (int)(masterPane.DrawingSpaceDisplayLimit.Width - actualDrawingSpaceView.Width);
            int height = (int)(masterPane.DrawingSpaceDisplayLimit.Height - actualDrawingSpaceView.Height);

            bool hScrollRefresh = false;
            bool vScrollRefresh = false;

            if (width > 0)
            {
                if (hScrollBar.Maximum != width)
                {
                    this.hScrollBar.Maximum = width;
                    hScrollRefresh          = true;
                }

                if (hScrollBar.LargeChange != hScrollBar.Maximum / 100 + 1)
                {
                    hScrollBar.LargeChange = hScrollBar.Maximum / 100 + 1;
                    hScrollRefresh         = true;
                }

                if (hScrollBar.SmallChange != hScrollBar.Maximum / 1000 + 1)
                {
                    hScrollBar.SmallChange = hScrollBar.Maximum / 1000 + 1;
                    hScrollRefresh         = true;
                }
            }

            if (this.hScrollBar.Enabled != (width > 0))
            {
                this.hScrollBar.Enabled = (width > 0);
            }

            if (height > 0)
            {
                if (this.vScrollBar.Maximum != height)
                {
                    this.vScrollBar.Maximum = height;
                    vScrollRefresh          = true;
                }

                if (vScrollBar.LargeChange != vScrollBar.Maximum / 100 + 1)
                {
                    vScrollBar.LargeChange = vScrollBar.Maximum / 100 + 1;
                    vScrollRefresh         = true;
                }

                if (vScrollBar.SmallChange != vScrollBar.Maximum / 1000 + 1)
                {
                    vScrollBar.SmallChange = vScrollBar.Maximum / 1000 + 1;
                    vScrollRefresh         = true;
                }
            }

            if (this.vScrollBar.Enabled != false)
            {
                this.vScrollBar.Enabled = false;
            }
            //if (this.vScrollBar.Enabled != (height > 0))
            //{
            //this.vScrollBar.Enabled = (height > 0);
            //vScrollRefresh = true;
            //}

            int xLocation = (int)(actualDrawingSpaceView.X - masterPane.DrawingSpaceDisplayLimit.X);
            int yLocation = (int)(actualDrawingSpaceView.Y - masterPane.DrawingSpaceDisplayLimit.Y);

            if (xLocation > 0)
            {
                if (hScrollBar.Value != Math.Min(hScrollBar.Maximum, xLocation))
                {
                    hScrollBar.Value = Math.Min(hScrollBar.Maximum, xLocation);
                    hScrollRefresh   = true;
                }
            }
            else
            {
                if (hScrollBar.Value != 0)
                {
                    hScrollBar.Value = 0;
                    hScrollRefresh   = true;
                }
            }

            if (yLocation > 0 && vScrollBar.Maximum - yLocation > 0)
            {
                if (vScrollBar.Value != Math.Min(vScrollBar.Maximum, vScrollBar.Maximum - yLocation))
                {
                    // Y bars operate in the other faship - top is top
                    vScrollBar.Value = Math.Min(vScrollBar.Maximum, vScrollBar.Maximum - yLocation);
                    vScrollRefresh   = true;
                }
            }
            else
            {
                if (vScrollBar.Value != 0)
                {
                    vScrollBar.Value = 0;
                    vScrollRefresh   = true;
                }
            }

            if (hScrollRefresh)
            {
                hScrollBar.Refresh();
            }

            if (vScrollRefresh)
            {
                vScrollBar.Refresh();
            }

            // Also Update the series in the Save To File button.
            UpdateSaveToFileUI();
        }
Пример #30
0
        void graphicPane_DrawingSpaceUpdatedEvent(ChartPane pane)
        {
            // Drawing space or Drawing space view was changed - update.

            RectangleF actualDrawingSpaceView = masterPane.GraphicsWrapper.ActualSpaceToDrawingSpace(masterPane.ActualDrawingSpaceArea);

            int width = (int)(masterPane.DrawingSpaceDisplayLimit.Width - actualDrawingSpaceView.Width);
            int height = (int)(masterPane.DrawingSpaceDisplayLimit.Height - actualDrawingSpaceView.Height);

            bool hScrollRefresh = false;
            bool vScrollRefresh = false;

            if (width > 0)
            {
                if (hScrollBar.Maximum != width)
                {
                    this.hScrollBar.Maximum = width;
                    hScrollRefresh = true;
                }

                if (hScrollBar.LargeChange != hScrollBar.Maximum / 100 + 1)
                {
                    hScrollBar.LargeChange = hScrollBar.Maximum / 100 + 1;
                    hScrollRefresh = true;
                }

                if (hScrollBar.SmallChange != hScrollBar.Maximum / 1000 + 1)
                {
                    hScrollBar.SmallChange = hScrollBar.Maximum / 1000 + 1;
                    hScrollRefresh = true;
                }
            }

            if (this.hScrollBar.Enabled != (width > 0))
            {
                this.hScrollBar.Enabled = (width > 0);
            }

            if (height > 0)
            {
                if (this.vScrollBar.Maximum != height)
                {
                    this.vScrollBar.Maximum = height;
                    vScrollRefresh = true;
                }

                if (vScrollBar.LargeChange != vScrollBar.Maximum / 100 + 1)
                {
                    vScrollBar.LargeChange = vScrollBar.Maximum / 100 + 1;
                    vScrollRefresh = true;
                }

                if (vScrollBar.SmallChange != vScrollBar.Maximum / 1000 + 1)
                {
                    vScrollBar.SmallChange = vScrollBar.Maximum / 1000 + 1;
                    vScrollRefresh = true;
                }
            }

            if (this.vScrollBar.Enabled != false)
            {
                this.vScrollBar.Enabled = false;
            }
            //if (this.vScrollBar.Enabled != (height > 0))
            //{
                //this.vScrollBar.Enabled = (height > 0);
                //vScrollRefresh = true;
            //}

            int xLocation = (int)(actualDrawingSpaceView.X - masterPane.DrawingSpaceDisplayLimit.X);
            int yLocation = (int)(actualDrawingSpaceView.Y - masterPane.DrawingSpaceDisplayLimit.Y);

            if (xLocation > 0)
            {
                if (hScrollBar.Value != Math.Min(hScrollBar.Maximum, xLocation))
                {
                    hScrollBar.Value = Math.Min(hScrollBar.Maximum, xLocation);
                    hScrollRefresh = true;
                }
            }
            else
            {
                if (hScrollBar.Value != 0)
                {
                    hScrollBar.Value = 0;
                    hScrollRefresh = true;
                }
            }

            if (yLocation > 0 && vScrollBar.Maximum - yLocation > 0)
            {
                if (vScrollBar.Value != Math.Min(vScrollBar.Maximum, vScrollBar.Maximum - yLocation))
                {
                    // Y bars operate in the other faship - top is top
                    vScrollBar.Value = Math.Min(vScrollBar.Maximum, vScrollBar.Maximum - yLocation);
                    vScrollRefresh = true;
                }
            }
            else
            {
                if (vScrollBar.Value != 0)
                {
                    vScrollBar.Value = 0;
                    vScrollRefresh = true;
                }
            }

            if (hScrollRefresh)
            {
                hScrollBar.Refresh();
            }

            if (vScrollRefresh)
            {
                vScrollBar.Refresh();
            }

            // Also Update the series in the Save To File button.
            UpdateSaveToFileUI();
        }
        /// <summary>
        /// Main drawing routine.
        /// </summary>
        public override void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, 
            RectangleF clippingRectangle, float itemWidth, float itemMargin)
        {
            //TracerHelper.Trace(TracerHelper.GetCallingMethod(2).Name);

            if (Visible == false)
            {
                return;
            }

            if (_dataProvider == null)
            {
                return;
            }

            IDataBarHistoryProvider dataBarProvider = CurrentDataBarProvider;
            if (dataBarProvider == null)
            {
                return;
            }

            lock (dataBarProvider)
            {
                base.Draw(g, dataBarProvider.BarsUnsafe, unitsUnification, clippingRectangle, itemWidth, itemMargin, _maxVolume, null);
            }

            // Draw ask/bid line.
            if (_dataProvider.OperationalState == CommonSupport.OperationalStateEnum.Operational && _dataProvider.Quotes != null
                && _dataProvider.Quotes.Bid.HasValue && _dataProvider.Quotes.Ask.HasValue)
            {
                if (_showCurrentAskLine)
                {
                    float price = (float)_dataProvider.Quotes.Ask;
                    g.DrawLine(_priceLevelPen, clippingRectangle.X, price, clippingRectangle.X + clippingRectangle.Width, price);
                }

                if (_showCurrentBidLine)
                {
                    float price = (float)_dataProvider.Quotes.Bid;
                    g.DrawLine(_priceLevelPen, clippingRectangle.X, price, clippingRectangle.X + clippingRectangle.Width, price);
                }
            }

            List<Order> ordersOpening;

            // Draw orders locations on chart.
            lock(this)
            {
                if (_orderExecutionProvider == null)
                {
                    return;
                }
            }
            // Render orders.
            ordersOpening = new List<Order>();

            ITradeEntityManagement history = _orderExecutionProvider.TradeEntities;
            if (history != null && _dataProvider != null)
            {
                lock (history)
                {
                    ordersOpening.AddRange(history.GetOrdersBySymbol(_dataProvider.SessionInfo.Symbol));
                }
            }

            // Use for orders closes.
            List<Order> ordersClosing = new List<Order>();
            foreach (Order order in ordersOpening)
            {
                if (order.State == OrderStateEnum.Closed)
                {// Only add orders already closed.
                    ordersClosing.Add(order);
                }
            }

            // This is used later on, since ordersClosing is modified.
            List<Order> ordersClosed = new List<Order>(ordersClosing);

            // TradeEntities opening at current bar.
            List<Order> pendingOpeningOrders = new List<Order>();
            // Order closing at current bar.
            List<Order> pendingClosingOrders = new List<Order>();

            PointF drawingPoint = new PointF();
            int startIndex, endIndex;
            GetDrawingRangeIndecesFromClippingRectange(clippingRectangle, drawingPoint, unitsUnification, out startIndex, out endIndex, itemWidth, itemMargin);

            lock (dataBarProvider)
            {
                float lastBarX = (itemMargin + itemWidth) * dataBarProvider.BarCount;
                for (int i = startIndex; i < endIndex && i < dataBarProvider.BarCount
                    && (ordersOpening.Count > 0 || ordersClosing.Count > 0); i++)
                {// Foreach bar, draw orders (and closeVolume).

                    while (ordersOpening.Count > 0)
                    {// All orders before now.
                        if (ordersOpening[0].OpenTime < (dataBarProvider.BarsUnsafe[i].DateTime - Period))
                        {// Order before time period.
                            if ((ordersOpening[0].State == OrderStateEnum.Executed /*||
                                ordersOpening[0].State == OrderInformation.OrderStateEnum.Submitted*/)
                                && _showPendingOrdersTracing)
                            {// Since it is an open pending order, we shall also need to draw it as well.
                                pendingOpeningOrders.Add(ordersOpening[0]);
                            }
                            ordersOpening.RemoveAt(0);
                            continue;
                        }

                        if (ordersOpening[0].OpenTime > dataBarProvider.BarsUnsafe[i].DateTime)
                        {// Order after time period - look no further.
                            break;
                        }

                        // Order open is within the current period.
                        // Only if order is part of the current period - add to pending.
                        pendingOpeningOrders.Add(ordersOpening[0]);
                        ordersOpening.RemoveAt(0);
                    }

                    for (int j = ordersClosing.Count - 1; j >= 0; j--)
                    {
                        if (ordersClosing[j].CloseTime >= (dataBarProvider.BarsUnsafe[i].DateTime - dataBarProvider.Period) &&
                            ordersClosing[j].CloseTime <= dataBarProvider.BarsUnsafe[i].DateTime)
                        {// Order close is within the current period.
                            pendingClosingOrders.Add(ordersClosing[j]);
                            ordersClosing.RemoveAt(j);
                        }
                    }

                    drawingPoint.X = i * (itemMargin + itemWidth);
                    DrawOrders(g, i, drawingPoint, itemWidth, itemMargin, pendingOpeningOrders, pendingClosingOrders, dataBarProvider.BarsUnsafe[i], lastBarX);
                    pendingOpeningOrders.Clear();
                    pendingClosingOrders.Clear();
                }

                if (_showClosedOrdersTracing && dataBarProvider.BarCount > 0 && startIndex < dataBarProvider.BarCount)
                {// Since a closed order may be before or after (or during) the curren set of periods - make a special search and render for them.
                    endIndex = Math.Max(0, endIndex);
                    endIndex = Math.Min(dataBarProvider.BarCount - 1, endIndex);

                    foreach (Order order in ordersClosed)
                    {
                        if (order.OpenTime.HasValue
                            && order.CloseTime.HasValue
                            && order.OpenTime.Value <= dataBarProvider.BarsUnsafe[endIndex].DateTime
                            && order.CloseTime.Value >= dataBarProvider.BarsUnsafe[startIndex].DateTime - dataBarProvider.Period)
                        {
                            int openIndex = dataBarProvider.GetIndexAtTime(order.OpenTime.Value);
                            int closeIndex = dataBarProvider.GetIndexAtTime(order.CloseTime.Value);

                            Pen pen = _buyDashedPen;
                            if (order.IsBuy == false)
                            {
                                pen = _sellDashedPen;
                            }

                            Decimal? doubleOpenValue = order.OpenPrice;
                            Decimal? doubleCloseValue = order.ClosePrice;

                            if (doubleOpenValue.HasValue == false)
                            {
                                SystemMonitor.Error("Invalid open price value for closed order to draw.");
                                continue;
                            }

                            if (doubleCloseValue.HasValue == false)
                            {
                                SystemMonitor.Error("Invalid close price value for closed order to draw.");
                                continue;
                            }

                            g.DrawLine(pen, new PointF(openIndex * (itemWidth + itemMargin), (float)doubleOpenValue),
                                new PointF(closeIndex * (itemWidth + itemMargin), (float)doubleCloseValue));
                        }
                    }
                }

            } // Lock
        }
 void SlaveChartPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, Matrix previousTransformation, Matrix currentTransformation)
 {
     UpdateMasterSynchronizationState(false);
 }
 public override void DrawInitialActualSpaceOverlays(ChartPane managingPane, GraphicsWrapper g)
 {
     base.DrawInitialActualSpaceOverlays(managingPane, g);
 }
Пример #34
0
 /// <summary>
 ///
 /// </summary>
 void _masterPane_ParametersUpdatedEvent(ChartPane pane)
 {
     SynchronizeWithMasterPane();
 }
Пример #35
0
 void graphicPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, System.Drawing.Drawing2D.Matrix previousTransformation, System.Drawing.Drawing2D.Matrix currentTransformation)
 {
     // Pane has changed its view.
     graphicPane_DrawingSpaceUpdatedEvent(pane);
     toolStripLabelUnitUnification.Text = "Scale: 1 / " + masterPane.CurrentUnitUnification;
 }
Пример #36
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="g"></param>
 /// <param name="unitsUnification">Draw a few units as one. Used when zooming is too big to show each unit - so unify them. 1 means no unification, 10 means unify 10 units together</param>
 /// <param name="clippingRectangle"></param>
 /// <param name="itemWidth"></param>
 /// <param name="itemMargin"></param>
 public abstract void Draw(ChartPane managingPane, GraphicsWrapper g, int unitsUnification, RectangleF clippingRectangle, float itemWidth, float itemMargin);
Пример #37
0
 void masterPane_ParametersUpdatedEvent(ChartPane pane)
 {
     if (this.IsHandleCreated == false)
     {
         return;
     }
     UpdateMasterPaneToolbar();
 }
Пример #38
0
 void SlaveChartPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, Matrix previousTransformation, Matrix currentTransformation)
 {
     UpdateMasterSynchronizationState(false);
 }
        /// <summary>
        /// Override this routine, to add the price labels at the space outside of the current drawing pane.
        /// </summary>
        /// <param name="managingPane"></param>
        /// <param name="g"></param>
        public override void DrawInitialActualSpaceOverlays(ChartPane managingPane, GraphicsWrapper g)
        {
            base.DrawInitialActualSpaceOverlays(managingPane, g);

            if (_dataProvider == null || _dataProvider.OperationalState != OperationalStateEnum.Operational)
            {
                return;
            }

            decimal? ask = _dataProvider.Quotes.Ask;
            decimal? bid = _dataProvider.Quotes.Bid;

            if (ask.HasValue == false
                || bid.HasValue == false)
            {
                return;
            }

            // Measure based on a default format of 6 symbols.
            SizeF size = g.MeasureString("00.0000", managingPane.LabelsFont);

            Brush fillBrush = managingPane.LabelsFill;
            if (fillBrush == null)
            {
                fillBrush = managingPane.ActualDrawingSpaceAreaFill;
            }

            if (_showCurrentAskLine)
            {
                PointF position = managingPane.GraphicsWrapper.DrawingSpaceToActualSpace(new PointF(0, (float)_dataProvider.Quotes.Ask), true);
                position.X = managingPane.Width - managingPane.ActualDrawingSpaceAreaMarginRight;
                position.Y -= size.Height;

                if (fillBrush != null)
                {
                    g.FillRectangle(fillBrush, new RectangleF(position.X, position.Y, size.Width, size.Height));
                }

                if (managingPane.LabelsFont != null && managingPane.LabelsFontBrush != null)
                {
                    g.DrawString(ask.Value.ToString(_dataProvider.SessionInfo.ValueFormat), managingPane.LabelsFont, managingPane.LabelsFontBrush, position);
                    g.DrawRectangle(managingPane.ActualDrawingSpaceAreaBorderPen, new RectangleF(position.X, position.Y, size.Width/* - 2*/, size.Height));
                }

            }

            if (_showCurrentBidLine)
            {
                PointF position = managingPane.GraphicsWrapper.DrawingSpaceToActualSpace(new PointF(0, (float)_dataProvider.Quotes.Bid), true);
                position.X = managingPane.Width - managingPane.ActualDrawingSpaceAreaMarginRight;

                if (fillBrush != null)
                {
                    g.FillRectangle(fillBrush, new RectangleF(position.X, position.Y, size.Width, size.Height));
                }

                if (managingPane.LabelsFont != null && managingPane.LabelsFontBrush != null)
                {
                    g.DrawString(bid.Value.ToString(_dataProvider.SessionInfo.ValueFormat), managingPane.LabelsFont, managingPane.LabelsFontBrush, position);
                    g.DrawRectangle(managingPane.ActualDrawingSpaceAreaBorderPen, new RectangleF(position.X, position.Y, size.Width/* - 2*/, size.Height));
                }
            }
        }
Пример #40
0
 public void Initialize(ChartPane pane)
 {
     SystemMonitor.CheckThrow(_pane == null);
     _pane = pane;
 }
        public override PointF DrawCustomMessages(ChartPane managingPane, GraphicsWrapper g, PointF drawingLocation)
        {
            if (Visible == false)
            {
                return drawingLocation;
            }

            // Draw any standard messages first (if any).
            drawingLocation = base.DrawCustomMessages(managingPane, g, drawingLocation);

            Font font = managingPane.TitleFont;
            if (CustomMessagesFont != null)
            {
                font = CustomMessagesFont;
            }

            foreach (FFNewsCustom.NewsEvent eventItem in Indicator.VisibleNewsEvents)
            {
                TimeSpan span = (eventItem.DateTime - DateTime.UtcNow);
                int hours = (int)Math.Abs(Math.Floor(span.TotalHours));

                string message;
                if (span.TotalSeconds < 0)
                {
                    message = hours.ToString() + " hrs " + Math.Abs(span.Minutes).ToString() + " mins since " + eventItem.Country + ": " + eventItem.Title;
                }
                else
                {
                    message = hours.ToString() + " hrs " + span.Minutes.ToString() + " mins until " + eventItem.Country + ": " + eventItem.Title;
                }
                drawingLocation = DrawCustomMessage(g, font, Indicator.TitleBrush, message, drawingLocation);

                float drawingLocationOriginalX = drawingLocation.X;
                SizeF size = new SizeF();
                if (font != null && Indicator.ImpactBrush != null)
                {
                    // Draw impact part.
                    string impactString = "Impact: " + eventItem.Impact.ToString();
                    size = g.MeasureString(impactString, font);
                    g.DrawString(impactString, font, Indicator.ImpactBrush, drawingLocation);
                    drawingLocation.X += size.Width;
                }

                // Draw previous part.
                if (string.IsNullOrEmpty(eventItem.Previous) == false)
                {
                    if (font != null && Indicator.PreviousBrush != null)
                    {
                        string previousString = "Previous: " + eventItem.Previous;
                        size = g.MeasureString(previousString, font);
                        g.DrawString(previousString, font, Indicator.PreviousBrush, drawingLocation);
                        drawingLocation.X += size.Width;
                    }
                }

                if (string.IsNullOrEmpty(eventItem.Forecast) == false)
                {
                    if (font != null && Indicator.ForecastBrush != null)
                    {
                        string forecastString = "Forecast: " + eventItem.Forecast;
                        size = g.MeasureString(forecastString, font);
                        g.DrawString(forecastString, font, Indicator.ForecastBrush, drawingLocation);
                        drawingLocation.X += size.Width;
                    }
                }

                drawingLocation.X = drawingLocationOriginalX;
                drawingLocation.Y += size.Height;
            }

            return drawingLocation;
        }
Пример #42
0
 public void UnInitialize()
 {
     _pane = null;
 }