/// <summary> /// 校验入口 /// </summary> /// <param name="errMsg">错误信息</param> /// <returns>是否成功</returns> public bool Check(out string errMsg) { bool result = Initialize(Types.BreedClassTypeEnum.HKStock, request.TraderId, request.Code, out errMsg); //基础验证,包括商品的基础验证,账户的基础验证 if (result) { result = CheckTraderAvalible(out errMsg); } //如果是在交易时间内,那么检查停牌,连续3次,预下单不检查 if (ValidateCenter.IsMatchTradingTime(Types.BreedClassTypeEnum.HKStock, request.Code)) { if (result) { result = CheckStopTrading(ref errMsg); if (!result) { result = CheckStopTrading(ref errMsg); } if (!result) { result = CheckStopTrading(ref errMsg); } } } return(result); }
private bool PO_HoldValidate_Sell(ref string strMessage) { bool result = false; strMessage = "GT-2220:[现货委托持久化]卖持仓检查,无持仓"; var ahtMemory = MemoryDataManager.XHHoldMemoryList.GetByHoldAccountAndCurrencyType(HoldingAccount, Code, CurrencyType); if (ahtMemory == null) { ahtMemory = XHCommonLogic.GetHoldMemoryTable(HoldingAccount, Code, CurrencyType); } if (ahtMemory == null) { return(false); } var aht = ahtMemory.Data; if (aht == null) { return(false); } /*update 李健华 2009-12-11=========== * 当程序没有加载持仓时第一次为-1,那么这里在内部从数据库获取持仓表的主键持仓账户ID时获取到了数据并加载到了内 * 存表中,那么这里也应把持仓账户ID附值回这里,要不然在数据库提交时会有主外键的冲突,如果不设置数据库的主外键那么 *这里可以不用修改,因为后面清算的时候是以委托编号去查询相关的冻结记录 */ if (HoldingAccountId == -1) { HoldingAccountId = aht.AccountHoldLogoId; } //====================== strMessage = "GT-2221:[现货委托持久化]卖持仓检查,无足够可用持仓"; int position = Convert.ToInt32(aht.AvailableAmount); //持仓帐户是否存在判断 if (ValidateCenter.ValidateStockMinVolumeOfBusiness(Request, position, ref strMessage)) { //已经统一使用撮合单位了 decimal orderAmount = Convert.ToDecimal(Request.OrderAmount); // *unitMultiple; //可用持仓>=委托量 result = aht.AvailableAmount >= orderAmount; } if (result) { strMessage = ""; } return(result); }
private bool PO_HoldValidate_Buy(ref string strMessage) { bool result = false; strMessage = "GT-2219:[现货委托持久化]买持仓检查,超过持仓限制"; int position = 0; decimal freezeAmount = 0; var ahtMemory = MemoryDataManager.XHHoldMemoryList.GetByAccountHoldLogoId(HoldingAccountId); if (ahtMemory == null) { ahtMemory = XHCommonLogic.GetHoldMemoryTable(HoldingAccount, Code, CurrencyType); } if (ahtMemory != null) { var aht = ahtMemory.Data; if (aht != null) { /*update 李健华 2009-12-11=========== * 当程序没有加载持仓时第一次为-1,那么这里在内部从数据库获取持仓表的主键持仓账户ID时获取到了数据并加载到了内 * 存表中,那么这里也应把持仓账户ID附值回这里,要不然在数据库提交时会有主外键的冲突,如果不设置数据库的主外键那么 *这里可以不用修改,因为后面清算的时候是以委托编号去查询相关的冻结记录 */ if (HoldingAccountId == -1) { HoldingAccountId = aht.AccountHoldLogoId; } //====================== position = Convert.ToInt32(aht.AvailableAmount); freezeAmount = aht.FreezeAmount; } } if (ValidateCenter.ValidateStockMinVolumeOfBusiness(Request, position, ref strMessage)) { //获取持仓限制 Decimal pLimit = MCService.GetPositionLimit(Request.Code).PositionValue; //可用持仓+冻结量+委托量<持仓限制 result = pLimit >= position + freezeAmount + Convert.ToDecimal(Request.OrderAmount); } //成功时需要清空错误信息。 if (result) { strMessage = ""; } return(result); }
private bool HodingCheck(XH_AccountHoldTableInfo hold, XH_AccountHoldTableInfo_Delta change) { string strMessage = ""; bool result = false; if (Request.BuySell == GTA.VTS.Common.CommonObject.Types.TransactionDirection.Buying) { strMessage = "GT-2219:[现货委托持久化]买持仓检查,超过持仓限制"; int position = 0; decimal freezeAmount = 0; position = Convert.ToInt32(hold.AvailableAmount); freezeAmount = hold.FreezeAmount; if (ValidateCenter.ValidateStockMinVolumeOfBusiness(Request, position, ref strMessage)) { //获取持仓限制 Decimal pLimit = MCService.GetPositionLimit(Request.Code).PositionValue; //可用持仓+冻结量+委托量<持仓限制 result = pLimit >= position + freezeAmount + Convert.ToDecimal(Request.OrderAmount); } } else { strMessage = "GT-2220:[现货委托持久化]卖持仓检查,无持仓"; if (hold != null) { strMessage = "GT-2221:[现货委托持久化]卖持仓检查,无足够可用持仓"; int position = Convert.ToInt32(hold.AvailableAmount); //持仓帐户是否存在判断 if (ValidateCenter.ValidateStockMinVolumeOfBusiness(Request, position, ref strMessage)) { //已经统一使用撮合单位了 decimal orderAmount = Convert.ToDecimal(Request.OrderAmount); // *unitMultiple; //可用持仓>=委托量 result = hold.AvailableAmount >= orderAmount; } } } if (result) { strMessage = ""; } else { holdMessage = strMessage; } return(result); }
/// <summary> /// 校验入口 /// </summary> /// <param name="errMsg">错误信息</param> /// <returns>是否成功</returns> public bool Check(out string errMsg) { bool result = Initialize(request.TraderId, request.Code, out errMsg); //检查品种交易权限 //if(result) //{ // result = CheckTradeRight(out errMsg); //} //基础验证,包括商品的基础验证,账户的基础验证 if (result) { result = CheckTraderAvalible(out errMsg); } ////检查资金 //if(result) //{ // result = CheckFuncTable(ref errMsg); //} ////检查持仓 //if (result) //{ // result = CheckHoldTable(ref errMsg); //} //如果是在交易时间内,那么检查停牌,连续3次,预下单不检查 if (ValidateCenter.IsMatchTradingTime(request.Code)) { if (result) { result = CheckStopTrading(ref errMsg); if (!result) { result = CheckStopTrading(ref errMsg); } if (!result) { result = CheckStopTrading(ref errMsg); } } } return(result); }
/// <summary> /// 校验入口 /// </summary> /// <param name="errMsg">错误信息</param> /// <param name="breedType">品种类型(这里是因为这里两种获取的行情实体方法有区别)</param> /// <returns>是否成功</returns> public bool Check(out string errMsg, Types.BreedClassTypeEnum breedType) { bool result = Initialize(traderId, code, out errMsg); //基础验证,包括商品的基础验证,账户的基础验证 if (result) { result = CheckTraderAvalible(out errMsg); } //检查资金 //if (result) //{ // result = CheckFuncTable(ref errMsg); //} ////检查持仓 //if (result) //{ // result = CheckHoldTable(ref errMsg); //} //如果是在交易时间内,那么检查停牌,连续3次,预下单不检查 if (ValidateCenter.IsMatchTradingTime(code)) { if (result) { result = CheckStopTrading(ref errMsg, breedType); if (!result) { result = CheckStopTrading(ref errMsg, breedType); } if (!result) { result = CheckStopTrading(ref errMsg, breedType); } } } return(result); }
/// <summary> /// 处理Type1类型改单-未报 /// </summary> /// <param name="request">改单委托</param> private void ProcessType1(HKModifyOrderRequest request) { LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType1接收类型1改单请求" + request); //如果不在交易时间内,那么直接到缓存中删除原来的委托,生成新委托 if (!ValidateCenter.IsMatchTradingTime(Types.BreedClassTypeEnum.HKStock, request.Code)) { LogHelper.WriteDebug("类型1改单请求" + request + "不在交易时间时间内,直接到缓存中删除原来的委托,生成新委托"); //1.删除缓存中的委托信息 OrderOfferCenter.Instance._orderCache.DeleteHKOrder(request.Code, request.EntrustNubmer); //2.进行内存撤单 var tet = HKDataAccess.GetTodayEntrustTable(request.EntrustNubmer); OrderOfferCenter.Instance.IntelnalCancelHKOrder(tet, "预委托被改单,作废"); //tet.OrderStatusID = (int)Entity.Contants.Types.OrderStateType.DOSCanceled; //tet.OrderMessage = "未报的委托被改单,作废"; //HKDataAccess.UpdateEntrustTable(tet); //3.回推原始委托变化到前台 ReckonEndObject <HK_TodayEntrustInfo, HK_TodayTradeInfo> reckonEndObject = new ReckonEndObject <HK_TodayEntrustInfo, HK_TodayTradeInfo>(); reckonEndObject.IsSuccess = true; reckonEndObject.EntrustTable = tet; reckonEndObject.TradeTableList = new List <HK_TodayTradeInfo>(); reckonEndObject.TradeID = request.TraderId; reckonEndObject.Message = ""; CounterOrderService.Instance.AcceptHKDealOrder(reckonEndObject); ProcessType1_NewOrder(request); } else { //否则的话,放入类型1改单缓存,等原始委托报盘时再处理 LogHelper.WriteDebug("M————>ModifyOrderProcessor.ProcessType1类型1改单请求在交易时间内,放入缓存等待报盘时查找核对" + request); AddType1Reqest(request); } }
public OrderResponse Process(HKModifyOrderRequest hkOrder) { LogHelper.WriteDebug("M——>ModifyOrderProcessor.Process接收改单入口" + hkOrder); bool canModifyOrder = false; OrderResponse orResult = new OrderResponse(); string strErrorMessage = ""; //hkOrder.ID = HKCommonLogic.BuildHKOrderNo(); hkOrder.ID = Guid.NewGuid().ToString(); #region 原始单位及成交量转换 var code = hkOrder.Code; var oriUnitType = hkOrder.OrderUnitType; decimal scale; Types.UnitType matchUnitType; bool canConvert = OrderAccepter.ConvertUnitType(Types.BreedClassTypeEnum.HKStock, code, oriUnitType, out scale, out matchUnitType); if (!canConvert) { strErrorMessage = @"GT-2450:[港股委托]无法进行行情单位转换."; goto EndProcess; } LogHelper.WriteDebug("委托单:" + hkOrder.EntrustNubmer + "当前改单获取到的转换倍数为: " + scale); hkOrder.OrderUnitType = matchUnitType; hkOrder.OrderAmount = hkOrder.OrderAmount * (float)scale; #endregion //记录改单操作记录数据 bool canSave = HKDataAccess.AddHKModifyOrderRequest(hkOrder); if (!canSave) { strErrorMessage = @"GT-2451:[港股改单委托]无法保持改单委托,请查看错误日志."; LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } #region 校验 if ((string.IsNullOrEmpty(hkOrder.TraderId) && string.IsNullOrEmpty(hkOrder.FundAccountId))) { strErrorMessage = @"GT-2452:[港股改单委托]交易员ID或资金帐户无效."; LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } //柜台委托时间判断 if (!ValidateCenter.IsCountTradingTime(Types.BreedClassTypeEnum.HKStock, hkOrder.Code, ref strErrorMessage)) { LogHelper.WriteInfo("ModifyOrderProcessor.Process" + strErrorMessage); string oriMsg = "当前时间不接受委托"; if (strErrorMessage.Length > 0) { oriMsg = strErrorMessage; } strErrorMessage = @"GT-2453:[港股改单委托]" + oriMsg; LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } HK_TodayEntrustInfo tet = HKDataAccess.GetTodayEntrustTable(hkOrder.EntrustNubmer); if (tet == null) { strErrorMessage = "GT-2454:[港股改单委托]无委托对象信息"; LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } if ((float)tet.EntrustPrice == hkOrder.OrderPrice && tet.EntrustAmount == (int)hkOrder.OrderAmount) { strErrorMessage = "GT-2455:[港股改单委托]无效改单,改单量、改单价与原始委托相同"; LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } //港股改单规则检验,这里有些与真实下单有些重复,但这样可以提高改单的成功率 if (!McValidater.GetInstance().ValidateHKModifyOrderRule(hkOrder, tet, ref strErrorMessage)) { LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } #endregion //未报 if (tet.OrderStatusID == (int)Entity.Contants.Types.OrderStateType.DOSUnRequired) { ProcessType1(hkOrder); canModifyOrder = true; goto EndProcess; } #region 已报、部成 if (tet.OrderStatusID == (int)Entity.Contants.Types.OrderStateType.DOSIsRequired || tet.OrderStatusID == (int)Entity.Contants.Types.OrderStateType.DOSPartDealed) { //如果不在交易时间内,那么直接到缓存中删除原来的委托,生成新委托 if (!ValidateCenter.IsMatchTradingTime(Types.BreedClassTypeEnum.HKStock, hkOrder.Code)) { strErrorMessage = "GT-2456:[港股改单委托]不在交易时间内"; LogHelper.WriteInfo(strErrorMessage + "," + hkOrder); goto EndProcess; } if ((decimal)hkOrder.OrderPrice == tet.EntrustPrice && hkOrder.OrderAmount < tet.EntrustAmount) { ProcessType2(hkOrder); canModifyOrder = true; } else { ProcessType3(hkOrder); canModifyOrder = true; goto EndProcess; } } #endregion EndProcess: //结束 if (canModifyOrder) { hkOrder.ModifyOrderDateTime = DateTime.Now; orResult.OrderDatetime = DateTime.Now; } else { int type = 0; bool canGetErrorCode = Utils.GetErrorCode(strErrorMessage, out type); if (canGetErrorCode) { orResult.ErrorType = type; } hkOrder.Message = strErrorMessage; orResult.OrderMessage = strErrorMessage; } //更新改单委托 HKDataAccess.UpdateModifyOrderRequest(hkOrder); orResult.IsSuccess = canModifyOrder; orResult.OrderId = hkOrder.ID; return(orResult); }