/// <summary> /// 挂单下单 /// </summary> /// <param name="orderln">下单信息</param> /// <returns>下单结果</returns> public Orders GetOrders(OrdersLncoming orderln) { Orders orders = new Orders(); orders.MoneyInventory = new MoneyInventory(); orders.TradeHoldOrder = new TradeHoldOrder(); ProductConfig ptc = new ProductConfig(); DateTime dt = DateTime.Now;//服务器当前本地时间\ TradeUser TdUser = new TradeUser(); double _frozenMoney = 0;//冻结资金 double fxrate = 0; //风险率 string holdid = string.Empty;//挂单ID string userId = string.Empty; //被操作的用户ID string operUser = string.Empty;//操作人 string ipmac = string.Empty; int operUserType = 0; try { #region 判断用户登陆标识是否过期 if (!ComFunction.ExistUserLoginID(orderln.LoginID, ref TdUser)) { orders.Result = false; orders.ReturnCode = ResCode.UL003; orders.Desc = ResCode.UL003Desc; return orders; } operUser = TdUser.Account; ipmac = ComFunction.GetIpMac(TdUser.Ip, TdUser.Mac); operUserType = (int)TdUser.UType; if (UserType.NormalType == TdUser.UType) { userId = TdUser.UserID; } else { userId = ComFunction.GetUserId(orderln.TradeAccount, ref TdUser); } #endregion #region 交易手数验证 if (!ComFunction.ValidateQuantity(orderln.Quantity,TdUser.OrderUnit)) { orders.Result = false; orders.ReturnCode = ResCode.UL044; //orders.Desc = ResCode.UL044Desc; orders.Desc = string.Format("交易手数必须是{0}的倍数", TdUser.OrderUnit); return orders; } #endregion #region 判断用户是否允许挂买单或挂卖单 if ("0" == orderln.OrderType) //挂买单 { if (!TdUser.PermitDhuo) { orders.Result = false; orders.ReturnCode = ResCode.UL017; orders.Desc = ResCode.UL017Desc; return orders; } } else if ("1" == orderln.OrderType) //挂卖单 { if (!TdUser.PermitHshou) { orders.Result = false; orders.ReturnCode = ResCode.UL018; orders.Desc = ResCode.UL018Desc; return orders; } } else { orders.Result = false; orders.ReturnCode = ResCode.UL021; orders.Desc = ResCode.UL021Desc; return orders; } #endregion #region 获取商品信息 ptc = ComFunction.GetProductInfo(orderln.ProductCode); //挂单类型(0买、1卖) if (string.IsNullOrEmpty(ptc.State)) //未能获取商品状态 { orders.Result = false; orders.ReturnCode = ResCode.UL024; orders.Desc = ResCode.UL024Desc; return orders; } #endregion #region 判断当前时间服务器是否允许交易 if (!ComFunction.GetDateset(ptc.PriceCode,dt)) { orders.Result = false; orders.ReturnCode = ResCode.UL022; orders.Desc = ResCode.UL022Desc; return orders; } #endregion #region 挂单有效期判断 //判断有效期是否大于挂单时间 DateTime vlidt = Convert.ToDateTime(string.Format("{0}-{1}-{2} 23:59:59", orderln.ValidTime.Year, orderln.ValidTime.Month, orderln.ValidTime.Day)); if (!(vlidt > dt)) { orders.Result = false; orders.ReturnCode = ResCode.UL023; orders.Desc = ResCode.UL023Desc; return orders; } #endregion #region 判断商品是否处于交易时段 if (!ComFunction.ProductCanTrade(ptc.Starttime, ptc.Endtime)) { orders.Result = false; orders.ReturnCode = ResCode.UL025; orders.Desc = ResCode.UL025Desc; return orders; } #endregion #region 判断商品是否允许交易 //商品的状态(0 正常交易, 1 只报价, 2 只买, 3 只卖, 4 全部禁止) if ("0" == ptc.State) //商品允许正常交易 { if ("0" == orderln.OrderType) //买 { orders.Desc = "买成功"; } else if ("1" == orderln.OrderType) //卖 { orders.Desc = "卖成功"; } else { orders.Result = false; orders.ReturnCode = ResCode.UL021; orders.Desc = ResCode.UL021Desc; return orders; } } else if ("2" == ptc.State) //商品只允许买 { if ("0" == orderln.OrderType) //买 { orders.Desc = "买成功"; } else { orders.Result = false; orders.ReturnCode = ResCode.UL026; orders.Desc = ResCode.UL026Desc; return orders; } } else if ("3" == ptc.State) //商品只允许卖 { if ("1" == orderln.OrderType) //卖 { orders.Desc = "卖成功"; } else { orders.Result = false; orders.ReturnCode = ResCode.UL027; orders.Desc = ResCode.UL027Desc; return orders; } } else { orders.Result = false; orders.ReturnCode = ResCode.UL025; orders.Desc = ResCode.UL025Desc; return orders; } #endregion #region 挂单价判断 (浮点数比较时,把两个数相减,然后和0.000001比较) //最小成交价格 < 挂单价 <最大成交价格 if (!(orderln.HoldPrice - ptc.MinPrice >= ComFunction.dzero && orderln.HoldPrice - ptc.MaxPrice <= ComFunction.dzero)) { orders.Result = false; orders.ReturnCode = ResCode.UL015; orders.Desc = ResCode.UL015Desc; return orders; } #endregion #region 最大交易时间差判断 //当前客户端实时报价时间+允许最大交易时间差>=服务器时间 if (!(orderln.CurrentTime.AddSeconds(ptc.MaxTime) >= dt)) { orders.Result = false; orders.ReturnCode = ResCode.UL014; orders.Desc = ResCode.UL014Desc; return orders; } #endregion #region 风险率判断 //获取帐户资金信息 orders.MoneyInventory = ComFunction.GetMoneyInventoryByUserId(userId); if (!orders.MoneyInventory.Result) { orders.Result = false; orders.Desc = "未能获取资金库存"; return orders; } //冻结保证金=挂单价/[点差基值]*[点值]*下单数量*保证金百分比 //风险率=([占用]+[冻结])/[账户结余] //风险率<=60%(加上本单的冻结保证金) //_frozenMoney = // System.Math.Round( // orderln.HoldPrice / ptc.AdjustBase * ptc.ValueDot * orderln.Quantity * orderln.OrderMoney, 2, // MidpointRounding.AwayFromZero); _frozenMoney = System.Math.Round(ComFunction.Getfee(ptc.OrderMoneyFee, orderln.OrderMoney, orderln.HoldPrice, orderln.Quantity), 2, MidpointRounding.AwayFromZero); /* 老的风险率判断代码 fxrate = (_frozenMoney + orders.MoneyInventory.FdInfo.OccMoney + orders.MoneyInventory.FdInfo.FrozenMoney) / orders.MoneyInventory.FdInfo.Money; if (orders.MoneyInventory.FdInfo.Money - _frozenMoney - orders.MoneyInventory.FdInfo.OccMoney - orders.MoneyInventory.FdInfo.FrozenMoney<=ComFunction.dzero) { orders.Result = false; orders.ReturnCode = ResCode.UL012; orders.Desc = ResCode.UL012Desc; return orders; } if (!(fxrate - ComFunction.fenxian_rate <= ComFunction.dzero)) { orders.Result = false; orders.ReturnCode = ResCode.UL013; orders.Desc = ResCode.UL013Desc; return orders; } */ #region 新的风险率判断代码 double DongJieMoney = 0;//冻结资金 if (orders.MoneyInventory.FdInfo.DongJieMoney > ComFunction.dzero) { DongJieMoney = orders.MoneyInventory.FdInfo.DongJieMoney; } double UseMoney = _frozenMoney + orders.MoneyInventory.FdInfo.OccMoney + orders.MoneyInventory.FdInfo.FrozenMoney; if (UseMoney <= ComFunction.dzero)//如果使用金额为0 则说明有问题 使用金额不可能小于0 { orders.Result = false; orders.Desc = "挂单下单失败!"; return orders; } double yingkui = ComFunction.GetUserYingKui(userId);//用户的盈亏 fxrate = (orders.MoneyInventory.FdInfo.Money - DongJieMoney + yingkui) / UseMoney; if (orders.MoneyInventory.FdInfo.Money - DongJieMoney - _frozenMoney - orders.MoneyInventory.FdInfo.OccMoney - orders.MoneyInventory.FdInfo.FrozenMoney <= ComFunction.dzero) { orders.Result = false; orders.ReturnCode = ResCode.UL012; orders.Desc = ResCode.UL012Desc; return orders; } if (fxrate - ComFunction.fenxian_rate <= ComFunction.dzero) { orders.Result = false; orders.ReturnCode = ResCode.UL013; orders.Desc = ResCode.UL013Desc; return orders; } // #endregion #endregion holdid = ComFunction.GetOrderId(ComFunction.Hold); #region 数据库事务处理 List<string> sqlList = new List<string>(); sqlList.Add(string.Format("INSERT INTO Trade_HoldOrder([userId],[HoldOrderID],[productCode],[quantity],[OrderType],[HoldPrice],[lossPrice],[profitPrice],[frozenMoney],[validtime],[ordertime],[ip],[mac]) VALUES('{0}','{1}','{2}',{3},{4},{5},{6},{7},{8},'{9}','{10}','{11}','{12}')", userId, holdid, orderln.ProductCode, orderln.Quantity, orderln.OrderType, orderln.HoldPrice, orderln.LossPrice, orderln.ProfitPrice, _frozenMoney, orderln.ValidTime.ToString("yyyy-MM-dd"), dt.ToString("yyyy-MM-dd HH:mm:ss.fff"), ComFunction.GetClientIp(), orderln.Mac)); sqlList.Add(string.Format("update Trade_FundInfo set frozenMoney = frozenMoney+{0} where userid='{1}' and [state]<>'4'", _frozenMoney, userId)); //添加操作记录 sqlList.Add(string.Format("insert into Base_OperrationLog([OperTime],[Account],[UserType],[Remark]) values('{0}','{1}',{2},'{3}')", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), operUser, operUserType, string.Format("{1}委托订单{0}", holdid, ipmac))); if (!ComFunction.SqlTransaction(sqlList)) { orders.Result = false; orders.Desc = "挂单时数据库事务处理出错"; return orders; } #endregion #region 给返回对象赋值 orders.Result = true; orders.TradeHoldOrder.FrozenMoney = _frozenMoney; orders.TradeHoldOrder.HoldOrderID = holdid; orders.TradeHoldOrder.HoldPrice = orderln.HoldPrice; orders.TradeHoldOrder.LossPrice = orderln.LossPrice; orders.TradeHoldOrder.OrderTime = dt; orders.TradeHoldOrder.OrderType = orderln.OrderType; orders.TradeHoldOrder.ProductCode = orderln.ProductCode; orders.TradeHoldOrder.ProductName = ptc.ProductName; orders.TradeHoldOrder.ProfitPrice = orderln.ProfitPrice; orders.TradeHoldOrder.Quantity = orderln.Quantity; orders.TradeHoldOrder.ValidTime = orderln.ValidTime; orders.MoneyInventory.FdInfo.FrozenMoney += _frozenMoney; #endregion } catch (Exception ex) { ComFunction.WriteErr(ex); orders.Result = false; orders.Desc = "挂单下单失败"; } return orders; }
public String AnalysisXml(string ReqXml) { string ResXml = string.Empty; string ReqCode = string.Empty; try { System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument(); xmldoc.LoadXml(ReqXml); //请求指令 ReqCode = xmldoc.SelectSingleNode("JTW91G/MsgData/ReqHeader/ReqCode").InnerText; Trade.CTrade trade = new Trade.CTrade(); OrdersLncoming orderln = new OrdersLncoming(); orderln.Mac = xmldoc.SelectSingleNode("JTW91G/MsgData/ReqHeader/Mac").InnerText; orderln.LoginID = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/LoginId").InnerText; orderln.TradeAccount = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/TradeAccount").InnerText; orderln.CurrentTime = Convert.ToDateTime(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/CurrentTime").InnerText); //可以不设置止盈止损价 如果为空 不能直接转换 string ProfitPrice = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/ProfitPrice").InnerText; string LossPrice = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/LossPrice").InnerText; orderln.ProfitPrice = Convert.ToDouble(string.IsNullOrEmpty(ProfitPrice) ? "0" : ProfitPrice); orderln.LossPrice = Convert.ToDouble(string.IsNullOrEmpty(LossPrice) ? "0" : LossPrice); orderln.OrderType = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/OrderType").InnerText; orderln.ProductCode = xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/ProductCode").InnerText; orderln.HoldPrice = Convert.ToDouble(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/HoldPrice").InnerText); orderln.Quantity = Convert.ToDouble(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/Quantity").InnerText); orderln.RtimePrices = Convert.ToDouble(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/RtimePrices").InnerText); orderln.ValidTime = Convert.ToDateTime(xmldoc.SelectSingleNode("JTW91G/MsgData/DataBody/HoldOrders/HoldOrder/ValidTime").InnerText);//ValidTime orderln.UserType = 0; //客户端没有传递这个值 内部调用默认赋值0 表示普通用户 orderln.OrderMoney = 0; //客户端没有传递这个值 这个值本身也没有使用 随便赋个值 Orders orders = trade.GetOrders(orderln); if (!orders.Result) { string CodeDesc = ResCode.UL005Desc; string ReturnCode = GssGetCode.GetCode(orders.ReturnCode,orders.Desc, ref CodeDesc); ResXml = GssResXml.GetResXml(ReqCode, ReturnCode, CodeDesc, string.Format("<DataBody></DataBody>")); } else { //返回的结构不一样 不能直接转换 //string holdorder = XmlUtil.SerializeObjToXml(typeof(TradeHoldOrder), orders.TradeHoldOrder); StringBuilder strb = new StringBuilder(); strb.AppendFormat("<HoldOrderId>{0}</HoldOrderId>", orders.TradeHoldOrder.HoldOrderID); strb.AppendFormat("<ProductCode>{0}</ProductCode>", orders.TradeHoldOrder.ProductCode); strb.AppendFormat("<HoldPrice>{0}</HoldPrice>", orders.TradeHoldOrder.HoldPrice); strb.AppendFormat("<Quantity>{0}</Quantity>", orders.TradeHoldOrder.Quantity); strb.AppendFormat("<FrozenMoney>{0}</FrozenMoney>", orders.TradeHoldOrder.FrozenMoney); strb.AppendFormat("<ValidTime>{0}</ValidTime>", orders.TradeHoldOrder.ValidTime.ToString(Const.dateformat)); strb.AppendFormat("<LossPrice>{0}</LossPrice>", orders.TradeHoldOrder.LossPrice); strb.AppendFormat("<ProfitPrice>{0}</ProfitPrice>", orders.TradeHoldOrder.ProfitPrice); strb.AppendFormat("<OrderType>{0}</OrderType>", orders.TradeHoldOrder.OrderType); strb.AppendFormat("<OrderTime>{0}</OrderTime>", orders.TradeHoldOrder.OrderTime.ToString(Const.dateformat)); strb.Append("<CancelTime></CancelTime>"); StringBuilder fundinfo = new StringBuilder(); fundinfo.Append("<FundInfo>"); fundinfo.AppendFormat("<Money>{0}</Money>", orders.MoneyInventory.FdInfo.Money); fundinfo.AppendFormat("<OccMoney>{0}</OccMoney>", orders.MoneyInventory.FdInfo.OccMoney); fundinfo.AppendFormat("<FrozenMoney>{0}</FrozenMoney>", orders.MoneyInventory.FdInfo.FrozenMoney); fundinfo.Append("</FundInfo>"); //响应消息体 string DataBody = string.Format("<DataBody><HoldOrders><HoldOrder>{0}</HoldOrder></HoldOrders>{1}</DataBody>", strb.ToString(), fundinfo.ToString()); ResXml = GssResXml.GetResXml(ReqCode, ResCode.UL004, ResCode.UL004Desc, DataBody); } } catch (Exception ex) { com.individual.helper.LogNet4.WriteErr(ex); //业务处理失败 ResXml = GssResXml.GetResXml(ReqCode, ResCode.UL005, ResCode.UL005Desc, string.Format("<DataBody></DataBody>")); } return ResXml; }