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; } } }
/// <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); }
private void masterPane_AppearanceSchemeChangedEvent(ChartPane pane, ChartPane.AppearanceSchemeEnum scheme) { if (masterPane.XAxisLabelsFontBrush is SolidBrush) { this.toolStripMain.ForeColor = ((SolidBrush)masterPane.XAxisLabelsFontBrush).Color; } }
void masterPane_ParametersUpdatedEvent(ChartPane pane) { if (this.IsHandleCreated == false) { return; } UpdateMasterPaneToolbar(); }
///// <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); } }
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 }
/// <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; }
void _masterPane_DrawingSpaceViewTransformationChangedEvent(ChartPane pane, Matrix previousTransformation, Matrix currentTransformation) { SynchronizeWithMasterPane(); }
void _masterPane_AppearanceSchemeChangedEvent(ChartPane pane, AppearanceSchemeEnum scheme) { this.SetAppearanceScheme(scheme); this.Refresh(); //this.Invalidate(); }
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)); } } }
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(); }
/// <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 }
/// <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 || 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); } } }
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(); }
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); }
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; }
/// <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)); } } }
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; }