/// <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);
                }
            }
        }
Example #2
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 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;
            }
        }
Example #4
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());
        }
        /// <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);
        }
Example #6
0
        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);
        }
Example #8
0
        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);
        }
Example #12
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);
        }