/// <summary> /// 是否禁止交易指定证券类型的证券 /// </summary> /// <param name="sType"></param> /// <returns></returns> private bool IsBanned(TradingSystem.StockType sType) { try { string strSpecies = ""; for (int i = 0; i < 100; i++) { strSpecies = Common.Config("Trading", "Species-" + i.ToString("00").Trim()); if (strSpecies.Length > 0) { if (string.Compare(strSpecies.ToUpper().Trim(), sType.ToString().ToUpper().Trim()) == 0) { return(false); } } } return(true); } catch { return(true); } }
/// <summary> /// 添加限价订单 /// </summary> /// <param name="strUserKey"></param> /// <param name="UserID"></param> /// <param name="StockCode"></param> /// <param name="Market"></param> /// <param name="Volume"></param> /// <param name="OrderPrice"></param> /// <param name="Side"></param> /// <param name="ValidDays"></param> /// <param name="OrderID"></param> /// <returns></returns> public RI_Result RequestLimitedOrder(string strUserKey, int UserID, string StockCode, RI_Market Market, int Volume, double OrderPrice, bool Side, ushort ValidDays, out int OrderID) { OrderID = -1; try { if (strUserKey == null || string.Compare(strUserKey.Trim(), Common.Config("Authorization", "UserKey").Trim()) != 0) { if (strUserKey != null) { Common.Log("The Invoker [" + strUserKey.Trim() + "] Is Unauthorized. [UserID=" + UserID + "]"); } else { Common.Log("The Invoker [null] Is Unauthorized. [UserID=" + UserID + "]"); } return(RI_Result.Unauthorized); } else if (!Common.Switch_LimitedOrder || !Management.Work) { Common.Log("The Interface [ProcessLimitedOrder] Is Closed. [UserID=" + UserID + "]"); return(RI_Result.Closed_Interface); } if (!Common.IsInInterfaceQuotationTime) { return(RI_Result.Out_Of_Quotation_Time); } else if (Common.stkTrading == null) { return(RI_Result.Internal_Error); } else if (UserID <= 0) { return(RI_Result.Illegal_UserID); } TradingSystem.StockType stkType = Common.stkTrading.GetStockType(StockCode, (TradingSystem.StockMarket)((byte)Market)); if (Volume <= 0 || (Side && (stkType != TradingSystem.StockType.SH_Warrant && stkType != TradingSystem.StockType.SZ_Warrant && Volume % 100 != 0) || ((stkType == TradingSystem.StockType.SH_Warrant || stkType == TradingSystem.StockType.SZ_Warrant) && Volume % 1000 != 0))) { return(RI_Result.Illegal_Volume); } else if (OrderPrice < 0.001) { return(RI_Result.Illegal_Price); } else if ((stkType == TradingSystem.StockType.SH_A || stkType == TradingSystem.StockType.SZ_A) && OrderPrice < 0.01) { return(RI_Result.Illegal_Price); } else if (StockCode == null || Market == RI_Market.Unknown) { return(RI_Result.Banned_Stock); } StockCode = StockCode.Trim(); TradingSystem.Currency Curr = TradingSystem.Currency.Unknown; switch (stkType) { case TradingSystem.StockType.SH_B: Curr = TradingSystem.Currency.USD; break; case TradingSystem.StockType.SZ_B: Curr = TradingSystem.Currency.HKD; break; default: Curr = TradingSystem.Currency.RMB; break; } if (IsBanned(stkType)) { Common.Debug("Banned_Stock:" + UserID + ";" + StockCode + ";" + Market.ToString().Trim() + ";" + stkType.ToString().Trim()); return(RI_Result.Banned_Stock); } Show2003DBFRecord SHRec = new Show2003DBFRecord(); SHRec.Clear(); SjshqDBFRecord SZRec = new SjshqDBFRecord(); SZRec.Clear(); if (Common.stkQuotation.CheckSuspended(StockCode, (TradingSystem.StockMarket)((byte)Market))) { Common.Debug("Suspended_Stock:" + UserID + ";" + StockCode + ";" + Market.ToString()); return(RI_Result.Suspended_Stock); } short sCurrCount = Common.stkTrading.GetUserOrdersCount(UserID); if (sCurrCount == -2) { return(RI_Result.Illegal_UserID); } if (sCurrCount < 0 || sCurrCount >= Common.MaxOrders) { Common.Debug("Too_Many_Orders:" + UserID + ";" + sCurrCount + "/" + Common.MaxOrders); return(RI_Result.Too_Many_Orders); } int SellableVolume = Common.stkTrading.GetSellableStockVolume(UserID, StockCode, (TradingSystem.StockMarket)((byte)Market)); if (!Side && (SellableVolume < Volume)) { Common.Debug("Not_Enough_Stock:" + UserID + "/" + StockCode.Trim() + "-" + (byte)Market + ";" + SellableVolume + "/" + Volume); return(RI_Result.Not_Enough_Stock); } if (!Side && (Volume % 100 != 0) && (Volume % 100 != SellableVolume % 100)) { return(RI_Result.Illegal_Volume); } if (Side && !Common.stkTrading.CanBuy(UserID, StockCode, (TradingSystem.StockMarket)((byte)Market), Curr, OrderPrice * Volume * (1 + Common.stkTrading.defaultBuyTax))) { Common.Debug("Speculation_Behavior:" + UserID + "/" + StockCode.Trim() + "-" + (byte)Market + "/" + (OrderPrice * Volume * (1 + Common.stkTrading.defaultBuyTax)).ToString("f2")); return(RI_Result.Speculation_Behavior); } TradingSystem.UserOrders userOrder = new TradingSystem.UserOrders(); userOrder.Initialize(); userOrder.OrderID = Common.stkTrading.nLastOrderID++; userOrder.UserID = UserID; userOrder.StockCode = StockCode.Trim(); userOrder.Market = (TradingSystem.StockMarket)((byte)Market); userOrder.Side = Side; userOrder.OrderVolume = Volume; userOrder.OrderPrice = OrderPrice; userOrder.OrderDate = DateTime.Now; userOrder.ExpiredDate = userOrder.OrderDate.Date.Add(new TimeSpan(ValidDays, Common.EndPMTS.Hours, Common.EndPMTS.Minutes, Common.EndPMTS.Seconds)); userOrder.OrdStatus = TradingSystem.OrderStatus.Waiting; userOrder.OrdType = TradingSystem.OrderType.LimitedOrder; userOrder.Curr = Curr; if (Side) { lock (Common.stkTrading.listNewUserFund) { TradingSystem.UserFund usableFund = new TradingSystem.UserFund(); usableFund.Initialize(); for (int i = 0; i < Common.stkTrading.listNewUserFund.Count; i++) { if (Common.stkTrading.listNewUserFund[i].UserID == UserID && ((stkType == TradingSystem.StockType.SH_B && Common.stkTrading.listNewUserFund[i].Curr == TradingSystem.Currency.USD) || (stkType == TradingSystem.StockType.SZ_B && Common.stkTrading.listNewUserFund[i].Curr == TradingSystem.Currency.HKD) || Common.stkTrading.listNewUserFund[i].Curr == TradingSystem.Currency.RMB)) { usableFund = Common.stkTrading.listNewUserFund[i]; usableFund.UsableCash -= Common.ConvertPrice((userOrder.OrderVolume * userOrder.OrderPrice) * (1 + Common.stkTrading.defaultBuyTax) + 0.0099); if (usableFund.UsableCash < 0) { return(RI_Result.Not_Enough_Cash); } if (!Common.stkTrading.SetUserFund(UserID, usableFund)) { return(RI_Result.Illegal_UserID); } Common.stkTrading.listNewUserFund[i] = usableFund; Common.DBSync.FundUpdate(usableFund, UserID); lock (Common.stkTrading.listNewUserOrders) { Common.stkTrading.listNewUserOrders.Add(userOrder); Common.DBSync.OrderAppended(userOrder, UserID); } Common.Debug("Limited Order Requested [UserID=" + UserID + "; StockCode=" + StockCode.Trim() + "-" + (byte)Market + "]."); OrderID = userOrder.OrderID; return(RI_Result.Success); } } Dictionary <byte, TradingSystem.UserFund> mapUsableFund = new Dictionary <byte, TradingSystem.UserFund>(); if (!Common.stkTrading.GetUserFund(UserID, out mapUsableFund)) { return(RI_Result.Illegal_UserID); } switch (stkType) { case TradingSystem.StockType.SH_B: { if (mapUsableFund.ContainsKey((byte)TradingSystem.Currency.USD)) { usableFund = mapUsableFund[(byte)TradingSystem.Currency.USD]; } else { return(RI_Result.Not_Enough_Cash); } } break; case TradingSystem.StockType.SZ_B: { if (mapUsableFund.ContainsKey((byte)TradingSystem.Currency.HKD)) { usableFund = mapUsableFund[(byte)TradingSystem.Currency.HKD]; } else { return(RI_Result.Not_Enough_Cash); } } break; default: { if (mapUsableFund.ContainsKey((byte)TradingSystem.Currency.RMB)) { usableFund = mapUsableFund[(byte)TradingSystem.Currency.RMB]; } else { return(RI_Result.Not_Enough_Cash); } } break; } usableFund.UsableCash -= Common.ConvertPrice((userOrder.OrderVolume * userOrder.OrderPrice) * (1 + Common.stkTrading.defaultBuyTax) + 0.0099); if (usableFund.UsableCash < 0) { Common.Debug("Not_Enough_Cash:" + UserID + "/" + StockCode.Trim() + "-" + (byte)Market + ";" + (usableFund.UsableCash + Common.ConvertPrice((userOrder.OrderVolume * userOrder.OrderPrice) * (1 + Common.stkTrading.defaultBuyTax))) + "/" + ((userOrder.OrderVolume * userOrder.OrderPrice) * (1 + Common.stkTrading.defaultBuyTax))); return(RI_Result.Not_Enough_Cash); } if (!Common.stkTrading.SetUserFund(UserID, usableFund)) { return(RI_Result.Illegal_UserID); } Common.stkTrading.listNewUserFund.Add(usableFund); Common.DBSync.FundUpdate(usableFund, UserID); } } lock (Common.stkTrading.listNewUserOrders) { Common.stkTrading.listNewUserOrders.Add(userOrder); Common.DBSync.OrderAppended(userOrder, UserID); } Common.Debug("Limited Order Requested [UserID=" + UserID + "; StockCode=" + StockCode.Trim() + "-" + (byte)Market + "]."); OrderID = userOrder.OrderID; return(RI_Result.Success); } catch { return(RI_Result.Internal_Error); } }