/// <summary> /// обработчик отчета об ошибках отмены моих ордеров /// </summary> private void OrderCancelRejectHandler(FixEntity entity) { try { string rej = entity.GetFieldByTag((int)Tags.CxlRejReason); if (rej == "1") { Order order = new Order(); order.ServerType = ServerType.Lmax; order.NumberMarket = entity.GetFieldByTag((int)Tags.ClOrdID); order.TimeCallBack = DateTime.UtcNow; var numUser = entity.GetFieldByTag((int)Tags.OrigClOrdID); try { order.NumberUser = Convert.ToInt32(numUser); } catch (Exception e) { return; } order.State = OrderStateType.Fail; MyOrderEvent?.Invoke(order); return; } SendLogMessage("Ошибка отмены ордера. Причина: " + _errorDictionary.CxlRejReason[rej] + "-" + entity.GetFieldByTag((int)Tags.Text), LogMessageType.Trade); } catch (ArgumentException e) { SendLogMessage(e.Message, LogMessageType.Error); } catch (Exception e) { SendLogMessage("OrderCancelRejectHandlerError " + e.Message, LogMessageType.Error); } }
/// <summary> /// обработчик отчета о моих ордерах и сделках /// </summary> private void ExecutionReportHandler(FixEntity entity) { try { string type = entity.GetFieldByTag((int)Tags.ExecType); if (type != "F") { Order order = new Order(); order.ServerType = ServerType.Lmax; var time = entity.GetFieldByTag((int)Tags.TransactTime); order.TimeCallBack = DateTime.ParseExact(time, "yyyyMMdd-HH:mm:ss.fff", CultureInfo.CurrentCulture); order.SecurityNameCode = entity.GetFieldByTag((int)Tags.SecurityID); var numUser = entity.GetFieldByTag((int)Tags.ClOrdID); if (type == "0") { try { // если пришел сигнал о новом ордере, но ClOrdID не может быть конвертирован в int, значит ордер создавался не в OsEngine, игнорим его order.NumberUser = Convert.ToInt32(numUser); } catch (Exception e) { return; } order.State = OrderStateType.Activ; order.NumberMarket = entity.GetFieldByTag((int)Tags.OrderID); order.Side = entity.GetFieldByTag((int)Tags.Side) == "1" ? Side.Buy : Side.Sell; order.Volume = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.OrderQty), CultureInfo.InvariantCulture); if (entity.GetFieldByTag((int)Tags.OrdType) == "2") { order.Price = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.Price), CultureInfo.InvariantCulture); } MyOrderEvent?.Invoke(order); return; } if (type == "8") { try { order.NumberUser = Convert.ToInt32(numUser); } catch (Exception e) { return; } order.State = OrderStateType.Fail; string rej = entity.GetFieldByTag((int)Tags.OrdRejReason); SendLogMessage( "Ошибка выставления ордера: " + _errorDictionary.OrdRejReason[rej] + "-" + entity.GetFieldByTag((int)Tags.Text), LogMessageType.System); MyOrderEvent?.Invoke(order); return; } if (type == "4") { order.State = OrderStateType.Cancel; order.TimeCancel = order.TimeCallBack; var oldNumUser = entity.GetFieldByTag((int)Tags.OrigClOrdID); try { order.NumberUser = Convert.ToInt32(oldNumUser); } catch (Exception e) { return; } order.NumberMarket = entity.GetFieldByTag((int)Tags.OrderID); order.Side = entity.GetFieldByTag((int)Tags.Side) == "1" ? Side.Buy : Side.Sell; order.Volume = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.OrderQty), CultureInfo.InvariantCulture); if (entity.GetFieldByTag((int)Tags.OrdType) == "2") { order.Price = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.Price), CultureInfo.InvariantCulture); } MyOrderEvent?.Invoke(order); } else if (type == "I") { } } else { MyTrade trade = new MyTrade(); trade.Time = DateTime.ParseExact(entity.GetFieldByTag((int)Tags.TransactTime), "yyyyMMdd-HH:mm:ss.fff", CultureInfo.CurrentCulture); trade.NumberOrderParent = entity.GetFieldByTag((int)Tags.OrderID); trade.NumberTrade = entity.GetFieldByTag((int)Tags.ExecID); trade.Volume = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.LastQty), CultureInfo.InvariantCulture); trade.Price = Convert.ToDecimal(entity.GetFieldByTag((int)Tags.LastPx), CultureInfo.InvariantCulture); trade.SecurityNameCode = entity.GetFieldByTag((int)Tags.SecurityID); MyTradeEvent?.Invoke(trade); } } catch (ArgumentException e) { SendLogMessage(e.Message, LogMessageType.Error); } catch (Exception e) { SendLogMessage("ExecutionReportHandlerError " + e.Message, LogMessageType.Error); } }