/// <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> /// /// </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(); }
/// <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> /// 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; } } }
/// <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()); } } } }
/// <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 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; }