示例#1
0
        /// <summary>
        /// Constructor.
        /// </summary>
        public MBTradingConnectionManager(MBTradingAdapter adapter)
        {
            ChangeOperationalState(OperationalStateEnum.Constructed);

            _adapter             = adapter;
            _messageLoopOperator = new BackgroundMessageLoopOperator(false);
            _quotes  = new MBTradingQuote(_messageLoopOperator);
            _history = new MBTradingHistory(_messageLoopOperator);
            _orders  = new MBTradingOrders(_messageLoopOperator);
        }
        /// <summary>
        /// Constructor.
        /// </summary>
        public MBTradingConnectionManager(MBTradingAdapter adapter)
        {
            ChangeOperationalState(OperationalStateEnum.Constructed);

            _adapter = adapter;
            _messageLoopOperator = new BackgroundMessageLoopOperator(false);
            _quotes = new MBTradingQuote(_messageLoopOperator);
            _history = new MBTradingHistory(_messageLoopOperator);
            _orders = new MBTradingOrders(_messageLoopOperator);
        }
示例#3
0
        /// <summary>
        ///
        /// </summary>
        public void Dispose()
        {
            try
            {
                lock (this)
                {
                    if (_quotes != null)
                    {
                        _quotes.Dispose();
                        _quotes = null;
                    }

                    if (_history != null)
                    {
                        _history.Dispose();
                        _history = null;
                    }

                    if (_orders != null)
                    {
                        _orders.UnInitialize();
                        _orders.Dispose();
                        _orders = null;
                    }

                    if (_adapter != null)
                    {
                        _adapter = null;
                    }

                    if (_communicationManager != null)
                    {
                        _communicationManager.OnLogonSucceed -= new IMbtComMgrEvents_OnLogonSucceedEventHandler(_communicationManager_OnLogonSucceed);
                        _communicationManager = null;
                    }

                    if (_messageLoopOperator != null)
                    {
                        _messageLoopOperator.Stop();
                        _messageLoopOperator.Dispose();
                        _messageLoopOperator = null;
                    }

                    ChangeOperationalState(OperationalStateEnum.Disposed);
                }
            }
            catch (Exception ex)
            {
                SystemMonitor.OperationError(ex.Message);
            }

            //GC.Collect();
        }
示例#4
0
        /// <summary>
        ///
        /// </summary>
        public void UnInitialize()
        {
            try
            {
                if (_orderClient != null)
                {
                    // An exception is generated here, upon trying to unsubscribe these events, so we shall leave them be.
                    // the wrapper class around the actual COM does something and releases too early ??

                    // ALWAYS CONSUME ORDERS EVENTS AND OPERATIONS TROUGH THE _orderClient VARIABLE, NEVER like this "_commManager.OrderClient"

                    _orderClient.OnAccountLoaded -= new _IMbtOrderClientEvents_OnAccountLoadedEventHandler(_ordersClient_OnAccountLoaded);
                    _orderClient.OnBalanceUpdate -= new _IMbtOrderClientEvents_OnBalanceUpdateEventHandler(_ordersClient_OnBalanceUpdate);
                    _orderClient.OnLogonSucceed  -= new _IMbtOrderClientEvents_OnLogonSucceedEventHandler(_ordersClient_OnLogonSucceed);
                    _orderClient.OnHistoryAdded  -= new _IMbtOrderClientEvents_OnHistoryAddedEventHandler(_orderClient_OnHistoryAdded);
                    _orderClient.OnSubmit        -= new _IMbtOrderClientEvents_OnSubmitEventHandler(_orderClient_OnSubmit);
                    _orderClient.OnAcknowledge   -= new _IMbtOrderClientEvents_OnAcknowledgeEventHandler(_orderClient_OnAcknowledge);
                    _orderClient.OnPositionAdded -= new _IMbtOrderClientEvents_OnPositionAddedEventHandler(_orderClient_OnPositionAdded);

                    _orderClient.OnExecute       -= new _IMbtOrderClientEvents_OnExecuteEventHandler(_orderClient_OnExecute);
                    _orderClient.OnReplacePlaced -= new _IMbtOrderClientEvents_OnReplacePlacedEventHandler(_orderClient_OnReplacePlaced);

                    _orderClient = null;
                }

                if (_timer != null)
                {
                    _timer.Dispose();
                    _timer = null;
                }

                if (_commManager != null)
                {
                    _commManager.OnAlertAdded -= new IMbtComMgrEvents_OnAlertAddedEventHandler(_commManager_OnAlertAdded);
                    _commManager = null;
                }
            }
            catch (Exception ex)
            {
                SystemMonitor.OperationError(ex.Message);
            }
            finally
            {
                _orderClient = null;
                _timer       = null;
                _commManager = null;
                _manager     = null;
                _adapter     = null;
            }
        }
示例#5
0
        /// <summary>
        ///
        /// </summary>
        public bool Initialize(MBTradingAdapter adapter, MBTradingConnectionManager manager, MbtComMgr communicationManager)
        {
            SystemMonitor.CheckError(_messageLoopOperator.InvokeRequred == false, "Init must better be called on message loop method.");

            StatusSynchronizationEnabled = true;
            StatusSynchronizationSource  = manager;

            try
            {
                _adapter     = adapter;
                _commManager = communicationManager;
                _orderClient = _commManager.OrderClient;

                // *Never* subscribe to COM events of a property, always make sure to hold the object alive
                // http://www.codeproject.com/Messages/2189754/Re-Losing-COM-events-handler-in-Csharp-client.aspx


                // *** ALWAYS CONSUME ORDERS EVENTS AND OPERATIONS TROUGH THE _orderClient VARIABLE, NEVER like this "_commManager.OrderClient"
                _commManager.OnAlertAdded += new IMbtComMgrEvents_OnAlertAddedEventHandler(_commManager_OnAlertAdded);

                _manager = manager;

                _orderClient.SilentMode = true;

                _timer = new Timer(TimerUpdate, null, 10000, 1000);

                _orderClient.OnAccountLoaded += new _IMbtOrderClientEvents_OnAccountLoadedEventHandler(_ordersClient_OnAccountLoaded);
                _orderClient.OnBalanceUpdate += new _IMbtOrderClientEvents_OnBalanceUpdateEventHandler(_ordersClient_OnBalanceUpdate);
                _orderClient.OnLogonSucceed  += new _IMbtOrderClientEvents_OnLogonSucceedEventHandler(_ordersClient_OnLogonSucceed);
                _orderClient.OnHistoryAdded  += new _IMbtOrderClientEvents_OnHistoryAddedEventHandler(_orderClient_OnHistoryAdded);
                _orderClient.OnSubmit        += new _IMbtOrderClientEvents_OnSubmitEventHandler(_orderClient_OnSubmit);
                _orderClient.OnAcknowledge   += new _IMbtOrderClientEvents_OnAcknowledgeEventHandler(_orderClient_OnAcknowledge);
                _orderClient.OnPositionAdded += new _IMbtOrderClientEvents_OnPositionAddedEventHandler(_orderClient_OnPositionAdded);

                _orderClient.OnExecute       += new _IMbtOrderClientEvents_OnExecuteEventHandler(_orderClient_OnExecute);
                _orderClient.OnReplacePlaced += new _IMbtOrderClientEvents_OnReplacePlacedEventHandler(_orderClient_OnReplacePlaced);
            }
            catch (Exception ex)
            {
                SystemMonitor.OperationError(ex.Message);
                return(false);
            }

            return(true);
        }
示例#6
0
        /// <summary>
        /// Apply commission values
        /// </summary>
        public void ApplyCommissions(MBTradingAdapter adapter, ref Quote quote)
        {
            if (quote.Ask.HasValue)
            {
                switch (Operation)
                {
                case Commission.OperationEnum.Multiply:
                {
                    quote.Ask = Math.Round(quote.Ask.Value * AskValue, adapter.CommissionPrecisionDecimals);
                }
                break;

                case Commission.OperationEnum.Add:
                {
                    quote.Ask = Math.Round(quote.Ask.Value + AskValue, adapter.CommissionPrecisionDecimals);
                }
                break;

                default: break;
                }
            }

            if (quote.Bid.HasValue)
            {
                switch (Operation)
                {
                case Commission.OperationEnum.Multiply:
                {
                    quote.Bid = Math.Round(quote.Bid.Value * BidValue, adapter.CommissionPrecisionDecimals);
                }
                break;

                case Commission.OperationEnum.Add:
                {
                    quote.Bid = Math.Round(quote.Bid.Value + BidValue, adapter.CommissionPrecisionDecimals);
                }
                break;

                default:
                    break;
                }
            }
        }
示例#7
0
        /// <summary>
        /// Make sure to call on Invoke'd thread.
        /// </summary>
        /// <param name="account"></param>
        void PerformUpdate(MbtAccount account, bool updateAccount, bool updateOrders, bool updatePositions)
        {
            //SystemMonitor.CheckError(_messageLoopOperator.InvokeRequred == false, "Invoke must not be required in baseMethod call.");

            MbtOrderClient             orderClient = _orderClient;
            MBTradingConnectionManager manager     = _manager;
            MBTradingQuote             quotes      = null;

            if (orderClient == null || manager == null)
            {
                return;
            }

            quotes = manager.Quotes;
            if (quotes == null)
            {
                return;
            }

            AccountInfo info;
            Dictionary <string, OrderInfo> pendingOrderInfos = new Dictionary <string, OrderInfo>();
            List <PositionInfo>            positionsInfos    = new List <PositionInfo>();

            lock (this)
            {
                if (updateOrders)
                {
                    // We need to send up only the latest of each orders histories, since prev ones are for previous states.
                    foreach (MbtOrderHistory history in _orderClient.OrderHistories)
                    {
                        Order.UpdateTypeEnum updateType;
                        OrderInfo?           orderInfo = ConvertToOrderInfo(history, out updateType);
                        if (orderInfo.HasValue)
                        {
                            pendingOrderInfos[orderInfo.Value.Id] = orderInfo.Value;
                        }
                    }

                    // Make sure open orders orderInfo is always on top.
                    foreach (MbtOpenOrder pOrd in _orderClient.OpenOrders)
                    {
                        OrderInfo?orderInfo = ConvertToOrderInfo(pOrd);
                        if (orderInfo.HasValue)
                        {
                            pendingOrderInfos[orderInfo.Value.Id] = orderInfo.Value;
                        }
                    }
                }

                if (updatePositions)
                {
                    foreach (MbtPosition position in _orderClient.Positions)
                    {
                        PositionInfo?positionInfo = ConvertToPositionInfo(position);
                        if (positionInfo.HasValue)
                        {
                            positionsInfos.Add(positionInfo.Value);
                        }
                    }
                }

                if (_accountInfo.HasValue)
                {
                    info = _accountInfo.Value;
                }
                else
                {
                    info      = new AccountInfo();
                    info.Guid = Guid.NewGuid();
                }

                ConvertAccount(account, ref info);

                _accountInfo = info;
            }

            MBTradingAdapter adapter = _adapter;

            if (adapter != null)
            {
                OrderExecutionSourceStub stub = adapter.OrderExecutionSourceStub;
                if (stub != null)
                {
                    if (updateAccount)
                    {
                        stub.UpdateAccountInfo(_accountInfo.Value);
                    }

                    if (updateOrders)
                    {
                        stub.UpdateOrdersInfo(_accountInfo.Value,
                                              GeneralHelper.GenerateSingleValueArray <Order.UpdateTypeEnum>(pendingOrderInfos.Count, Order.UpdateTypeEnum.Update),
                                              GeneralHelper.EnumerableToArray <OrderInfo>(pendingOrderInfos.Values));
                    }

                    if (updatePositions)
                    {
                        stub.UpdatePositionsInfo(_accountInfo.Value, positionsInfos.ToArray());
                    }
                }
            }
        }
示例#8
0
        /// <summary>
        ///
        /// </summary>
        public static Commission?GenerateSymbolCommission(MBTradingAdapter adapter, Symbol symbol)
        {
            // This is the commission value per each $10000 (USD)
            decimal commissionValue = adapter.CommissionValue;

            bool checkDealRate = false;

            // We have 4 cases - see http://www.mbtrading.com/commissions.aspx?page=Forex
            //
            if (symbol.ForexCurrency1 == "USD")
            {
                // first case - USD/JPY - US dollar based currency
                checkDealRate = false;
            }
            else if (symbol.ForexCurrency2 == "USD")
            {
                // second case - EUR/USD - Non-US dollar based currency
                checkDealRate = true;
            }
            else if (HasForexSymbol(symbol.ForexCurrency1, "USD"))
            {
                // third case - EUR/CHF - Exotic: US dollar is available as cross currency (EUR/USD)
                checkDealRate = true;
            }
            else if (HasForexSymbol("USD", symbol.ForexCurrency1))
            {
                // fourth case - CHF/JPY - Exotic: US dollar cross (CHF/USD) isn't available but base is (USD/CHF)
                checkDealRate = false;
            }
            else
            {// We should not be here.
                return(null);
            }


            Commission commission = new Commission()
            {
                RawValue = commissionValue * 0.0001m
            };
            decimal value = commission.RawValue / 2;

            if (checkDealRate)
            {
                commission.Operation = Commission.OperationEnum.Multiply;
                //decimal value = commission.RawValue / 2;
                //value /= 2;
                commission.AskValue = 1.0m + value;
                commission.BidValue = 1.0m - value;

                commission.OrderValue = 1.0m + commission.RawValue;
            }
            else
            {
                commission.Operation = Commission.OperationEnum.Add;
                //decimal value = commissionValue * 0.0001m;
                //value /= 2;
                commission.AskValue = value;
                commission.BidValue = -value;

                commission.OrderValue = commission.RawValue;
            }

            return(commission);
        }
        /// <summary>
        /// 
        /// </summary>
        public void UnInitialize()
        {
            try
            {
                if (_orderClient != null)
                {
                    // An exception is generated here, upon trying to unsubscribe these events, so we shall leave them be.
                    // the wrapper class around the actual COM does something and releases too early ??

                    // ALWAYS CONSUME ORDERS EVENTS AND OPERATIONS TROUGH THE _orderClient VARIABLE, NEVER like this "_commManager.OrderClient"

                    _orderClient.OnAccountLoaded -= new _IMbtOrderClientEvents_OnAccountLoadedEventHandler(_ordersClient_OnAccountLoaded);
                    _orderClient.OnBalanceUpdate -= new _IMbtOrderClientEvents_OnBalanceUpdateEventHandler(_ordersClient_OnBalanceUpdate);
                    _orderClient.OnLogonSucceed -= new _IMbtOrderClientEvents_OnLogonSucceedEventHandler(_ordersClient_OnLogonSucceed);
                    _orderClient.OnHistoryAdded -= new _IMbtOrderClientEvents_OnHistoryAddedEventHandler(_orderClient_OnHistoryAdded);
                    _orderClient.OnSubmit -= new _IMbtOrderClientEvents_OnSubmitEventHandler(_orderClient_OnSubmit);
                    _orderClient.OnAcknowledge -= new _IMbtOrderClientEvents_OnAcknowledgeEventHandler(_orderClient_OnAcknowledge);
                    _orderClient.OnPositionAdded -= new _IMbtOrderClientEvents_OnPositionAddedEventHandler(_orderClient_OnPositionAdded);

                    _orderClient.OnExecute -= new _IMbtOrderClientEvents_OnExecuteEventHandler(_orderClient_OnExecute);
                    _orderClient.OnReplacePlaced -= new _IMbtOrderClientEvents_OnReplacePlacedEventHandler(_orderClient_OnReplacePlaced);

                    _orderClient = null;
                }

                if (_timer != null)
                {
                    _timer.Dispose();
                    _timer = null;
                }

                if (_commManager != null)
                {
                    _commManager.OnAlertAdded -= new IMbtComMgrEvents_OnAlertAddedEventHandler(_commManager_OnAlertAdded);
                    _commManager = null;
                }
            }
            catch (Exception ex)
            {
                SystemMonitor.OperationError(ex.Message);
            }
            finally
            {
                _orderClient = null;
                _timer = null;
                _commManager = null;
                _manager = null;
                _adapter = null;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public bool Initialize(MBTradingAdapter adapter, MBTradingConnectionManager manager, MbtComMgr communicationManager)
        {
            SystemMonitor.CheckError(_messageLoopOperator.InvokeRequred == false, "Init must better be called on message loop method.");

            StatusSynchronizationEnabled = true;
            StatusSynchronizationSource = manager;

            try
            {
                _adapter = adapter;
                _commManager = communicationManager;
                _orderClient = _commManager.OrderClient;

                // *Never* subscribe to COM events of a property, always make sure to hold the object alive
                // http://www.codeproject.com/Messages/2189754/Re-Losing-COM-events-handler-in-Csharp-client.aspx

                // *** ALWAYS CONSUME ORDERS EVENTS AND OPERATIONS TROUGH THE _orderClient VARIABLE, NEVER like this "_commManager.OrderClient"
                _commManager.OnAlertAdded += new IMbtComMgrEvents_OnAlertAddedEventHandler(_commManager_OnAlertAdded);

                _manager = manager;

                _orderClient.SilentMode = true;

                _timer = new Timer(TimerUpdate, null, 10000, 1000);

                _orderClient.OnAccountLoaded += new _IMbtOrderClientEvents_OnAccountLoadedEventHandler(_ordersClient_OnAccountLoaded);
                _orderClient.OnBalanceUpdate += new _IMbtOrderClientEvents_OnBalanceUpdateEventHandler(_ordersClient_OnBalanceUpdate);
                _orderClient.OnLogonSucceed += new _IMbtOrderClientEvents_OnLogonSucceedEventHandler(_ordersClient_OnLogonSucceed);
                _orderClient.OnHistoryAdded += new _IMbtOrderClientEvents_OnHistoryAddedEventHandler(_orderClient_OnHistoryAdded);
                _orderClient.OnSubmit += new _IMbtOrderClientEvents_OnSubmitEventHandler(_orderClient_OnSubmit);
                _orderClient.OnAcknowledge += new _IMbtOrderClientEvents_OnAcknowledgeEventHandler(_orderClient_OnAcknowledge);
                _orderClient.OnPositionAdded += new _IMbtOrderClientEvents_OnPositionAddedEventHandler(_orderClient_OnPositionAdded);

                _orderClient.OnExecute += new _IMbtOrderClientEvents_OnExecuteEventHandler(_orderClient_OnExecute);
                _orderClient.OnReplacePlaced += new _IMbtOrderClientEvents_OnReplacePlacedEventHandler(_orderClient_OnReplacePlaced);

            }
            catch (Exception ex)
            {
                SystemMonitor.OperationError(ex.Message);
                return false;
            }

            return true;
        }
        /// <summary>
        /// 
        /// </summary>
        public void Dispose()
        {
            try
            {
                lock (this)
                {
                    if (_quotes != null)
                    {
                        _quotes.Dispose();
                        _quotes = null;
                    }

                    if (_history != null)
                    {
                        _history.Dispose();
                        _history = null;
                    }

                    if (_orders != null)
                    {
                        _orders.UnInitialize();
                        _orders.Dispose();
                        _orders = null;
                    }

                    if (_adapter != null)
                    {
                        _adapter = null;
                    }

                    if (_communicationManager != null)
                    {
                        _communicationManager.OnLogonSucceed -= new IMbtComMgrEvents_OnLogonSucceedEventHandler(_communicationManager_OnLogonSucceed);
                        _communicationManager = null;
                    }

                    if (_messageLoopOperator != null)
                    {
                        _messageLoopOperator.Stop();
                        _messageLoopOperator.Dispose();
                        _messageLoopOperator = null;
                    }

                    ChangeOperationalState(OperationalStateEnum.Disposed);
                }
            }
            catch (Exception ex)
            {
                SystemMonitor.OperationError(ex.Message);
            }

            //GC.Collect();
        }