コード例 #1
0
        public bool OnTrade(ref SingleOrder order, ref CZQThostFtdcTradeField pTrade, ref double Price, ref int Volume)
        {
            //先保存到两个队例,排序是为了配对
            //if (TZQThostFtdcDirectionType.Buy == pTrade.Direction)
            //{
            //    qBuy.Add(pTrade);
            //    qBuy.Sort(SortCZQThostFtdcTradeField);
            //}
            //else
            //{
            //    qSell.Add(pTrade);
            //    qSell.Sort(SortCZQThostFtdcTradeField);
            //}

            ////取已经配对好的
            //if (qBuy.Count > 0 && qSell.Count > 0)
            //{
            //    if (qBuy[0].Volume == qSell[0].Volume)//如果不等就有问题了
            //    {
            //        Volume = qBuy[0].Volume;
            //        if (order.Side == Side.Buy)
            //        {
            //            Price = qBuy[0].Price - qSell[0].Price;
            //        }
            //        else
            //        {
            //            Price = qSell[0].Price - qBuy[0].Price;
            //        }
            //        //用完就清除
            //        qBuy.RemoveAt(0);
            //        qSell.RemoveAt(0);
            //        return true;
            //    }
            //}
            return false;
        }
コード例 #2
0
ファイル: EventArgs.cs プロジェクト: kandsy/CTPZQ
 public OnRtnTradeArgs(IntPtr pTraderApi, ref CZQThostFtdcTradeField pTrade)
 {
     this.pTraderApi = pTraderApi;
     this.pTrade = pTrade;
 }
コード例 #3
0
ファイル: EventArgs.cs プロジェクト: kandsy/CTPZQ
 public OnRspQryTradeArgs(IntPtr pTraderApi, ref CZQThostFtdcTradeField pTrade, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     this.pTraderApi = pTraderApi;
     this.pTrade = pTrade;
     this.pRspInfo = pRspInfo;
     this.nRequestID = nRequestID;
     this.bIsLast = bIsLast;
 }
コード例 #4
0
        //用于计算组合成交
        //private Dictionary<SingleOrder, DbInMemTrade> _Orders4Combination = new Dictionary<SingleOrder, DbInMemTrade>();
        private void OnRtnTrade(IntPtr pTraderApi, ref CZQThostFtdcTradeField pTrade)
        {
            if (OutputLogToConsole)
            {
                Console.WriteLine("时{0},合约{1},方向{2},开平{3},价{4},量{5},引用{6}",
                    pTrade.TradeTime, pTrade.InstrumentID, pTrade.Direction, pTrade.OffsetFlag, pTrade.Price, pTrade.Volume, pTrade.OrderRef);
            }

            //由于证券比较复杂,此处的持仓计算目前不准
            if (_dbInMemInvestorPosition.UpdateByTrade(pTrade))
            {
            }
            else
            {
                //本地计算更新失败,重查一次
                TraderApi.TD_ReqQryInvestorPosition(m_pTdApi, pTrade.InstrumentID);
            }

            SingleOrder order;
            //找到自己发送的订单,标记成交
            if (_OrderRef2Order.TryGetValue(string.Format("{0}:{1}:{2}", _RspUserLogin.FrontID, _RspUserLogin.SessionID, pTrade.OrderRef), out order))
            {
                //if (TZQThostFtdcTradeTypeType.CombinationDerived == pTrade.TradeType)
                //{
                //    //组合,得特别处理
                //    DbInMemTrade _trade;//用此对象维护组合对
                //    if (!_Orders4Combination.TryGetValue(order, out _trade))
                //    {
                //        _trade = new DbInMemTrade();
                //        _Orders4Combination[order] = _trade;
                //    }

                //    double Price = 0;
                //    int Volume = 0;
                //    //找到成对交易的,得出价差
                //    if (_trade.OnTrade(ref order, ref pTrade, ref Price, ref Volume))
                //    {
                //        EmitFilled(order, Price, Volume);

                //        //完成使命了,删除
                //        if (_trade.isEmpty())
                //        {
                //            _Orders4Combination.Remove(order);
                //        }
                //    }
                //}
                //else
                {
                    //普通订单,直接通知即可
                    double price = Convert.ToDouble(pTrade.Price);
                    EmitFilled(order, price, pTrade.Volume);
                }
            }
        }
コード例 #5
0
 private static int SortCZQThostFtdcTradeField(CZQThostFtdcTradeField a1, CZQThostFtdcTradeField a2)
 {
     return a1.TradeID.CompareTo(a2.TradeID);
 }
コード例 #6
0
ファイル: TraderApiWrapper.cs プロジェクト: cz242/CTPZQ
 private void OnRtnTrade_callback(IntPtr pTraderApi, ref CZQThostFtdcTradeField pTrade)
 {
     if (null != OnRtnTrade)
     {
         OnRtnTrade(this, new OnRtnTradeArgs(pTraderApi, ref pTrade));
     }
 }
コード例 #7
0
ファイル: TraderApiWrapper.cs プロジェクト: cz242/CTPZQ
 private void OnRspQryTrade_callback(IntPtr pTraderApi, ref CZQThostFtdcTradeField pTrade, ref CZQThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast)
 {
     if (null != OnRspQryTrade)
     {
         OnRspQryTrade(this, new OnRspQryTradeArgs(pTraderApi, ref pTrade, ref pRspInfo, nRequestID, bIsLast));
     }
 }
コード例 #8
0
        public bool UpdateByTrade(CZQThostFtdcTradeField pTrade)
        {
            lock(this)
            {
                TZQThostFtdcPosiDirectionType PosiDirection = TZQThostFtdcPosiDirectionType.Net;
                TZQThostFtdcPositionDateType PositionDate = TZQThostFtdcPositionDateType.Today;
                TZQThostFtdcHedgeFlagType HedgeFlag = TZQThostFtdcHedgeFlagType.Speculation;

                return InsertOrReplaceForTrade(
                    pTrade.InstrumentID,
                    PosiDirection,
                    pTrade.Direction,
                    HedgeFlag,
                    PositionDate,
                    pTrade.Volume);
            }
        }
コード例 #9
0
        //用于计算组合成交
        //private Dictionary<SingleOrder, DbInMemTrade> _Orders4Combination = new Dictionary<SingleOrder, DbInMemTrade>();

        private void OnRtnTrade(IntPtr pTraderApi, ref CZQThostFtdcTradeField pTrade)
        {
            tdlog.Info("时{0},合约{1},方向{2},开平{3},价{4},量{5},引用{6},成交编号{7}",
                    pTrade.TradeTime, pTrade.InstrumentID, pTrade.Direction, pTrade.OffsetFlag,
                    pTrade.Price, pTrade.Volume, pTrade.OrderRef, pTrade.TradeID);

            //由于证券比较复杂,此处的持仓计算目前不准
            if (_dbInMemInvestorPosition.UpdateByTrade(pTrade))
            {
            }
            else
            {
                //本地计算更新失败,重查一次
                TraderApi.TD_ReqQryInvestorPosition(m_pTdApi, pTrade.InstrumentID);
            }

            SingleOrder order;
            //找到自己发送的订单,标记成交
            string strSysID = string.Format("{0}:{1}", pTrade.ExchangeID, pTrade.OrderSysID);
            string strKey;
            if (!_OrderSysID2OrderRef.TryGetValue(strSysID, out strKey))
            {
                return;
            }

            //找到自己发送的订单,标记成交
            if (_OrderRef2Order.TryGetValue(strKey, out order))
            {
                double Price = 0;
                int Volume = 0;
                //if (TZQThostFtdcTradeTypeType.CombinationDerived == pTrade.TradeType)
                //{
                //    //组合,得特别处理
                //    DbInMemTrade _trade;//用此对象维护组合对
                //    if (!_Orders4Combination.TryGetValue(order, out _trade))
                //    {
                //        _trade = new DbInMemTrade();
                //        _Orders4Combination[order] = _trade;
                //    }

                //    double Price = 0;
                //    int Volume = 0;
                //    //找到成对交易的,得出价差
                //    if (_trade.OnTrade(ref order, ref pTrade, ref Price, ref Volume))
                //    {
                //        EmitFilled(order, Price, Volume);

                //        //完成使命了,删除
                //        if (_trade.isEmpty())
                //        {
                //            _Orders4Combination.Remove(order);
                //        }
                //    }
                //}
                //else
                {
                    //普通订单,直接通知即可
                    Price = Convert.ToDouble(pTrade.Price);
                    Volume = pTrade.Volume;
                }

                int LeavesQty = (int)order.LeavesQty - Volume;
                EmitFilled(order, Price, Volume, CommType.Absolute, 0);

                //成交完全,清理
                if (LeavesQty <= 0)
                {
                    _OrderRef2Order.Remove(strKey);
                    _OrderSysID2OrderRef.Remove(strSysID);
                    _Orders4Cancel.Remove(order);
                }
            }
        }