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