/// <summary> /// 从Ctp查询手续费。 /// </summary> /// <param name="instrumentCode">合约代码。</param> /// <returns></returns> private InstrumentCommissionRateField QueryCommissionRateFieldFromCtp(string instrumentCode) { List <InstrumentCommissionRateField> commissionFields = new List <InstrumentCommissionRateField>(); int requestID = m_requetSeqIDCreator.Next(); try { USeResetEvent queryEvent = new USeResetEvent(requestID); queryEvent.Tag = commissionFields; m_eventDic.Add(queryEvent.EventID, queryEvent); QryInstrumentCommissionRateField requestFields = new QryInstrumentCommissionRateField(); requestFields.BrokerID = m_brokerID; requestFields.InvestorID = m_investorID; requestFields.InstrumentID = instrumentCode; m_ctpUser.ReqQryInstrumentCommissionRate(ref requestFields, requestID); while (true) { if (queryEvent.IsError) { Debug.Assert(queryEvent.Tag != null); RspInfoField rspInfo = (RspInfoField)queryEvent.Tag; throw new Exception(string.Format("({0}){1}", rspInfo.ErrorID, rspInfo.ErrorMsg)); } if (queryEvent.IsFinish) { break; } if (queryEvent.WaitOne(m_queryTimeOut) == false) { throw new Exception(string.Format("({0}){1}", "99", "time out")); } } } catch (Exception ex) { m_logger.WriteError(string.Format("{0}.QueryCommissionRateFieldFromCtp() failed,Error:{1}.", ToString(), ex.Message)); throw new Exception(string.Format("Query [{0}] commission rate failed,Error:{1}.", instrumentCode, ex.Message)); } finally { m_eventDic.Remove(requestID); } if (commissionFields.Count > 0) { Debug.Assert(commissionFields.Count == 1); return(commissionFields[0]); } else { //查询有应答但无值,构造一个空的手续费 USeInstrumentDetail instrumentDetail = m_dataBuffer.GetInstrumentDetail(instrumentCode); Debug.Assert(instrumentDetail != null); InstrumentCommissionRateField rateField = new InstrumentCommissionRateField(); rateField.BrokerID = m_brokerID; rateField.CloseRatioByMoney = 0d; rateField.CloseRatioByVolume = 0d; rateField.CloseTodayRatioByMoney = 0d; rateField.CloseTodayRatioByVolume = 0d; rateField.InstrumentID = instrumentDetail.Varieties; rateField.InvestorID = m_investorID; rateField.InvestorRange = InvestorRangeType.All; rateField.OpenRatioByMoney = 0d; rateField.OpenRatioByVolume = 0d; return(rateField); } }
/// <summary> /// 查询合约手续费。 /// </summary> /// <param name="instrumentCode"></param> /// <returns></returns> public InstrumentCommissionRateField?QueryInstrumentFee(string instrumentCode) { int requestID = m_requetSeqIDCreator.Next(); try { List <InstrumentCommissionRateField> feeList = new List <InstrumentCommissionRateField>(); USeResetEvent queryEvent = new USeResetEvent(requestID); queryEvent.Tag = feeList; m_eventDic.Add(queryEvent.EventID, queryEvent); QryInstrumentCommissionRateField field = new QryInstrumentCommissionRateField(); field.BrokerID = m_brokerID; field.InvestorID = m_investorID; field.InstrumentID = instrumentCode; m_ctpUser.ReqQryInstrumentCommissionRate(ref field, requestID); if (queryEvent.WaitOne(m_queryTimeOut) == false) { throw new Exception("查询超时"); } else { if (queryEvent.IsError) { Debug.Assert(queryEvent.Tag != null); RspInfoField rspInfo = (RspInfoField)queryEvent.Tag; throw new Exception(string.Format("({0}){1}", rspInfo.ErrorID, rspInfo.ErrorMsg)); } while (true) { if (queryEvent.IsFinish) { break; } // 继续等待应答结果 if (queryEvent.WaitOne(m_queryTimeOut) == false) { throw new Exception(string.Format("({0}){1}", "99", "超时")); } } } if (feeList.Count > 0) { Debug.Assert(feeList.Count == 1); return(feeList[0]); } else { return(null); } } catch (Exception ex) { throw ex; } finally { m_eventDic.Remove(requestID); } }