Example #1
0
        private void TradeTest(decimal buyRate, decimal sellRate)
        {
            //
            StockPriceUtil util = new StockPriceUtil();
            // 30日前から今日までの株価情報を取得
            List <StockPriceProfile> lst = util.GetListStockPriceProfile(DateTime.Now.AddDays(-90), DateTime.Now);

            // 証券コードのDISTINCTを取得  200円以上
            var stockCodes = (from q in lst
                              where q.AdjustmentClosingPrice >= 100 & q.StockDate >= DateTime.Now.AddDays(-14)
                              select q.StockCode).Distinct();

            Boolean isBuy  = false;
            Boolean isSell = false;

            decimal           startYen    = 1000000m;
            decimal           shares      = 0m;
            decimal           prevPrice   = 0m;
            StockPriceProfile prev        = null;
            decimal           totalYen    = 0;
            decimal           upCnt       = 0;
            decimal           downCnt     = 0;
            decimal           nochangeCnt = 0;
            StringBuilder     sb          = new StringBuilder();
            StringBuilder     sb2         = new StringBuilder();



            foreach (decimal code in stockCodes)
            {
                var price = from p in lst
                            where p.StockCode == code
                            select p;


                // まずは買い
                isBuy     = true;
                isSell    = false;
                shares    = 0m;
                startYen  = 1000000m;
                prevPrice = 0m;

                // 基準日の調整後終値を基準の値にする
                decimal basePrice = price.First().AdjustmentClosingPrice;

                foreach (StockPriceProfile sp in price)
                {
                    if (isBuy)
                    {
                        // 買い
                        if (sp.AdjustmentClosingPrice <= basePrice * buyRate)
                        {
                            startYen -= 500;        // 手数料
                            shares    = Math.Floor(startYen / sp.AdjustmentClosingPrice);
                            startYen  = startYen - (sp.AdjustmentClosingPrice * shares);
                            basePrice = sp.AdjustmentClosingPrice;
                            isBuy     = false;
                            isSell    = true;
                            sb.AppendLine(sp.StockCode + "@@" + sp.CompanyName + "@@" + sp.StockDate.ToString("yyyy/MM/dd") + "@@" + "買い" + "\t" + sp.AdjustmentClosingPrice + "@@" + shares);
                        }
                    }
                    else if (isSell)
                    {
                        // 売り
                        if (sp.AdjustmentClosingPrice >= basePrice * sellRate)
                        {
                            startYen -= 500;        // 手数料
                            sb.AppendLine(sp.StockCode + "@@" + sp.CompanyName + "@@" + sp.StockDate.ToString("yyyy/MM/dd") + "@@" + "売り" + "@@" + sp.AdjustmentClosingPrice + "\t" + shares);

                            startYen  = startYen + (sp.AdjustmentClosingPrice * shares);
                            shares    = 0;
                            basePrice = sp.AdjustmentClosingPrice;
                            isBuy     = true;
                            isSell    = false;
                        }
                    }

                    prevPrice = sp.AdjustmentClosingPrice;
                    prev      = sp;
                }

                if (isSell)
                {
                    sb.AppendLine(prev.StockCode + "@@" + prev.CompanyName + "@@" + prev.StockDate.ToString("yyyy/MM/dd") + "@@" + "売り" + "@@" + prev.AdjustmentClosingPrice + "\t" + shares);
                    startYen = startYen + (prevPrice * shares);
                }

                //if (startYen > 1100000m)
                //{
                //    Console.WriteLine(code.ToString() + ":" + startYen.ToString());
                //}

                if (startYen > 1000000)
                {
                    upCnt += 1;
                }

                if (startYen == 1000000)
                {
                    nochangeCnt += 1;
                }

                if (startYen < 1000000)
                {
                    downCnt += 1;
                }

                totalYen += startYen - 1000000;

                sb2.AppendLine(prev.StockCode + "@@" + prev.CompanyName + "@@" + (startYen - 1000000));
            }
            Console.WriteLine(sb2.ToString());

            Console.WriteLine("買利率:" + "\t" + buyRate + "\t" + " 売利率:" + "\t" + sellRate + "\t" + " 損益合計:" + "\t" + totalYen + "\t" + " 上昇:" + "\t" + upCnt + "\t" + " 減少:" + "\t" + downCnt + "\t" + " 変更無し:" + "\t" + nochangeCnt);
            this.txtTrade.Text += "買利率:" + "\t" + buyRate + "\t" + " 売利率:" + "\t" + sellRate + "\t" + " 損益合計:" + "\t" + totalYen + "\t" + " 上昇:" + "\t" + upCnt + "\t" + " 減少:" + "\t" + downCnt + "\t" + " 変更無し:" + "\t" + nochangeCnt;

            //var sellrates = new[] { 1, 2, 3 };
            //var buyrates = new[] { 9, 8, 7 };

            //var rates = sellrates.SelectMany(
            //    sellrate => buyrates,
            //    (sellrate, buyrate) => new { Sellrate = sellrate, Buyrate = buyrate });

            //foreach (var rate in rates)
            //{
            //    Console.WriteLine(rate.Sellrate + " " + rate.Buyrate);
            //}
        }
Example #2
0
        private void btnTest_Click(object sender, EventArgs e)
        {
            StockPriceUtil util = new StockPriceUtil();
            // 20日前から今日までの株価情報を取得
            List <StockPriceProfile> lst = util.GetListStockPriceProfile(DateTime.Now.AddDays(-20), DateTime.Now);

            // 証券コードのDISTINCTを取得
            var stockCodes = (from q in lst
                              select q.StockCode).Distinct();


            foreach (decimal code in stockCodes)
            {
                // 証券コードでループ処理
                // 11件以上データが無い場合は飛ばす
                var cnt = (from t in lst
                           where t.StockCode == code
                           select t).Count();

                if (cnt < 11)
                {
                    continue;
                }

                // 1) 日付の降順に並べ3件スキップした10件分のデータの出来高の平均値を取得
                var average = (from t in lst
                               where t.StockCode == code
                               orderby t.StockDate descending
                               select t.TradeVolume).Skip(3).Take(10).Average();

                // 2) 日付の降順に並べ3件分のデータを取得
                var query2 = (from t in lst
                              where t.StockCode == code
                              orderby t.StockDate descending
                              select t).Take(3);

                // 3) 3日間の出来高が平均の1.5倍以上であるものを抽出
                var query3 = from t in query2
                             where t.TradeVolume >= (average * 1.5m)
                             orderby t.StockDate ascending
                             select t;


                if (query3.Count() == 3)
                {
                    int     up     = 0;
                    int     down   = 0;
                    decimal price  = query3.FirstOrDefault().AdjustmentClosingPrice;
                    decimal volume = query3.FirstOrDefault().TradeVolume;
                    // 4) 3日間の株価の終値が連続して上昇
                    foreach (StockPriceProfile q in query3)
                    {
                        if (q.AdjustmentClosingPrice > price && q.TradeVolume > volume)
                        {
                            // 上昇
                            up++;
                        }

                        if (q.AdjustmentClosingPrice < price && q.TradeVolume < volume)
                        {
                            // 下落
                            down++;
                        }

                        price  = q.AdjustmentClosingPrice;
                        volume = q.TradeVolume;
                    }

                    if (up == 2)
                    {
                        Console.WriteLine(String.Format("【上昇】{0} {1}", query2.FirstOrDefault().StockCode, query2.FirstOrDefault().CompanyName));
                    }

                    if (down == 2)
                    {
                        Console.WriteLine(String.Format("【下落】{0} {1}", query2.FirstOrDefault().StockCode, query2.FirstOrDefault().CompanyName));
                    }

                    //if (up != 2 && down != 2)
                    //{
                    //    Console.WriteLine(String.Format("【どっちでもない】{0} {1}", query2.FirstOrDefault().StockCode, query2.FirstOrDefault().CompanyName));
                    //}
                }
            }
        }