protected override void Orders_OrderUpdatedEvent(ITradeEntityManagement provider, AccountInfo account, Order[] orders, ActiveOrder.UpdateTypeEnum[] updatesType)
        {
            base.Orders_OrderUpdatedEvent(provider, account, orders, updatesType);

            // Run in a separate thread since it takes time to request from server.
            //GeneralHelper.FireAndForget(new GeneralHelper.GenericReturnDelegate<bool>(Update));
        }
        public void UnInitialize()
        {
            if (_dataProvider != null)
            {
                _dataProvider.QuoteUpdateEvent -= new QuoteProviderUpdateDelegate(_dataProvider_QuoteUpdateEvent);
                _dataProvider = null;
            }

            _order = null;
        }
 /// <summary>
 /// Detailed constructor.
 /// </summary>
 public ModifyOrderControl(ModeEnum mode, Order order)
 {
     InitializeComponent();
     _provider = order.OrderExecutionProvider;
     _mode = mode;
     _order = order;
     _dataProvider = order.QuoteProvider;
     _dataProvider.QuoteUpdateEvent += new QuoteProviderUpdateDelegate(_dataProvider_QuoteUpdateEvent);
     _session = order.SessionInfo.Value;
 }
예제 #4
0
 protected virtual void Orders_OrderUpdatedEvent(ITradeEntityManagement provider, AccountInfo account, Order[] orders, Order.UpdateTypeEnum[] updatesType)
 {
 }
        /// <summary>
        /// NON UI Thread.
        /// </summary>
        //protected void DoObtainAllOrders(bool showError)
        //{
        //foreach (ExpertSession session in _sessions.ToArray())
        //{
        //    if (session.OrderExecutionProvider == null ||
        //        session.OrderExecutionProvider.OperationalState != OperationalStateEnum.Operational)
        //    {
        //        continue;
        //    }
        //    string operationResultMessage;
        //    if (session.OrderExecutionProvider.DefaultAccount != null &&
        //        session.OrderExecutionProvider.DefaultAccount.SynchronizeOrders(null, out operationResultMessage) == false)
        //    {
        //        if (showError)
        //        {
        //            MessageBox.Show("Failed to obtain orders session [" + session.Info.Name + "] [" + operationResultMessage + "].", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //        }
        //        else
        //        {
        //            SystemMonitor.OperationError("Failed to obtain orders session [" + session.Info.Name + "] [" + operationResultMessage + "].");
        //        }
        //    }
        //}
        //WinFormsHelper.BeginFilteredManagedInvoke(this, new GeneralHelper.DefaultDelegate( delegate() { toolStripButtonObtainOrders.Enabled = true; }));
        //}
        protected ListViewItem SetItemAsOrder(ListViewItem item, Order order, AccountInfo account)
        {
            if (item.Tag != order)
            {
                item.Tag = order;
            }

            if (item.UseItemStyleForSubItems != false)
            {
                item.UseItemStyleForSubItems = false;
            }

            OrderStateEnum orderState = order.State;
            string groupName = string.Format("{0} Orders, Server [{1}] Company [{2}] Account [{3} / {4}]", orderState.ToString().ToUpper(), account.Server, account.Company, account.Name, account.Id);

            ListViewGroup group = listViewOrders.Groups[groupName];
            if (group == null)
            {
                group = new ListViewGroup(groupName, groupName);

                if (orderState == OrderStateEnum.Executed)
                {// Insert group at top of list.
                    listViewOrders.Groups.Insert(0, group);
                }
                else if (orderState == OrderStateEnum.Submitted)
                {// ...
                    listViewOrders.Groups.Insert(0, group);
                }
                else
                {
                    listViewOrders.Groups.Add(group);
                }
            }

            if (item.Group != group)
            {
                item.Group = group;
            }

            if (order.IsBuy)
            {
                int index = order.State == OrderStateEnum.Executed ? 0 : 2;
                if (item.ImageIndex != index)
                {
                    item.ImageIndex = index;
                }
            }
            else
            {
                int index = order.State == OrderStateEnum.Executed ? 1 : 3;
                if (item.ImageIndex != index)
                {
                    item.ImageIndex = index;
                }
            }

            while(item.SubItems.Count < 12)
            {
                item.SubItems.Add("");
            }

            //if (order.Type == OrderTypeEnum.UNKNOWN)
            //{// Order type not established yet.
            //    item.SubItems[0].Text = "NA";
            //    return item;
            //}

            string id = order.Id;
            if (id == null)
            {
                id = string.Empty;
            }

            if (item.SubItems[0].Text != id)
            {
                item.SubItems[0].Text = id;
            }

            if (item.SubItems[1].Text != order.Symbol.Name)
            {
                item.SubItems[1].Text = order.Symbol.Name;
            }

            if (order.IsOpenOrPending)
            {
                if (item.SubItems[2].Text != (GeneralHelper.GetShortDateTime(order.OpenTime)))
                {
                    item.SubItems[2].Text = (GeneralHelper.GetShortDateTime(order.OpenTime));
                }
            }
            else
            {
                if (item.SubItems[2].Text != (GeneralHelper.GetShortDateTime(order.OpenTime) + " to " + GeneralHelper.GetShortDateTime(order.CloseTime)))
                {
                    item.SubItems[2].Text = (GeneralHelper.GetShortDateTime(order.OpenTime) + " to " + GeneralHelper.GetShortDateTime(order.CloseTime));
                }
            }

            if (item.SubItems[3].Text != (order.Type.ToString()))
            {
                item.SubItems[3].Text = (order.Type.ToString());
            }

            if (item.SubItems[4].Text != (GeneralHelper.ToString(order.CurrentVolume)))
            {
                item.SubItems[4].Text = GeneralHelper.ToString(order.CurrentVolume);
            }

            if (item.SubItems[5].Text != GeneralHelper.ToString(order.OpenPrice))
            {
                item.SubItems[5].Text = GeneralHelper.ToString(order.OpenPrice);
            }

            string closePriceValue = GeneralHelper.ToString(order.ClosePrice);
            if (item.SubItems[6].Text != closePriceValue)
            {
                item.SubItems[6].Text = closePriceValue;
            }

            if (item.SubItems[7].Text != GeneralHelper.ToString(order.StopLoss))
            {
                item.SubItems[7].Text = GeneralHelper.ToString(order.StopLoss);
            }

            if (item.SubItems[8].Text != GeneralHelper.ToString(order.TakeProfit))
            {
                item.SubItems[8].Text = GeneralHelper.ToString(order.TakeProfit);
            }

            if (item.SubItems[9].Text != ("-"))
            {
                item.SubItems[9].Text = ("-");
            }

            decimal? currentResultPips = order.GetResult(Order.ResultModeEnum.Pips);
            decimal? currentResultBaseCurrency = order.GetResult(Order.ResultModeEnum.Currency);

            string resultString;

            if (currentResultBaseCurrency.HasValue == false ||
                currentResultBaseCurrency.HasValue == false)
            {
                resultString = "NaN";
            }
            else
            {
                resultString = currentResultPips.Value.ToString("0.#") + "p / " + currentResultBaseCurrency.Value.ToString("0.#");
            }

            if (item.SubItems[10].Text != resultString)
            {
                item.SubItems[10].Text = resultString;
            }

            if (currentResultPips < 0)
            {
                if (item.SubItems[10].BackColor != Color.MistyRose)
                {
                    item.SubItems[10].BackColor = Color.MistyRose;
                }
            }
            else
            {
                if (item.SubItems[10].BackColor != Color.Transparent)
                {
                    item.SubItems[10].BackColor = Color.Transparent;
                }
            }

            if (item.SubItems[11].Text != "-")
            {
                item.SubItems[11].Text = ("-");
            }

            return item;
        }
 /// <summary>
 /// NON UI Thread.
 /// </summary>
 public void SelectOrder(Order order)
 {
     if (this.IsHandleCreated)
     {
         WinFormsHelper.BeginFilteredManagedInvoke(this, new GeneralHelper.GenericDelegate<Order>(DoSelectOrder), order);
     }
 }
        /// <summary>
        /// An order has been received an update containing critical modification of its information,
        /// so handle this here and show to user.
        /// </summary>
        void management_OrdersCriticalInformationChangedEvent(ITradeEntityManagement provider, AccountInfo account, Order order, OrderInfo updateInfo)
        {
            // Compose the critical update message instantly, as otherwise it is wrong since the order gets instantly updated after this call.
            string criticalUpdateMessage = string.Empty;
            if (order.OpenPrice.HasValue && updateInfo.OpenPrice.HasValue && order.OpenPrice.Value != updateInfo.OpenPrice.Value)
            {
                criticalUpdateMessage = string.Format("Open Price Difference [{0}], Existing [{1}], New [{2}].", order.OpenPrice - updateInfo.OpenPrice, order.OpenPrice.ToString(), updateInfo.OpenPrice) + Environment.NewLine;
            }

            if (order.ClosePrice.HasValue && updateInfo.ClosePrice.HasValue && order.ClosePrice.Value != updateInfo.ClosePrice.Value)
            {
                criticalUpdateMessage += string.Format("Close Price Difference [{0}], Existing [{1}], New [{2}].", order.ClosePrice - updateInfo.ClosePrice, order.ClosePrice.ToString(), updateInfo.ClosePrice) + Environment.NewLine;
            }

            WinFormsHelper.BeginManagedInvoke(this, delegate()
            {
                if (toolStripButtonPopupNotifications.Checked == false)
                {
                    return;
                }

                if (string.IsNullOrEmpty(criticalUpdateMessage) == false)
                {
                    string message = "Account [" + account.Name + "] Order Id[" + order.Id + "] Critical Information Updated" + Environment.NewLine + criticalUpdateMessage;
                    NotificationForm form = new NotificationForm();
                    form.labelMessage.Text = message;
                    form.Text = "Critical Order Update";
                    form.TopMost = true;
                    form.Show();

                    //MessageBox.Show("Critical Order Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            });
        }
 void executor_OrderUpdatedEvent(IOrderSink executor, AccountInfo account, string[] previousOrdersIds, OrderInfo[] orderInfos, Order.UpdateTypeEnum[] updatesType)
 {
     //RaiseSeriesValuesUpdated(true);
 }
        public void UnInitialize()
        {
            lock (this)
            {
                _ordersArrows.Clear();
                GeneralHelper.FireAndForget(SelectedOrderChangedEvent, _selectedOrder, null);
                _selectedOrder = null;

                CurrentDataBarProvider = null;
                if (_dataProvider != null)
                {
                    if (_dataProvider.Quotes != null)
                    {
                        _dataProvider.Quotes.QuoteUpdateEvent += new QuoteProviderUpdateDelegate(Quotes_QuoteUpdateEvent);
                    }

                    _dataProvider.CurrentDataBarProviderChangedEvent -= new DataProviderUpdateDelegate(_dataProvider_CurrentDataBarProviderChangedEvent);
                    _dataProvider = null;
                }

                if (_orderExecutionProvider != null)
                {
                    IOrderSink executor = _orderExecutionProvider;
                    ITradeEntityManagement management = _orderExecutionProvider.TradeEntities;

                    if (executor != null)
                    {
                        executor.OrdersUpdatedEvent -= new OrdersUpdateDelegate(executor_OrderUpdatedEvent);
                    }

                    if (management != null)
                    {
                        management.OrdersAddedEvent -= new OrderManagementOrdersUpdateDelegate(management_OrdersAddedEvent);
                        management.OrdersRemovedEvent -= new OrderManagementOrdersUpdateDelegate(management_OrdersRemovedEvent);
                        management.OrdersUpdatedEvent -= new OrderManagementOrdersUpdateTypeDelegate(management_OrderUpdatedEvent);
                    }

                    _orderExecutionProvider = null;
                }

                _buyDashedPen.Dispose();
                _sellDashedPen.Dispose();
            }
        }
        public bool CancelPendingOrder(AccountInfo account, Order order, out string modifiedId, out string operationResultMessage)
        {
            decimal closingPrice;
            DateTime closingDateTime;
            if (DoCloseOrder(account, order, -1, 0, out closingPrice, out closingDateTime, out modifiedId, out operationResultMessage))
            {
                RaiseOrderUpdateEvent(account, string.Empty, order.Info, ActiveOrder.UpdateTypeEnum.Canceled);
                return true;
            }

            return false;
        }
 public void UpdateOrdersInfo(AccountInfo account, Order.UpdateTypeEnum[] updatesType, OrderInfo[] ordersInfo)
 {
     lock (this)
     {// Will only add it once, the remaining will just return false.
         if (_subscribers.Count > 0)
         {
             // Establish account subscribers and deliver them the update.
             this.SendRespondingToMany(_subscribers, new OrdersInformationUpdateResponseMessage(account, ordersInfo, updatesType, true));
         }
     }
 }
 /// <summary>
 /// 
 /// </summary>
 public void UpdateOrderInfo(AccountInfo account, Order.UpdateTypeEnum updateType, OrderInfo orderInfo)
 {
     UpdateOrdersInfo(account, new Order.UpdateTypeEnum[] { updateType }, new OrderInfo[] { orderInfo });
 }
        void _executor_OrderUpdatedEvent(IOrderSink providerSink, AccountInfo accountInfo, string[] previousOrdersIds, 
            OrderInfo[] ordersInfos, Order.UpdateTypeEnum[] updatesType)
        {
            ISourceOrderExecution provider = _provider;

            if (providerSink != _provider)
            {
                SystemMonitor.Warning("Provider mismatch.");
                return;
            }

            List<Order> updatedOrders = new List<Order>();
            List<Order.UpdateTypeEnum> updatedOrdersUpdateTypes = new List<Order.UpdateTypeEnum>();

            for (int i = 0; i < ordersInfos.Length; i++)
            {
                if (string.IsNullOrEmpty(ordersInfos[i].Id))
                {
                    SystemMonitor.Warning("Order update of order with no ID.");
                    continue;
                }

                if (previousOrdersIds.Length > i && previousOrdersIds[i] != ordersInfos[i].Id
                    && string.IsNullOrEmpty(previousOrdersIds[i]) == false)
                {// Order Id has changed, remove old order.
                    Order superceededOrder = GetOrderById(previousOrdersIds[i]);
                    RemoveOrder(superceededOrder);
                }

                Order order = GetOrderById(ordersInfos[i].Id);
                if (order == null)
                {// Create new order based on incoming information.

                    if (provider.SupportsActiveOrderManagement)
                    {
                        order = new ActiveOrder(_manager, provider, _delivery.SourceId, true);
                    }
                    else
                    {
                        order = new PassiveOrder(_manager, _delivery.SourceId, provider.SourceId);
                    }

                    order.AdoptInfo(ordersInfos[i]);

                    if (AddOrder(order) == false)
                    {
                        SystemMonitor.OperationError("Failed to add order to keeper (id [" + order.Id + "] already used for another order).", TracerItem.PriorityEnum.Medium);
                    }
                }
                else
                {// Existing order, to be updated.

                    OrderInfo info = ordersInfos[i];

                    // First, check for critical modifications (price changes).
                    if (order.Info.IsCriticalUpdate(info))
                    {
                        SystemMonitor.Report(string.Format("Order has received a critical data modication Id[{0}], Open[{1} / {2}], Close[{3} / {4}].", order.Id, order.OpenPrice.ToString(), info.OpenPrice.ToString(), order.ClosePrice.ToString(),
                            info.ClosePrice.ToString()), TracerItem.PriorityEnum.High);

                        if (OrdersCriticalInformationChangedEvent != null)
                        {
                            OrdersCriticalInformationChangedEvent(this, accountInfo, order, info);
                        }
                    }

                    if (order.UpdateInfo(info) == false)
                    {
                        SystemMonitor.OperationError("Failed to update order [" + order.Id + "].");
                        continue;
                    }

                    lock (this)
                    {
                        // Remove from any of the sub arrays it may be in.
                        foreach (OrderStateEnum state in Enum.GetValues(typeof(OrderStateEnum)))
                        {
                            if (_ordersByState.ContainsKey(state) && _ordersByState[state].Contains(order))
                            {
                                _ordersByState[state].Remove(order);
                            }
                        }

                        _ordersByState[info.State].Add(order);
                    }

                    updatedOrders.Add(order);
                    updatedOrdersUpdateTypes.Add(updatesType[i]);
                }
            }

            if (updatedOrders.Count > 0 && OrdersUpdatedEvent != null)
            {
                OrdersUpdatedEvent(this, accountInfo, updatedOrders.ToArray(), updatedOrdersUpdateTypes.ToArray() );
            }
        }
 void order_OrderUpdatedEvent(Order order, Order.UpdateTypeEnum updateType)
 {
     if (OrdersUpdatedEvent != null)
     {
         OrdersUpdatedEvent(this, _provider.DefaultAccount.Info, new Order[] { order }, new Order.UpdateTypeEnum[] { updateType });
     }
 }
 /// <summary>
 /// 
 /// </summary>
 public bool RemoveOrder(Order order)
 {
     RemoveOrders(new Order[] { order });
     return true;
 }
        /// <summary>
        /// Helper.
        /// </summary>
        bool DoCloseOrder(AccountInfo account, Order order, decimal? allowedSlippage, decimal? desiredPrice, out decimal closingPrice,
            out DateTime closingTime, out string modifiedId, out string operationResultMessage)
        {
            TracerHelper.Trace(this.Name);

            closingPrice = decimal.MinValue;
            closingTime = DateTime.MinValue;
            modifiedId = order.Id;

            if (OperationalState != OperationalStateEnum.Operational)
            {
                operationResultMessage = "Attempted operations on non operational order executioner.";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            allowedSlippage = ProcessSlippage(allowedSlippage);

            CloseOrderVolumeMessage message = new CloseOrderVolumeMessage(account, order.Symbol, order.Id,
                order.Tag, desiredPrice, allowedSlippage);
            message.PerformSynchronous = true;

            ResponseMessage response = this.SendAndReceiveResponding<ResponseMessage>
                (SourceTransportInfo, message);

            if (response == null)
            {// Time out.
                operationResultMessage = "Failed receive result for order request. In this scenario inconsistency may occur!";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            if (response.OperationResult)
            {
                CloseOrderVolumeResponseMessage responseMessage = (CloseOrderVolumeResponseMessage)response;
                operationResultMessage = "Order closed.";
                closingPrice = responseMessage.ClosingPrice;
                closingTime = responseMessage.ClosingDateTime;

                SystemMonitor.CheckError(order.Id == responseMessage.OrderId.ToString(), "Order id mismatch [" + order.Id + " / " + responseMessage.OrderId + "].");

                modifiedId = responseMessage.OrderModifiedId.ToString();
                return true;
            }

            operationResultMessage = response.OperationResultMessage;
            return false;
        }
        public override bool TrySelect(System.Drawing.Drawing2D.Matrix transformationMatrix, PointF drawingSpaceSelectionPoint, float absoluteSelectionMargin, bool canLoseSelection)
        {
            if (base.TrySelect(transformationMatrix, drawingSpaceSelectionPoint, absoluteSelectionMargin, canLoseSelection))
            {
                return true;
            }

            ISourceOrderExecution provider = _orderExecutionProvider;

            List<Order> orders = new List<Order>();

            if (provider != null && provider.TradeEntities != null && _dataProvider != null)
            {// Try select orders.
                lock (provider.TradeEntities)
                {
                    orders.AddRange(provider.TradeEntities.GetOrdersBySymbol(_dataProvider.SessionInfo.Symbol));
                }
            }

            lock (this)
            {
                foreach (Order order in orders)
                {
                    if (_ordersArrows.ContainsKey(order))
                    {
                        if (_ordersArrows[order].Contains(drawingSpaceSelectionPoint))
                        {
                            GeneralHelper.FireAndForget(SelectedOrderChangedEvent, _selectedOrder, order);
                            _selectedOrder = order;
                            break;
                        }
                    }
                }
            }

            return false;
        }
        public bool CloseOrder(AccountInfo account, Order order, decimal? allowedSlippage, decimal? desiredPrice, out decimal closingPrice, out DateTime closingTime, out string modifiedId, out string operationResultMessage)
        {
            if (DoCloseOrder(account, order, allowedSlippage, desiredPrice, out closingPrice,
                out closingTime, out modifiedId, out operationResultMessage))
            {
                RaiseOrderUpdateEvent(account, string.Empty, order.Info, ActiveOrder.UpdateTypeEnum.Closed);
                return true;
            }

            return false;
        }
        void DrawOrder(GraphicsWrapper g, ref PointF updatedImageDrawingPoint, Order order, float itemWidth, float itemMargin,
            float yToXScaling, DataBar orderBarData, float lastBarX, bool drawOpening)
        {
            Image image = _imageUp;
            Brush brush = Brushes.Green;
            Pen dashedPen = _buyDashedPen;
            Pen pen = Pens.GreenYellow;
            if (order.IsBuy == false)
            {
                image = _imageDown;
                brush = Brushes.Red;
                pen = Pens.Red;
                dashedPen = _sellDashedPen;
            }

            if (drawOpening == false)
            {
                image = _imageCross;
            }

            if (order.OpenPrice.HasValue == false)
            {
                SystemMonitor.OperationError("Order with no open price assigned for drawing.", TracerItem.PriorityEnum.Low);
                return;
            }

            float price = (float)order.OpenPrice.Value;
            if (drawOpening == false)
            {
                if (order.ClosePrice.HasValue == false)
                {
                    return;
                }

                price = (float)order.ClosePrice.Value;
            }

            if (drawOpening && _showPendingOrdersTracing &&
                (order is ActiveOrder && order.State == OrderStateEnum.Executed)
                && _dataProvider.Quotes.Bid.HasValue
                && _dataProvider.Quotes.Ask.HasValue)
            {// Open orders tracking line.
                PointF point1 = new PointF(updatedImageDrawingPoint.X + itemWidth / 2f, updatedImageDrawingPoint.Y + price);
                float sellPrice = (float)_dataProvider.Quotes.Bid;
                if (order.IsBuy == false)
                {
                    sellPrice = (float)_dataProvider.Quotes.Ask;
                }
                PointF point2 = new PointF(lastBarX - itemWidth / 2f, updatedImageDrawingPoint.Y + sellPrice);
                g.DrawLine(dashedPen, point1, point2);
            }

            //if (drawOpening && _showClosedOrdersTracing && order.IsOpen == false)
            //{// Closed order tracking.
            // Close order tracing is implemented in main draw function.
            //}

            if (_showOrderSpot)
            {
                PointF basePoint = new PointF(updatedImageDrawingPoint.X, updatedImageDrawingPoint.Y + price);
                float height = (yToXScaling * itemWidth);
                if (order.IsBuy == false)
                {
                    height = -height;
                }

                if (drawOpening)
                {
                    g.FillPolygon(brush, new PointF[] { basePoint, new PointF(basePoint.X + itemWidth, basePoint.Y),
                        new PointF(basePoint.X + (itemWidth / 2f), basePoint.Y + height) });
                    g.DrawPolygon(Pens.White, new PointF[] { basePoint, new PointF(basePoint.X + itemWidth, basePoint.Y),
                        new PointF(basePoint.X + (itemWidth / 2f), basePoint.Y + height) });

                    float drawToLeft = (float)(1.5 * itemWidth);
                    float drawToRight = (float)(2.5 * itemWidth);

                    // Take profit level.
                    if (order.TakeProfit.HasValue
                        && order.TakeProfit.Value != 0)
                    {
                        g.DrawLine(pen, updatedImageDrawingPoint.X - drawToLeft, updatedImageDrawingPoint.Y + (float)order.TakeProfit,
                            updatedImageDrawingPoint.X + drawToRight, updatedImageDrawingPoint.Y + (float)order.TakeProfit);

                        g.DrawLine(pen, updatedImageDrawingPoint.X + itemWidth / 2f, updatedImageDrawingPoint.Y + (float)order.TakeProfit,
                            updatedImageDrawingPoint.X + itemWidth / 2f, updatedImageDrawingPoint.Y + (float)order.TakeProfit - height);
                    }

                    // Stop loss level.
                    if (order.StopLoss.HasValue
                        && order.StopLoss.Value != 0)
                    {
                        g.DrawLine(pen, updatedImageDrawingPoint.X - drawToLeft, updatedImageDrawingPoint.Y + (float)order.StopLoss,
                            updatedImageDrawingPoint.X + drawToRight, updatedImageDrawingPoint.Y + (float)order.StopLoss);

                        g.DrawLine(pen, updatedImageDrawingPoint.X + itemWidth / 2f, updatedImageDrawingPoint.Y + (float)order.StopLoss,
                            updatedImageDrawingPoint.X + itemWidth / 2f, updatedImageDrawingPoint.Y + (float)order.StopLoss + height);
                    }
                }
                else
                {
                    g.DrawRectangle(Pens.White, basePoint.X, basePoint.Y,
                        itemWidth, yToXScaling * itemWidth);
                }

            }

            float imageHeight = 2 * (yToXScaling * itemWidth);
            if (_showOrderArrow)
            {
                float x = updatedImageDrawingPoint.X - (itemWidth / 2f);
                float y = updatedImageDrawingPoint.Y + (float)orderBarData.Low - (yToXScaling * itemWidth);
                float width = 2 * itemWidth;
                float height = -imageHeight;
                GraphicsWrapper.NormalizedRectangle(ref x, ref y, ref width, ref height);
                RectangleF rectange = new RectangleF(x, y, width, height);

                // Draw up image.
                g.DrawImage(image, rectange.X, rectange.Y, rectange.Width, rectange.Height);

                if (order == _selectedOrder)
                {// This is selected order.
                    g.DrawRectangle(Pens.White, rectange);
                }

                _ordersArrows[order] = rectange;

                updatedImageDrawingPoint.Y -= 1.2f * imageHeight;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public bool DecreaseOrderVolume(AccountInfo account, Order order, decimal volumeDecreasal, decimal? allowedSlippage, 
            decimal? desiredPrice, out decimal decreasalPrice, out string modifiedId, out string operationResultMessage)
        {
            TracerHelper.Trace(this.Name);
            modifiedId = order.Id;
            decreasalPrice = decimal.MinValue;

            if (OperationalState != OperationalStateEnum.Operational)
            {
                operationResultMessage = "Attempted operations on non operational order executioner.";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            allowedSlippage = ProcessSlippage(allowedSlippage);

            CloseOrderVolumeMessage message = new CloseOrderVolumeMessage(account, order.Symbol, order.Id,
                order.Tag, volumeDecreasal, desiredPrice, allowedSlippage);
            message.PerformSynchronous = true;

            ResponseMessage response = this.SendAndReceiveResponding<ResponseMessage>
                (SourceTransportInfo, message);

            if (response == null)
            {// Time out.
                operationResultMessage = "Failed receive result for order request. In this scenario inconsistency may occur!";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            if (response.OperationResult == false)
            {
                operationResultMessage = response.OperationResultMessage;
                return false;
            }

            CloseOrderVolumeResponseMessage responseMessage = (CloseOrderVolumeResponseMessage)response;

            operationResultMessage = "Order volume decreased.";
            decreasalPrice = responseMessage.ClosingPrice;

            // When modified, order changes its Id.
            modifiedId = responseMessage.OrderModifiedId;

            RaiseOrderUpdateEvent(account, responseMessage.OrderId, order.Info, ActiveOrder.UpdateTypeEnum.VolumeChanged);

            return true;
        }
 void management_OrderUpdatedEvent(ITradeEntityManagement provider, AccountInfo account, Order[] orders, Order.UpdateTypeEnum[] updatesType)
 {
     //RaiseSeriesValuesUpdated(true);
 }
        public bool IncreaseOrderVolume(AccountInfo account, Order order, decimal volumeIncrease, decimal? allowedSlippage, decimal? desiredPrice, out decimal increasalPrice, out string modifiedId, out string operationResultMessage)
        {
            operationResultMessage = "Remote Order Execution Provider does not support volume increase.";
            allowedSlippage = ProcessSlippage(allowedSlippage);

            SystemMonitor.OperationError(operationResultMessage);
            increasalPrice = 0;
            modifiedId = string.Empty;
            return false;
        }
 void management_OrderUpdatedEvent(ITradeEntityManagement provider, AccountInfo account, Order[] orders, Order.UpdateTypeEnum[] updateType)
 {
     WinFormsHelper.BeginFilteredManagedInvoke(this, UpdateUI);
 }
        public bool ModifyOrder(AccountInfo account, Order order, decimal? stopLoss, decimal? takeProfit, 
            decimal? targetOpenPrice, out string modifiedId, out string operationResultMessage)
        {
            TracerHelper.Trace(this.Name);
            modifiedId = order.Id;

            if (OperationalState != OperationalStateEnum.Operational)
            {
                operationResultMessage = "Attempted operations on non operational order executioner.";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            ModifyOrderMessage message = new ModifyOrderMessage(account, order.Symbol, order.Id, stopLoss, takeProfit, targetOpenPrice, null);
            message.PerformSynchronous = true;

            ResponseMessage responseMessage = this.SendAndReceiveResponding<ResponseMessage>(
                SourceTransportInfo, message);

            if (responseMessage == null)
            {// Time out.
                operationResultMessage = "Timeout, failed receive result for order modification request. In this scenario inconsistency may occur!";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            if (responseMessage.OperationResult == false)
            {
                operationResultMessage = responseMessage.OperationResultMessage;
                return false;
            }

            ModifyOrderResponseMessage castedResponseMessage = (ModifyOrderResponseMessage)responseMessage;
            SystemMonitor.CheckError(string.IsNullOrEmpty(castedResponseMessage.OrderModifiedId) == false, "Modified not assigned.");
            modifiedId = castedResponseMessage.OrderModifiedId;
            operationResultMessage = "Order modified.";

            RaiseOrderUpdateEvent(account, castedResponseMessage.OrderId, order.Info, ActiveOrder.UpdateTypeEnum.Modified);

            return true;
        }
 protected void DoSelectOrder(Order order)
 {
     listViewOrders.SelectedItems.Clear();
     foreach (ListViewItem item in listViewOrders.Items)
     {
         if (item.Tag == order)
         {
             item.Selected = true;
         }
     }
 }
        /// <summary>
        /// 
        /// </summary>
        public string SubmitOrder(AccountInfo account, Order order, Symbol symbol, OrderTypeEnum orderType,
            int volume, decimal? allowedSlippage, decimal? desiredPrice, decimal? takeProfit, decimal? stopLoss, 
            string comment, out string operationResultMessage)
        {
            TracerHelper.Trace(this.Name);

            if (OperationalState != OperationalStateEnum.Operational)
            {
                operationResultMessage = "Attempted operations on non operational order executioner.";
                SystemMonitor.Error(operationResultMessage);
                return null;
            }

            if (account.IsEmpty
                || string.IsNullOrEmpty(account.Id)
                || string.IsNullOrEmpty(account.Name))
            {
                operationResultMessage = "Account info on order execution provider not properly assigned.";
                return null;
            }

            allowedSlippage = ProcessSlippage(allowedSlippage);

            SubmitOrderMessage request = new SubmitOrderMessage(account,
                symbol, orderType, volume, desiredPrice, allowedSlippage, takeProfit, stopLoss, comment);

            request.RequestResponse = true;
            request.PerformSynchronous = true;

            ResponseMessage response = this.SendAndReceiveResponding<ResponseMessage>
                (SourceTransportInfo, request);

            if (response == null)
            {// Time out.
                operationResultMessage = "Failed receive result for order request. In this scenario inconsistency may occur!";
                SystemMonitor.Error(operationResultMessage);
                return null;
            }

            if (response.OperationResult == false)
            {
                operationResultMessage = response.OperationResultMessage;
                return null;
            }

            SubmitOrderResponseMessage responseMessage = (SubmitOrderResponseMessage)response;
            operationResultMessage = "Order submited.";

            //RaiseOrderUpdateEvent(account, order.Info, Order.UpdateTypeEnum.Submitted);

            return responseMessage.OrderId;
        }
        bool IsOrderVisible(Order order)
        {
            if (_orderFilterStates.Count == 0)
            {
                return true;
            }

            foreach(OrderStateEnum state in _orderFilterStates)
            {
                if (order.State == state)
                {
                    return true;
                }
            }

            return false;
        }
 /// <summary>
 /// Redefine for the operationTimeOut, by providing the DefaultTimeOut.
 /// </summary>
 public bool SynchronousExecute(AccountInfo account, Order order, Symbol symbol, OrderTypeEnum orderType,
     int volume, decimal? allowedSlippage, decimal? desiredPrice, decimal? takeProfit, decimal? stopLoss,
     string comment, out OrderInfo? info, out string operationResultMessage)
 {
     return SynchronousExecute(account, order, symbol, orderType,
         volume, allowedSlippage, desiredPrice, takeProfit, stopLoss,
         comment, this.DefaultTimeOut, out info, out operationResultMessage);
 }
        /// <summary>
        /// Convert history to order orderInfo.
        /// </summary>
        /// <param name="OrderInfo"></param>
        /// <returns></returns>
        OrderInfo? ConvertToOrderInfo(MbtOrderHistory pHist, out Order.UpdateTypeEnum updateType)
        {
            updateType = Order.UpdateTypeEnum.Update;

            if (string.IsNullOrEmpty(pHist.Event))
            {
                return null;
            }

            OrderInfo info = new OrderInfo(pHist.Token);

            string eventInfo = pHist.Event.ToLower();

            if (eventInfo.Contains("enter") || (eventInfo.Contains("session") && eventInfo.Contains("open")))
            {// "Enter", "Session open" events skipped.
                return null;
            }

            if (eventInfo.Contains("live"))
            {
                info.State = OrderStateEnum.Submitted;
            }
            else if (eventInfo.Contains("executed"))
            {
                info.State = OrderStateEnum.Executed;
            }
            else if (eventInfo.Contains("suspended"))
            {
                info.State = OrderStateEnum.Suspended;
            }
            else if (eventInfo == "cancel"
                    || (eventInfo.Contains("cancel") && eventInfo.Contains("reject"))
                    || (eventInfo.Contains("order") && eventInfo.Contains("reject"))
                    || (eventInfo.Contains("order") && eventInfo.Contains("cancel")))
            {// Order Reject or Cancel.
                info.State = OrderStateEnum.Canceled;
                updateType = Order.UpdateTypeEnum.Canceled;
            }
            else if (eventInfo.Contains("suspended"))
            {// Suspended
                info.State = OrderStateEnum.Suspended;
                updateType = Order.UpdateTypeEnum.Modified;
            }

            string eventMessage = pHist.Message;

            Symbol? symbol = TryObtainSymbol(pHist.Symbol);
            if (symbol.HasValue == false)
            {
                return null;
            }

            info.Tag = pHist.OrderNumber;
            info.OpenPrice = (decimal)pHist.Price;
            info.StopLoss = (decimal)pHist.StopLimit;
            info.TakeProfit = (decimal)pHist.StopLimit;
            info.OpenTime = ConvertDateTime(pHist.Date + " " + pHist.Time);
            info.Volume = pHist.Quantity;

            info.Symbol = symbol.Value;

            info.Type = ConvertFromMBTOrderType(pHist.OrderType, pHist.BuySell);
            if (info.Type == OrderTypeEnum.UNKNOWN)
            {
                SystemMonitor.OperationWarning("Failed to recognize order type [" + pHist.OrderType.ToString() + "].");
                //return null;
            }

            return info;
        }
        /// <summary>
        /// Main SynchronousExecute method.
        /// </summary>
        public bool SynchronousExecute(AccountInfo account, Order order, Symbol symbol, OrderTypeEnum orderType, 
            int volume, decimal? allowedSlippage, decimal? desiredPrice, decimal? takeProfit, decimal? stopLoss, 
            string comment, TimeSpan operationTimeOut, out OrderInfo? info, out string operationResultMessage)
        {
            TracerHelper.Trace(this.Name);

            info = null;
            operationResultMessage = string.Empty;

            if (OperationalState != OperationalStateEnum.Operational)
            {
                operationResultMessage = "Attempted operations on non operational order executioner.";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            if (account.IsEmpty
                || string.IsNullOrEmpty(account.Id)
                || string.IsNullOrEmpty(account.Name))
            {
                operationResultMessage = "Account info on order execution provider not properly assigned.";
                return false;
            }

            allowedSlippage = ProcessSlippage(allowedSlippage);

            ExecuteMarketOrderMessage request = new ExecuteMarketOrderMessage(account,
                symbol, orderType, volume, desiredPrice, allowedSlippage, takeProfit, stopLoss, comment);

            request.PerformSynchronous = true;

            ResponseMessage response = this.SendAndReceiveResponding<ResponseMessage>
                (SourceTransportInfo, request, operationTimeOut);

            if (response == null)
            {// Time out.
                operationResultMessage = "Failed receive result for order request. In this scenario inconsistency may occur!";
                SystemMonitor.Error(operationResultMessage);
                return false;
            }

            if (response.OperationResult == false)
            {
                operationResultMessage = response.OperationResultMessage;
                return false;
            }

            //if (orderType == OrderTypeEnum.BUY_MARKET
            //    || orderType == OrderTypeEnum.SELL_MARKET)
            //{// Immediate order.
            //    resultState = OrderStateEnum.Executed;
            //}
            //else
            //{// Delayed pending order.
            //    resultState = OrderStateEnum.Submitted;
            //}

            ExecuteMarketOrderResponseMessage responseMessage = (ExecuteMarketOrderResponseMessage)response;
            operationResultMessage = "Order opened.";

            info = responseMessage.Info;

            //RaiseOrderUpdateEvent(account, order.Info, ActiveOrder.UpdateTypeEnum.Submitted);

            return true;
        }