• R/O
  • SSH
  • HTTPS

protra: Commit


Commit MetaInfo

Revision538 (tree)
Time2018-12-23 22:04:25
Authorpanacoran

Log Message

k-db.comがサービスを終了したのでデータソースから削除する

* Protra.Lib/Protra.Lib.csproj: KdbComUpdator.csを削除する
* Protra.Lib/Update/KdbComUpdator.cs: 削除
* Protra.Lib/Update/PriceDataUpdator.cs (PriceDataUpdator.PriceDataSource): PriceDataSource.KdbComを削除
(PriceDataUpdator.Create): 同上
(PriceDataUpdator.GetDescription): 同上
(PriceDataUpdator.DataSourceNames): 株価データダウンロードサイトを削除

Change Summary

Incremental Difference

--- protra/trunk/ChangeLog.txt (revision 537)
+++ protra/trunk/ChangeLog.txt (revision 538)
@@ -1,5 +1,16 @@
11 2018-12-23 panacoran <panacoran@users.osdn.me>
22
3+ k-db.comがサービスを終了したのでデータソースから削除する
4+
5+ * Protra.Lib/Protra.Lib.csproj: KdbComUpdator.csを削除する
6+ * Protra.Lib/Update/KdbComUpdator.cs: 削除
7+ * Protra.Lib/Update/PriceDataUpdator.cs (PriceDataUpdator.PriceDataSource): PriceDataSource.KdbComを削除
8+ (PriceDataUpdator.Create): 同上
9+ (PriceDataUpdator.GetDescription): 同上
10+ (PriceDataUpdator.DataSourceNames): 株価データダウンロードサイトを削除
11+
12+2018-12-23 panacoran <panacoran@users.osdn.me>
13+
314 Yahooから株価を取得できないのを直す
415
516 * Protra.Lib/Update/YahooFinanceUpdator.cs (YahooFinanceUpdator.YahooFinanceUpdator): HTTPSで使うプロトコルにTLS1.2を指定する
--- protra/trunk/Protra.Lib/Update/KdbComUpdator.cs (revision 537)
+++ protra/trunk/Protra.Lib/Update/KdbComUpdator.cs (nonexistent)
@@ -1,263 +0,0 @@
1-// Copyright(C) 2008, 2010, 2011, 2013 panacorn <panacoran@users.sourceforge.jp>
2-//
3-// This program is part of Protra.
4-//
5-// Protra is free software: you can redistribute it and/or modify it
6-// under the terms of the GNU General Public License as published by
7-// the Free Software Foundation, either version 3 of the License, or
8-// (at your option) any later version.
9-//
10-// This program is distributed in the hope that it will be useful,
11-// but WITHOUT ANY WARRANTY; without even the implied warranty of
12-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13-// GNU General Public License for more details.
14-//
15-// You should have received a copy of the GNU General Public License
16-// along with this program; if not, see <http://www.gnu.org/licenses/>.
17-//
18-// $Id$
19-
20-using System;
21-using System.Collections.Generic;
22-using System.ComponentModel;
23-using System.IO;
24-using System.Text;
25-using Protra.Lib.Data;
26-
27-namespace Protra.Lib.Update
28-{
29- /// <summary>
30- /// 株価データダウンロードサイトを利用して株価データの更新を行うクラス。
31- /// </summary>
32- public class KdbComUpdator : PriceDataUpdator
33- {
34- /// <summary>
35- /// データが存在する最初の日付を取得する。
36- /// </summary>
37- public override DateTime DataSince
38- {
39- get { return new DateTime(2007, 1, 4); }
40- }
41-
42- /// <summary>
43- /// 新しいデータが置かれる時刻に達しているか。
44- /// </summary>
45- /// <param name="time">時刻</param>
46- /// <returns></returns>
47- protected override bool IsDataAvailable(DateTime time)
48- {
49- return time.Hour >= 16;
50- }
51-
52- /// <summary>
53- /// データのURLを取得する。
54- /// </summary>
55- /// <returns>URL</returns>
56- protected override string DownloadUrl(DateTime date)
57- {
58- return string.Format("http://k-db.com/stocks/{0:yyyy-MM-dd}?download=csv", date);
59- }
60-
61- private readonly Dictionary<DateTime, double> _marketVolume = new Dictionary<DateTime, double>();
62- private readonly Dictionary<DateTime, Price> _nikkei225 = new Dictionary<DateTime, Price>();
63- private readonly Dictionary<DateTime, Price> _topix = new Dictionary<DateTime, Price>();
64-
65- /// <summary>
66- /// 日経平均とTOPIXのデータを取得する。
67- /// </summary>
68- /// <param name="worker">BackgroundWorker</param>
69- /// <param name="begin">最初の日付</param>
70- /// <param name="end">最後の日付</param>
71- protected override void GetIndices(BackgroundWorker worker, DateTime begin, DateTime end)
72- {
73- GetMarketVolume(worker, begin, end);
74- GetIndexValues(worker, begin, end);
75- }
76-
77- private void GetMarketVolume(BackgroundWorker worker, DateTime begin, DateTime end)
78- {
79- for (var year = begin.Year; year <= end.Year; year++)
80- {
81- var span = end.Year - begin.Year;
82- worker.ReportProgress(span == 0 ? 0 : (year - begin.Year) * 100 / span,
83- string.Format("市場統計: {0:D}年", year));
84- var dl = new DownloadUtil(string.Format("http://k-db.com/statistics/T1?year={0:D}&download=csv", year));
85- var stream = dl.GetResponse();
86- if (stream == null)
87- throw new ApplicationException("市場統計データの読み込みに失敗しました。");
88- using (var reader = new StreamReader(stream, Encoding.GetEncoding("shift_jis")))
89- {
90- string line;
91- while ((line = reader.ReadLine()) != null)
92- {
93- var tokens = line.Split(',');
94- switch (tokens[0])
95- {
96- case "東証1部":
97- case "日付":
98- continue;
99- }
100- try
101- {
102- var date = DateTime.Parse(tokens[0]);
103- var volume = Math.Round(double.Parse(tokens[1]) / 1000); // 無尽蔵に合わせるため丸める。
104- _marketVolume[date] = volume;
105- }
106- catch (FormatException e)
107- {
108- throw new ApplicationException("市場統計データの読み込みに失敗しました:\r\n" + e.Message);
109- }
110- }
111- }
112- }
113- worker.ReportProgress(100, "");
114- }
115-
116- private void GetIndexValues(BackgroundWorker worker, DateTime begin, DateTime end)
117- {
118- for (var year = begin.Year; year <= end.Year; year++)
119- {
120- var span = end.Year - begin.Year;
121- worker.ReportProgress(span == 0 ? 0 : (year - begin.Year) * 100 / span,
122- string.Format("指数: {0:D}年", year));
123- foreach (var kdbCode in new[] {"I101", "I102"})
124- {
125- var dl = new DownloadUtil(string.Format(
126- "http://k-db.com/indices/{0}?year={1:D}&download=csv", kdbCode, year));
127- var stream = dl.GetResponse();
128- if (stream == null)
129- throw new ApplicationException("指数の読み込みに失敗しました。");
130- var prices = kdbCode == "I101" ? _nikkei225 : _topix;
131- var code = kdbCode == "I101" ? "1001" : "1002";
132- using (var reader = new StreamReader(stream, Encoding.GetEncoding("shift_jis")))
133- {
134- string line;
135- while ((line = reader.ReadLine()) != null)
136- {
137- var tokens = line.Split(',');
138- if (tokens.Length != 5)
139- continue;
140- if (tokens[0] == "日付")
141- continue;
142- var date = DateTime.Parse(tokens[0]);
143- prices[date] = new Price
144- {
145- Date = date,
146- Code = code,
147- Open = (int)double.Parse(tokens[1]),
148- High = (int)double.Parse(tokens[2]),
149- Low = (int)double.Parse(tokens[3]),
150- Close = (int)double.Parse(tokens[4]),
151- Volume = _marketVolume[date]
152- };
153- }
154- }
155- }
156- }
157- worker.ReportProgress(100, "");
158- }
159-
160- /// <summary>
161- /// 日経平均とTOPIXのデータを挿入する。
162- /// </summary>
163- /// <param name="date">日付</param>
164- /// <param name="prices">Priceのリスト</param>
165- protected override void InsertIndices(DateTime date, IDictionary<string, Price> prices)
166- {
167- prices.Add(_nikkei225[date].Code, _nikkei225[date]);
168- prices.Add(_topix[date].Code, _topix[date]);
169- }
170-
171- /// <summary>
172- /// 文字列に含まれるデータを格納したオブジェクトを返す。
173- /// </summary>
174- /// <param name="line">文字列を指定する。</param>
175- /// <param name="date">日付</param>
176- /// <returns>オブジェクト</returns>
177- protected override Price ParseLine(string line, DateTime date)
178- {
179- var tokens = line.Split(',');
180- var r = new Price();
181- try
182- {
183- if (tokens.Length != 9 || tokens[0].Length != 6)
184- return null;
185- r.Code = tokens[0].Substring(0, 4);
186- switch (tokens[2])
187- {
188- case "市場":
189- return null;
190- case "東証":
191- case "東証1部":
192- r.Market = "T1";
193- break;
194- case "東証2部":
195- r.Market = "T2";
196- break;
197- case "東証マザーズ":
198- case "東証マザーズ外国":
199- r.Market = "M";
200- break;
201- case "東証TPM":
202- return null;
203- case "東証1部外国":
204- r.Market = "T1";
205- break;
206- case "東証2部外国":
207- r.Market = "T2";
208- break;
209- case "大証":
210- case "大証1部":
211- r.Market = "O1";
212- break;
213- case "大証2部":
214- r.Market = "O2";
215- break;
216- case "東証JQグロース":
217- case "東証JQスタンダード":
218- case "東証JQスタンダード外国":
219- case "JQ":
220- case "JQスタンダード":
221- case "JQスタンダード外国":
222- case "JQグロース":
223- case "JQNEO":
224- r.Market = "J";
225- break;
226- case "HCスタンダード":
227- case "HCスタンダード外国":
228- case "HCグロース":
229- r.Market = "H";
230- break;
231- case "福証":
232- case "福証Q-Board":
233- case "札証":
234- case "札証アンビシャス":
235- case "名証":
236- return null;
237- default:
238- throw new ApplicationException(tokens[1] + ": 不明な市場名です。");
239- }
240- r.Date = date;
241- r.Open = (int)ParseField(tokens[3]);
242- r.High = (int)ParseField(tokens[4]);
243- r.Low = (int)ParseField(tokens[5]);
244- r.Close = (int)ParseField(tokens[6]);
245- r.Volume = ParseField(tokens[7]) / 1000;
246- }
247- catch (FormatException)
248- {
249- throw new ApplicationException("データ形式に異常があります。");
250- }
251- return r;
252- }
253-
254- private static double ParseField(string s)
255- {
256- // 空文字列を0として扱う。
257- if (s == "")
258- return 0;
259- // 指数の値に小数が含まれているのでdouble.Parseを利用する。
260- return double.Parse(s);
261- }
262- }
263-}
\ No newline at end of file
Deleted: svn:keywords
## -1 +0,0 ##
-Id
\ No newline at end of property
--- protra/trunk/Protra.Lib/Update/PriceDataUpdator.cs (revision 537)
+++ protra/trunk/Protra.Lib/Update/PriceDataUpdator.cs (revision 538)
@@ -1,4 +1,4 @@
1-// Copyright (C) 2005-2008, 2010-2013 panacorn <panacoran@users.sourceforge.jp>
1+// Copyright (C) 2005-2008, 2010-2013, 2018 panacorn <panacoran@users.sourceforge.jp>
22 //
33 // This program is part of Protra.
44 //
@@ -44,11 +44,6 @@
4444 Mujinzou,
4545
4646 /// <summary>
47- /// 株価データダウンロードサイト
48- /// </summary>
49- KdbCom,
50-
51- /// <summary>
5247 /// Yahoo!ファイナンス
5348 /// </summary>
5449 YahooFinance
@@ -79,7 +74,7 @@
7974 /// </summary>
8075 public string Referer
8176 {
82- set { _request.Referer = value; }
77+ set => _request.Referer = value;
8378 }
8479
8580 /// <summary>
@@ -87,7 +82,7 @@
8782 /// </summary>
8883 public DateTime IfModifiedSince
8984 {
90- set { _request.IfModifiedSince = value; }
85+ set => _request.IfModifiedSince = value;
9186 }
9287
9388 /// <summary>
@@ -109,6 +104,7 @@
109104 return null;
110105 throw;
111106 }
107+
112108 return null;
113109 }
114110
@@ -142,6 +138,7 @@
142138 extractor.ExtractFile(0, stream);
143139 }
144140 }
141+
145142 File.Delete(dst);
146143 stream.Seek(0, SeekOrigin.Begin);
147144 return stream;
@@ -236,7 +233,7 @@
236233 _prevDays = _days;
237234 _prevProgress = progress;
238235 _prevTicks = DateTime.Now.Ticks;
239- var message = String.Format("{0:d} ({1}/{2}) ", date, _days + 1, NumDays) + LeftTime();
236+ var message = $"{date:d} ({_days + 1}/{NumDays}) " + LeftTime();
240237 worker.ReportProgress(progress, message);
241238 }
242239
@@ -259,9 +256,11 @@
259256 s += " " + (leftTime / 3600) + " 時間";
260257 leftTime %= 3600;
261258 }
259+
262260 if (leftTime > 0)
263261 s += " " + ((leftTime + 59) / 60) + " 分"; // 切り上げ
264262 }
263+
265264 return s;
266265 }
267266
@@ -278,6 +277,7 @@
278277 var leftRecords = RecordsPerDay - _daily + (NumDays - _days - 1) * RecordsPerDay;
279278 leftTicks += ticksForRecords / _total * leftRecords;
280279 }
280+
281281 return (int)(leftTicks / 10000000);
282282 }
283283 }
@@ -308,6 +308,7 @@
308308 if (Calendar.IsMarketOpen(d))
309309 result.Add(d);
310310 }
311+
311312 return result;
312313 }
313314
@@ -326,9 +327,6 @@
326327 case PriceDataSource.Mujinzou:
327328 r = new MujinzouUpdator();
328329 break;
329- case PriceDataSource.KdbCom:
330- r = new KdbComUpdator();
331- break;
332330 case PriceDataSource.YahooFinance:
333331 r = new YahooFinanceUpdator();
334332 break;
@@ -335,6 +333,7 @@
335333 default:
336334 return null;
337335 }
336+
338337 return r;
339338 }
340339
@@ -341,19 +340,12 @@
341340 /// <summary>
342341 /// データソースの名前の一覧を取得する。
343342 /// </summary>
344- public static string[] DataSourceNames
343+ public static string[] DataSourceNames => new[]
345344 {
346- get
347- {
348- return new[]
349- {
350- "株価情報",
351- "無尽蔵",
352- "株価データダウンロードサイト",
353- "Yahoo!ファイナンス"
354- };
355- }
356- }
345+ "株価情報",
346+ "無尽蔵",
347+ "Yahoo!ファイナンス"
348+ };
357349
358350 /// <summary>
359351 /// データソースの説明を取得する。
@@ -368,11 +360,10 @@
368360 return "2000年からのデータを取得できますが、2005年までは大証のデータがありません。";
369361 case PriceDataSource.Mujinzou:
370362 return "1996年からのデータを取得できます。";
371- case PriceDataSource.KdbCom:
372- return "2007年からのデータを取得できます。";
373363 case PriceDataSource.YahooFinance:
374364 return "1991年からのデータを取得できますが、非常に時間がかかります。";
375365 }
366+
376367 return "";
377368 }
378369
@@ -395,6 +386,7 @@
395386 e.Cancel = true;
396387 return;
397388 }
389+
398390 UpdatePrice(worker, e);
399391 worker.ReportProgress(100, "");
400392 }
@@ -435,11 +427,13 @@
435427 PriceData.CloseAll();
436428 return;
437429 }
430+
438431 if (stream == null)
439432 {
440433 _progress.NumDays--;
441434 continue;
442435 }
436+
443437 using (var reader = new StreamReader(stream, Encoding.GetEncoding("shift_jis")))
444438 {
445439 string line;
@@ -455,6 +449,7 @@
455449 }
456450 }
457451 }
452+
458453 _progress.RecordsPerDay = prices.Count;
459454 foreach (var price in prices.Values)
460455 {
@@ -464,13 +459,16 @@
464459 PriceData.CloseAll();
465460 return;
466461 }
462+
467463 PriceData.Add(price, date == end);
468464 _progress.IncrementRecords();
469465 _progress.Show(worker, date);
470466 }
467+
471468 PriceData.MaxDate = date;
472469 _progress.IncrementDays();
473470 }
471+
474472 PriceData.CloseAll();
475473 }
476474
Show on old repository browser