protected override void ProcessBusinessResponse(CTPResponseType responseType, IntPtr pData, CTPResponseInfo rspInfo, int requestID) { Trace.WriteLine(string.Format("{0} [{1}]:{2},{3},{4}", this.wallTimeStopwatch.ElapsedMilliseconds, this.UserKey, "ProcessBusinessResponse", responseType, requestID)); switch (responseType) { #region 当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。 case CTPResponseType.FrontConnectedResponse: { this.isConnect = true; this.UserLogin(); //调用事件 OnEventHandler(CTPResponseType.FrontConnectedResponse, new CTPEventArgs()); break; } #endregion #region 通信中断 case CTPResponseType.FrontDisconnectedResponse: /// 当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。 ///@param nReason 错误原因 /// 0x1001 网络读失败 /// 0x1002 网络写失败 /// 0x2001 接收心跳超时 /// 0x2002 发送心跳失败 /// 0x2003 收到错误报文 { this.isConnect = false; //调用事件 OnEventHandler(CTPResponseType.FrontDisconnectedResponse, new CTPEventArgs()); } break; #endregion #region 心跳超时警告 case CTPResponseType.HeartBeatWarningResponse: { /// <summary> ///心跳超时警告。当长时间未收到报文时,该方法被调用。 ///@param nTimeLapse 距离上次接收报文的时间 /// </summary> /// <param name="nTimeLapse"></param> break; } #endregion #region 客户端认证响应 case CTPResponseType.AuthenticateResponse: { CTPEventArgs<CThostFtdcRspAuthenticateField> args = CreateEventArgs<CThostFtdcRspAuthenticateField>(requestID, rspInfo); this.OnEventHandler(CTPResponseType.AuthenticateResponse, args); break; } #endregion #region 用户登录 case CTPResponseType.UserLoginResponse: { CTPEventArgs<CThostFtdcRspUserLoginField> args = CreateEventArgs<CThostFtdcRspUserLoginField>(requestID, rspInfo); CThostFtdcRspUserLoginField userLogin = args.Value; if (rspInfo.ErrorID == 0) { this.BrokerID = userLogin.BrokerID; this.FrontID = userLogin.FrontID; this.SessionID = userLogin.SessionID; this.isLogin = true; this.loginTime = userLogin.LoginTime; //最大报单引用 int orderRef = 0; if (int.TryParse(userLogin.MaxOrderRef, out orderRef) == false) { orderRef = 0; } this.orderRef = orderRef; //this.currentOrderRef++; DateTime.TryParseExact(userLogin.TradingDay, "yyyyMMdd", null, System.Globalization.DateTimeStyles.AllowWhiteSpaces, out this.tradingDate); //大连 TimeSpan.TryParse(userLogin.DCETime, out this.loginTimeDCE); this.exchanges["DCE"].CurrentTime = this.loginTimeDCE; //郑州 TimeSpan.TryParse(userLogin.CZCETime, out this.loginTimeCZCE); this.exchanges["CZCE"].CurrentTime = this.loginTimeCZCE; //中金 TimeSpan.TryParse(userLogin.FFEXTime, out this.loginTimeCFFEX); this.exchanges["CFFEX"].CurrentTime = this.loginTimeCFFEX; //上海 TimeSpan.TryParse(userLogin.SHFETime, out this.loginTimeSHFE); this.exchanges["SHFE"].CurrentTime = this.loginTimeSHFE; this.wallTimeStopwatch.Start(); this.timer.Change(0, 1000); } this.OnEventHandler(CTPResponseType.UserLoginResponse, args); } break; #endregion #region 登出请求响应 case CTPResponseType.UserLogoutResponse: { this.isLogin = false; //调用事件 OnEventHandler(CTPResponseType.UserLogoutResponse, new CTPEventArgs()); break; } #endregion #region 用户口令更新请求响应 case CTPResponseType.UserPasswordUpdateResponse: /// <summary> /// 用户口令更新请求响应 /// </summary> { CTPEventArgs<CThostFtdcUserPasswordUpdateField> args = CreateEventArgs<CThostFtdcUserPasswordUpdateField>(requestID, rspInfo); this.OnEventHandler(CTPResponseType.UserPasswordUpdateResponse, args); break; } #endregion #region 资金账户口令更新请求响应 case CTPResponseType.TradingAccountPasswordUpdateResponse: /// <summary> /// 资金账户口令更新请求响应 /// </summary> /// <param name="pTradingAccountPasswordUpdate"></param> /// <param name="pRspInfo"></param> /// <param name="nRequestID"></param> /// <param name="bIsLast"></param> { CTPEventArgs<CThostFtdcTradingAccountPasswordUpdateField> args = CreateEventArgs<CThostFtdcTradingAccountPasswordUpdateField>(requestID, rspInfo); this.OnEventHandler(CTPResponseType.TradingAccountPasswordUpdateResponse, args); break; } #endregion #region 报单录入请求响应 case CTPResponseType.OrderInsertResponse: { CTPEventArgs<CThostFtdcInputOrderField> args = CreateEventArgs<CThostFtdcInputOrderField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.OrderInsertResponse, args); break; } #endregion #region 预埋单录入请求响应 case CTPResponseType.ParkedOrderInsertResponse: { CTPEventArgs<CThostFtdcParkedOrderField> args = CreateEventArgs<CThostFtdcParkedOrderField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ParkedOrderInsertResponse, args); break; } #endregion #region 预埋单撤单请求响应 case CTPResponseType.ParkedOrderActionResponse: { CTPEventArgs<CThostFtdcParkedOrderActionField> args = CreateEventArgs<CThostFtdcParkedOrderActionField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ParkedOrderActionResponse, args); break; } #endregion #region 改单响应 case CTPResponseType.OrderActionResponse: { CTPEventArgs<CThostFtdcInputOrderActionField> args = CreateEventArgs<CThostFtdcInputOrderActionField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.OrderActionResponse, args); break; } #endregion #region 查询最大报单数量响应 case CTPResponseType.QueryMaxOrderVolumeResponse: { CTPEventArgs<CThostFtdcQueryMaxOrderVolumeField> args = CreateEventArgs<CThostFtdcQueryMaxOrderVolumeField>(requestID, rspInfo); this.OnEventHandler(CTPResponseType.QueryMaxOrderVolumeResponse, args); break; } #endregion #region 投资者结算结果确认响应 case CTPResponseType.SettlementInfoConfirmResponse: { if (rspInfo.ErrorID == 0) { this.isSettlementConfim = true; } CTPEventArgs<CThostFtdcSettlementInfoConfirmField> args = CreateEventArgs<CThostFtdcSettlementInfoConfirmField>(requestID, rspInfo); this.OnEventHandler(CTPResponseType.SettlementInfoConfirmResponse, args); break; } #endregion #region 删除预埋单响应 case CTPResponseType.RemoveParkedOrderResponse: { CTPEventArgs<CThostFtdcRemoveParkedOrderField> args = CreateEventArgs<CThostFtdcRemoveParkedOrderField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.RemoveParkedOrderResponse, args); break; } #endregion #region 删除预埋撤单响应 case CTPResponseType.RemoveParkedOrderActionResponse: { CTPEventArgs<CThostFtdcRemoveParkedOrderActionField> args = CreateEventArgs<CThostFtdcRemoveParkedOrderActionField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.RemoveParkedOrderActionResponse, args); break; } #endregion #region 查询报单响应 case CTPResponseType.QueryOrderResponse: { CTPEventArgs<List<CThostFtdcOrderField>> args = CreateListEventArgs<CThostFtdcOrderField>(requestID, rspInfo); lock (this.OrderList) { this.OrderList.Clear(); this.OrderList.AddRange(args.Value); } //调用事件 OnEventHandler(CTPResponseType.QueryOrderResponse, args); break; } #endregion #region 查询成交单响应 case CTPResponseType.QueryTradeResponse: { CTPEventArgs<List<CThostFtdcTradeField>> args = CreateListEventArgs<CThostFtdcTradeField>(requestID, rspInfo); this.TradeList.Clear(); this.TradeList.AddRange(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryTradeResponse, args); break; } #endregion #region 查询投资者持仓响应 case CTPResponseType.QueryInvestorPositionResponse: { CTPEventArgs<List<CThostFtdcInvestorPositionField>> args = CreateListEventArgs<CThostFtdcInvestorPositionField>(requestID, rspInfo); this.PositionList.Clear(); this.PositionList.AddRange(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryInvestorPositionResponse, args); break; } #endregion #region 查询资金账户响应 case CTPResponseType.QueryTradingAccountResponse: { /// 查询资金账户响应 CTPEventArgs<CThostFtdcTradingAccountField> args = CreateEventArgs<CThostFtdcTradingAccountField>(requestID, rspInfo); this.tradingAccount = args.Value; this.OnEventHandler(CTPResponseType.QueryTradingAccountResponse, args); break; } #endregion #region 查询投资者响应 case CTPResponseType.QueryInvestorResponse: { CTPEventArgs<CThostFtdcInvestorField> args = CreateEventArgs<CThostFtdcInvestorField>(requestID, rspInfo); this.investor = args.Value; this.OnEventHandler(CTPResponseType.QueryInvestorResponse, args); break; } #endregion #region 请求查询交易编码响应 case CTPResponseType.QueryTradingCodeResponse: { CTPEventArgs<CThostFtdcTradingCodeField> args = CreateEventArgs<CThostFtdcTradingCodeField>(requestID, rspInfo); this.OnEventHandler(CTPResponseType.QueryTradingCodeResponse, args); break; } #endregion #region 查询保证金响应 case CTPResponseType.QueryInstrumentMarginRateResponse: { CTPEventArgs<CThostFtdcInstrumentMarginRateField> args = CreateEventArgs<CThostFtdcInstrumentMarginRateField>(requestID, rspInfo); this.SetInstrumentRate(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryInstrumentMarginRateResponse, args); break; } #endregion #region 查询手续费响应 case CTPResponseType.QueryInstrumentCommissionRateResponse: { CTPEventArgs<CThostFtdcInstrumentCommissionRateField> args = CreateEventArgs<CThostFtdcInstrumentCommissionRateField>(requestID, rspInfo); this.SetInstrumentRate(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryInstrumentCommissionRateResponse, args); CTPTaskBase<CTPRequestAction> task = null; if (this.processedTasks.TryGetValue(args.RequestID, out task)) { if (task.Callback != null) { task.Callback(task,args); } } break; } #endregion #region 查询交易所响应 case CTPResponseType.QueryExchangeResponse: { CTPEventArgs<CThostFtdcExchangeField> args = CreateEventArgs<CThostFtdcExchangeField>(requestID, rspInfo); //保存市场信息 CTPExchange ctpExchange = new CTPExchange(); ctpExchange.SetNativeValue(args.Value); this.Exchanges.Add(args.Value.ExchangeID, ctpExchange); //调用事件 OnEventHandler(CTPResponseType.QueryExchangeResponse, new CTPEventArgs<CTPExchange>(ctpExchange)); break; } #endregion #region 查询合约响应 case CTPResponseType.QueryInstrumentResponse: { CTPEventArgs<List<CThostFtdcInstrumentField>> values = CreateListEventArgs<CThostFtdcInstrumentField>(requestID, rspInfo); foreach (var instrument in values.Value) { if (instrument.ProductClass == CTPProductClassType.EFP) { continue; } CTPInstrument ctpInstrument = new CTPInstrument(); ctpInstrument.SetNativeValue(instrument); //加入到市场列表 if (this.Exchanges.ContainsKey(ctpInstrument.ExchangeID)) { this.Exchanges[instrument.ExchangeID].Instruments.Add(ctpInstrument); } //if (this.SymbolProducts.ContainsKey(ctpInstrument.ProductID.ToUpper()) == false) //{ // this.SymbolProducts.Add(ctpInstrument.ProductID.ToUpper(), new CTPSymbolProduct(instrument)); //} //加入到合约表 if (this.InstrumentDictionary.ContainsKey(ctpInstrument.ID) == false) { this.InstrumentDictionary.Add(ctpInstrument.ID, ctpInstrument); } } //创建新的事件参数 List<CTPInstrument> list = new List<CTPInstrument>(this.InstrumentDictionary.Values); CTPEventArgs<List<CTPInstrument>> args = new CTPEventArgs<List<CTPInstrument>>(list); //调用事件 OnEventHandler(CTPResponseType.QueryInstrumentResponse, args); break; } #endregion #region 查询行情响应 case CTPResponseType.QueryDepthMarketDataResponse: { CTPEventArgs<CThostFtdcDepthMarketDataField> args = CreateEventArgs<CThostFtdcDepthMarketDataField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryDepthMarketDataResponse, args); break; } #endregion #region 查询结算单 case CTPResponseType.QuerySettlementInfoResponse: { CTPEventArgs<List<CThostFtdcSettlementInfoField>> rspData = CreateListEventArgs<CThostFtdcSettlementInfoField>(requestID, rspInfo); CTPSettlementInfo sinfo = new CTPSettlementInfo(); foreach (var item in rspData.Value) { sinfo.Context += PInvokeUtility.GetUnicodeString(item.Content); } //读取结算单信息 //sinfo.ReadContext(); //从请求参数中获取日期 CThostFtdcQrySettlementInfoField queryData = (CThostFtdcQrySettlementInfoField)this.processedTasks[requestID].Parameter; string tradingDate = queryData.TradingDay; if (string.IsNullOrEmpty(tradingDate)) { tradingDate = sinfo.TradingDate; } if (string.IsNullOrEmpty(tradingDate)) { tradingDate = this.TradingDate.ToString("yyyyMMdd"); } if (this.settlementInfoDictionary.ContainsKey(tradingDate) == false) { this.settlementInfoDictionary.Add(tradingDate, sinfo); } else { this.settlementInfoDictionary[tradingDate] = sinfo; } //调用事件 OnEventHandler(CTPResponseType.QuerySettlementInfoResponse, new CTPEventArgs<CTPSettlementInfo>(sinfo, rspInfo)); break; } #endregion #region 请求查询转帐银行响应 case CTPResponseType.QueryTransferBankResponse: { CTPEventArgs<CThostFtdcTransferBankField> args = CreateEventArgs<CThostFtdcTransferBankField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryTransferBankResponse, args); break; } #endregion #region 查询投资者持仓明细响应 case CTPResponseType.QueryInvestorPositionDetailResponse: { CTPEventArgs<List<CThostFtdcInvestorPositionDetailField>> args = CreateListEventArgs<CThostFtdcInvestorPositionDetailField>(requestID, rspInfo); this.PositionDetailList.Clear(); this.PositionDetailList.AddRange(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryInvestorPositionDetailResponse, args); break; } #endregion #region 请求查询客户通知响应 case CTPResponseType.QueryNoticeResponse: { CTPEventArgs<List<CThostFtdcNoticeField>> args = CreateListEventArgs<CThostFtdcNoticeField>(requestID, rspInfo); StringBuilder buffer = new StringBuilder(); foreach (var item in args.Value) { buffer.Append(PInvokeUtility.GetUnicodeString(item.Content)); } //调用事件 OnEventHandler(CTPResponseType.QueryNoticeResponse, new CTPEventArgs<String>(buffer.ToString())); break; } #endregion #region 查询结算单确认响应 case CTPResponseType.QuerySettlementInfoConfirmResponse: { CTPEventArgs<CThostFtdcSettlementInfoConfirmField> args = CreateEventArgs<CThostFtdcSettlementInfoConfirmField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QuerySettlementInfoConfirmResponse, args); break; } #endregion #region 查询投资者组合持仓明细响应 case CTPResponseType.QueryInvestorPositionCombineDetailResponse: { CTPEventArgs<List<CThostFtdcInvestorPositionCombineDetailField>> args = CreateListEventArgs<CThostFtdcInvestorPositionCombineDetailField>(requestID, rspInfo); this.investorPositionCombineDetailList = args.Value; //调用事件 OnEventHandler(CTPResponseType.QueryInvestorPositionCombineDetailResponse, args); break; } #endregion #region 查询保证金中心响应 case CTPResponseType.QueryCFMMCTradingAccountKeyResponse: { if (pData == IntPtr.Zero) { //不存在保证金KEY的服务器,是模拟服务器 this.isSimulationServer = true; } //查询保证金中心,为登录后内部初始化时的最后调用 //因此,当该查询返回时,可认为初始化完成 this.isInitialized = true; CTPEventArgs<CThostFtdcCFMMCTradingAccountKeyField> args = CreateEventArgs<CThostFtdcCFMMCTradingAccountKeyField>(requestID, rspInfo); this.cfmmcTradingAccountKey = args.Value; //调用事件 OnEventHandler(CTPResponseType.QueryCFMMCTradingAccountKeyResponse, args); break; } #endregion #region 【20120828增加(未实现)】请求查询仓单折抵信息响应 case CTPResponseType.QueryEWarrantOffsetResponse: { break; } #endregion #region 请求查询转帐流水响应 case CTPResponseType.QueryTransferSerialResponse: { CTPEventArgs<List<CThostFtdcTransferSerialField>> args = CreateListEventArgs<CThostFtdcTransferSerialField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryTransferSerialResponse, args); break; } #endregion #region 【20120828增加(未实现)】请求查询银期签约关系响应 case CTPResponseType.QueryAccountregisterResponse: { break; } #endregion #region 错误回报 case CTPResponseType.ErrorResponse: { this.OnEventHandler(CTPResponseType.ErrorResponse, new CTPEventArgs(rspInfo)); break; } #endregion #region 报单回报 case CTPResponseType.ReturnOrderResponse: { CTPEventArgs<CThostFtdcOrderField> args = CreateEventArgs<CThostFtdcOrderField>(pData, rspInfo); lock (this.orderList) { AppendOrReplaceOrder(this.orderList, args.Value); } //调用事件 OnEventHandler(CTPResponseType.ReturnOrderResponse, args); break; } #endregion #region 成交回报 case CTPResponseType.ReturnTradeResponse: { CTPEventArgs<CThostFtdcTradeField> args = CreateEventArgs<CThostFtdcTradeField>(pData, rspInfo); //插入到列表中 AppendOrReplaceOrder(this.tradeList, args.Value); //调用事件 OnEventHandler(CTPResponseType.ReturnTradeResponse, args); break; } #endregion #region 错单回报 case CTPResponseType.ErrorReturnOrderInsertResponse: { CTPEventArgs<CThostFtdcInputOrderField> args = CreateEventArgs<CThostFtdcInputOrderField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnOrderInsertResponse, args); break; } #endregion #region 报单操作错误回报 case CTPResponseType.ErrorReturnOrderActionResponse: { CTPEventArgs<CThostFtdcOrderActionField> args = CreateEventArgs<CThostFtdcOrderActionField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnOrderActionResponse, args); break; } #endregion #region 合约交易状态通知 case CTPResponseType.ReturnInstrumentStatusResponse: { CTPEventArgs<CThostFtdcInstrumentStatusField> args = CreateEventArgs<CThostFtdcInstrumentStatusField>(pData, rspInfo); CThostFtdcInstrumentStatusField instrumentStatus = args.Value; Trace.WriteLine(string.Format("{0}:{1} {2}", instrumentStatus.ExchangeID, instrumentStatus.InstrumentStatus,instrumentStatus.EnterTime)); //交易所状态 if (this.exchangeStatus.ContainsKey(instrumentStatus.ExchangeID) == false) { this.exchangeStatus.Add(instrumentStatus.ExchangeID, instrumentStatus.InstrumentStatus); } //更新交易所状态 this.exchangeStatus[instrumentStatus.ExchangeID] = instrumentStatus.InstrumentStatus; this.tradingStatus = instrumentStatus.InstrumentStatus; //初始化完成之前不推送状态事件 if (isInitialized) { //调用事件 OnEventHandler(CTPResponseType.ReturnInstrumentStatusResponse, args); } break; } #endregion #region 交易通知 case CTPResponseType.ReturnTradingNoticeResponse: { //CTPEventArgs<CThostFtdcTradingNoticeInfoField> args = CreateEventArgs<CThostFtdcTradingNoticeInfoField>(pData, rspInfo); CThostFtdcTradingNoticeInfoField value = PInvokeUtility.GetObjectFromIntPtr<CThostFtdcTradingNoticeInfoField>(pData); CTPEventArgs<string> args = new CTPEventArgs<string>(PInvokeUtility.GetUnicodeString(value.FieldContent)); //调用事件 OnEventHandler(CTPResponseType.ReturnTradingNoticeResponse, args); break; } #endregion #region 【已删除】提示条件单校验错误 //case CTPResponseType.ReturnErrorConditionalOrderResponse: // { // CTPEventArgs<CThostFtdcErrorConditionalOrderField> args = CreateEventArgs<CThostFtdcErrorConditionalOrderField>(pData, rspInfo); // //调用事件 // OnEventHandler(CTPResponseType.ReturnErrorConditionalOrderResponse, args); // break; // } #endregion #region 请求查询签约银行响应 case CTPResponseType.QueryContractBankResponse: { CTPEventArgs<List<CThostFtdcContractBankField>> args = CreateListEventArgs<CThostFtdcContractBankField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryContractBankResponse, args); break; } #endregion #region 查询预埋单响应 case CTPResponseType.QueryParkedOrderResponse: { CTPEventArgs<List<CThostFtdcParkedOrderField>> args = CreateListEventArgs<CThostFtdcParkedOrderField>(requestID, rspInfo); this.ParkedOrderList.Clear(); this.ParkedOrderList.AddRange(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryParkedOrderResponse, args); break; } #endregion #region 查询预埋撤单响应 case CTPResponseType.QueryParkedOrderActionResponse: { CTPEventArgs<List<CThostFtdcParkedOrderActionField>> args = CreateListEventArgs<CThostFtdcParkedOrderActionField>(requestID, rspInfo); this.ParkedOrderActionList.Clear(); this.ParkedOrderActionList.AddRange(args.Value); //调用事件 OnEventHandler(CTPResponseType.QueryParkedOrderActionResponse, args); break; } #endregion #region 请求查询交易通知响应 case CTPResponseType.QueryTradingNoticeResponse: { CTPEventArgs<List<CThostFtdcTradingNoticeField>> args = CreateListEventArgs<CThostFtdcTradingNoticeField>(requestID, rspInfo); StringBuilder buffer = new StringBuilder(); //合并消息内容 foreach (var item in args.Value) { buffer.Append(PInvokeUtility.GetUnicodeString(item.FieldContent)); } //调用事件 OnEventHandler(CTPResponseType.QueryTradingNoticeResponse, new CTPEventArgs<string>(buffer.ToString())); break; } #endregion #region 请求查询经纪公司交易参数响应 case CTPResponseType.QueryBrokerTradingParamsResponse: { CTPEventArgs<CThostFtdcBrokerTradingParamsField> args = CreateEventArgs<CThostFtdcBrokerTradingParamsField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryBrokerTradingParamsResponse, args); } break; #endregion #region 请求查询经纪公司交易参数响应 case CTPResponseType.QueryBrokerTradingAlgosResponse: { CTPEventArgs<CThostFtdcBrokerTradingAlgosField> args = CreateEventArgs<CThostFtdcBrokerTradingAlgosField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryBrokerTradingAlgosResponse, args); break; } #endregion #region 银行发起银行资金转期货通知 case CTPResponseType.ReturnFromBankToFutureByBankResponse: { CTPEventArgs<CThostFtdcRspTransferField> args = CreateEventArgs<CThostFtdcRspTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnFromBankToFutureByBankResponse, args); break; } #endregion #region 银行发起期货资金转银行通知 case CTPResponseType.ReturnFromFutureToBankByBankResponse: { CTPEventArgs<CThostFtdcRspTransferField> args = CreateEventArgs<CThostFtdcRspTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnFromFutureToBankByBankResponse, args); break; } #endregion #region 银行发起冲正银行转期货通知 case CTPResponseType.ReturnRepealFromBankToFutureByBankResponse: { CTPEventArgs<CThostFtdcRspRepealField> args = CreateEventArgs<CThostFtdcRspRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnRepealFromBankToFutureByBankResponse, args); break; } #endregion #region 银行发起冲正期货转银行通知 case CTPResponseType.ReturnRepealFromFutureToBankByBankResponse: { CTPEventArgs<CThostFtdcRspRepealField> args = CreateEventArgs<CThostFtdcRspRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnRepealFromFutureToBankByBankResponse, args); break; } #endregion #region 期货发起银行资金转期货通知 case CTPResponseType.ReturnFromBankToFutureByFutureResponse: { CTPEventArgs<CThostFtdcRspTransferField> args = CreateEventArgs<CThostFtdcRspTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnFromBankToFutureByFutureResponse, args); break; } #endregion #region 期货发起期货资金转银行通知 case CTPResponseType.ReturnFromFutureToBankByFutureResponse: { CTPEventArgs<CThostFtdcRspTransferField> args = CreateEventArgs<CThostFtdcRspTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnFromFutureToBankByFutureResponse, args); break; } #endregion #region 系统运行时期手工冲正 case CTPResponseType.ReturnRepealFromBankToFutureByFutureManualResponse: { CTPEventArgs<CThostFtdcRspRepealField> args = CreateEventArgs<CThostFtdcRspRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnRepealFromBankToFutureByFutureManualResponse, args); break; } case CTPResponseType.ReturnRepealFromFutureToBankByFutureManualResponse: { CTPEventArgs<CThostFtdcRspRepealField> args = CreateEventArgs<CThostFtdcRspRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnRepealFromFutureToBankByFutureManualResponse, args); break; } #endregion #region 期货发起查询银行余额通知 case CTPResponseType.ReturnQueryBankBalanceByFutureResponse: { CTPEventArgs<CThostFtdcNotifyQueryAccountField> args = CreateEventArgs<CThostFtdcNotifyQueryAccountField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnQueryBankBalanceByFutureResponse, args); break; } #endregion #region 期货端出入金错误回报 case CTPResponseType.ErrorReturnBankToFutureByFutureResponse: { CTPEventArgs<CThostFtdcReqTransferField> args = CreateEventArgs<CThostFtdcReqTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnBankToFutureByFutureResponse, args); break; } case CTPResponseType.ErrorReturnFutureToBankByFutureResponse: { CTPEventArgs<CThostFtdcReqTransferField> args = CreateEventArgs<CThostFtdcReqTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnFutureToBankByFutureResponse, args); break; } #endregion #region 手工冲正错误回报 case CTPResponseType.ErrorReturnRepealBankToFutureByFutureManualResponse: { CTPEventArgs<CThostFtdcReqRepealField> args = CreateEventArgs<CThostFtdcReqRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnRepealBankToFutureByFutureManualResponse, args); break; } case CTPResponseType.ErrorReturnRepealFutureToBankByFutureManualResponse: { CTPEventArgs<CThostFtdcReqRepealField> args = CreateEventArgs<CThostFtdcReqRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnRepealFutureToBankByFutureManualResponse, args); break; } #endregion #region 期货发起查询银行余额错误回报 case CTPResponseType.ErrorReturnQueryBankBalanceByFutureResponse: { CTPEventArgs<CThostFtdcReqQueryAccountField> args = CreateEventArgs<CThostFtdcReqQueryAccountField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ErrorReturnQueryBankBalanceByFutureResponse, args); break; } #endregion #region 期货发起冲正请求,银行处理完毕后报盘发回的通知 case CTPResponseType.ReturnRepealFromBankToFutureByFutureResponse: { CTPEventArgs<CThostFtdcRspRepealField> args = CreateEventArgs<CThostFtdcRspRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnRepealFromBankToFutureByFutureResponse, args); break; } case CTPResponseType.ReturnRepealFromFutureToBankByFutureResponse: { CTPEventArgs<CThostFtdcRspRepealField> args = CreateEventArgs<CThostFtdcRspRepealField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.ReturnRepealFromFutureToBankByFutureResponse, args); break; } #endregion #region 期货发起出入金应答 case CTPResponseType.FromBankToFutureByFutureResponse: { CTPEventArgs<CThostFtdcReqTransferField> args = CreateEventArgs<CThostFtdcReqTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.FromBankToFutureByFutureResponse, args); break; } case CTPResponseType.FromFutureToBankByFutureResponse: { CTPEventArgs<CThostFtdcReqTransferField> args = CreateEventArgs<CThostFtdcReqTransferField>(pData, rspInfo); //调用事件 OnEventHandler(CTPResponseType.FromFutureToBankByFutureResponse, args); break; } #endregion #region 期货发起查询银行余额应答 case CTPResponseType.QueryBankAccountMoneyByFutureResponse: { CTPEventArgs<CThostFtdcReqQueryAccountField> args = CreateEventArgs<CThostFtdcReqQueryAccountField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPResponseType.QueryBankAccountMoneyByFutureResponse, args); break; } #endregion #region 【20120828增加(未实现)】银行发起银期开户通知 case CTPResponseType.OpenAccountByBankResponse: { break; } #endregion #region 【20120828增加(未实现)】银行发起银期销户通知 case CTPResponseType.CancelAccountByBankResponse: { break; } #endregion #region 【20120828增加(未实现)】银行发起变更银行账号通知 case CTPResponseType.ChangeAccountByBankResponse: { break; } #endregion default: break; } }
protected override void ProcessBusinessResponse(CTPResponseType responseType, IntPtr pData, CTPResponseInfo rspInfo, int requestID) { switch (responseType) { #region 当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。 case CTPResponseType.FrontConnectedResponse: { this.isConnect = true; this.UserLogin(); //调用事件 OnEventHandler(CTPResponseType.FrontConnectedResponse, new CTPEventArgs()); break; } #endregion #region 用户登录 case CTPResponseType.UserLoginResponse: { CTPEventArgs<CThostFtdcRspUserLoginField> args = CreateEventArgs<CThostFtdcRspUserLoginField>(pData, rspInfo); this.isLogin = true; this.OnEventHandler(CTPResponseType.UserLoginResponse, args); } break; #endregion case CTPResponseType.DepthMarketDataResponse: { if (this == null || this.isDispose == true) { return; } CTPEventArgs<CThostFtdcDepthMarketDataField> args = CreateEventArgs<CThostFtdcDepthMarketDataField>(pData, rspInfo); OnEventHandler(CTPResponseType.DepthMarketDataResponse, args); break; } } }
protected override void ProcessBusinessResponse(CTPStockResponseType responseType, IntPtr pData, CTPResponseInfo rspInfo, int requestID) { Trace.WriteLine(string.Format("{0} [{1}]:{2},{3},{4}", this.wallTimeStopwatch.ElapsedMilliseconds, this.UserKey, "ProcessBusinessResponse", responseType, requestID)); switch (responseType) { #region 当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。 case CTPStockResponseType.FrontConnectedResponse: { this.isConnect = true; this.UserLogin(); //调用事件 OnEventHandler(CTPStockResponseType.FrontConnectedResponse, new CTPEventArgs()); break; } #endregion #region 通信中断 case CTPStockResponseType.FrontDisconnectedResponse: /// 当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。 ///@param nReason 错误原因 /// 0x1001 网络读失败 /// 0x1002 网络写失败 /// 0x2001 接收心跳超时 /// 0x2002 发送心跳失败 /// 0x2003 收到错误报文 { this.isConnect = false; //调用事件 OnEventHandler(CTPStockResponseType.FrontDisconnectedResponse, new CTPEventArgs()); } break; #endregion #region 心跳超时警告 case CTPStockResponseType.HeartBeatWarningResponse: { /// <summary> ///心跳超时警告。当长时间未收到报文时,该方法被调用。 ///@param nTimeLapse 距离上次接收报文的时间 /// </summary> /// <param name="nTimeLapse"></param> Trace.WriteLine("CTPTrader:OnHeartBeatWarning!! " + pData.ToString()); break; } #endregion #region 客户端认证响应 case CTPStockResponseType.AuthenticateResponse: { CTPEventArgs<CZQThostFtdcRspAuthenticateField> args = CreateEventArgs<CZQThostFtdcRspAuthenticateField>(requestID, rspInfo); this.OnEventHandler(CTPStockResponseType.AuthenticateResponse, args); break; } #endregion #region 用户登录 case CTPStockResponseType.UserLoginResponse: { CTPEventArgs<CZQThostFtdcRspUserLoginField> args = CreateEventArgs<CZQThostFtdcRspUserLoginField>(requestID, rspInfo); CZQThostFtdcRspUserLoginField userLogin = args.Value; if (rspInfo.ErrorID == 0) { this.BrokerID = userLogin.BrokerID; this.FrontID = userLogin.FrontID; this.SessionID = userLogin.SessionID; this.isLogin = true; this.loginTime = userLogin.LoginTime; //最大报单引用 int orderRef = 0; if (int.TryParse(userLogin.MaxOrderRef, out orderRef) == false) { orderRef = 0; } this.currentOrderRef = orderRef; //this.currentOrderRef++; DateTime.TryParseExact(userLogin.TradingDay, "yyyyMMdd", null, System.Globalization.DateTimeStyles.AllowWhiteSpaces, out this.tradingDate); TimeSpan.TryParse(userLogin.DCETime, out this.loginTimeDCE); TimeSpan.TryParse(userLogin.CZCETime, out this.loginTimeCZCE); TimeSpan.TryParse(userLogin.SHFETime, out this.loginTimeSHFE); //TimeSpan.TryParse(userLogin.DCETime, out this.currentTimeDCE); this.wallTimeStopwatch.Start(); this.timer.Change(0, 1000); } this.OnEventHandler(CTPStockResponseType.UserLoginResponse, args); } break; #endregion #region 登出请求响应 case CTPStockResponseType.UserLogoutResponse: { this.isLogin = false; //调用事件 OnEventHandler(CTPStockResponseType.UserLogoutResponse, new CTPEventArgs()); break; } #endregion #region 用户口令更新请求响应 case CTPStockResponseType.UserPasswordUpdateResponse: /// <summary> /// 用户口令更新请求响应 /// </summary> { CTPEventArgs<CZQThostFtdcUserPasswordUpdateField> args = CreateEventArgs<CZQThostFtdcUserPasswordUpdateField>(requestID, rspInfo); this.OnEventHandler(CTPStockResponseType.UserPasswordUpdateResponse, args); break; } #endregion #region 报单录入请求响应 case CTPStockResponseType.OrderInsertResponse: { CTPEventArgs<CZQThostFtdcInputOrderField> args = CreateEventArgs<CZQThostFtdcInputOrderField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPStockResponseType.OrderInsertResponse, args); break; } #endregion #region 改单响应 case CTPStockResponseType.OrderActionResponse: { CTPEventArgs<CZQThostFtdcInputOrderActionField> args = CreateEventArgs<CZQThostFtdcInputOrderActionField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPStockResponseType.OrderActionResponse, args); break; } #endregion #region 查询最大报单数量响应 case CTPStockResponseType.QueryMaxOrderVolumeResponse: { CTPEventArgs<CZQThostFtdcQueryMaxOrderVolumeField> args = CreateEventArgs<CZQThostFtdcQueryMaxOrderVolumeField>(requestID, rspInfo); this.OnEventHandler(CTPStockResponseType.QueryMaxOrderVolumeResponse, args); break; } #endregion #region 查询报单响应 case CTPStockResponseType.QueryOrderResponse: { CTPEventArgs<List<CZQThostFtdcOrderField>> args = CreateListEventArgs<CZQThostFtdcOrderField>(requestID, rspInfo); lock (this.OrderList) { this.OrderList.Clear(); this.OrderList.AddRange(args.Value); } //调用事件 OnEventHandler(CTPStockResponseType.QueryOrderResponse, args); break; } #endregion #region 查询成交单响应 case CTPStockResponseType.QueryTradeResponse: { CTPEventArgs<List<CZQThostFtdcTradeField>> args = CreateListEventArgs<CZQThostFtdcTradeField>(requestID, rspInfo); this.TradeList = args.Value; //调用事件 OnEventHandler(CTPStockResponseType.QueryTradeResponse, args); break; } #endregion #region 查询投资者持仓响应 case CTPStockResponseType.QueryInvestorPositionResponse: { CTPEventArgs<List<CZQThostFtdcInvestorPositionField>> args = CreateListEventArgs<CZQThostFtdcInvestorPositionField>(requestID, rspInfo); this.PositionList = args.Value; //调用事件 OnEventHandler(CTPStockResponseType.QueryInvestorPositionResponse, args); break; } #endregion #region 查询资金账户响应 case CTPStockResponseType.QueryTradingAccountResponse: { /// 查询资金账户响应 CTPEventArgs<CZQThostFtdcTradingAccountField> args = CreateEventArgs<CZQThostFtdcTradingAccountField>(requestID, rspInfo); this.tradingAccount = args.Value; this.OnEventHandler(CTPStockResponseType.QueryTradingAccountResponse, args); break; } #endregion #region 查询投资者响应 case CTPStockResponseType.QueryInvestorResponse: { CTPEventArgs<CZQThostFtdcInvestorField> args = CreateEventArgs<CZQThostFtdcInvestorField>(requestID, rspInfo); this.investor = args.Value; this.OnEventHandler(CTPStockResponseType.QueryInvestorResponse, args); break; } #endregion #region 请求查询交易编码响应 case CTPStockResponseType.QueryTradingCodeResponse: { CTPEventArgs<CZQThostFtdcTradingCodeField> args = CreateEventArgs<CZQThostFtdcTradingCodeField>(requestID, rspInfo); this.OnEventHandler(CTPStockResponseType.QueryTradingCodeResponse, args); break; } #endregion #region 查询手续费响应 case CTPStockResponseType.QueryInstrumentCommissionRateResponse: { CTPEventArgs<CZQThostFtdcInstrumentCommissionRateField> args = CreateEventArgs<CZQThostFtdcInstrumentCommissionRateField>(requestID, rspInfo); this.SetInstrumentRate(args.Value); //调用事件 OnEventHandler(CTPStockResponseType.QueryInstrumentCommissionRateResponse, args); break; } #endregion #region 查询交易所响应 case CTPStockResponseType.QueryExchangeResponse: { CTPEventArgs<CZQThostFtdcExchangeField> args = CreateEventArgs<CZQThostFtdcExchangeField>(requestID, rspInfo); //保存市场信息 //CTPExchange ctpExchange = new CTPExchange(); //ctpExchange.SetNativeValue(args.Value); //this.Exchanges.Add(args.Value.ExchangeID, ctpExchange); //调用事件 OnEventHandler(CTPStockResponseType.QueryExchangeResponse, args); break; } #endregion #region 查询合约响应 case CTPStockResponseType.QueryInstrumentResponse: { CTPEventArgs<List<CZQThostFtdcInstrumentField>> values = CreateListEventArgs<CZQThostFtdcInstrumentField>(requestID, rspInfo); foreach (var instrument in values.Value) { if (instrument.ProductClass == CTPStockProductClassType.EFP || instrument.ProductClass == CTPStockProductClassType.Futures || instrument.ProductClass == CTPStockProductClassType.Options) { continue; } CTPStockInstrument ctpInstrument = new CTPStockInstrument(); ctpInstrument.SetNativeValue(instrument); //加入到市场列表 //if (this.Exchanges.ContainsKey(ctpInstrument.ExchangeID)) //{ // this.Exchanges[instrument.ExchangeID].Instruments.Add(ctpInstrument); //} //if (this.SymbolProducts.ContainsKey(ctpInstrument.ProductID.ToUpper()) == false) //{ // this.SymbolProducts.Add(ctpInstrument.ProductID.ToUpper(), new CTPSymbolProduct(instrument)); //} //加入到合约表 if (this.InstrumentDictionary.ContainsKey(ctpInstrument.ID) == false) { this.InstrumentDictionary.Add(ctpInstrument.ID, ctpInstrument); } } //创建新的事件参数 List<CTPStockInstrument> list = new List<CTPStockInstrument>(this.InstrumentDictionary.Values); CTPEventArgs<List<CTPStockInstrument>> args = new CTPEventArgs<List<CTPStockInstrument>>(list); //调用事件 //OnEventHandler(CTPStockResponseType.QueryInstrumentResponse, args); OnEventHandler(CTPStockResponseType.QueryInstrumentResponse, values); break; } #endregion #region 查询行情响应 case CTPStockResponseType.QueryDepthMarketDataResponse: { CTPEventArgs<CZQThostFtdcDepthMarketDataField> args = CreateEventArgs<CZQThostFtdcDepthMarketDataField>(requestID, rspInfo); //调用事件 OnEventHandler(CTPStockResponseType.QueryDepthMarketDataResponse, args); break; } #endregion #region 查询投资者持仓明细响应 case CTPStockResponseType.QueryInvestorPositionDetailResponse: { CTPEventArgs<List<CZQThostFtdcInvestorPositionDetailField>> args = CreateListEventArgs<CZQThostFtdcInvestorPositionDetailField>(requestID, rspInfo); this.PositionDetailList = args.Value; //调用事件 OnEventHandler(CTPStockResponseType.QueryInvestorPositionDetailResponse, args); break; } #endregion #region 错误回报 case CTPStockResponseType.ErrorResponse: { this.OnEventHandler(CTPStockResponseType.ErrorResponse, new CTPEventArgs(rspInfo)); break; } #endregion #region 报单回报 case CTPStockResponseType.ReturnOrderResponse: { CTPEventArgs<CZQThostFtdcOrderField> args = CreateEventArgs<CZQThostFtdcOrderField>(pData, rspInfo); lock (this.orderList) { CTPStockOrderConvert.AppendOrReplaceOrder(this.orderList, args.Value); } if (this.filterRestart == true && this.isInitialized == false) { } else { //调用事件 OnEventHandler(CTPStockResponseType.ReturnOrderResponse, args); } break; } #endregion #region 成交回报 case CTPStockResponseType.ReturnTradeResponse: { CTPEventArgs<CZQThostFtdcTradeField> args = CreateEventArgs<CZQThostFtdcTradeField>(pData, rspInfo); //插入到列表中 CTPStockOrderConvert.AppendOrReplaceOrder(this.tradeList, args.Value); if (this.filterRestart == true && this.isInitialized == false) { } else { //调用事件 OnEventHandler(CTPStockResponseType.ReturnTradeResponse, args); } break; } #endregion #region 错单回报 case CTPStockResponseType.ErrorReturnOrderInsertResponse: { if (this.filterRestart == true && this.isInitialized == false) { } else { CTPEventArgs<CZQThostFtdcInputOrderField> args = CreateEventArgs<CZQThostFtdcInputOrderField>(pData, rspInfo); //调用事件 OnEventHandler(CTPStockResponseType.ErrorReturnOrderInsertResponse, args); } break; } #endregion #region 报单操作错误回报 case CTPStockResponseType.ErrorReturnOrderActionResponse: { if (this.filterRestart == true && this.isInitialized == false) { } else { CTPEventArgs<CZQThostFtdcOrderActionField> args = CreateEventArgs<CZQThostFtdcOrderActionField>(pData, rspInfo); //调用事件 OnEventHandler(CTPStockResponseType.ErrorReturnOrderActionResponse, args); } break; } #endregion #region 合约交易状态通知 case CTPStockResponseType.ReturnInstrumentStatusResponse: { CTPEventArgs<CZQThostFtdcInstrumentStatusField> args = CreateEventArgs<CZQThostFtdcInstrumentStatusField>(pData, rspInfo); CZQThostFtdcInstrumentStatusField instrumentStatus = args.Value; Trace.WriteLine(string.Format("{0}:{1}", instrumentStatus.ExchangeID, instrumentStatus.InstrumentStatus)); //交易所状态 if (this.exchangeStatus.ContainsKey(instrumentStatus.ExchangeID) == false) { this.exchangeStatus.Add(instrumentStatus.ExchangeID, instrumentStatus.InstrumentStatus); } //更新交易所状态 this.exchangeStatus[instrumentStatus.ExchangeID] = instrumentStatus.InstrumentStatus; this.tradingStatus = instrumentStatus.InstrumentStatus; //调用事件 OnEventHandler(CTPStockResponseType.ReturnInstrumentStatusResponse, args); break; } #endregion default: break; } }