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();
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        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;
                    }
                }
            }
        }
示例#9
0
        /// <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());
                        }
                    }
                }
            }
        }
示例#10
0
        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);
            }
        }