/// <summary> /// 从Ctp查询保证金。 /// </summary> /// <param name="instrumentCode"></param> /// <returns></returns> private InstrumentMarginRateField QueryMarginFromCtp(string instrumentCode) { List <InstrumentMarginRateField> marginFields = new List <InstrumentMarginRateField>(); int requestID = m_requetSeqIDCreator.Next(); try { USeResetEvent queryEvent = new USeResetEvent(requestID); queryEvent.Tag = marginFields; m_eventDic.Add(queryEvent.EventID, queryEvent); QryInstrumentMarginRateField requestField = new QryInstrumentMarginRateField(); requestField.BrokerID = m_brokerID; requestField.InvestorID = m_investorID; requestField.InstrumentID = instrumentCode; requestField.HedgeFlag = HedgeFlagType.Speculation; m_ctpUser.ReqQryInstrumentMarginRate(ref requestField, 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 oute")); } } } catch (Exception ex) { m_logger.WriteError(string.Format("{0}.QueryMarginFromCtp() failed,Error:{1}.", ToString(), ex.Message)); throw new Exception(string.Format("Query [{0}]margin failed,Error:{1}.", instrumentCode, ex.Message)); } finally { m_eventDic.Remove(requestID); } if (marginFields.Count > 0) { Debug.Assert(marginFields.Count == 1); return(marginFields[0]); } else { //查询有应答但无值,构造一个空的保证金 InstrumentMarginRateField marginField = new InstrumentMarginRateField(); marginField.BrokerID = m_brokerID; marginField.HedgeFlag = HedgeFlagType.Speculation; marginField.InstrumentID = instrumentCode; marginField.InvestorID = m_investorID; marginField.InvestorRange = InvestorRangeType.All; marginField.IsRelative = IntBoolType.Yes; marginField.LongMarginRatioByMoney = 0d; marginField.LongMarginRatioByVolume = 0d; marginField.ShortMarginRatioByMoney = 0d; marginField.ShortMarginRatioByVolume = 0d; return(marginField); } }
/// <summary> /// 查询合约保证金。 /// </summary> /// <param name="instrumentCode"></param> /// <returns></returns> public InstrumentMarginRateField?QueryInstrumentMargin(string instrumentCode) { int requestID = m_requetSeqIDCreator.Next(); try { List <InstrumentMarginRateField> marginList = new List <InstrumentMarginRateField>(); USeResetEvent queryEvent = new USeResetEvent(requestID); queryEvent.Tag = marginList; m_eventDic.Add(queryEvent.EventID, queryEvent); QryInstrumentMarginRateField field = new QryInstrumentMarginRateField(); field.BrokerID = m_brokerID; field.InvestorID = m_investorID; field.InstrumentID = instrumentCode; field.HedgeFlag = HedgeFlagType.Speculation; m_ctpUser.ReqQryInstrumentMarginRate(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 (marginList.Count > 0) { Debug.Assert(marginList.Count == 1); return(marginList[0]); } else { return(null); } } catch (Exception ex) { throw ex; } finally { m_eventDic.Remove(requestID); } }