private void OnRspQryTradingAccount_callback(IntPtr pTraderApi, ref CZQThostFtdcTradingAccountField pTradingAccount, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { if (null != OnRspQryTradingAccount) { OnRspQryTradingAccount(this, new OnRspQryTradingAccountArgs(pTraderApi, ref pTradingAccount, ref pRspInfo, nRequestID, bIsLast)); } }
public OnRspQryTradingAccountArgs(IntPtr pTraderApi, ref CZQThostFtdcTradingAccountField pTradingAccount, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { this.pTraderApi = pTraderApi; this.pTradingAccount = pTradingAccount; this.pRspInfo = pRspInfo; this.nRequestID = nRequestID; this.bIsLast = bIsLast; }
private void OnRspQryTradingAccount(IntPtr pTraderApi, ref CZQThostFtdcTradingAccountField pTradingAccount, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLastt) { if (0 == pRspInfo.ErrorID) { m_TradingAccount = pTradingAccount; //有资金信息过来了,重新计时 timerAccount.Enabled = false; timerAccount.Enabled = true; } else { tdlog.Error("nRequestID:{0},ErrorID:{1},OnRspQryTradingAccount:{2}", nRequestID, pRspInfo.ErrorID, pRspInfo.ErrorMsg); EmitError(nRequestID, pRspInfo.ErrorID, "OnRspQryTradingAccount:" + pRspInfo.ErrorMsg); } }
public static string GetUserKey(object field) { //委托单 if (field is CZQThostFtdcInputOrderField) { CZQThostFtdcInputOrderField ctpOrder = (CZQThostFtdcInputOrderField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //撤单 if (field is CZQThostFtdcOrderActionField) { CZQThostFtdcOrderActionField ctpOrder = (CZQThostFtdcOrderActionField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //预埋单 if (field is CZQThostFtdcParkedOrderField) { CZQThostFtdcParkedOrderField ctpOrder = (CZQThostFtdcParkedOrderField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //删除预埋单 if (field is CZQThostFtdcRemoveParkedOrderField) { CZQThostFtdcRemoveParkedOrderField ctpOrder = (CZQThostFtdcRemoveParkedOrderField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //预埋撤单 if (field is CZQThostFtdcParkedOrderActionField) { CZQThostFtdcRemoveParkedOrderField ctpOrder = (CZQThostFtdcRemoveParkedOrderField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //删除预埋撤单 if (field is CZQThostFtdcRemoveParkedOrderActionField) { CZQThostFtdcRemoveParkedOrderActionField ctpOrder = (CZQThostFtdcRemoveParkedOrderActionField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //订单 if (field is CZQThostFtdcOrderField) { CZQThostFtdcOrderField ctpOrder = (CZQThostFtdcOrderField)field; return(GetUserKey(ctpOrder.InvestorID, ctpOrder.BrokerID)); } //成交单 if (field is CZQThostFtdcTradeField) { CZQThostFtdcTradeField ctpData = (CZQThostFtdcTradeField)field; return(GetUserKey(ctpData.InvestorID, ctpData.BrokerID)); } //持仓 if (field is CZQThostFtdcInvestorPositionField) { CZQThostFtdcInvestorPositionField ctpData = (CZQThostFtdcInvestorPositionField)field; return(GetUserKey(ctpData.InvestorID, ctpData.BrokerID)); } //持仓明细 if (field is CZQThostFtdcInvestorPositionDetailField) { CZQThostFtdcInvestorPositionDetailField ctpData = (CZQThostFtdcInvestorPositionDetailField)field; return(GetUserKey(ctpData.InvestorID, ctpData.BrokerID)); } //持仓明细 if (field is CZQThostFtdcInvestorPositionCombineDetailField) { CZQThostFtdcInvestorPositionCombineDetailField ctpData = (CZQThostFtdcInvestorPositionCombineDetailField)field; return(GetUserKey(ctpData.InvestorID, ctpData.BrokerID)); } //资金账户 if (field is CZQThostFtdcTradingAccountField) { CZQThostFtdcTradingAccountField ctpData = (CZQThostFtdcTradingAccountField)field; return(GetUserKey(ctpData.AccountID, ctpData.BrokerID)); } throw new Exception("unknow type : " + field.GetType().FullName); }
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; } }