Пример #1
0
        public void GetPositions(
            string InstrumentID,
            TThostFtdcPosiDirectionType PosiDirection,
            TThostFtdcHedgeFlagType HedgeFlag,
            out int YdPosition,
            out int TodayPosition)
        {
            YdPosition    = 0;
            TodayPosition = 0;
            DataView view = dtInvestorPosition.DefaultView;

            view.RowFilter = string.Format("InstrumentID='{0}' and PosiDirection={1} and HedgeFlag={2}",
                                           InstrumentID,
                                           (int)PosiDirection,
                                           (int)HedgeFlag);

            foreach (DataRowView dr in view)
            {
                int vol = (int)dr[Position];
                TThostFtdcPositionDateType PositionDate1 = (TThostFtdcPositionDateType)dr[PositionDate];
                if (TThostFtdcPositionDateType.Today == PositionDate1)
                {
                    TodayPosition += vol;
                }
                else
                {
                    YdPosition += vol;
                }
            }
        }
Пример #2
0
        //开仓时调用
        public bool InsertOrReplaceForOpen(
            string InstrumentID,
            TThostFtdcPosiDirectionType PosiDirection,
            TThostFtdcHedgeFlagType HedgeFlag,
            TThostFtdcPositionDateType PositionDate,
            int volume)
        {
            lock (this)
            {
                //冲突的可能性大一些,所以要先Update后Insert
                DataRow[] rows = Select(InstrumentID, PosiDirection, HedgeFlag, PositionDate);

                if (rows.Count() == 1)
                {
                    rows[0][Position] = volume + (int)rows[0][Position];
                }
                else
                {
                    try
                    {
                        dtInvestorPosition.Rows.Add(
                            InstrumentID,
                            PosiDirection,
                            HedgeFlag,
                            PositionDate,
                            volume);
                    }
                    catch
                    {
                        return(false);
                    }
                }
                return(true);
            }
        }
Пример #3
0
        //只有在平今或平昨时才会调用
        public int ReplaceForClose(
            string InstrumentID,
            TThostFtdcPosiDirectionType PosiDirection,
            TThostFtdcHedgeFlagType HedgeFlag,
            TThostFtdcPositionDateType PositionDate,
            int volume)
        {
            lock (this)
            {
                //冲突的可能性大一些,所以要先Update后Insert
                DataRow[] rows = Select(InstrumentID, PosiDirection, HedgeFlag, PositionDate);

                int restVol = volume;
                foreach (DataRow dr in rows)
                {
                    if (restVol > 0)
                    {
                        int vol = (int)dr[Position];
                        if (restVol - vol >= 0)
                        {
                            //不够,得多设置几条
                            dr[Position] = 0;
                            restVol     -= vol;
                        }
                        else
                        {
                            //足够了,只设置当前即可
                            dr[Position] = vol - restVol;
                            restVol      = 0;
                        }
                    }
                }
                return(restVol);
            }
        }
Пример #4
0
 private string GetPositionKey(string InstrumentID,
                               TThostFtdcPosiDirectionType PosiDirection,
                               TThostFtdcHedgeFlagType HedgeFlag,
                               TThostFtdcPositionDateType PositionDate)
 {
     return(string.Format("{0}:{1}:{2}:{3}", InstrumentID, PosiDirection, HedgeFlag, PositionDate));
 }
        //private int x = 0;

        //查询持仓后调用此函数
        public bool InsertOrReplace(
            string InstrumentID,
            TThostFtdcPosiDirectionType PosiDirection,
            TThostFtdcHedgeFlagType HedgeFlag,
            TThostFtdcPositionDateType PositionDate,
            int volume)
        {
            lock(this)
            {
                //冲突的可能性大一些,所以要先Update后Insert
                DataRow[] rows = Select(InstrumentID,
                    PosiDirection,
                    HedgeFlag,
                    PositionDate);

                if (rows.Count() == 1)
                {
                    rows[0][Position] = volume;
                }
                else
                {
                    try
                    {
                        dtInvestorPosition.Rows.Add(
                            InstrumentID,
                            PosiDirection,
                            HedgeFlag,
                            PositionDate,
                            volume);
                    }
                    catch
                    {
                        return false;
                    }
                }
                return true;
            }
        }
 public DataRow[] Select(string InstrumentID, TThostFtdcPosiDirectionType PosiDirection, TThostFtdcHedgeFlagType HedgeFlag, TThostFtdcPositionDateType PositionDate)
 {
     return dtInvestorPosition.Select(
         string.Format("InstrumentID='{0}' and PosiDirection={1} and HedgeFlag={2} and PositionDate={3}",
                 InstrumentID,
                 (int)PosiDirection,
                 (int)HedgeFlag,
                 (int)PositionDate));
 }
        //只有在平今或平昨时才会调用
        public int ReplaceForClose(
            string InstrumentID,
            TThostFtdcPosiDirectionType PosiDirection,
            TThostFtdcHedgeFlagType HedgeFlag,
            TThostFtdcPositionDateType PositionDate,
            int volume)
        {
            lock(this)
            {
                //冲突的可能性大一些,所以要先Update后Insert
                DataRow[] rows = Select(InstrumentID, PosiDirection, HedgeFlag, PositionDate);

                int restVol = volume;
                foreach (DataRow dr in rows)
                {
                    if (restVol > 0)
                    {
                        int vol = (int)dr[Position];
                        if (restVol - vol >= 0)
                        {
                            //不够,得多设置几条
                            dr[Position] = 0;
                            restVol -= vol;
                        }
                        else
                        {
                            //足够了,只设置当前即可
                            dr[Position] = vol - restVol;
                            restVol = 0;
                        }
                    }
                }
                return restVol;
            }
        }
        //只收到成交信息时调用
        public bool InsertOrReplaceForTrade(
            string InstrumentID,
            TThostFtdcPosiDirectionType PosiDirection,
            TThostFtdcDirectionType Direction,
            TThostFtdcHedgeFlagType HedgeFlag,
            TThostFtdcPositionDateType PositionDate,
            int volume)
        {
            lock (this)
            {
                // 今天的买入要先冻结
                //冲突的可能性大一些,所以要先Update后Insert
                DataRow[] rows = Select(InstrumentID, PosiDirection, HedgeFlag, PositionDate);

                if (rows.Count() == 1)
                {
                    int vol = (int)rows[0][Position];
                    rows[0][Position] = vol - volume;
                }
                else
                {
                    //假设是新添数据
                    try
                    {
                        if (Direction == TThostFtdcDirectionType.Buy)
                        {
                            dtInvestorPosition.Rows.Add(
                                        InstrumentID,
                                        PosiDirection,
                                        HedgeFlag,
                                        PositionDate,
                                        0,
                                        volume,
                                        0);
                        }
                        else
                        {
                            dtInvestorPosition.Rows.Add(
                                        InstrumentID,
                                        PosiDirection,
                                        HedgeFlag,
                                        PositionDate,
                                        0,
                                        0,
                                        volume);
                        }
                    }
                    catch
                    {
                        return false;
                    }
                }
                return true;
            }
        }
Пример #9
0
        /// <summary>
        /// TThostFtdcPositionDateType枚举型转为PositionDateType枚举型
        /// </summary>
        /// <param name="tfpdt">TThostFtdcPositionDateType枚举型</param>
        /// <returns></returns>
        public static PositionDateType TThostFtdcPositionDateType_To_PositionDateType(TThostFtdcPositionDateType tfpdt)
        {
            PositionDateType pdt = PositionDateType.Today;

            switch (tfpdt)
            {
            case TThostFtdcPositionDateType.THOST_FTDC_PSD_Today:
                break;

            case TThostFtdcPositionDateType.THOST_FTDC_PSD_History:
                pdt = PositionDateType.History;
                break;

            default:
                break;
            }
            return(pdt);
        }
Пример #10
0
        public bool UpdateByTrade(CThostFtdcTradeField pTrade)
        {
            /*
             * Q:向非上海市场发送平今指今,系统能自动处理成平今,接到的回报是平今还是平仓?
             * A:上海市场的昨仓用Close和CloseYesterday都能平,报单回报不会改变,而成交回报会修改成CloseYesterday
             *
             * Q:是否不同市场收到的成交回报都分为了今天与历史。非上海市场不时用Close时,返回数据能区分CloseToday和CloseYesterday吗?还是只回Close
             *
             * Q:上海强平今仓与昨仓会收到什么结果?
             *
             * Q:非上海市场,一手今,一手昨,同时平,收到的回报会如何?
             *
             */

            //如果是开仓,查找唯一的那条记录,不存在就插入
            //如果是平今,只查找今天的记录,直接修改
            //如果是平昨,只处理昨天
            //如果是平仓,从历史开始处理
            lock (this)
            {
                TThostFtdcPosiDirectionType PosiDirection = TThostFtdcPosiDirectionType.Short;
                TThostFtdcPositionDateType  PositionDate  = TThostFtdcPositionDateType.Today;
                if (TThostFtdcOffsetFlagType.Open == pTrade.OffsetFlag)
                {
                    if (TThostFtdcDirectionType.Buy == pTrade.Direction)
                    {
                        PosiDirection = TThostFtdcPosiDirectionType.Long;
                    }
                    return(InsertOrReplaceForOpen(pTrade.InstrumentID,
                                                  PosiDirection,
                                                  pTrade.HedgeFlag,
                                                  PositionDate,
                                                  pTrade.Volume));
                }
                else
                {
                    if (TThostFtdcDirectionType.Sell == pTrade.Direction)
                    {
                        PosiDirection = TThostFtdcPosiDirectionType.Long;
                    }

                    if (TThostFtdcOffsetFlagType.CloseToday == pTrade.OffsetFlag)
                    {
                        return(ReplaceForClose(pTrade.InstrumentID,
                                               PosiDirection,
                                               pTrade.HedgeFlag,
                                               PositionDate,
                                               pTrade.Volume) == 0);
                    }
                    else if (TThostFtdcOffsetFlagType.CloseYesterday == pTrade.OffsetFlag)
                    {
                        PositionDate = TThostFtdcPositionDateType.History;
                        return(ReplaceForClose(pTrade.InstrumentID,
                                               PosiDirection,
                                               pTrade.HedgeFlag,
                                               PositionDate,
                                               pTrade.Volume) == 0);
                    }
                    else if (TThostFtdcOffsetFlagType.Close == pTrade.OffsetFlag)
                    {
                        return(ReplaceForClose(pTrade.InstrumentID,
                                               PosiDirection,
                                               pTrade.HedgeFlag,
                                               pTrade.Volume) == 0);
                    }
                    else
                    {
                        //无法计算的开平类型,要求直接发送查询请求
                        return(false);
                    }
                }
            }
        }
Пример #11
0
 public DataRow[] Select(string InstrumentID, TThostFtdcPosiDirectionType PosiDirection, TThostFtdcHedgeFlagType HedgeFlag, TThostFtdcPositionDateType PositionDate)
 {
     return(dtInvestorPosition.Select(
                string.Format("InstrumentID='{0}' and PosiDirection={1} and HedgeFlag={2} and PositionDate={3}",
                              InstrumentID,
                              (int)PosiDirection,
                              (int)HedgeFlag,
                              (int)PositionDate)));
 }
Пример #12
0
 private string GetPositionKey(string InstrumentID,
     TThostFtdcPosiDirectionType PosiDirection,
     TThostFtdcHedgeFlagType HedgeFlag,
     TThostFtdcPositionDateType PositionDate)
 {
     return string.Format("{0}:{1}:{2}:{3}", InstrumentID, PosiDirection, HedgeFlag, PositionDate);
 }