/// <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); }
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); } }
/// <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); }
/// <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); }
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); } }
/// <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); }