void SaveHistory(MbtOrderHistory history) { if (firstHistory) { orderLog.Notice(DisplayHeader(history)); firstHistory = false; } orderLog.Notice(DisplayValues(history)); }
void _orderClient_OnHistoryAdded(MbtOrderHistory pHist) { Order.UpdateTypeEnum update; OrderInfo? info = ConvertToOrderInfo(pHist, out update); if (info.HasValue && info.Value.State == OrderStateEnum.Canceled) { TryCompleteOrderOperation(pHist.Token, false, info); } if (info.HasValue) { this._adapter.OrderExecutionSourceStub.UpdateOrderInfo(_accountInfo.Value, update, info.Value); } else { SystemMonitor.OperationWarning("Order history update skipped [" + pHist.OrderNumber + "/" + pHist.Token + " - " + pHist.Event + ", " + pHist.Message + "].", TracerItem.PriorityEnum.Low); } }
/// <summary> /// Convert history to order orderInfo. /// </summary> /// <param name="OrderInfo"></param> /// <returns></returns> OrderInfo?ConvertToOrderInfo(MbtOrderHistory pHist, out Order.UpdateTypeEnum updateType) { updateType = Order.UpdateTypeEnum.Update; if (string.IsNullOrEmpty(pHist.Event)) { return(null); } OrderInfo info = new OrderInfo(pHist.Token); string eventInfo = pHist.Event.ToLower(); if (eventInfo.Contains("enter") || (eventInfo.Contains("session") && eventInfo.Contains("open"))) {// "Enter", "Session open" events skipped. return(null); } if (eventInfo.Contains("live")) { info.State = OrderStateEnum.Submitted; } else if (eventInfo.Contains("executed")) { info.State = OrderStateEnum.Executed; } else if (eventInfo.Contains("suspended")) { info.State = OrderStateEnum.Suspended; } else if (eventInfo == "cancel" || (eventInfo.Contains("cancel") && eventInfo.Contains("reject")) || (eventInfo.Contains("order") && eventInfo.Contains("reject")) || (eventInfo.Contains("order") && eventInfo.Contains("cancel"))) {// Order Reject or Cancel. info.State = OrderStateEnum.Canceled; updateType = Order.UpdateTypeEnum.Canceled; } else if (eventInfo.Contains("suspended")) {// Suspended info.State = OrderStateEnum.Suspended; updateType = Order.UpdateTypeEnum.Modified; } string eventMessage = pHist.Message; Symbol?symbol = TryObtainSymbol(pHist.Symbol); if (symbol.HasValue == false) { return(null); } info.Tag = pHist.OrderNumber; info.OpenPrice = (decimal)pHist.Price; info.StopLoss = (decimal)pHist.StopLimit; info.TakeProfit = (decimal)pHist.StopLimit; info.OpenTime = ConvertDateTime(pHist.Date + " " + pHist.Time); info.Volume = pHist.Quantity; info.Symbol = symbol.Value; info.Type = ConvertFromMBTOrderType(pHist.OrderType, pHist.BuySell); if (info.Type == OrderTypeEnum.UNKNOWN) { SystemMonitor.OperationWarning("Failed to recognize order type [" + pHist.OrderType.ToString() + "]."); //return null; } return(info); }
/// <summary> /// Convert history to order orderInfo. /// </summary> /// <param name="OrderInfo"></param> /// <returns></returns> OrderInfo? ConvertToOrderInfo(MbtOrderHistory pHist, out Order.UpdateTypeEnum updateType) { updateType = Order.UpdateTypeEnum.Update; if (string.IsNullOrEmpty(pHist.Event)) { return null; } OrderInfo info = new OrderInfo(pHist.Token); string eventInfo = pHist.Event.ToLower(); if (eventInfo.Contains("enter") || (eventInfo.Contains("session") && eventInfo.Contains("open"))) {// "Enter", "Session open" events skipped. return null; } if (eventInfo.Contains("live")) { info.State = OrderStateEnum.Submitted; } else if (eventInfo.Contains("executed")) { info.State = OrderStateEnum.Executed; } else if (eventInfo.Contains("suspended")) { info.State = OrderStateEnum.Suspended; } else if (eventInfo == "cancel" || (eventInfo.Contains("cancel") && eventInfo.Contains("reject")) || (eventInfo.Contains("order") && eventInfo.Contains("reject")) || (eventInfo.Contains("order") && eventInfo.Contains("cancel"))) {// Order Reject or Cancel. info.State = OrderStateEnum.Canceled; updateType = Order.UpdateTypeEnum.Canceled; } else if (eventInfo.Contains("suspended")) {// Suspended info.State = OrderStateEnum.Suspended; updateType = Order.UpdateTypeEnum.Modified; } string eventMessage = pHist.Message; Symbol? symbol = TryObtainSymbol(pHist.Symbol); if (symbol.HasValue == false) { return null; } info.Tag = pHist.OrderNumber; info.OpenPrice = (decimal)pHist.Price; info.StopLoss = (decimal)pHist.StopLimit; info.TakeProfit = (decimal)pHist.StopLimit; info.OpenTime = ConvertDateTime(pHist.Date + " " + pHist.Time); info.Volume = pHist.Quantity; info.Symbol = symbol.Value; info.Type = ConvertFromMBTOrderType(pHist.OrderType, pHist.BuySell); if (info.Type == OrderTypeEnum.UNKNOWN) { SystemMonitor.OperationWarning("Failed to recognize order type [" + pHist.OrderType.ToString() + "]."); //return null; } return info; }
TradeImpl ToTradeLinkFill(MbtOpenOrder pOrd, MbtOrderHistory pHist) { //debug(String.Format("pOrd\n{0}\n\npHist\n{1}", Util.DumpObjectProperties(pOrd), Util.DumpObjectProperties(pHist))); debug(String.Format("pOrd: {0}", DisplayOrder(pOrd))); //TODO:Add hstory to this debug TradeImpl f = new TradeImpl(); f.symbol = pOrd.Symbol; f.Account = pOrd.Account.Account; //f.xprice = (pOrd.Price > 0) ? (decimal)pOrd.Price : (decimal)pOrd.StopLimit; //f.xprice = Math.Abs((decimal)pOrd.Price); f.xprice = (decimal)pHist.Price; //f.xsize = pHist.Event == "Executed" ? pHist.Quantity : pHist.SharesFilled; f.xsize = pHist.Quantity; f.side = (pOrd.BuySell == MBConst.VALUE_BUY); f.xtime = Util.DT2FT(pOrd.UTCDateTime); f.xdate = Util.ToTLDate(pOrd.UTCDateTime); long tlid = 0; if (broker2tl.TryGetValue(pOrd.OrderNumber, out tlid)) f.id = tlid; else debug(String.Format("WARNING: No order matching fill for pOrd.OrderNumber {0}", pOrd.OrderNumber)); //debug(String.Format("New fill {1}\n is valid:{0}\ndump:{2}", f.isValid, f.ToString(), Util.DumpObjectProperties(f))); debug(String.Format("New fill {1} is valid? {0}", f.isValid, f.ToString())); return f; }
/// <summary> /// Get the order for a history object then convert that to a TradeLink fill /// </summary> /// <param name="pHist"></param> /// <returns></returns> TradeImpl HistToTradeLinkFill(MbtOrderHistory pHist) { MbtOpenOrder pOrd = GetOrderByOrderNumber(pHist.OrderNumber); TradeImpl fill = ToTradeLinkFill(pOrd, pHist); /* //clean it up if the order is completely filled if( pHist.Quantity == pHist.SharesFilled ) { //order has been completely filled so do cleanup string bid = pOrd.OrderNumber; debug(String.Format("Cleaning up orders for {0}", bid)); //clean up the orders list if( orders.ContainsKey(bid) ) orders.Remove(bid); else debug(String.Format("order {0} did not exist in orders", bid)); //clean up mappings long tlid = 0; if( broker2tl.TryGetValue(bid, out tlid ) ) { //got the tradelink id so clear the broker mapping debug(String.Format("Cleaning up broker2tl mapping {0} - {1}", bid, tlid)); broker2tl.Remove(bid); //then clear the tradelink mapping debug(String.Format("cleaning up tl2broker mapping {0} - {1}", tlid, bid)); if( tl2broker.ContainsKey(tlid ) ) tl2broker.Remove(tlid); else debug(String.Format("Order {0} did not have a matching tlid {1} to remove.", bid, tlid)); } //clear the order from the orders list orders.Remove(pOrd.OrderNumber); } */ return fill; }
/// <summary> /// Get the order for a history object then convert that to a TradeLink order /// </summary> /// <param name="pHist"></param> /// <returns></returns> OrderImpl HistToTradeLinkOrder(MbtOrderHistory pHist) { MbtOpenOrder pOrd = GetOrderByOrderNumber(pHist.OrderNumber); return ToTradeLinkOrder(pOrd); //pmh - what happens if not found?!? }
void m_OrderClient_OnHistoryAdded(MbtOrderHistory pHist) { long tlid = 0; double price = (pHist.Price != 0) ? pHist.Price : pHist.StopPrice; broker2tl.TryGetValue(pHist.OrderNumber, out tlid); debug(String.Format("m_OrderClient_OnHistoryAdded {0} {1} {2} {3} {4} {5} {6}", pHist.Symbol, pHist.Event, pHist.OrderNumber, tlid, price, pHist.Quantity, pHist.Message)); switch (pHist.Event) { case "Accepted": case "Live": if (!sentNewOrders.Contains(pHist.OrderNumber)) { OrderImpl o = HistToTradeLinkOrder(pHist); tl.newOrder(o); sentNewOrders.Add(pHist.OrderNumber); } break; case "Executed": //OrderImpl o = HistToTradeLinkOrder(pHist); //tl.newOrder(o); TradeImpl f = HistToTradeLinkFill(pHist); pt.Adjust(f); tl.newFill(f); break; case "Order Cancelled": //TODO: have to make sure order cancellations are happening correctly, especially on repeat requests from TradeLink string bid = pHist.OrderNumber; //long tlid = 0; if (broker2tl.TryGetValue(bid, out tlid)) { debug(String.Format("Order {0} cancelled, matched order {1} and sending newOrderCancel to TradeLink", bid, tlid)); //remove the order mappings if (broker2tl.ContainsKey(bid)) broker2tl.Remove(bid); if (tl2broker.ContainsKey(tlid)) tl2broker.Remove(tlid); cancelids.Remove(bid); orders.Remove(bid); tl.newCancel(tlid); canceledids.Add(tlid, true); } else debug(String.Format("Order {0} cancelled but no matching TradeLink order to cancel", bid)); break; default: break; } }
/// <summary> /// Get the order for a history object then convert that to a TradeLink order /// </summary> /// <param name="pHist"></param> /// <returns></returns> OrderImpl HistToTradeLinkOrder(MbtOrderHistory pHist) { MbtOpenOrder pOrd = GetOrderByOrderNumber(pHist.OrderNumber); return ToTradeLinkOrder(pOrd); }
public void OnHistoryAdded(MbtOrderHistory orderhistory) { SaveHistory(orderhistory); }