Esempio n. 1
0
        /// <summary>
        /// Called when HTB Locate event is Raised by Blackwood
        /// </summary>
        private void OnLocate(object sender, BWOrder locatemsg)
        {
            try
            {
                if (Logger.IsInfoEnabled)
                {
                    Logger.Info("HTB Locate event raised by Blackwood: " + locatemsg.ToString(), _type.FullName, "OnLocate");
                }

                //Create limit order containing locate parameters
                LimitOrder locateOrder = OrderMessage.GenerateLimitOrder(locatemsg.ClientOrderID.ToString(),
                                                                         new Security()
                {
                    Symbol = locatemsg.Symbol
                },
                                                                         locatemsg.OrderSide2.ToString(),
                                                                         (int)locatemsg.Size,
                                                                         (decimal)locatemsg.LimitPrice,
                                                                         _orderExecutionProviderName);

                // Raise event to notify listeners
                if (OnLocateMessage != null)
                {
                    // Update BW Locate Orders Map
                    _locateOrders.AddOrUpdate(locatemsg.ClientOrderID.ToString(), locatemsg, (key, value) => locatemsg);

                    // Fire Event
                    OnLocateMessage(locateOrder);
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "OnLocate");
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Called when Order Update is received from Blackwood
        /// </summary>
        private void OnOrderUpdate(object sender, BWOrder ordermsg)
        {
            try
            {
                if (ordermsg.OrderID != 0 && ordermsg.OrderStatus == OrderStatus.Market)
                {
                    if (Logger.IsInfoEnabled)
                    {
                        Logger.Info("Order update received from Blackwood: " + ordermsg.ToString(), _type.FullName, "OnOrderUpdate");
                    }

                    if (Logger.IsDebugEnabled)
                    {
                        Logger.Debug("BW-Order ID: " + ordermsg.OrderID + " | BW-ClientOrder ID: " + ordermsg.ClientOrderID,
                                     _type.FullName, "OnOrderUpdate");
                    }

                    // Get corresponding Local Order ID
                    string localId = (from id in _localToBlackwoodIdsMap
                                      where id.Value.Equals(ordermsg.ClientOrderID.ToString())
                                      select id.Key).FirstOrDefault();

                    if (localId == null)
                    {
                        return;
                    }

                    Order order = new Order(_orderExecutionProviderName)
                    {
                        OrderID   = localId,
                        OrderSide = BlackwoodTypeConvertor.OrderSideConvertor.GetTradeHubOrderSide(ordermsg.OrderSide2),
                        OrderSize = Convert.ToInt32(ordermsg.Size),
                        Security  = new Security {
                            Symbol = ordermsg.Symbol
                        },
                        OrderDateTime = ordermsg.OrderTime
                    };

                    // Update IDs Map
                    _localToBlackwoodIdsMap[localId] = ordermsg.OrderID.ToString();

                    BWOrder bwOrder;
                    if (_bwOrders.TryRemove(ordermsg.ClientOrderID.ToString(), out bwOrder))
                    {
                        // Update Orders Map
                        _bwOrders.TryAdd(ordermsg.OrderID.ToString(), bwOrder);
                    }

                    // Raise Order Acceptance Event
                    if (NewArrived != null)
                    {
                        NewArrived(order);
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "OnOrderUpdate");
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Sends Market Order on the given Order Execution Provider
        /// </summary>
        /// <param name="marketOrder">TradeHub MarketOrder</param>
        public void SendMarketOrder(MarketOrder marketOrder)
        {
            try
            {
                if (Logger.IsInfoEnabled)
                {
                    Logger.Info("Sending Market Order on Blackwood." + marketOrder, _type.FullName, "SendMarketOrder");
                }

                OrderSide tempSide    = BlackwoodTypeConvertor.OrderSideConvertor.GetBlackwoodOrderSide(marketOrder.OrderSide);
                TIMEOUT   tempTimeout = BlackwoodTypeConvertor.OrderTifConvertor.GetBlackwoodOrderTif(marketOrder.OrderTif);

                if (tempSide.Equals(ORDER_SIDE.NONE))
                {
                    Logger.Info("Invalid Order Side", _type.FullName, "SendMarketOrder");
                    return;
                }

                // Create Blackwood Order
                //BWOrder bwOrder = new BWOrder(_session, marketOrder.Security.Symbol, tempSide,
                //                              (uint)marketOrder.OrderSize, 0, 0,
                //                              ORDER_TYPE.MARKET, (int)tempTimeout, FEED_ID.NONE, false,
                //                              (uint)marketOrder.OrderSize);
                BWOrder bwOrder = new BWOrder(_session, marketOrder.Security.Symbol, tempSide,
                                              (uint)marketOrder.OrderSize, 0, OrderType.MARKET, (int)tempTimeout, FeedId.NONE, false,
                                              (uint)marketOrder.OrderSize);
                // Set OPG Venue
                DetermineAndSetTraderDestinationsMarket(bwOrder, marketOrder.Exchange);

                // Send Order to gateway
                bwOrder.Send();

                // Update Local IDs Map
                _localToBlackwoodIdsMap.TryAdd(marketOrder.OrderID, bwOrder.ClientOrderID.ToString());

                // Update BW-Orders Map
                _bwOrders.TryAdd(bwOrder.ClientOrderID.ToString(), bwOrder);

                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("BW-Order ID: " + bwOrder.OrderID + " | BW-ClientOrder ID: " + bwOrder.ClientOrderID,
                                 _type.FullName, "SendMarketOrder");
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "SendMarketOrder");
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Sends Limit Order on the given Order Execution Provider
        /// </summary>
        /// <param name="limitOrder">TradeHub LimitOrder</param>
        public void SendLimitOrder(LimitOrder limitOrder)
        {
            try
            {
                if (Logger.IsInfoEnabled)
                {
                    Logger.Info("Sending Limit Order on Blackwood." + limitOrder, _type.FullName, "SendLimitOrder");
                }

                OrderSide tempSide    = BlackwoodTypeConvertor.OrderSideConvertor.GetBlackwoodOrderSide(limitOrder.OrderSide);
                TIMEOUT   tempTimeout = BlackwoodTypeConvertor.OrderTifConvertor.GetBlackwoodOrderTif(limitOrder.OrderTif);

                if (tempSide.Equals(ORDER_SIDE.NONE))
                {
                    Logger.Info("Invalid Order Side", _type.FullName, "SendLimitOrder");
                    return;
                }

                // NOTE: FFED_ID is fixed to ARCA according to StockTrader code
                // Create Blackwood Order
                //BWOrder bwOrder = new BWOrder(_session, limitOrder.Security.Symbol, tempSide,
                //                              (uint)limitOrder.OrderSize, (double)limitOrder.LimitPrice, 0,
                //                              ORDER_TYPE.LIMIT, (int)tempTimeout, FEED_ID.ARCA, false,
                //                              (uint)limitOrder.OrderSize);
                BWOrder bwOrder = new BWOrder(_session, limitOrder.Security.Symbol, tempSide,
                                              (uint)limitOrder.OrderSize, (double)limitOrder.LimitPrice, 0, OrderType.LIMIT, (int)tempTimeout,
                                              FeedId.ARCA, false, (uint)limitOrder.OrderSize);

                // Send Order to gateway
                bwOrder.Send();

                // Update Local IDs Map
                _localToBlackwoodIdsMap.TryAdd(limitOrder.OrderID, bwOrder.ClientOrderID.ToString());

                // Update BW-Orders Map
                _bwOrders.TryAdd(bwOrder.ClientOrderID.ToString(), bwOrder);

                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("BW-Order ID: " + bwOrder.OrderID + " | BW-ClientOrder ID: " + bwOrder.ClientOrderID,
                                 _type.FullName, "SendLimitOrder");
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "SendLimitOrder");
            }
        }
Esempio n. 5
0
        long ServerBlackwood_newSendOrderRequest(Order o)
        {
            v(o.symbol + " received sendorder request for: " + o.ToString());
            if ((o.id != 0) && !isunique(o))
            {
                v(o.symbol + " dropping duplicate order: " + o.ToString());
                return((long)MessageTypes.DUPLICATE_ORDERID);
            }
            if (o.id == 0)
            {
                o.id = _id.AssignId;
            }
            int         orderCID       = (int)o.id;
            string      sSymbol        = o.symbol;
            ORDER_SIDE  orderSide      = (o.side ? ORDER_SIDE.SIDE_BUY : ORDER_SIDE.SIDE_SELL);
            BWVenue     orderVenue     = getVenueFromBW(o);
            BWOrderType orderType      = (o.isStop ? (o.isLimit ? BWOrderType.STOP_LIMIT : BWOrderType.STOP_MARKET) : (o.isLimit ? BWOrderType.LIMIT : BWOrderType.MARKET));
            int         orderTIF       = (int)getDurationFromBW(o);
            uint        orderSize      = (uint)o.UnsignedSize;
            int         orderReserve   = o.UnsignedSize;
            float       orderPrice     = (float)o.price;
            float       orderStopPrice = (float)o.stopp;
            // create a new BWOrder with these parameters
            BWOrder bwOrder = new BWOrder(m_Session, sSymbol, orderSide, orderSize, orderPrice, orderType, orderTIF, orderVenue, false, orderSize);

            bwOrder.CustomID = orderCID;
            bwOrder.SmartID  = orderCID;
            // subscribe to this order's events
            bwOrder.BWOrderUpdateEvent += new BWOrder.BWOrderUpdateHandler(bwOrder_BWOrderUpdateEvent);
            // add a BWStock object for this symbol to the list of stocks that have had orders placed
            // so that it can be referred to for position management
            try
            {
                // GetStock throws an exception if not connected to Market Data
                BWStock stock = m_Session.GetStock(bwOrder.Symbol);
            }
            catch (ClientPortalConnectionException e)
            {
                debug(e.Message);
            }
            // send the order
            bwOrder.Send();
            _bwOrdIds.Add(o.id, 0);
            v(o.symbol + " sent order: " + o.ToString());
            return((long)MessageTypes.OK);
        }
Esempio n. 6
0
        /// <summary>
        /// Determine and Set trader Destinations for Market orders
        /// </summary>
        private bool DetermineAndSetTraderDestinationsMarket(BWOrder bwOrder, string opgVenue)
        {
            try
            {
                foreach (Pacmid.Messages.TraderDestination traderDestination in _session.GetTraderDestinations().Values)
                {
                    if (bwOrder.Timeout == (int)TIMEOUT.TIMEOUT_OPG)
                    {
                        if (traderDestination.FeedID.FeedName == opgVenue &&
                            traderDestination.OrderType.BWOrderType == bwOrder.OrderType &&
                            (int)traderDestination.TIF.BWTIF == bwOrder.Timeout)
                        {
                            bwOrder.SetTraderDestination(traderDestination);
                            if (Logger.IsDebugEnabled)
                            {
                                Logger.Debug("Venue on the Order is: " + bwOrder.FeedId2.ToString(), _type.FullName, "DetermineAndSetTraderDestinationsOPG");
                                Logger.Debug("Venue on the Trader Destination is: " + traderDestination.FeedID.ToString(), _type.FullName, "DetermineAndSetTraderDestinationsOPG");
                            }

                            return(true);
                        }
                    }
                    else if (traderDestination.FeedID.FeedName == "SMARTEDGEP" &&
                             traderDestination.OrderType.BWOrderType == bwOrder.OrderType &&
                             (int)traderDestination.TIF.BWTIF == bwOrder.Timeout)
                    {
                        bwOrder.SetTraderDestination(traderDestination);

                        if (Logger.IsDebugEnabled)
                        {
                            Logger.Debug("Venue on the Order is: " + bwOrder.FeedId2.ToString(), _type.FullName, "DetermineAndSetTraderDestinationsOPG");
                            Logger.Debug("Venue on the Trader Destination is: " + traderDestination.FeedID.FeedName, _type.FullName, "DetermineAndSetTraderDestinationsOPG");
                        }

                        return(true);
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "DetermineAndSetTraderDestinationsOPG");
            }
            return(false);
        }
Esempio n. 7
0
        void bwOrder_BWOrderUpdateEvent(object sender, BWOrderStatus BWOrderStatus)
        {
            BWOrder bwo = (BWOrder)sender;
            long    id  = (long)bwo.CustomID;
            Order   o   = new OrderImpl(bwo.Symbol, (int)bwo.Size);

            o.id      = (long)bwo.CustomID;
            o.side    = (bwo.OrderSide == ORDER_SIDE.SIDE_BUY) || (bwo.OrderSide == ORDER_SIDE.SIDE_COVER);
            o.price   = (decimal)bwo.LimitPrice;
            o.stopp   = (decimal)bwo.StopPrice;
            o.Account = bwo.UserID.ToString();
            o.ex      = bwo.Venue.ToString();

            switch (BWOrderStatus)
            {
            case BWOrderStatus.ACCEPTED:
            {
                tl.newOrder(o);
                v(o.symbol + " sent order acknowledgement for: " + o.ToString());
                if (_bwOrdIds.ContainsKey(o.id))
                {
                    _bwOrdIds[o.id] = bwo.OrderID;
                }
            }
            break;

            case BWOrderStatus.CANCELED:
            {
                tl.newCancel(id);
                v("sent cancel notification for order: " + id);
            }
            break;

            case BWOrderStatus.REJECTED:
            {
                tl.newCancel(id);
                debug("Rejected: " + bwo.CustomID.ToString() + bwo.RejectReason);
            }
            break;
            }
        }
Esempio n. 8
0
 long ServerBlackwood_newSendOrderRequest(Order o)
 {
     v(o.symbol + " received sendorder request for: " + o.ToString());
     if ((o.id != 0) && !isunique(o))
     {
         v(o.symbol + " dropping duplicate order: " + o.ToString());
         return (long)MessageTypes.DUPLICATE_ORDERID;
     }
     if (o.id == 0)
         o.id = _id.AssignId;
     int orderCID = (int)o.id;
     string sSymbol = o.symbol;
     ORDER_SIDE orderSide = (o.side ? ORDER_SIDE.SIDE_BUY : ORDER_SIDE.SIDE_SELL);
     BWVenue orderVenue = getVenueFromBW(o);
     BWOrderType orderType = (o.isStop ? (o.isLimit ? BWOrderType.STOP_LIMIT : BWOrderType.STOP_MARKET) : (o.isLimit ? BWOrderType.LIMIT : BWOrderType.MARKET));
     int orderTIF = (int)getDurationFromBW(o);
     uint  orderSize = (uint)o.UnsignedSize;
     int orderReserve = o.UnsignedSize;
     float orderPrice = (float)o.price;
     float orderStopPrice = (float)o.stopp;
     // create a new BWOrder with these parameters
     BWOrder bwOrder = new BWOrder(m_Session, sSymbol, orderSide, orderSize, orderPrice, orderType, orderTIF, orderVenue, false, orderSize);
     bwOrder.CustomID = orderCID;
     bwOrder.SmartID = orderCID;
     // subscribe to this order's events
     bwOrder.BWOrderUpdateEvent += new BWOrder.BWOrderUpdateHandler(bwOrder_BWOrderUpdateEvent);
     // add a BWStock object for this symbol to the list of stocks that have had orders placed
     // so that it can be referred to for position management
     try
     {
         // GetStock throws an exception if not connected to Market Data
         BWStock stock = m_Session.GetStock(bwOrder.Symbol);
     }
     catch (ClientPortalConnectionException e)
     {
         debug(e.Message);
     }
     // send the order
     bwOrder.Send();
     _bwOrdIds.Add(o.id, 0);
     v(o.symbol + " sent order: " + o.ToString());
     return (long)MessageTypes.OK;
 }
        private void STATUSSERVERUPDATE(BWOrder bwo)
        {
            long _tlid = 0;
            int _bwid = bwo.ClientOrderID;
            int _smartID = bwo.SmartID;
            // rectify ClientOrderID to SmartID
            // check for ClientOrderID 'key'
            if (_intlong.ContainsKey(_bwid))
            {
                _intlong.TryGetValue(_bwid, out _tlid);

                if (_tlid != 0)
                {
                    // update TL with BWid
                    _intlong.Remove(_bwid);
                    _intlong.Add(_smartID, _tlid);
                    _longint[_tlid] = _smartID;
                    //v(String.Format("RECTIFYING! Updating order map, TL:[{0}] with BW:[{1}]", _tlid, _smartID));
                }
                else
                {
                    v(String.Format("Order for {0} put TL [{0}] to ZERO ", bwo.Symbol, _tlid ));
                }
            }
            else
            {
                if (_intlong.ContainsKey(_smartID))
                {
                    // v(String.Format("We have already updated BW and TL to reflect smartID [{0}]", _smartID));
                }
                else
                {
                    long _cancelID = _id.AssignId;
                    _intlong.Add(_smartID, _cancelID);
                    _longint.Add(_cancelID, _smartID);
                    //orderz.Add(_cancelID, bwo);
                    debug(String.Format("+++Manual Order ack+++ SmartID:[{0}] getting tagged to *NEW* TL_ID: [{1}] and BWOrder: [{2}]", _smartID, _cancelID, bwo.ToString()));
                }
            }
        }
        private void STATUSMARKETUPDATE(BWOrder bwo)
        {
            long _tlid = 0;
            int _bwid = bwo.SmartID;

            if (_intlong.ContainsKey(_bwid))
            {
                // locate TL order via bwo.SmartID
                _intlong.TryGetValue(_bwid, out _tlid);
            }
            else
            {
                v(String.Format("STATUS.MARKET.UPDATE.{0}: smartID [{1}] cannot be found...", bwo.Symbol, _bwid));
            }

            // create TL order
            Order o = new OrderImpl(bwo.Symbol, Convert.ToInt32(bwo.Size));
            o.id = _tlid;
            o.side = (bwo.OrderSide == ORDER_SIDE.BUY) || (bwo.OrderSide == ORDER_SIDE.COVER);
            o.price = System.Convert.ToDecimal(bwo.LimitPrice);
            o.stopp = System.Convert.ToDecimal(bwo.StopPrice);
            o.Account = _acct;
            o.ex = bwo.FeedID.ToString();

            // update new orders list
            if (!sentNewOrders.Contains(o.id))
            {
                tl.newOrder(o);
                sentNewOrders.Add(o.id);
                string _direction = o.side ? "+++++" : "-----";
                debug(String.Format("{0}>{1} sent for {2} @ ${3}   TL[{4}]", _direction, o.symbol, o.size, o.price, o.id));
            }
            else
            {
                //v(String.Format("STATUS.MARKET ...sentNewOrders already contains TL_ID: [{0}]", o.id));
            }

            // update orderz map
            if (!orderz.ContainsKey(o.id))
            {
                orderz.Add(o.id, bwo);
                //v(String.Format("STATUS.MARKET ...adding to orderz: TL_ID: [{0}] with bwo: [{1}]", o.id, bwo.ToString()));
            }
            else
            {
                //v(String.Format("STATUS.MARKET ...orderz already contains TL_ID: [{0}] with bwo: [{1}]", o.id, bwo.ToString()));
            }
        }
        long ServerBlackwood_newSendOrderRequest(Order o)
        {
            v(String.Format("{0} received sendorder request for: {1}",o.symbol, o.ToString()));
            if ((o.id != 0) && !isunique(o))
            {
                v(String.Format("{0} dropping duplicate order: {1}",o.symbol, o.ToString()));
                return (long)MessageTypes.DUPLICATE_ORDERID;
            }
            if (o.id == 0)
            {
                o.id = _id.AssignId;
                v(String.Format("No order id for {0}...assigning [{1}]", o.symbol, o.id));
            }

            string sSymbol = o.symbol;
            ORDER_SIDE orderSide = (o.side ? ORDER_SIDE.BUY : ORDER_SIDE.SELL);
            FEED_ID orderVenue = getVenueFromBW(o); // need to add pegged order types
            ORDER_TYPE orderType = (o.isStop ? (o.isLimit ? ORDER_TYPE.STOP_LIMIT : ORDER_TYPE.STOP_MARKET) : (o.isLimit ? ORDER_TYPE.LIMIT : ORDER_TYPE.MARKET));
            int orderTIF = (int)getDurationFromBW(o);
            uint orderSize = (uint)o.UnsignedSize;
            int orderReserve = o.UnsignedSize;
            double orderPrice = System.Convert.ToDouble(o.price);
            double orderStopPrice = System.Convert.ToDouble(o.stopp);
            // create a new BWOrder with these parameters
            BWOrder bwOrder = new BWOrder(m_Session, sSymbol, orderSide, orderSize, orderPrice, orderType, orderTIF, orderVenue, false, orderSize);

            SENDORDERUPDATE(bwOrder, o);

            // check market connection
            try
            {
                // GetStock throws an exception if not connected to Market Data
                BWStock stock = m_Session.GetStock(bwOrder.Symbol);
            }
            catch (ClientPortalConnectionException e)
            {
                debug(e.Message);
            }
            // send the order
            bwOrder.Send();
            debug(String.Format("{0} sent order @ ${1}", bwOrder.Symbol, orderPrice));
            return (long)MessageTypes.OK;
        }
 private void SENDORDERUPDATE(BWOrder bwo, Order o)
 {
     long _tlid = o.id;
     int _bwid = bwo.ClientOrderID;
     // update order map
     if (_tlid != 0)
     {
         // TL 2 broker
         if (!_longint.ContainsKey(_tlid))
         {
             //v(String.Format("Mapping TL:[{0}] to BW:[{1}]", _tlid, _bwid));
             _longint.Add(_tlid, _bwid);
         }
         else
         {
             // update the existing ID
             v(String.Format("-----WARNING! Updating TL:[{0}] with BW:[{1}]", _tlid, _bwid));
             _longint[_tlid] = _bwid;
         }
         // broker 2 TL
         if (!_intlong.ContainsKey(_bwid))
         {
             //v(String.Format("Mapping BW:[{0}] to TL:[{1}]", _bwid, _tlid));
             _intlong.Add(_bwid, _tlid);
         }
         else
         {
             // update the existing ID
             v(String.Format("-----WARNING! Updating BW:[{0}] with TL:[{1}]", _bwid, _tlid));
             _intlong[_bwid] = _tlid; // this actually shouldn't be called...!
         }
     }
     else
     {
         v("WARNING! Incoming TL order does not have an id. It will be generated.");
     }
 }
        void m_Session_OnOrderMessage(object sender, BWOrder bwo)
        {
            //v(String.Format("ORDER.MSG.{0}.{1}: for BW[{2}]", bwo.Status.ToString(), bwo.Symbol, bwo.SmartID));

            switch (bwo.Status)
            {
                case STATUS.SERVER:
                    {
                        STATUSSERVERUPDATE(bwo);
                    }
                    break;
                case STATUS.MARKET:
                    {
                        STATUSMARKETUPDATE(bwo);
                    }
                    break;
                case STATUS.REJECT:
                    {
                        debug(String.Format("{0} order was rejected [{1}]",bwo.Symbol, bwo.SmartID));
                    }
                    break;
                case STATUS.DONE:
                    {
                        if (bwo.SizeRemaining == 0)
                        {
                            v(String.Format("STATUS.DONE.{0}: for BW[{1}]",bwo.Symbol, bwo.SmartID));
                        }
                    }
                    break;
            }
        }