Beispiel #1
0
        public void CancelOrder(ref CThostFtdcOrderField pOrder)
        {
            if (null == m_pTdApi || IntPtr.Zero == m_pTdApi)
            {
                return;
            }

            TraderApi.TD_CancelOrder(m_pTdApi, ref pOrder);
        }
Beispiel #2
0
        public void CancelOrder(ref CThostFtdcOrderField pOrder)
        {
            if (null == IntPtrKey || IntPtr.Zero == IntPtrKey)
            {
                return;
            }

            TraderApi.TD_CancelOrder(IntPtrKey, ref pOrder);
        }
Beispiel #3
0
        private void OnRtnOrderLastStatus(GenericOrderItem item, CThostFtdcOrderField pOrder, string OrderSysID, string Key)
        {
            // 给成交回报用的,由于成交回报返回慢,所以不能删
            //orderMap.OrderSysID_OrderRef.Remove(OrderSysID);

            // 已经是最后状态,不能用于撤单了
            // 这个功能交给用户上层处理,报个重复撤单也没啥
            //orderMap.OrderItem_OrderField.Remove(item);

            OnLastStatus(item, OrderSysID, Key);
        }
 private void OnRspQryOrder_callback(object sender, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     if (null != OnRspQryOrder)
     {
         try
         {
             OnRspQryOrder(this, new OnRspQryOrderArgs(ref pOrder, ref pRspInfo, nRequestID, bIsLast));
         }
         catch (Exception ex)
         {
             MessageBox.Show("TraderApiWrapper::OnRspQryOrder_callback:" + ex.ToString());
         }
     }
 }
 public void OnRtnOrder(CThostFtdcOrderField pOrder)
 {
     Console.WriteLine("OnRtnOrder");
     if (pOrder.OrderStatus == '1')
     {
         Console.WriteLine("PartTradedQueueing");
     }
     else if (pOrder.OrderStatus == '2')
     {
         Console.WriteLine("PartTradedNotQueueing");
     }
     else if (pOrder.OrderStatus == '5')
     {
         Console.WriteLine("Canceled");
     }
     else
     {
         Console.WriteLine("Placed");
     }
 }
Beispiel #6
0
        private void CTPOnRtnOrder(ref CThostFtdcOrderField pOrder)
        {
            if (!IsLogin)
            {
                _rtnOrderTime = DateTime.Now;                   //登录前接收所有旧的 order
            }
            if (string.IsNullOrEmpty(pOrder.InstrumentID))
            {
                return;
            }

            string id = string.Format("{0}|{1}|{2}", pOrder.SessionID, pOrder.FrontID, pOrder.OrderRef);

            //_dicLocalidSfrId.TryAdd(pOrder.OrderLocalID, id);//防止因此项未赋值,导致成交响应里无法更新

            if (DicOrderField.TryAdd(id, new OrderField
            {
                Custom = (int)(long.TryParse(pOrder.OrderRef, out long tmp) ? tmp % 1000000 : 0),
                //修复: 值为null会导致界面显示错误
                InsertTime = string.IsNullOrEmpty(pOrder.InsertTime) ? DateTime.Now.ToString("HH:mm:ss") : pOrder.InsertTime,
                InstrumentID = pOrder.InstrumentID,
                //SysID = string.Empty,        //为null会导致界面显示错误
                //TradeTime = string.Empty,

                IsLocal = pOrder.SessionID == _session,
                LimitPrice = pOrder.LimitPrice,
                OrderID = id,
                Volume = pOrder.VolumeTotalOriginal,
                VolumeLeft = pOrder.VolumeTotalOriginal,                 // pOrder->VolumeTotal;
                //f->VolumeLeft = pOrder->VolumeTotal; //由ontrade处理
                Status = OrderStatus.Normal,
                StatusMsg = pOrder.StatusMsg,
                Direction = pOrder.Direction == TThostFtdcDirectionType.THOST_FTDC_D_Buy ? DirectionType.Buy : DirectionType.Sell,
                Hedge = (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Speculation ? HedgeType.Speculation : (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Arbitrage ? HedgeType.Arbitrage : HedgeType.Hedge,
                Offset = (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_Open ? OffsetType.Open : (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_CloseToday ? OffsetType.CloseToday : OffsetType.Close,
            }))             //首次响应
Beispiel #7
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(CThostFtdcOrderField obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
Beispiel #8
0
 private void OnRspQryOrder_3(ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     OnRspQryOrder_1(this, ref pOrder, ref pRspInfo, nRequestID, bIsLast);
 }
Beispiel #9
0
 private void OnRspQryOrder_3(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     OnRspQryOrder_1(this, pTraderApi, ref pOrder, ref pRspInfo, nRequestID, bIsLast);
 }
Beispiel #10
0
 // 通过报单组合,实际的向交易所撤单
 public bool TryGetValue(GenericOrderItem key, out CThostFtdcOrderField value)
 {
     return(OrderItem_OrderField.TryGetValue(key, out value));
 }
Beispiel #11
0
        private void OnRtnOrder(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder)
        {
            if (OutputLog)
            {
                Console.WriteLine("{0},{1},{2},开平{3},价{4},原量{5},成交{6},提交{7},状态{8},引用{9},{10}",
                                  pOrder.InsertTime, pOrder.InstrumentID, pOrder.Direction, pOrder.CombOffsetFlag, pOrder.LimitPrice,
                                  pOrder.VolumeTotalOriginal, pOrder.VolumeTraded, pOrder.OrderSubmitStatus, pOrder.OrderStatus,
                                  pOrder.OrderRef, pOrder.StatusMsg);
            }

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

            if (_OrderRef2Order.TryGetValue(strKey, out order))
            {
                order.Text = pOrder.StatusMsg;

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

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

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

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

                    case TThostFtdcOrderStatusType.NoTradeQueueing:
                        if (0 == _Ref2Action.Count())
                        {
                            EmitAccepted(order);
                        }
                        _Ref2Action[strKey] = pOrder;
                        break;

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

                    case TThostFtdcOrderStatusType.Canceled:
                        //已经是最后状态,不能用于撤单了
                        _Ref2Action.Remove(strKey);
                        //分析此报单是否结束,如果结束分析整个Order是否结束
                        switch (pOrder.OrderSubmitStatus)
                        {
                        case TThostFtdcOrderSubmitStatusType.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 TThostFtdcOrderStatusType.Unknown:
                        switch (pOrder.OrderSubmitStatus)
                        {
                        case TThostFtdcOrderSubmitStatusType.InsertSubmitted:
                            //新单,新加入记录以便撤单
                            if (0 == _Ref2Action.Count())
                            {
                                EmitAccepted(order);
                            }
                            _Ref2Action[strKey] = pOrder;
                            break;
                        }
                        break;

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

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

                    //已经是最后状态了,可以去除了
                    if (0 == _Ref2Action.Count())
                    {
                        _Orders4Cancel.Remove(order);
                    }
                }
            }
            else
            {
                //由第三方软件发出或上次登录时的剩余的单子在这次成交了,先不处理,当不存在
            }
        }
Beispiel #12
0
 public OnRtnOrderArgs(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder)
 {
     this.pTraderApi = pTraderApi;
     this.pOrder = pOrder;
 }
Beispiel #13
0
 public OnRspQryOrderArgs(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     this.pTraderApi = pTraderApi;
     this.pOrder = pOrder;
     this.pRspInfo = pRspInfo;
     this.nRequestID = nRequestID;
     this.bIsLast = bIsLast;
 }
 ///请求查询报单响应
 public void OnRspQryOrder(CThostFtdcOrderField pOrder, CThostFtdcRspInfoField pRspInfo, int nRequestID,
                           bool bIsLast)
 {
     Console.WriteLine("OnRspQryOrder");
 }
Beispiel #15
0
 public void CancelOrder(ref CThostFtdcOrderField pOrder)
 {
     m_Api.CancelOrder(ref pOrder);
 }
Beispiel #16
0
        public void CancelOrder(string OrderRef, int FrontID, int SessionID, string instrumentID)
        {
            var orderField = new CThostFtdcOrderField();
            orderField.OrderRef = OrderRef;
            orderField.FrontID = FrontID;
            orderField.SessionID = SessionID;
            orderField.InstrumentID = instrumentID;

            m_Api.CancelOrder(ref orderField);
        }
Beispiel #17
0
        public void CancelOrder(ref CThostFtdcOrderField pOrder)
        {
            if (null == IntPtrKey || IntPtr.Zero == IntPtrKey)
            {
                return;
            }

            TraderApi.TD_CancelOrder(IntPtrKey, ref pOrder);
        }
 public override void OnRspQryOrder(CThostFtdcOrderField pOrder, CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     _callbackApi.OnRspQryOrder(pOrder, pRspInfo, nRequestID, bIsLast);
 }
Beispiel #19
0
 private void OnRtnOrder_3(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder)
 {
     OnRtnOrder_1(this, pTraderApi, ref pOrder);
 }
 public override void OnRtnOrder(CThostFtdcOrderField pOrder)
 {
     _callbackApi.OnRtnOrder(pOrder);
 }
Beispiel #21
0
 private void OnRtnOrder_3(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder)
 {
     OnRtnOrder_1(this, pTraderApi, ref pOrder);
 }
Beispiel #22
0
 public OnRtnOrderArgs(ref CThostFtdcOrderField pOrder)
 {
     this.pOrder = pOrder;
 }
Beispiel #23
0
 private void OnRtnOrder_3(ref CThostFtdcOrderField pOrder)
 {
     OnRtnOrder_1(this, ref pOrder);
 }
Beispiel #24
0
 public void CancelOrder(ref CThostFtdcOrderField pOrder)
 {
     m_Api.CancelOrder(ref pOrder);
 }
Beispiel #25
0
        private void OnRtnOrder(IntPtr pTraderApi, ref CThostFtdcOrderField 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;
            }

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

            if (orderMap.TryGetValue(strKey, out item))
            {
                string strSysID = string.Format("{0}:{1}", pOrder.ExchangeID, pOrder.OrderSysID);

                switch (pOrder.OrderStatus)
                {
                /// 不用处理
                case TThostFtdcOrderStatusType.PartTradedQueueing:
                    break;

                /// 第一个状态,要注册
                case TThostFtdcOrderStatusType.NoTradeQueueing:
                    OnRtnOrderFirstStatus(item, pOrder, strSysID, strKey);
                    break;

                /// 最后一个状态,要清理
                case TThostFtdcOrderStatusType.AllTraded:
                case TThostFtdcOrderStatusType.PartTradedNotQueueing:
                case TThostFtdcOrderStatusType.NoTradeNotQueueing:
                    OnRtnOrderLastStatus(item, pOrder, strSysID, strKey);
                    break;

                /// 其它情况
                case TThostFtdcOrderStatusType.Canceled:
                    //分析此报单是否结束
                    switch (pOrder.OrderSubmitStatus)
                    {
                    case TThostFtdcOrderSubmitStatusType.InsertRejected:
                        EmitRejected(item, pOrder.StatusMsg);
                        break;

                    default:
                        EmitCancelled(item);
                        break;
                    }
                    OnRtnOrderLastStatus(item, pOrder, strSysID, strKey);
                    break;

                case TThostFtdcOrderStatusType.Unknown:
                    switch (pOrder.OrderSubmitStatus)
                    {
                    case TThostFtdcOrderSubmitStatusType.InsertSubmitted:
                        OnRtnOrderFirstStatus(item, pOrder, strSysID, strKey);
                        break;
                    }
                    break;

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

                case TThostFtdcOrderStatusType.Touched:
                    //没有处理
                    break;
                }
            }
        }
Beispiel #26
0
 private void OnRspQryOrder_callback(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     if (null != OnRspQryOrder)
     {
         OnRspQryOrder(this, new OnRspQryOrderArgs(pTraderApi, ref pOrder, ref pRspInfo, nRequestID, bIsLast));
     }
 }
Beispiel #27
0
 public static extern void TD_CancelOrder(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder);
Beispiel #28
0
 private void OnRtnOrder_callback(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder)
 {
     if (null != OnRtnOrder)
     {
         OnRtnOrder(this, new OnRtnOrderArgs(pTraderApi, ref pOrder));
     }
 }
Beispiel #29
0
 public OnRtnOrderArgs(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder)
 {
     this.pTraderApi = pTraderApi;
     this.pOrder     = pOrder;
 }
Beispiel #30
0
        private void OnRtnOrder(IntPtr pTraderApi, ref CThostFtdcOrderField 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, CThostFtdcOrderField> _Ref2Action;
                if (!_Orders4Cancel.TryGetValue(order, out _Ref2Action))
                {
                    //没找到,自己填一个
                    _Ref2Action           = new Dictionary <string, CThostFtdcOrderField>();
                    _Orders4Cancel[order] = _Ref2Action;
                }

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

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

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

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

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

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

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

                    case TThostFtdcOrderStatusType.Canceled:
                        //已经是最后状态,不能用于撤单了
                        _Ref2Action.Remove(strKey);
                        //分析此报单是否结束,如果结束分析整个Order是否结束
                        switch (pOrder.OrderSubmitStatus)
                        {
                        case TThostFtdcOrderSubmitStatusType.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 TThostFtdcOrderStatusType.Unknown:
                        switch (pOrder.OrderSubmitStatus)
                        {
                        case TThostFtdcOrderSubmitStatusType.InsertSubmitted:
                            // 有可能头两个报单就这状态,就是报单编号由空变为了有。为空时,也记,没有关系
                            _OrderSysID2OrderRef[strSysID] = strKey;

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

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

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

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

            if (!IsLogin)
            {
                _rtnOrderTime = DateTime.Now;   //登录前接收所有旧的 order
            }
            if (string.IsNullOrEmpty(pOrder.InstrumentID))
            {
                return;
            }

            string id = string.Format("{0}|{1}|{2}", pOrder.SessionID, pOrder.FrontID, pOrder.OrderRef);
            //_dicLocalidSfrId.TryAdd(pOrder.OrderLocalID, id);//防止因此项未赋值,导致成交响应里无法更新

            long tmp;

            if (DicOrderField.TryAdd(id, new OrderField
            {
                Custom = (int)(long.TryParse(pOrder.OrderRef, out tmp) ? tmp % 1000000 : 0),
                //修复: 值为null会导致界面显示错误
                InsertTime = string.IsNullOrEmpty(pOrder.InsertTime) ? DateTime.Now.ToString("HH:mm:ss") : pOrder.InsertTime,
                InstrumentID = pOrder.InstrumentID,
                //SysID = string.Empty,        //为null会导致界面显示错误
                //TradeTime = string.Empty,

                IsLocal = pOrder.SessionID == _session,
                LimitPrice = pOrder.LimitPrice,
                OrderID = id,
                Volume = pOrder.VolumeTotalOriginal,
                VolumeLeft = pOrder.VolumeTotalOriginal, // pOrder->VolumeTotal;
                                                         //f->VolumeLeft = pOrder->VolumeTotal; //由ontrade处理
                Status = OrderStatus.Normal,
                StatusMsg = pOrder.StatusMsg,
                Direction = pOrder.Direction == TThostFtdcDirectionType.THOST_FTDC_D_Buy ? DirectionType.Buy : DirectionType.Sell,
                Hedge = (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Speculation ? HedgeType.Speculation : (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Arbitrage ? HedgeType.Arbitrage : HedgeType.Hedge,
                Offset = (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_Open ? OffsetType.Open : (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_CloseToday ? OffsetType.CloseToday : OffsetType.Close,
            })) //首次响应
            {
                //if (pOrder.OrderLocalID.Length > 0) //成交响应时用
                if (IsLogin)
                {
                    _OnRtnOrder?.Invoke(this, new OrderArgs {
                        Value = DicOrderField[id]
                    });
                }
            }
            else
            {
                OrderField f = DicOrderField[id];
                //修复: 值为null会导致界面显示错误
                f.InsertTime = string.IsNullOrEmpty(pOrder.InsertTime) ? DateTime.Now.ToString("HH:mm:ss") : pOrder.InsertTime;

                if (_excTime == DateTime.MinValue && TimeSpan.TryParse(f.InsertTime, out ts)) //首次的onrtnorder时间有问题,故放在此处更新_exctime
                {
                    _excTime = DateTime.Today.Add(ts);
                    _sw.Restart();
                }

                if (TThostFtdcOrderStatusType.THOST_FTDC_OST_Canceled == pOrder.OrderStatus)
                {
                    f.Status    = OrderStatus.Canceled;
                    f.StatusMsg = pOrder.StatusMsg;
                    if (!string.IsNullOrEmpty(pOrder.CancelTime))
                    {
                        f.TradeTime = pOrder.CancelTime;
                    }
                    else if (IsLogin)//成撤时间:此处为撤单时间
                    {
                        f.TradeTime = DateTime.Now.ToString("HH:mm:ss");
                    }

                    if (IsLogin)
                    {
                        //委托被拒绝的撤单按错误处理
                        if (pOrder.StatusMsg.IndexOf(@"被拒绝") >= 0)
                        {
                            _OnRtnErrOrder?.Invoke(this, new ErrOrderArgs {
                                ErrorID = -1, ErrorMsg = pOrder.StatusMsg, Value = f
                            });
                        }
                        else
                        {
                            _OnRtnCancel?.Invoke(this, new OrderArgs {
                                Value = f,
                            });
                        }
                    }
                    //撤单次数等规则由业务层处理
                    //_dicCancelTimes.AddOrUpdate(f.InstrumentID, 1, (k, v) => v + 1);
                    //if (_dicCancelTimes[f.InstrumentID] >= 450 && _dicCancelTimes[f.InstrumentID] % 10 == 0)
                    //{
                    //	if (IsLogin && _caller._OnRtnErrCancel != null)
                    //		_caller._OnRtnErrOrder(_caller, new ErrOrderArgs
                    //		{
                    //			ErrorID = -1,
                    //			ErrorMsg = string.Format("撤单次数将要达到上限500次[{0}]", _dicCancelTimes[f.InstrumentID]),
                    //			Value = f,
                    //		});
                    //}
                }
            }

            //委托到交易所
            if (!string.IsNullOrEmpty(pOrder.OrderSysID))
            {
                DicOrderField[id].SysID = pOrder.OrderSysID;

                if (_dicSysidSfrId.TryAdd(pOrder.OrderSysID, id))
                {
                    List <CThostFtdcTradeField> list;
                    //成交先至,则在此处再调成交
                    if (_sysidTrade.TryGetValue(pOrder.OrderSysID, out list))
                    {
                        foreach (CThostFtdcTradeField t1 in list)
                        {
                            var t = t1;
                            //再调用rtntrade: 成交响应在rtntrade中完成
                            CTPOnRtnTrade(ref t);
                        }
                        list.Clear();
                    }
                }
            }
        }
Beispiel #32
0
 /// <summary>
 /// 构造函数
 /// </summary>
 public OrderField(CThostFtdcOrderField of)
 {
     OrderFieldInstance = of;
 }