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