/// <summary> /// 创建事件参数 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="event"></param> /// <param name="requestID"></param> /// <param name="rspInfo"></param> protected XSpeedEventArgs <T> CreateEventArgs <T>(int requestID, XSpeedResponseInfo rspInfo) where T : struct { //if (requestID == 0) //{ // throw new CBFNativeException("Invalid Operation in PreProcessResponse"); //} //转换响应数据 List <Object> rspDataList = this.responseDataMap[requestID]; T value = default(T); if (rspDataList.Count > 0) { value = (T)(rspDataList[0]); } //创建事件参数 XSpeedEventArgs <T> args = new XSpeedEventArgs <T>(value, rspInfo); args.RequestData = this.GetRequestData(requestID); return(args); }
protected override XSpeedResponseInfo GetResponseInfo(IntPtr pRspInfo) { XSpeedResponseInfo rsp = new XSpeedResponseInfo(); DFITCErrorRtnFiled rspInfo = PInvokeUtility.GetObjectFromIntPtr <DFITCErrorRtnFiled>(pRspInfo); rsp.ErrorID = rspInfo.ErrorID; //rsp.Message = PInvokeUtility.GetUnicodeString(rspInfo.ErrorMsg); rsp.Message = rspInfo.ErrorMsg; return(rsp); }
/// <summary> /// 回调函数 /// </summary> /// <param name="type"></param> /// <param name="pData"></param> /// <param name="pRspInfo"></param> /// <param name="requestID"></param> /// <param name="isLast"></param> protected void ResponseHandler(int type, IntPtr pData, IntPtr pRspInfo, int requestID, bool isLast) { TResponseType responseType = ConvertToResponseType(type); ReceiveResponseData(responseType, pData, requestID); if (isLast == true) { XSpeedResponseInfo rspInfo = GetResponseInfo(pRspInfo); this.ProcessBusinessResponse(responseType, pData, rspInfo, requestID); } }
/// <summary> /// 创建事件参数 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="rspData"></param> /// <param name="rspInfo"></param> /// <returns></returns> protected XSpeedEventArgs <T> CreateEventArgs <T>(IntPtr rspData, XSpeedResponseInfo rspInfo) { //转换响应数据 T value = default(T); if (rspData != IntPtr.Zero) { value = PInvokeUtility.GetObjectFromIntPtr <T>(rspData); } //创建事件参数 XSpeedEventArgs <T> args = new XSpeedEventArgs <T>(value, rspInfo); return(args); }
/// <summary> /// 创建事件参数 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="requestID"></param> /// <param name="rspInfo"></param> /// <returns></returns> protected XSpeedEventArgs <List <T> > CreateListEventArgs <T>(int requestID, XSpeedResponseInfo rspInfo) where T : struct { if (requestID == 0) { throw new Exception("Invalid Operation in PreProcessResponse"); } List <T> list = new List <T>(); //转换响应数据 foreach (Object p in this.responseDataMap[requestID]) { list.Add((T)p); } //创建事件参数 XSpeedEventArgs <List <T> > args = new XSpeedEventArgs <List <T> >(list, rspInfo); args.RequestData = this.GetRequestData(requestID); return(args); }
protected override void ProcessBusinessResponse(XSpeedResponseType responseType, IntPtr pData, XSpeedResponseInfo rspInfo, int requestID) { Trace.WriteLine(string.Format("{0} [{1}]:{2},{3},{4}", this.wallTimeStopwatch.ElapsedMilliseconds, this.UserKey, "ProcessBusinessResponse", responseType, requestID)); switch (responseType) { #region 当客户端与交易后台建立起通信连接时(还未登录前),该方法被调用。 case XSpeedResponseType.FrontConnectedResponse: { this.isConnect = true; this.UserLogin(); //调用事件 OnEventHandler(XSpeedResponseType.FrontConnectedResponse, new XSpeedEventArgs()); break; } #endregion #region 通信中断 case XSpeedResponseType.FrontDisconnectedResponse: /// 当客户端与交易后台通信连接断开时,该方法被调用。当发生这个情况后,API会自动重新连接,客户端可不做处理。 ///@param nReason 错误原因 /// 0x1001 网络读失败 /// 0x1002 网络写失败 /// 0x2001 接收心跳超时 /// 0x2002 发送心跳失败 /// 0x2003 收到错误报文 { this.isConnect = false; //调用事件 OnEventHandler(XSpeedResponseType.FrontDisconnectedResponse, new XSpeedEventArgs()); } break; #endregion #region 用户登录 case XSpeedResponseType.UserLoginResponse: { XSpeedEventArgs <DFITCUserLoginInfoRtnField> args = CreateEventArgs <DFITCUserLoginInfoRtnField>(requestID, rspInfo); DFITCUserLoginInfoRtnField userLogin = args.Value; if (rspInfo.ErrorID == 0) { //this.BrokerID = userLogin.BrokerID; //this.FrontID = userLogin.FrontID; this.SessionID = userLogin.SessionID; this.isLogin = true; //最大报单引用 this.orderRef = userLogin.InitLocalOrderID; //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); this.wallTimeStopwatch.Start(); this.timer.Change(0, 1000); } this.OnEventHandler(XSpeedResponseType.UserLoginResponse, args); } break; #endregion #region 登出请求响应 case XSpeedResponseType.UserLogoutResponse: { this.isLogin = false; //调用事件 OnEventHandler(XSpeedResponseType.UserLogoutResponse, new XSpeedEventArgs()); break; } #endregion #region 报单录入请求响应 case XSpeedResponseType.InsertOrderResponse: { XSpeedEventArgs <DFITCOrderRspDataRtnField> args = CreateEventArgs <DFITCOrderRspDataRtnField>(pData, rspInfo); DFITCOrderCommRtnField order = GetOrder(args.Value.SpdOrderID); if (order.SpdOrderID == 0) { // } else { order.OrderStatus = args.Value.OrderStatus; } //调用事件 OnEventHandler(XSpeedResponseType.InsertOrderResponse, args); break; } #endregion #region 改单响应 case XSpeedResponseType.CancelOrderResponse: { XSpeedEventArgs <DFITCCancelOrderField> args = CreateEventArgs <DFITCCancelOrderField>(pData, rspInfo); //调用事件 OnEventHandler(XSpeedResponseType.CancelOrderResponse, args); break; } #endregion #region 查询报单响应 case XSpeedResponseType.QueryOrderInfoResponse: { XSpeedEventArgs <List <DFITCOrderCommRtnField> > args = CreateListEventArgs <DFITCOrderCommRtnField>(requestID, rspInfo); lock (this.OrderList) { this.OrderList.Clear(); this.OrderList.AddRange(args.Value); } //调用事件 OnEventHandler(XSpeedResponseType.QueryOrderInfoResponse, args); break; } #endregion #region 查询成交单响应 case XSpeedResponseType.QueryMatchInfoResponse: { XSpeedEventArgs <List <DFITCMatchedRtnField> > args = CreateListEventArgs <DFITCMatchedRtnField>(requestID, rspInfo); this.TradeList.Clear(); this.TradeList.AddRange(args.Value); //调用事件 OnEventHandler(XSpeedResponseType.QueryMatchInfoResponse, args); break; } #endregion #region 查询投资者持仓响应 case XSpeedResponseType.QueryPositionResponse: { XSpeedEventArgs <List <DFITCPositionInfoRtnField> > args = CreateListEventArgs <DFITCPositionInfoRtnField>(requestID, rspInfo); this.PositionList.Clear(); this.PositionList.AddRange(args.Value); //调用事件 OnEventHandler(XSpeedResponseType.QueryPositionResponse, args); break; } #endregion #region 查询资金账户响应 case XSpeedResponseType.CustomerCapitalResponse: { /// 查询资金账户响应 XSpeedEventArgs <DFITCCapitalInfoRtnField> args = CreateEventArgs <DFITCCapitalInfoRtnField>(requestID, rspInfo); this.tradingAccount = args.Value; this.OnEventHandler(XSpeedResponseType.CustomerCapitalResponse, args); break; } #endregion #region 查询标准合约响应 case XSpeedResponseType.QuerySpecifyInstrumentResponse: { XSpeedEventArgs <DFITCInstrumentRtnField> args = CreateEventArgs <DFITCInstrumentRtnField>(pData, rspInfo); //this.SetInstrumentRate(args.Value); //调用事件 OnEventHandler(XSpeedResponseType.QuerySpecifyInstrumentResponse, args); break; } #endregion #region 查询合约响应 case XSpeedResponseType.QueryExchangeInstrumentResponse: { XSpeedEventArgs <List <DFITCExchangeInstrumentRtnField> > values = CreateListEventArgs <DFITCExchangeInstrumentRtnField>(requestID, rspInfo); foreach (var instrument in values.Value) { //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); //XSpeedEventArgs<List<CTPInstrument>> args = new XSpeedEventArgs<List<CTPInstrument>>(list); //调用事件 OnEventHandler(XSpeedResponseType.QueryExchangeInstrumentResponse, values); break; } #endregion #region 查询套利合约响应 case XSpeedResponseType.ArbitrageInstrumentResponse: { XSpeedEventArgs <List <DFITCAbiInstrumentRtnField> > values = CreateListEventArgs <DFITCAbiInstrumentRtnField>(requestID, rspInfo); //调用事件 OnEventHandler(XSpeedResponseType.ArbitrageInstrumentResponse, values); break; } #endregion #region 错误回报 case XSpeedResponseType.ReturnErrorMsgResponse: { this.OnEventHandler(XSpeedResponseType.ReturnErrorMsgResponse, new XSpeedEventArgs(rspInfo)); break; } #endregion #region 报单回报 case XSpeedResponseType.ReturnOrderResponse: { XSpeedEventArgs <DFITCOrderRtnField> args = CreateEventArgs <DFITCOrderRtnField>(pData, rspInfo); DFITCOrderCommRtnField order = GetOrder(args.Value.SpdOrderID); if (order.SpdOrderID == 0) { // } else { order.OrderStatus = args.Value.OrderStatus; } //调用事件 OnEventHandler(XSpeedResponseType.ReturnOrderResponse, args); break; } #endregion #region 成交回报 case XSpeedResponseType.ReturnMatchedInfoResponse: { XSpeedEventArgs <DFITCMatchedRtnField> args = CreateEventArgs <DFITCMatchedRtnField>(pData, rspInfo); //插入到列表中 AppendOrReplaceOrder(this.tradeList, args.Value); //调用事件 OnEventHandler(XSpeedResponseType.ReturnMatchedInfoResponse, args); break; } #endregion default: Debug.Assert(true, responseType.ToString()); break; } }
public XSpeedEventArgs(XSpeedResponseInfo rspInfo) : this(rspInfo, 0) { }
public XSpeedEventArgs(XSpeedResponseInfo rspInfo, int requestID) { this.ResponseInfo = rspInfo; this.RequestID = requestID; }
/// <summary> /// 处理业务响应 /// </summary> /// <param name="responseType"></param> /// <param name="pData"></param> /// <param name="rspInfo"></param> /// <param name="requestID"></param> protected abstract void ProcessBusinessResponse(TResponseType responseType, IntPtr pData, XSpeedResponseInfo rspInfo, int requestID);