/// <summary>
        /// 读取一行数据.
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        private CommodityPrice GetOneCommodityPriceDay(string line)
        {
            // 数据格式:
            // Date,Open,High,Low,Close,Volume,Adj Close
            // 2010-10-08,13.08996,13.46995,12.86,13.35997,129016300,8.60814

            string[] itemArray = line.Split(',');

            CommodityPrice result = new CommodityPrice()
            {
                // 日期.
                TradingStartDate  = Convert.ToDateTime(itemArray[0]),
                TradingFinishDate = Convert.ToDateTime(itemArray[0]),
                // 开.
                OpenPrice = Convert.ToDecimal(itemArray[1]),
                // 高.
                HighestPrice = Convert.ToDecimal(itemArray[2]),
                // 低.
                LowestPrice = Convert.ToDecimal(itemArray[3]),
                // 平.
                ClosePrice = Convert.ToDecimal(itemArray[4]),
                // 成交.
                Volume = Convert.ToInt64(itemArray[5])
            };

            return(result);
        }
        private static void removePricePointsInCommodityPrice(SQLiteDB db, CommodityPrice price)
        {
            Dictionary <string, string> priceID = new Dictionary <string, string>();

            priceID.Add("CommodityPriceID", price.Guid.ToString());
            db.RemoveValueFromTable("PricePoint", priceID);
        }
示例#3
0
        public override void DoProcess()
        {
            SinaCommodityPriceReader reader = new SinaCommodityPriceReader();

            List <CommodityPrice> dataList = reader.GetCommodityPriceList(this.Code, DateTime.Today, DateTime.Today);



            CommodityPrice newData = dataList[0];

            // 代码
            newData.CommodityCode = this.Code.Substring(2);
            // 有效.
            newData.IsActive = true;


            CommodityPriceService service = new CommodityPriceService();

            // 插入或更新.
            bool result = service.InsertOrUpdateCommodityPrice(newData);


            if (result)
            {
                logger.Info("Success!");
            }
            else
            {
                logger.Info("Fail!");
                logger.Info(service.ResultMessage);
            }
        }
示例#4
0
        /// <summary>
        /// 计算 ATR.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="newData"></param>
        /// <param name="atrParam"></param>
        /// <returns></returns>
        private static decimal GetAtrValue(MyMiniTradingSystemContext context, CommodityPrice newData, int atrParam = 14)
        {
            // 查询前 N 天的交易数据.
            var query =
                from data in context.CommodityPrices
                where
                data.CommodityCode == newData.CommodityCode &&
                data.TradingStartDate < newData.TradingStartDate
                orderby data.TradingStartDate descending
                select data.Tr;


            // 用于平均的行数(目的: 避免前 N 天, 日期不足, 平均的时候,分母过大.)
            int rowCount = 1;

            // 前 n-1 天.
            decimal resultData = 0;

            foreach (decimal oneTr in query.Take(atrParam - 1))
            {
                resultData += oneTr;

                rowCount++;
            }

            // 加 今天.
            resultData += newData.Tr;

            // 平均.
            resultData = resultData / rowCount;

            return(resultData);
        }
        private static void removeCommodityPrice(SQLiteDB db, CommodityPrice price)
        {
            Dictionary <string, string> id = new Dictionary <string, string>();

            id.Add("Guid", price.Guid.ToString());
            db.RemoveValueFromTable("CommodityPrice", id);
        }
示例#6
0
        /// <summary>
        /// 计算 TR
        /// </summary>
        /// <param name="context"></param>
        /// <param name="newData"></param>
        /// <returns></returns>
        private static decimal GetTrValue(MyMiniTradingSystemContext context, CommodityPrice newData)
        {
            // 查询前一天的交易数据.
            var query =
                from data in context.CommodityPrices
                where
                data.CommodityCode == newData.CommodityCode &&
                data.TradingStartDate < newData.TradingStartDate
                orderby data.TradingStartDate descending
                select data;


            CommodityPrice prevData = query.FirstOrDefault();


            // TR=∣最高价-最低价∣和∣最高价-昨收∣和∣昨收-最低价∣的最大值
            List <decimal> tempDataList = new List <decimal>();

            // 最高价-最低价
            tempDataList.Add(Math.Abs(newData.HighestPrice - newData.LowestPrice));

            if (prevData != null)
            {
                // 最高价-昨收
                tempDataList.Add(Math.Abs(newData.HighestPrice - prevData.ClosePrice));
                // 昨收-最低价
                tempDataList.Add(Math.Abs(prevData.ClosePrice - newData.LowestPrice));
            }


            return(tempDataList.Max());
        }
        private static void addPricePoint(SQLiteDB db, PricePoint point, CommodityPrice price)
        {
            Dictionary <string, string> pointFieldValues = new Dictionary <string, string>();

            pointFieldValues.Add("CommodityPriceGuid", price.Guid.ToString());
            pointFieldValues.Add("Price", point.Price.ToString());
            pointFieldValues.Add("DateTime", point.DateTime.Ticks.ToString());
            db.AddValueToTable("PricePoint", pointFieldValues);
        }
        private static void addCommodityPrice(SQLiteDB db, CommodityPrice price)
        {
            Dictionary <string, string> priceFieldValues = new Dictionary <string, string>();

            priceFieldValues.Add("Guid", price.Guid.ToString());
            priceFieldValues.Add("CommodityGuid", price.Commodity.Guid.ToString());
            priceFieldValues.Add("Type", price.Type.ToString());
            db.AddValueToTable("CommodityPrice", priceFieldValues);
        }
        public List <CommodityPrice> GetCommodityPriceList(string stockCode, DateTime startDate, DateTime finishDate)
        {
            List <CommodityPrice> resultList = new List <CommodityPrice>();

            string url = FormatUrl(stockCode, startDate, finishDate);



            try
            {
                //访问该链接
                WebRequest request = WebRequest.Create(url);
                //获得返回值
                WebResponse response = request.GetResponse();
                // 从 Internet 资源返回数据流。
                Stream s = response.GetResponseStream();

                using (StreamReader sr = new StreamReader(s, Encoding.UTF8))
                {
                    int    lineIndex = 0;
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        lineIndex++;

                        if (lineIndex == 1)
                        {
                            // 第一行是标题行, 忽略.
                            continue;
                        }

                        if (String.IsNullOrWhiteSpace(line))
                        {
                            // 只有空白, 结束.
                            break;
                        }


                        // 读取一行.
                        CommodityPrice oneResult = GetOneCommodityPriceDay(line);

                        // 加入列表.
                        resultList.Add(oneResult);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

                throw ex;
            }

            return(resultList);
        }
示例#10
0
        public override void DoProcess()
        {
            CommodityPriceService service = new CommodityPriceService();

            CommodityPrice newData = new CommodityPrice()
            {
                // 代码.
                CommodityCode = this.Code,

                // 日期.
                TradingStartDate  = this.Date,
                TradingFinishDate = this.Date,

                // 开.
                OpenPrice = this.OpenPrice,
                // 收.
                ClosePrice = this.ClosePrice,

                // 高.
                HighestPrice = this.HighestPrice,
                // 地.
                LowestPrice = this.LowestPrice,

                // 量.
                Volume = this.Volume,

                // 有效.
                IsActive = true,
            };

            bool result = service.InsertOrUpdateCommodityPrice(newData);


            if (result)
            {
                logger.Info("Success!");
            }
            else
            {
                logger.Info("Fail!");
                logger.Info(service.ResultMessage);
            }
        }
        /// <summary>
        /// 读取一行数据.
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        private CommodityPrice GetOneCommodityPriceDay(string line)
        {
            Console.WriteLine(line);

            // 数据格式:
            // var hq_str_sh601006="大秦铁路,13.41,13.69,13.07,13.69,13.05,13.06,13.07,115275247,1540387027,43400,13.06,51500,13.05,34900,13.04,187800,13.03,547600,13.02,13800,13.07,26000,13.08,19800,13.09,312424,13.10,79400,13.11,2015-04-24,11:35:42,00";


            line = line.Trim();
            int eqIndex = line.IndexOf('=');

            line = line.Substring(eqIndex + 2);
            line = line.Substring(0, line.Length - 2);


            string[] itemArray = line.Split(',');

            CommodityPrice result = new CommodityPrice()
            {
                // 日期.
                TradingStartDate  = DateTime.Today,
                TradingFinishDate = DateTime.Today,
                // 开.
                OpenPrice = Convert.ToDecimal(itemArray[1]),
                // 高.
                HighestPrice = Convert.ToDecimal(itemArray[4]),
                // 低.
                LowestPrice = Convert.ToDecimal(itemArray[5]),
                // 平.
                ClosePrice = Convert.ToDecimal(itemArray[3]),
                // 成交.
                Volume = Convert.ToInt64(itemArray[8])
            };

            return(result);
        }
        private void addPriceExecute()
        {
            CommodityPrice matchingPrice = null;

            foreach (CommodityPrice price in this.SelectedPort.Prices)
            {
                if (price.Commodity == this.SelectedCommodity && price.Type == this.SelectedType)
                {
                    matchingPrice = price;
                    break;
                }
            }

            if (matchingPrice == null)
            {
                matchingPrice = new CommodityPrice(this.SelectedCommodity, this.SelectedType);
                this.SelectedPort.Prices.Add(matchingPrice);
            }

            matchingPrice.AddPrice(this.NewPrice);

            this.SelectedCommodity = null;
            this.NewPrice          = 0;
        }
        /// <summary>
        /// 创建某用户的每日总结.
        /// </summary>
        /// <param name="userCode"></param>
        /// <returns></returns>
        public bool BuildOneUserDailySummary(string userCode, DateTime date)
        {
            bool result = false;

            try
            {
                using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext())
                {
                    // 先查询有没有仓位.
                    var pQuery =
                        from data in context.Positions
                        where
                        data.UserCode == userCode &&
                        data.Quantity > 0
                        select
                        data;


                    List <Position> userPositionList = pQuery.ToList();

                    if (userPositionList.Count == 0)
                    {
                        ResultMessage = "用户没有任何持仓!";
                        return(result);
                    }



                    List <DailySummary> newDataList = new List <DailySummary>();


                    foreach (Position userPosition in userPositionList)
                    {
                        CommodityPrice cp =
                            context.CommodityPrices.FirstOrDefault(p => p.CommodityCode == userPosition.CommodityCode && p.TradingStartDate == date);

                        if (cp == null)
                        {
                            ResultMessage = String.Format("未能检索到{0}的{1:yyyy-MM-dd}的行情数据!", userPosition.CommodityCode, date);
                            return(result);
                        }


                        DailySummary newData = new DailySummary()
                        {
                            // 用户.
                            UserCode = userCode,

                            // 商品.
                            PositionCommodityCode = userPosition.CommodityCode,

                            // 日期.
                            DailySummaryDate = date,

                            // 数量.
                            PositionQuantity = userPosition.Quantity,

                            // 收盘.
                            ClosePrice = cp.ClosePrice,

                            // 市值.
                            PositionValue = userPosition.Quantity * cp.ClosePrice,

                            // 有效.
                            IsActive = true,
                        };



                        // 止损 = 收盘 - 3ATR.
                        newData.StopLossPrice = newData.ClosePrice - 3 * cp.Atr;


                        // 取得前日数据.
                        DailySummary prevData =
                            context.DailySummarys.Where(p => p.UserCode == newData.UserCode &&
                                                        p.PositionCommodityCode == newData.PositionCommodityCode &&
                                                        p.DailySummaryDate < newData.DailySummaryDate).OrderByDescending(p => p.DailySummaryDate).FirstOrDefault();

                        if (prevData != null)
                        {
                            // 存在前日数据.
                            if (prevData.StopLossPrice > newData.StopLossPrice)
                            {
                                // 浮动止损, 只能上升,不能下降.
                                newData.StopLossPrice = prevData.StopLossPrice;
                            }
                        }


                        if (newData.ClosePrice <= newData.StopLossPrice)
                        {
                            // 当日收盘低于止损.
                            // 明日应当完成平仓操作.
                            newData.Todo = "准备平仓";
                        }



                        newData.BeforeInsertOperation();

                        newDataList.Add(newData);
                    }



                    // 先删除历史数据(如果有.)
                    var oldQuery =
                        from data in context.DailySummarys
                        where
                        data.UserCode == userCode &&
                        data.DailySummaryDate == date
                        select data;

                    List <DailySummary> oldDataList = oldQuery.ToList();
                    if (oldDataList.Count > 0)
                    {
                        context.DailySummarys.RemoveRange(oldDataList);
                    }


                    // 插入新数据.
                    context.DailySummarys.AddRange(newDataList);


                    // 保存.
                    context.SaveChanges();

                    result = true;
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);

                result        = false;
                ResultMessage = ex.Message;
            }



            return(result);
        }
        private static void removeTradingPortCommodityPrice(SQLiteDB db, TradingPort port, CommodityPrice price)
        {
            Dictionary <string, string> portPriceGuids = new Dictionary <string, string>();

            portPriceGuids.Add("TradingPortGuid", port.Guid.ToString());
            portPriceGuids.Add("CommodityPriceGuid", price.Guid.ToString());
            db.RemoveValueFromTable("TradingPortCommodityPriceTable", portPriceGuids);
        }
        public static SCDataManager Load(string path)
        {
            using (SQLiteDB db = new SQLiteDB(path))
            {
                SCDataManager dataManager = new SCDataManager();

                //Commodity
                DataTable commodityTable = db.GetDataFromTable("Commodity");
                foreach (DataRow row in commodityTable.Rows)
                {
                    Guid   guid = new Guid(row.ItemArray[0].ToString());
                    string name = row.ItemArray[1].ToString();

                    Commodity commodity = new Commodity(name, guid);
                    dataManager.Commodities.Add(commodity);
                }
                Dictionary <Guid, Commodity> commodityDict = createGuidDictionary(dataManager.Commodities);

                //TradingPort
                DataTable tradingPortTable = db.GetDataFromTable("TradingPort");
                foreach (DataRow row in tradingPortTable.Rows)
                {
                    Guid   guid = new Guid(row.ItemArray[0].ToString());
                    string name = row.ItemArray[1].ToString();

                    TradingPort port = new TradingPort(name, guid);
                    dataManager.TradingPorts.Add(port);
                }
                Dictionary <Guid, TradingPort> portDict = createGuidDictionary(dataManager.TradingPorts);

                //TradingPortComodityPrice
                DataTable portPriceTable = db.GetDataFromTable("TradingPortCommodityPrice");
                Dictionary <Guid, TradingPort> priceToPort = new Dictionary <Guid, TradingPort>();
                foreach (DataRow row in portPriceTable.Rows)
                {
                    Guid portGuid  = new Guid(row.ItemArray[0].ToString());
                    Guid priceGuid = new Guid(row.ItemArray[1].ToString());
                    priceToPort.Add(priceGuid, portDict[portGuid]);
                }

                //CommodityPrice
                DataTable             priceTable = db.GetDataFromTable("CommodityPrice");
                List <CommodityPrice> allPrices  = new List <CommodityPrice>();
                foreach (DataRow row in priceTable.Rows)
                {
                    Guid      guid          = new Guid(row.ItemArray[0].ToString());
                    Guid      commodityGuid = new Guid(row.ItemArray[1].ToString());
                    Commodity commodity     = commodityDict[commodityGuid];
                    PriceType type          = PriceTypeUtils.ConvertString(row.ItemArray[2].ToString());

                    CommodityPrice price = new CommodityPrice(commodity, type, guid);

                    TradingPort port = priceToPort[price.Guid];
                    port.Prices.Add(price);

                    allPrices.Add(price);
                }
                Dictionary <Guid, CommodityPrice> priceDict = createGuidDictionary(allPrices);

                //PricePoint
                DataTable pointTable = db.GetDataFromTable("PricePoint");
                foreach (DataRow row in pointTable.Rows)
                {
                    Guid     commodityPriceGuid = new Guid(row.ItemArray[0].ToString());
                    double   priceDouble        = (double)row.ItemArray[1];
                    DateTime dateTime           = new DateTime(Convert.ToInt64(row.ItemArray[2]));

                    CommodityPrice commodityPrice = priceDict[commodityPriceGuid];
                    commodityPrice.AddPrice(priceDouble, dateTime);
                }

                return(dataManager);
            }
        }
示例#16
0
        /// <summary>
        /// 更新每日行情.
        /// </summary>
        /// <param name="newData"></param>
        /// <returns></returns>
        public bool InsertOrUpdateCommodityPrice(CommodityPrice newData)
        {
            bool result = false;

            try
            {
                using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext())
                {
                    // 计算 Tr.
                    newData.Tr = GetTrValue(context, newData);

                    // 计算 Atr.
                    newData.Atr = GetAtrValue(context, newData);


                    // 查询数据是否已存在.
                    var query =
                        from data in context.CommodityPrices
                        where
                        data.CommodityCode == newData.CommodityCode &&
                        data.TradingStartDate == newData.TradingStartDate
                        select data;


                    CommodityPrice oldData = query.FirstOrDefault();

                    if (oldData != null)
                    {
                        // 更新.

                        // 开.
                        oldData.OpenPrice = newData.OpenPrice;
                        // 收.
                        oldData.ClosePrice = newData.ClosePrice;
                        // 高.
                        oldData.HighestPrice = newData.HighestPrice;
                        // 低.
                        oldData.LowestPrice = newData.LowestPrice;
                        // 量.
                        oldData.Volume = newData.Volume;

                        // Tr.
                        oldData.Tr = newData.Tr;
                        // ATR.
                        oldData.Atr = newData.Atr;

                        oldData.BeforeUpdateOperation();
                    }
                    else
                    {
                        // 插入.

                        newData.BeforeInsertOperation();

                        context.CommodityPrices.Add(newData);
                    }

                    // 保存.
                    context.SaveChanges();

                    result = true;
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);

                result        = false;
                ResultMessage = ex.Message;
            }



            return(result);
        }