public Tuple <MyTrade, bool> ProcessMyTradeMessage(Security security, ExecutionMessage message) { if (security == null) { throw new ArgumentNullException("security"); } if (message == null) { throw new ArgumentNullException("message"); } if (message.OriginalTransactionId == 0 && message.OrderId == 0 && message.OrderStringId.IsEmpty()) { throw new ArgumentOutOfRangeException("message", message.OriginalTransactionId, LocalizedStrings.Str715); } var myTrade = _cache.GetData(security).MyTrades.TryGetValue(Tuple.Create(message.OriginalTransactionId, message.TradeId)); if (myTrade != null) { return(Tuple.Create(myTrade, false)); } var order = GetOrder(security, message.OriginalTransactionId, message.OrderId, message.OrderStringId); if (order == null) { return(null); } var trade = message.ToTrade(EntityFactory.CreateTrade(security, message.TradeId, message.TradeStringId)); return(AddMyTrade(order, trade, message)); }
private void ProcessOrderLogMessage(Security security, ExecutionMessage message) { var trade = (message.TradeId != null || !message.TradeStringId.IsEmpty()) ? EntityFactory.CreateTrade(security, message.TradeId, message.TradeStringId) : null; var logItem = message.ToOrderLog(EntityFactory.CreateOrderLogItem(new Order { Security = security }, trade)); //logItem.LocalTime = message.LocalTime; RaiseNewOrderLogItem(logItem); if (message.IsSystem == false) return; if (CreateDepthFromOrdersLog) { try { var builder = _olBuilders.SafeAdd(security, key => MarketDataAdapter.CreateOrderLogMarketDepthBuilder(message.SecurityId)); if (builder == null) throw new InvalidOperationException(); var updated = builder.Update(message); if (updated) { RaiseNewMessage(builder.Depth.Clone()); ProcessQuotesMessage(security, builder.Depth, false); } } catch (Exception ex) { // если ОЛ поврежден, то не нарушаем весь цикл обработки сообщения // а только выводим сообщение в лог RaiseError(ex); } } if (trade != null && CreateTradesFromOrdersLog) { var tuple = _entityCache.GetTrade(security, message.TradeId, message.TradeStringId, (id, stringId) => { var t = trade.Clone(); t.OrderDirection = message.Side.Invert(); return t; }); if (tuple.Item2) RaiseNewTrade(tuple.Item1); } }
public Tuple <Trade, bool> ProcessTradeMessage(Security security, ExecutionMessage message) { if (security == null) { throw new ArgumentNullException("security"); } if (message == null) { throw new ArgumentNullException("message"); } var trade = GetTrade(security, message.TradeId, message.TradeStringId, (id, stringId) => { var t = message.ToTrade(EntityFactory.CreateTrade(security, id, stringId)); t.LocalTime = message.LocalTime; t.Time = message.ServerTime; message.CopyExtensionInfo(t); return(t); }); return(trade); }
public Tuple <MyTrade, bool> ProcessMyTradeMessage(Security security, ExecutionMessage message) { if (security == null) { throw new ArgumentNullException("security"); } if (message == null) { throw new ArgumentNullException("message"); } var originalTransactionId = _orderStatusTransactions.Contains(message.OriginalTransactionId) ? 0 : message.OriginalTransactionId; if (originalTransactionId == 0 && message.OrderId == null && message.OrderStringId.IsEmpty()) { throw new ArgumentOutOfRangeException("message", originalTransactionId, LocalizedStrings.Str715); } var securityData = _cache.GetData(security); var myTrade = securityData.MyTrades.TryGetValue(Tuple.Create(originalTransactionId, message.TradeId ?? 0)); if (myTrade != null) { return(Tuple.Create(myTrade, false)); } var order = GetOrder(security, originalTransactionId, message.OrderId, message.OrderStringId); if (order == null) { return(null); } var trade = message.ToTrade(EntityFactory.CreateTrade(security, message.TradeId, message.TradeStringId)); var isNew = false; myTrade = securityData.MyTrades.SafeAdd(Tuple.Create(order.TransactionId, trade.Id), key => { isNew = true; var t = EntityFactory.CreateMyTrade(order, trade); if (t.ExtensionInfo == null) { t.ExtensionInfo = new Dictionary <object, object>(); } if (message.Commission != null) { t.Commission = message.Commission; } if (message.Slippage != null) { t.Slippage = message.Slippage; } message.CopyExtensionInfo(t); //trades.Add(t); _cache.MyTrades.Add(t); return(t); }); return(Tuple.Create(myTrade, isNew)); // mika // http://stocksharp.com/forum/yaf_postst1072_Probliemy-so-sdielkami--pozitsiiami.aspx // из-за того, что сделки по заявке иногда приходит быстрее события NewOrders, неправильно расчитывается поза по стратегиям //var raiseOrderChanged = false; //trades.SyncDo(d => //{ // var newBalance = order.Volume - d.Sum(t => t.Trade.Volume); // if (order.Balance > newBalance) // { // raiseOrderChanged = true; // order.Balance = newBalance; // if (order.Balance == 0) // order.State = OrderStates.Done; // } //}); //if (raiseOrderChanged) // RaiseOrderChanged(order); }
public Tuple <MyTrade, bool> ProcessMyTradeMessage(Order order, Security security, ExecutionMessage message, long transactionId) { if (security == null) { throw new ArgumentNullException(nameof(security)); } if (message == null) { throw new ArgumentNullException(nameof(message)); } var securityData = GetData(security); if (transactionId == 0 && message.OrderId == null && message.OrderStringId.IsEmpty()) { throw new ArgumentOutOfRangeException(nameof(message), transactionId, LocalizedStrings.Str715); } var myTrade = securityData.MyTrades.TryGetValue(Tuple.Create(transactionId, message.TradeId ?? 0)); if (myTrade != null) { return(Tuple.Create(myTrade, false)); } if (order == null) { order = GetOrder(security, transactionId, message.OrderId, message.OrderStringId); if (order == null) { return(null); } } var trade = message.ToTrade(EntityFactory.CreateTrade(security, message.TradeId, message.TradeStringId)); var isNew = false; myTrade = securityData.MyTrades.SafeAdd(Tuple.Create(order.TransactionId, trade.Id), key => { isNew = true; var t = EntityFactory.CreateMyTrade(order, trade); if (t.ExtensionInfo == null) { t.ExtensionInfo = new Dictionary <object, object>(); } if (message.Commission != null) { t.Commission = message.Commission; } if (message.Slippage != null) { t.Slippage = message.Slippage; } if (message.PnL != null) { t.PnL = message.PnL; } if (message.Position != null) { t.Position = message.Position; } message.CopyExtensionInfo(t); _myTrades.Add(t); return(t); }); return(Tuple.Create(myTrade, isNew)); }