public void onTablesUpdates(O2GResponse data) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { if (reader.getUpdateTable(ii) == O2GTableType.Orders) { O2GOrderRow orderRow = reader.getOrderRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { if (mRequestID.Equals(orderRow.RequestID)) { Console.WriteLine("The order has been added. OrderID={0}, Type={1}, BuySell={2}, Rate={3}, TimeInForce={4}", orderRow.OrderID, orderRow.Type, orderRow.BuySell, orderRow.Rate, orderRow.TimeInForce); mSyncResponseEvent.Set(); break; } } } } } }
public void onTablesUpdates(O2GResponse data) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { if (reader.getUpdateTable(ii) == O2GTableType.Orders) { O2GOrderRow orderRow = reader.getOrderRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Update) { if (mOrderIDs.Contains(orderRow.OrderID)) { Console.WriteLine("The order has been updated. OrderID={0}, ContingentOrderID={1}, ContingencyType={2}", orderRow.OrderID, orderRow.ContingentOrderID, orderRow.ContingencyType); mOrderIDs.Remove(orderRow.OrderID); } if (mOrderIDs.Count == 0) { mSyncResponseEvent.Set(); } } } } } }
private IEnumerable <BaseRow> GetGenericResponse(O2GTablesUpdatesReader reader) { var rows = new List <BaseRow>(); for (var i = 0; i < reader.Count; i++) { var type = reader.getUpdateTable(i); BaseRow row = null; switch (type) { case O2GTableType.Accounts: { // AccountRowEx - so we can get hold of O2GAccountRow internally when needed. row = this.GetRow <AccountRowEx, O2GAccountRow>(reader.getAccountRow(i)); break; } case O2GTableType.ClosedTrades: { row = this.GetRow <ClosedTradeRow, O2GClosedTradeRow>(reader.getClosedTradeRow(i)); break; } case O2GTableType.Messages: { row = this.GetRow <MessageRow, O2GMessageRow>(reader.getMessageRow(i)); break; } case O2GTableType.Offers: { row = this.GetRow <OfferRow, O2GOfferRow>(reader.getOfferRow(i)); break; } case O2GTableType.Orders: { row = this.GetRow <OrderRow, O2GOrderRow>(reader.getOrderRow(i)); break; } case O2GTableType.Trades: { row = this.GetRow <TradeRow, O2GTradeRow>(reader.getTradeRow(i)); break; } } if (row != null) { row.UpdateType = ConvertersInternal.GetUpdateType(reader.getUpdateType(i)); rows.Add(row); } } return(rows); }
public void onTablesUpdates(O2GResponse data) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { if (reader.getUpdateTable(ii) == O2GTableType.Orders) { O2GOrderRow orderRow = reader.getOrderRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { mOrderID = orderRow.OrderID; mSyncResponseEvent.Set(); break; } } } } }
public void onTablesUpdates(O2GResponse data) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { if (reader.getUpdateTable(ii) == O2GTableType.Orders) { O2GOrderRow orderRow = reader.getOrderRow(ii); if (orderRow.RequestID.Equals(mRequestID)) { switch (reader.getUpdateType(ii)) { case O2GTableUpdateType.Insert: if (IsLimitEntryOrder(orderRow) && string.IsNullOrEmpty(mOrderID)) { mOrderID = orderRow.OrderID; Console.WriteLine("The order has been added. Order ID: {0}, Rate: {1}, Time In Force: {2}", orderRow.OrderID, orderRow.Rate, orderRow.TimeInForce); mSyncResponseEvent.Set(); } break; case O2GTableUpdateType.Delete: Console.WriteLine("The order has been deleted. Order ID: {0}", orderRow.OrderID); mSyncResponseEvent.Set(); break; } } } } } }
/// <summary> /// Listener: Forex Connect received update for trading tables. /// </summary> /// <param name="data"></param> public void onTablesUpdates(O2GResponse data) { if (data.Type == O2GResponseType.TablesUpdates) { if (mOffer == null) { return; } O2GTablesUpdatesReader reader = mSession.getResponseReaderFactory().createTablesUpdatesReader(data); for (int i = 0; i < reader.Count; i++) { // We are looking only for updates and only for offers // NOTE: in order to support offer subscribtion, the real application also will need // to read add/remove events and change the offer collection correspondingly if (reader.getUpdateType(i) == O2GTableUpdateType.Update && reader.getUpdateTable(i) == O2GTableType.Offers) { // read the offer update O2GOfferRow row = reader.getOfferRow(i); if (!row.isInstrumentValid) { continue; } if (!mInstrument.Equals(row.Instrument)) { continue; } // update latest offer if (row.isTimeValid) { mOffer.LastUpdate = row.Time; } if (row.isBidValid) { mOffer.Bid = row.Bid; } if (row.isAskValid) { mOffer.Ask = row.Ask; } if (row.isVolumeValid) { mOffer.MinuteVolume = row.Volume; } // please note that we send a clone of the offer, // we need it in order to make sure that no ticks // will be lost, if, for example, subscriber doesn't handle the // offer immideatelly if (OnPriceUpdate != null) { OnPriceUpdate(mOffer.Clone()); } } } } }
public void onTablesUpdates(O2GResponse data) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { switch (reader.getUpdateTable(ii)) { case O2GTableType.Accounts: O2GAccountRow account = reader.getAccountRow(ii); //Show balance updates Console.WriteLine("Balance: {0}", account.Balance); break; case O2GTableType.Orders: O2GOrderRow order = reader.getOrderRow(ii); switch (reader.getUpdateType(ii)) { case O2GTableUpdateType.Insert: if (mBatchOrderMonitor != null) { Console.WriteLine("The order has been added. Order ID: {0}, Rate: {1}, Time In Force: {2}", order.OrderID, order.Rate, order.TimeInForce); mBatchOrderMonitor.OnOrderAdded(order); } break; case O2GTableUpdateType.Delete: if (mBatchOrderMonitor != null) { Console.WriteLine("The order has been deleted. Order ID: {0}", order.OrderID); mBatchOrderMonitor.OnOrderDeleted(order); if (mBatchOrderMonitor.IsBatchExecuted()) { PrintResult(); mSyncResponseEvent.Set(); } } break; } break; case O2GTableType.Trades: O2GTradeRow trade = reader.getTradeRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { if (mBatchOrderMonitor != null) { mBatchOrderMonitor.OnTradeAdded(trade); if (mBatchOrderMonitor.IsBatchExecuted()) { PrintResult(); mSyncResponseEvent.Set(); } } } break; case O2GTableType.ClosedTrades: O2GClosedTradeRow closedTrade = reader.getClosedTradeRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { if (mBatchOrderMonitor != null) { mBatchOrderMonitor.OnClosedTradeAdded(closedTrade); if (mBatchOrderMonitor.IsBatchExecuted()) { PrintResult(); mSyncResponseEvent.Set(); } } } break; case O2GTableType.Messages: O2GMessageRow message = reader.getMessageRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { if (mBatchOrderMonitor != null) { mBatchOrderMonitor.OnMessageAdded(message); if (mBatchOrderMonitor.IsBatchExecuted()) { PrintResult(); mSyncResponseEvent.Set(); } } } break; } } } }
public void onTablesUpdates(O2GResponse response) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(response); for (int ii = 0; ii < reader.Count; ii++) { switch (reader.getUpdateTable(ii)) { case O2GTableType.Accounts: O2GAccountRow account = reader.getAccountRow(ii); // Show balance updates Console.WriteLine("Balance: {0}", account.Balance); break; case O2GTableType.Orders: O2GOrderRow order = reader.getOrderRow(ii); switch (reader.getUpdateType(ii)) { case O2GTableUpdateType.Insert: if (mRequestID.Equals(order.RequestID)) { mOrderID = order.OrderID; printOrder("New order is added", order); } break; case O2GTableUpdateType.Update: printOrder("An order is changed", order); break; case O2GTableUpdateType.Delete: if (mRequestID.Equals(order.RequestID)) { string sStatus = order.Status; if (sStatus.Equals("R")) { printOrder("An order has been rejected", order); } else { printOrder("An order is going to be removed", order); } mSyncResponseEvent.Set(); } break; } break; case O2GTableType.Trades: O2GTradeRow trade = reader.getTradeRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { Console.WriteLine("Position is opened: TradeID='{0}', TradeIDOrigin='{1}'", trade.TradeID, trade.TradeIDOrigin); } break; case O2GTableType.ClosedTrades: O2GClosedTradeRow closedTrade = reader.getClosedTradeRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { Console.WriteLine("Position is closed: TradeID='{0}'", closedTrade.TradeID); } break; case O2GTableType.Messages: O2GMessageRow message = reader.getMessageRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { string text = message.Text; int findPos = text.IndexOf(mOrderID); if (findPos >= 0) { Console.WriteLine("Feature='{0}', Message='{1}'", message.Feature, text); } } break; } } } }
/// <summary> /// Listener: Forex Connect received update for trading tables /// </summary> /// <param name="data"></param> public void onTablesUpdates(O2GResponse data) { if (data.Type == O2GResponseType.TablesUpdates) { O2GTablesUpdatesReader reader = mTradingSession.getResponseReaderFactory().createTablesUpdatesReader(data); for (int i = 0; i < reader.Count; i++) { // We are looking only for updates and only for offers // NOTE: in order to support offer subscribtion, the real application also will need // to read add/remove events and change the offer collection correspondingly if (reader.getUpdateType(i) == O2GTableUpdateType.Update && reader.getUpdateTable(i) == O2GTableType.Offers) { // read the offer update O2GOfferRow row = reader.getOfferRow(i); Offer offer; // find the offer in our list either by the instrument name or // by the offer id string id = null; if (row.isInstrumentValid) { id = row.Instrument; } else if (row.isOfferIDValid) { id = row.OfferID; } if (id == null) { continue; } offer = mOffers[id]; if (offer == null) { continue; } // if we have that offer - update it if (row.isTimeValid) { offer.LastUpdate = row.Time; } if (row.isBidValid) { offer.Bid = row.Bid; } if (row.isAskValid) { offer.Ask = row.Ask; } if (row.isVolumeValid) { offer.MinuteVolume = row.Volume; } // please note that we send a clone of the offer, // we need it in order to make sure that no ticks // will be lost, if, for example, subscriber doesn't handle the // offer immideatelly if (OnPriceUpdate != null) { OnPriceUpdate(offer.Clone()); } } } } }
public void onTablesUpdates(O2GResponse data) { O2GResponseReaderFactory factory = mSession.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { switch (reader.getUpdateTable(ii)) { case O2GTableType.Accounts: O2GAccountRow account = reader.getAccountRow(ii); //Show balance updates Console.WriteLine("Balance: {0}", account.Balance); break; case O2GTableType.Orders: O2GOrderRow order = reader.getOrderRow(ii); switch (reader.getUpdateType(ii)) { case O2GTableUpdateType.Insert: if ((OrderMonitorNetting.IsClosingOrder(order) || OrderMonitorNetting.IsOpeningOrder(order)) && mOrderMonitor == null) { Console.WriteLine("The order has been added. Order ID: {0}, Rate: {1}, Time In Force: {2}", order.OrderID, order.Rate, order.TimeInForce); O2GTradeRow tradeRow = null; string sTradeID = order.TradeID; if (mTradesTable != null) { for (int j = 0; j < mTradesTable.Count; j++) { if (sTradeID.Equals(mTradesTable.getRow(j).TradeID)) { tradeRow = mTradesTable.getRow(j); break; } } } if (tradeRow == null) { mOrderMonitor = new OrderMonitorNetting(order); } else { mOrderMonitor = new OrderMonitorNetting(order, tradeRow.Amount); } } break; case O2GTableUpdateType.Delete: if (mOrderMonitor != null) { Console.WriteLine("The order has been deleted. Order ID: {0}", order.OrderID); mOrderMonitor.OnOrderDeleted(order); if (mOrderMonitor.IsOrderCompleted) { PrintResult(); mSyncResponseEvent.Set(); } } break; } break; case O2GTableType.Trades: O2GTradeRow trade = reader.getTradeRow(ii); switch (reader.getUpdateType(ii)) { case O2GTableUpdateType.Insert: if (mOrderMonitor != null) { mOrderMonitor.OnTradeAdded(trade); if (mOrderMonitor.IsOrderCompleted) { PrintResult(); mSyncResponseEvent.Set(); } } break; case O2GTableUpdateType.Update: if (mOrderMonitor != null) { mOrderMonitor.OnTradeUpdated(trade); if (mOrderMonitor.IsOrderCompleted) { PrintResult(); mSyncResponseEvent.Set(); } } break; } break; case O2GTableType.ClosedTrades: O2GClosedTradeRow closedTrade = reader.getClosedTradeRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { if (mOrderMonitor != null) { mOrderMonitor.OnClosedTradeAdded(closedTrade); if (mOrderMonitor.IsOrderCompleted) { PrintResult(); mSyncResponseEvent.Set(); } } } break; case O2GTableType.Messages: O2GMessageRow message = reader.getMessageRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { if (mOrderMonitor != null) { mOrderMonitor.OnMessageAdded(message); if (mOrderMonitor.IsOrderCompleted) { PrintResult(); mSyncResponseEvent.Set(); } } } break; } } } }
private static bool ProcessOrderRequest(FxcmBroker fxcm, O2GRequest request, out string orderId) { var ret = string.Empty; var waitOrder = new ManualResetEvent(false); var responseListener = new ResponseListener( fxcm.Session, data => { O2GResponseReaderFactory factory = fxcm.Session.getResponseReaderFactory(); if (factory != null) { O2GTablesUpdatesReader reader = factory.createTablesUpdatesReader(data); for (int ii = 0; ii < reader.Count; ii++) { if (reader.getUpdateTable(ii) == O2GTableType.Orders) { O2GOrderRow orderRow = reader.getOrderRow(ii); if (reader.getUpdateType(ii) == O2GTableUpdateType.Insert) { ret = orderRow.OrderID; waitOrder.Set(); break; } } } } }); fxcm.Session.subscribeResponse(responseListener); try { responseListener.SetRequestID(request.RequestID); fxcm.Session.sendRequest(request); if (responseListener.WaitEvents()) { if (!string.IsNullOrEmpty(responseListener.Error)) { Log.Error($"Unable to process request - {responseListener.Error}"); orderId = ret; return(false); } // Get order ID waitOrder.WaitOne(); orderId = ret; return(true); } else { Log.Error($"Unable to process request"); orderId = ret; return(false); } } finally { fxcm.Session.unsubscribeResponse(responseListener); } }