private void OnRtnOrder_callback(IntPtr pTraderApi, ref CZQThostFtdcOrderField pOrder)
 {
     if (null != OnRtnOrder)
     {
         OnRtnOrder(this, new OnRtnOrderArgs(pTraderApi, ref pOrder));
     }
 }
        /// <summary>
        /// 返回交易模块编号
        /// </summary>
        /// <param name="field"></param>
        /// <returns></returns>
        public static string GetModelID(object field)
        {
            //委托单
            if (field is CZQThostFtdcInputOrderField)
            {
                CZQThostFtdcInputOrderField ctpOrder = (CZQThostFtdcInputOrderField)field;
                return(GetModelIDByOrderRef(ctpOrder.OrderRef));
            }

            //撤单
            if (field is CZQThostFtdcOrderActionField)
            {
                CZQThostFtdcOrderActionField ctpOrder = (CZQThostFtdcOrderActionField)field;
                return(GetModelIDByOrderRef(ctpOrder.OrderRef));
            }

            //订单
            if (field is CZQThostFtdcOrderField)
            {
                CZQThostFtdcOrderField ctpOrder = (CZQThostFtdcOrderField)field;
                return(GetModelIDByOrderRef(ctpOrder.OrderRef));
            }

            //成交单
            if (field is CZQThostFtdcTradeField)
            {
                CZQThostFtdcTradeField ctpOrder = (CZQThostFtdcTradeField)field;
                return(GetModelIDByOrderRef(ctpOrder.OrderRef));
            }

            throw new Exception("unknow field:" + field.ToString(), null);
        }
 private void OnRspQryOrder_callback(IntPtr pTraderApi, ref CZQThostFtdcOrderField pOrder, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     if (null != OnRspQryOrder)
     {
         OnRspQryOrder(this, new OnRspQryOrderArgs(pTraderApi, ref pOrder, ref pRspInfo, nRequestID, bIsLast));
     }
 }
Beispiel #4
0
 public OnRspQryOrderArgs(IntPtr pTraderApi, ref CZQThostFtdcOrderField pOrder, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     this.pTraderApi = pTraderApi;
     this.pOrder     = pOrder;
     this.pRspInfo   = pRspInfo;
     this.nRequestID = nRequestID;
     this.bIsLast    = bIsLast;
 }
        public void CancelOrder(ref CZQThostFtdcOrderField pOrder)
        {
            if (null == m_pTdApi || IntPtr.Zero == m_pTdApi)
            {
                return;
            }

            TraderApi.TD_CancelOrder(m_pTdApi, ref pOrder);
        }
        public CZQThostFtdcInputOrderActionField DeleteOrder(CZQThostFtdcOrderField order)
        {
            CZQThostFtdcInputOrderActionField orderAction = new CZQThostFtdcInputOrderActionField();

            orderAction.BrokerID   = order.BrokerID;
            orderAction.InvestorID = order.InvestorID;
            orderAction.TraderID   = order.TraderID;

            orderAction.FrontID      = order.FrontID;
            orderAction.SessionID    = order.SessionID;
            orderAction.RequestID    = order.RequestID;
            orderAction.OrderRef     = order.OrderRef;
            orderAction.OrderLocalID = order.OrderLocalID;

            orderAction.ExchangeID   = order.ExchangeID;
            orderAction.InstrumentID = order.InstrumentID;

            orderAction.ActionFlag = CTPStockActionFlagType.Delete;

            InvokeAPI(CTPStockRequestAction.OrderActionAction, orderAction);

            return(orderAction);
        }
        public static string GetOrderUniqueKey(object field)
        {
            //委托单
            //if (field is CZQThostFtdcInputOrderField)
            //{
            //  CZQThostFtdcInputOrderField ctpOrder = (CZQThostFtdcInputOrderField)field;
            //  return string.Format("{0}_{1}_{2}_{3}", ctpOrder.BrokerID, ctpOrder.InvestorID, ctpOrder.InstrumentID, ctpOrder.OrderRef);
            //}

            //撤单
            if (field is CZQThostFtdcOrderActionField)
            {
                CZQThostFtdcOrderActionField ctpOrder = (CZQThostFtdcOrderActionField)field;
                return(string.Format("{0:X}_{1:X}_{2}", ctpOrder.FrontID, ctpOrder.SessionID, ctpOrder.OrderRef.Trim()));
            }

            //订单
            if (field is CZQThostFtdcOrderField)
            {
                CZQThostFtdcOrderField ctpOrder = (CZQThostFtdcOrderField)field;
                return(string.Format("{0:X}_{1:X}_{2}", ctpOrder.FrontID, ctpOrder.SessionID, ctpOrder.OrderRef.Trim()));
            }

            //预埋单
            if (field is CZQThostFtdcParkedOrderField)
            {
                CZQThostFtdcParkedOrderField ctpOrder = (CZQThostFtdcParkedOrderField)field;
                return(string.Format("{0}_{1}_{2}", ctpOrder.BrokerID, ctpOrder.InvestorID, ctpOrder.ParkedOrderID));
            }

            //删除预埋单
            if (field is CZQThostFtdcRemoveParkedOrderField)
            {
                CZQThostFtdcRemoveParkedOrderField ctpOrder = (CZQThostFtdcRemoveParkedOrderField)field;
                return(string.Format("{0}_{1}_{2}", ctpOrder.BrokerID, ctpOrder.InvestorID, ctpOrder.ParkedOrderID));
            }


            //成交单
            if (field is CZQThostFtdcTradeField)
            {
                CZQThostFtdcTradeField ctpData = (CZQThostFtdcTradeField)field;
                return(string.Format("{0}_{1}_{2}_{3}", ctpData.BrokerID, ctpData.InvestorID, ctpData.TradingDay, ctpData.TradeID));
            }

            //持仓
            if (field is CZQThostFtdcInvestorPositionField)
            {
                CZQThostFtdcInvestorPositionField ctpData = (CZQThostFtdcInvestorPositionField)field;
                return(string.Format("{0}_{1}_{2}_{3}_{4}", ctpData.BrokerID, ctpData.InvestorID, ctpData.TradingDay, ctpData.InstrumentID, ctpData.PosiDirection));
            }

            //持仓明细
            if (field is CZQThostFtdcInvestorPositionDetailField)
            {
                //注意!!成交单ID可能重复
                CZQThostFtdcInvestorPositionDetailField ctpData = (CZQThostFtdcInvestorPositionDetailField)field;
                return(string.Format("{0}_{1}_{2}_{3}", ctpData.BrokerID, ctpData.InvestorID, ctpData.TradingDay, ctpData.TradeID));
            }

            throw new Exception("Unknow type : " + field.GetType().ToString());
        }
        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);
        }
Beispiel #9
0
 public static extern void TD_CancelOrder(IntPtr pTraderApi, ref CZQThostFtdcOrderField pOrder);
        private void OnRtnOrder(IntPtr pTraderApi, ref CZQThostFtdcOrderField pOrder)
        {
            tdlog.Info("{0},{1},{2},开平{3},价{4},原量{5},成交{6},提交{7},状态{8},前置{9},会话{10},引用{11},报单编号{12},{13}",
                       pOrder.InsertTime, pOrder.InstrumentID, pOrder.Direction, pOrder.CombOffsetFlag, pOrder.LimitPrice,
                       pOrder.VolumeTotalOriginal, pOrder.VolumeTraded, pOrder.OrderSubmitStatus, pOrder.OrderStatus,
                       pOrder.FrontID, pOrder.SessionID, pOrder.OrderRef, pOrder.OrderSysID, pOrder.StatusMsg);

            // 加上这句只是为了在一个账号多会话高频交易时提前过滤
            if (pOrder.SessionID != _RspUserLogin.SessionID || pOrder.FrontID != _RspUserLogin.FrontID)
            {
                return;
            }

            SingleOrder order;
            string      strKey = string.Format("{0}:{1}:{2}", pOrder.FrontID, pOrder.SessionID, pOrder.OrderRef);

            if (_OrderRef2Order.TryGetValue(strKey, out order))
            {
                order.Text    = string.Format("{0}|{1}", order.Text.Substring(0, Math.Min(order.Text.Length, 64)), pOrder.StatusMsg);
                order.OrderID = pOrder.OrderSysID;

                //找到对应的报单回应
                Dictionary <string, CZQThostFtdcOrderField> _Ref2Action;
                if (!_Orders4Cancel.TryGetValue(order, out _Ref2Action))
                {
                    //没找到,自己填一个
                    _Ref2Action           = new Dictionary <string, CZQThostFtdcOrderField>();
                    _Orders4Cancel[order] = _Ref2Action;
                }

                // 有对它进行过撤单操作,这地方是为了加正在撤单状态
                OrdStatus status;
                if (_PendingCancelFlags.TryGetValue(order, out status))
                {
                    // 记下当时的状态
                    _PendingCancelFlags[order] = order.OrdStatus;
                    EmitPendingCancel(order);
                }

                lock (_Ref2Action)
                {
                    string strSysID = string.Format("{0}:{1}", pOrder.ExchangeID, pOrder.OrderSysID);

                    switch (pOrder.OrderStatus)
                    {
                    case TZQThostFtdcOrderStatusType.AllTraded:
                        //已经是最后状态,不能用于撤单了
                        _PendingCancelFlags.Remove(order);
                        _Ref2Action.Remove(strKey);
                        break;

                    case TZQThostFtdcOrderStatusType.PartTradedQueueing:
                        //只是部分成交,还可以撤单,所以要记录下来
                        _Ref2Action[strKey] = pOrder;
                        break;

                    case TZQThostFtdcOrderStatusType.PartTradedNotQueueing:
                        //已经是最后状态,不能用于撤单了
                        _PendingCancelFlags.Remove(order);
                        _Ref2Action.Remove(strKey);
                        break;

                    case TZQThostFtdcOrderStatusType.NoTradeQueueing:
                        // 用于收到成交回报时定位
                        _OrderSysID2OrderRef[strSysID] = strKey;

                        if (0 == _Ref2Action.Count())
                        {
                            _Ref2Action[strKey] = pOrder;
                            EmitAccepted(order);
                        }
                        else
                        {
                            _Ref2Action[strKey] = pOrder;
                        }
                        break;

                    case TZQThostFtdcOrderStatusType.NoTradeNotQueueing:
                        //已经是最后状态,不能用于撤单了
                        _PendingCancelFlags.Remove(order);
                        _Ref2Action.Remove(strKey);
                        break;

                    case TZQThostFtdcOrderStatusType.Canceled:
                        //已经是最后状态,不能用于撤单了
                        _PendingCancelFlags.Remove(order);
                        _Ref2Action.Remove(strKey);
                        //分析此报单是否结束,如果结束分析整个Order是否结束
                        switch (pOrder.OrderSubmitStatus)
                        {
                        case TZQThostFtdcOrderSubmitStatusType.InsertRejected:
                            //如果是最后一个的状态,同意发出消息
                            if (0 == _Ref2Action.Count())
                            {
                                EmitRejected(order, pOrder.StatusMsg);
                            }
                            else
                            {
                                Cancel(order);
                            }
                            break;

                        default:
                            //如果是最后一个的状态,同意发出消息
                            if (0 == _Ref2Action.Count())
                            {
                                EmitCancelled(order);
                            }
                            else
                            {
                                Cancel(order);
                            }
                            break;
                        }
                        break;

                    case TZQThostFtdcOrderStatusType.Unknown:
                        switch (pOrder.OrderSubmitStatus)
                        {
                        case TZQThostFtdcOrderSubmitStatusType.InsertSubmitted:
                            // 有可能头两个报单就这状态,就是报单编号由空变为了有。为空时,也记,没有关系
                            _OrderSysID2OrderRef[strSysID] = strKey;

                            //新单,新加入记录以便撤单
                            if (0 == _Ref2Action.Count())
                            {
                                _Ref2Action[strKey] = pOrder;
                                EmitAccepted(order);
                            }
                            else
                            {
                                _Ref2Action[strKey] = pOrder;
                            }
                            break;
                        }
                        break;

                    case TZQThostFtdcOrderStatusType.NotTouched:
                        //没有处理
                        break;

                    case TZQThostFtdcOrderStatusType.Touched:
                        //没有处理
                        break;
                    }

                    //已经是最后状态了,可以去除了
                    if (0 == _Ref2Action.Count())
                    {
                        _Orders4Cancel.Remove(order);
                    }
                }
            }
            else
            {
                //由第三方软件发出或上次登录时的剩余的单子在这次成交了,先不处理,当不存在
            }
        }
Beispiel #11
0
 public OnRtnOrderArgs(IntPtr pTraderApi, ref CZQThostFtdcOrderField pOrder)
 {
     this.pTraderApi = pTraderApi;
     this.pOrder     = pOrder;
 }