/// <summary> /// 查询. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnQuery_Click(object sender, EventArgs e) { string code = this.cboItem.Text; DateTime startDt = this.dtpStart.Value; DateTime finishDt = this.dtpFinish.Value; using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { var query = from data in context.DailySummarys where data.UserCode == DefaultUserCode && data.PositionCommodityCode == code && data.DailySummaryDate >= startDt && data.DailySummaryDate <= finishDt orderby data.DailySummaryDate select data; chart1.Series["ClosePrice"].Points.Clear(); chart1.Series["StopLossPrice"].Points.Clear(); foreach (var data in query) { chart1.Series["ClosePrice"].Points.AddXY(data.DailySummaryDate.ToShortDateString(), data.ClosePrice); chart1.Series["StopLossPrice"].Points.AddXY(data.DailySummaryDate.ToShortDateString(), data.StopLossPrice); } } }
/// <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 void FormDailySummary_Load(object sender, EventArgs e) { using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { var groupQuery = from data in context.DailySummarys where data.UserCode == DefaultUserCode group data by data.PositionCommodityCode; foreach (var group in groupQuery) { this.cboItem.Items.Add(group.Key); } var dateQuery = from data in context.DailySummarys where data.UserCode == DefaultUserCode orderby data.DailySummaryDate select data; DailySummary firstData = dateQuery.FirstOrDefault(); if (firstData != null) { this.dtpStart.Value = firstData.DailySummaryDate; this.dtpStart.MinDate = firstData.DailySummaryDate; } this.dtpFinish.Value = DateTime.Today; this.dtpFinish.MaxDate = DateTime.Today; } }
/// <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()); }
/// <summary> /// 创建仓位. /// </summary> /// <param name="newData"></param> /// <returns></returns> public bool OpenPosition(Position newData) { bool result = false; try { using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { // 查询数据是否已存在. var query = from data in context.Positions where data.CommodityCode == newData.CommodityCode && data.UserCode == newData.UserCode select data; Position oldData = query.FirstOrDefault(); if (oldData != null) { // 更新. oldData.Quantity = oldData.Quantity + newData.Quantity; oldData.BeforeUpdateOperation(); } else { // 新增. newData.BeforeInsertOperation(); context.Positions.Add(newData); } // 保存. context.SaveChanges(); result = true; } } catch (Exception ex) { logger.Error(ex.Message, ex); result = false; ResultMessage = ex.Message; } return(result); }
private void FormDailySummaryValue_Load(object sender, EventArgs e) { using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { var groupQuery = from data in context.DailySummarys where data.UserCode == DefaultUserCode group data by data.PositionCommodityCode; foreach (var group in groupQuery) { // Create a data series Series series1 = new Series() { // 名称. Name = group.Key, // 类型. ChartType = SeriesChartType.StackedArea, // 显示数值. IsValueShownAsLabel = true, }; // Add series to the chart this.chart1.Series.Add(series1); } var dateQuery = from data in context.DailySummarys where data.UserCode == DefaultUserCode orderby data.DailySummaryDate select data; DailySummary firstData = dateQuery.FirstOrDefault(); if (firstData != null) { this.dtpStart.Value = firstData.DailySummaryDate; this.dtpStart.MinDate = firstData.DailySummaryDate; } this.dtpFinish.Value = DateTime.Today; this.dtpFinish.MaxDate = DateTime.Today; } }
/// <summary> /// 插入商品信息. /// </summary> /// <param name="newData"></param> /// <returns></returns> public bool CreateTradableCommodity(TradableCommodity newData) { bool result = false; try { using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { // 查询数据是否已存在. var query = from data in context.TradableCommoditys where data.CommodityCode == newData.CommodityCode select data; if (query.Count() > 0) { ResultMessage = String.Format("代码为{0}的商品已存在!", newData.CommodityCode); return(result); } newData.BeforeInsertOperation(); context.TradableCommoditys.Add(newData); context.SaveChanges(); result = true; } } catch (Exception ex) { logger.Error(ex.Message, ex); result = false; ResultMessage = ex.Message; } return(result); }
static void Main(string[] args) { // 当 Code First 与数据库结构不一致时 // 自动升级到最新的版本. Database.SetInitializer(new MigrateDatabaseToLatestVersion <MyMiniTradingSystemContext, MyMiniTradingSystem.Migrations.Configuration>()); using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { var query = from data in context.TradableCommoditys select data; foreach (var item in query) { Console.WriteLine(item.CommodityCode); } Console.WriteLine("Finish !!!"); Console.ReadLine(); } }
/// <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); }
/// <summary> /// 更新每日总结. /// </summary> /// <param name="newData"></param> /// <returns></returns> public bool InsertOrUpdateDailySummary(DailySummary newData) { bool result = false; try { using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { // 查询数据是否已存在. var query = from data in context.DailySummarys where data.PositionCommodityCode == newData.PositionCommodityCode && data.UserCode == newData.UserCode && data.DailySummaryDate == newData.DailySummaryDate select data; DailySummary oldData = query.FirstOrDefault(); if (oldData != null) { // 更新. // 数量. oldData.PositionQuantity = newData.PositionQuantity; // 收. oldData.ClosePrice = newData.ClosePrice; // 市值. oldData.PositionValue = newData.PositionValue; // 止损. oldData.StopLossPrice = newData.StopLossPrice; oldData.BeforeUpdateOperation(); } else { // 插入. newData.BeforeInsertOperation(); context.DailySummarys.Add(newData); } // 保存. context.SaveChanges(); result = true; } } catch (Exception ex) { logger.Error(ex.Message, ex); result = false; ResultMessage = ex.Message; } return(result); }
/// <summary> /// 平仓. /// </summary> /// <param name="newData"></param> /// <returns></returns> public bool ClosePosition(Position newData) { bool result = false; try { using (MyMiniTradingSystemContext context = new MyMiniTradingSystemContext()) { // 查询数据是否已存在. var query = from data in context.Positions where data.CommodityCode == newData.CommodityCode && data.UserCode == newData.UserCode select data; Position oldData = query.FirstOrDefault(); if (oldData != null) { // 更新. if (oldData.Quantity < newData.Quantity) { ResultMessage = String.Format("仓位只有{0},无法平仓{1}。", oldData.Quantity, newData.Quantity); return(result); } oldData.Quantity = oldData.Quantity - newData.Quantity; oldData.BeforeUpdateOperation(); } else { // 数据不存在. ResultMessage = "没有相关的仓位可供平仓。"; return(result); } // 保存. context.SaveChanges(); result = true; } } catch (Exception ex) { logger.Error(ex.Message, ex); result = false; ResultMessage = ex.Message; } return(result); }
/// <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); }