PriceDataUpdatorのサブクラスに継承で日付を渡すのをやめる
* Protra.Lib/Update/KabukaJohoUpdator.cs (KabukaJohoUpdator.DownloadUrl): 日付を引数に取る。
(KabukaJohoUpdator.ParseLine): 同上。
* Protra.Lib/Update/KdbComUpdator.cs: 同上。
* Protra.Lib/Update/MujinzouUpdator.cs: 同上。
* Protra.Lib/Update/PriceDataUpdator.cs (PriceDataUpdator.Date): 削除。
(PriceDataUpdator.EndDate): 削除。
(PriceDataUpdator.NextDate): 日付を引数に取る。
(PriceDataUpdator.DownloadUrl): 同上。
(PriceDataUpdator.ParseLine): 同上。
(PriceDataUpdator.UpdatePrice): DateとEndDateの削除に対応する。
* Protra.Lib/Update/YahooFinanceUpdator.cs: (YahooFinanceUpdator.UpdatePrice): DateとEndDateの削除に対応する。
(YahooFinanceUpdator.DoFetchPrice): Dateの削除に対応する。
(YahooFinanceUpdator.GetPage): 同上。
@@ -1,3 +1,21 @@ | ||
1 | +2014-04-13 panacoran <panacoran@users.sourceforge.jp> | |
2 | + | |
3 | + PriceDataUpdatorのサブクラスに継承で日付を渡すのをやめる | |
4 | + | |
5 | + * Protra.Lib/Update/KabukaJohoUpdator.cs (KabukaJohoUpdator.DownloadUrl): 日付を引数に取る。 | |
6 | + (KabukaJohoUpdator.ParseLine): 同上。 | |
7 | + * Protra.Lib/Update/KdbComUpdator.cs: 同上。 | |
8 | + * Protra.Lib/Update/MujinzouUpdator.cs: 同上。 | |
9 | + * Protra.Lib/Update/PriceDataUpdator.cs (PriceDataUpdator.Date): 削除。 | |
10 | + (PriceDataUpdator.EndDate): 削除。 | |
11 | + (PriceDataUpdator.NextDate): 日付を引数に取る。 | |
12 | + (PriceDataUpdator.DownloadUrl): 同上。 | |
13 | + (PriceDataUpdator.ParseLine): 同上。 | |
14 | + (PriceDataUpdator.UpdatePrice): DateとEndDateの削除に対応する。 | |
15 | + * Protra.Lib/Update/YahooFinanceUpdator.cs: (YahooFinanceUpdator.UpdatePrice): DateとEndDateの削除に対応する。 | |
16 | + (YahooFinanceUpdator.DoFetchPrice): Dateの削除に対応する。 | |
17 | + (YahooFinanceUpdator.GetPage): 同上。 | |
18 | + | |
1 | 19 | 2014-04-10 panacoran <panacoran@users.sourceforge.jp> |
2 | 20 | |
3 | 21 | 株価データ更新の進捗の計算をProgressクラスに分離する |
@@ -289,20 +289,10 @@ | ||
289 | 289 | private readonly Progress _progress = new Progress(); |
290 | 290 | |
291 | 291 | /// <summary> |
292 | - /// 処理中の日付を取得または設定する。 | |
293 | - /// </summary> | |
294 | - protected DateTime Date { get; set; } | |
295 | - | |
296 | - /// <summary> | |
297 | - /// 処理すべき最後の日付を取得または設定する。 | |
298 | - /// </summary> | |
299 | - protected DateTime EndDate { get; set; } | |
300 | - | |
301 | - /// <summary> | |
302 | 292 | /// データのURLを取得する。 |
303 | 293 | /// </summary> |
304 | 294 | /// <returns>URL</returns> |
305 | - protected abstract string DownloadUrl { get; } | |
295 | + protected abstract string DownloadUrl(DateTime date); | |
306 | 296 | |
307 | 297 | /// <summary> |
308 | 298 | /// 処理を開始終了する日付を営業日に調節し、その間の営業日数を数える。 |
@@ -337,12 +327,13 @@ | ||
337 | 327 | /// <summary> |
338 | 328 | /// 日付を次の市場が開いている日に進める。 |
339 | 329 | /// </summary> |
340 | - protected void NextDate() | |
330 | + protected DateTime NextDate(DateTime date) | |
341 | 331 | { |
342 | 332 | do |
343 | 333 | { |
344 | - Date = Date.AddDays(1); | |
345 | - } while (!Calendar.IsMarketOpen(Date) && Date < EndDate); | |
334 | + date = date.AddDays(1); | |
335 | + } while (!Calendar.IsMarketOpen(date)); | |
336 | + return date; | |
346 | 337 | } |
347 | 338 | |
348 | 339 | /// <summary> |
@@ -449,10 +440,10 @@ | ||
449 | 440 | end = end.AddDays(-1); |
450 | 441 | _progress.NumDays = AdjustedDate(ref begin, ref end); |
451 | 442 | _progress.Start(); |
452 | - for (Date = begin, EndDate = end; Date <= EndDate; NextDate()) | |
443 | + for (var date = begin; date <= end; date = NextDate(date)) | |
453 | 444 | { |
454 | - _progress.Show(worker, Date); | |
455 | - var dl = new DownloadUtil(DownloadUrl); | |
445 | + _progress.Show(worker, date); | |
446 | + var dl = new DownloadUtil(DownloadUrl(date)); | |
456 | 447 | _progress.StartDownload(); |
457 | 448 | var prices = new List<Price>(); |
458 | 449 | using (var stream = dl.DownloadAndExtract()) |
@@ -475,7 +466,7 @@ | ||
475 | 466 | Price prev = null; |
476 | 467 | while ((line = reader.ReadLine()) != null) |
477 | 468 | { |
478 | - var tmp = ParseLine(line); | |
469 | + var tmp = ParseLine(line, date); | |
479 | 470 | if (tmp == null) |
480 | 471 | continue; |
481 | 472 | if (prev == null) |
@@ -506,11 +497,11 @@ | ||
506 | 497 | PriceData.CloseAll(); |
507 | 498 | return; |
508 | 499 | } |
509 | - PriceData.Add(price, Date == EndDate); | |
500 | + PriceData.Add(price, date == end); | |
510 | 501 | _progress.IncrementRecords(); |
511 | - _progress.Show(worker, Date); | |
502 | + _progress.Show(worker, date); | |
512 | 503 | } |
513 | - PriceData.MaxDate = Date; | |
504 | + PriceData.MaxDate = date; | |
514 | 505 | _progress.IncrementDays(); |
515 | 506 | } |
516 | 507 | PriceData.CloseAll(); |
@@ -527,7 +518,8 @@ | ||
527 | 518 | /// 文字列を解析して価格データを返す。 |
528 | 519 | /// </summary> |
529 | 520 | /// <param name="line">文字列</param> |
521 | + /// <param name="date">日付</param> | |
530 | 522 | /// <returns>価格データ</returns> |
531 | - protected abstract Price ParseLine(string line); | |
523 | + protected abstract Price ParseLine(string line, DateTime date); | |
532 | 524 | } |
533 | 525 | } |
\ No newline at end of file |
@@ -49,15 +49,12 @@ | ||
49 | 49 | /// データのURLを取得する。 |
50 | 50 | /// </summary> |
51 | 51 | /// <returns>URL</returns> |
52 | - protected override string DownloadUrl | |
52 | + protected override string DownloadUrl(DateTime date) | |
53 | 53 | { |
54 | - get | |
55 | - { | |
56 | 54 | return "http://www.edatalab.net/kabu/data" + |
57 | - Date.ToString((Date.Year < 2006) | |
55 | + date.ToString((date.Year < 2006) | |
58 | 56 | ? "yyyy/yyyyMMdd" |
59 | 57 | : "yyyy/DyyMMdd") + ".LZH"; |
60 | - } | |
61 | 58 | } |
62 | 59 | |
63 | 60 | /// <summary> |
@@ -64,8 +61,9 @@ | ||
64 | 61 | /// 文字列を解析して価格データを返す。 |
65 | 62 | /// </summary> |
66 | 63 | /// <param name="line">文字列</param> |
64 | + /// <param name="date">日付</param> | |
67 | 65 | /// <returns>価格データ</returns> |
68 | - protected override Price ParseLine(string line) | |
66 | + protected override Price ParseLine(string line, DateTime date) | |
69 | 67 | { |
70 | 68 | var tokens = line.Split(','); |
71 | 69 | var r = new Price(); |
@@ -76,9 +76,9 @@ | ||
76 | 76 | /// データのURLを取得する。 |
77 | 77 | /// </summary> |
78 | 78 | /// <returns>URL</returns> |
79 | - protected override string DownloadUrl | |
79 | + protected override string DownloadUrl(DateTime date) | |
80 | 80 | { |
81 | - get { return "http://k-db.com/site/download.aspx?p=all&download=csv&date=" + Date.ToString("yyyy-MM-dd"); } | |
81 | + return "http://k-db.com/site/download.aspx?p=all&download=csv&date=" + date.ToString("yyyy-MM-dd"); | |
82 | 82 | } |
83 | 83 | |
84 | 84 | private Dictionary<DateTime, double> _indexVolume; |
@@ -113,8 +113,9 @@ | ||
113 | 113 | /// 文字列に含まれるデータを格納したオブジェクトを返す。 |
114 | 114 | /// </summary> |
115 | 115 | /// <param name="line">文字列を指定する。</param> |
116 | + /// <param name="date">日付</param> | |
116 | 117 | /// <returns>オブジェクト</returns> |
117 | - protected override Price ParseLine(string line) | |
118 | + protected override Price ParseLine(string line, DateTime date) | |
118 | 119 | { |
119 | 120 | var tokens = line.Split(','); |
120 | 121 | var r = new Price(); |
@@ -124,7 +125,7 @@ | ||
124 | 125 | { |
125 | 126 | r.Code = tokens[0] == "67" ? "1001" : "1002"; |
126 | 127 | r.Market = "T1"; |
127 | - r.Volume = _indexVolume[Date]; | |
128 | + r.Volume = _indexVolume[date]; | |
128 | 129 | } |
129 | 130 | else if (tokens[0].Length == 6) |
130 | 131 | { |
@@ -182,7 +183,7 @@ | ||
182 | 183 | } |
183 | 184 | else |
184 | 185 | return null; |
185 | - r.Date = Date; | |
186 | + r.Date = date; | |
186 | 187 | r.Open = (int)ParseField(tokens[4]); |
187 | 188 | r.High = (int)ParseField(tokens[5]); |
188 | 189 | r.Low = (int)ParseField(tokens[6]); |
@@ -49,9 +49,9 @@ | ||
49 | 49 | /// データのURLを取得する。 |
50 | 50 | /// </summary> |
51 | 51 | /// <returns>URL</returns> |
52 | - protected override string DownloadUrl | |
52 | + protected override string DownloadUrl(DateTime date) | |
53 | 53 | { |
54 | - get { return "http://souba-data.com/k_data/" + Date.ToString("yyyy/yy_MM/TyyMMdd") + ".lzh"; } | |
54 | + return "http://souba-data.com/k_data/" + date.ToString("yyyy/yy_MM/TyyMMdd") + ".lzh"; | |
55 | 55 | } |
56 | 56 | |
57 | 57 | /// <summary> |
@@ -58,8 +58,9 @@ | ||
58 | 58 | /// 文字列を解析して価格データを返す。 |
59 | 59 | /// </summary> |
60 | 60 | /// <param name="line">文字列</param> |
61 | + /// <param name="date">日付</param> | |
61 | 62 | /// <returns>価格データ</returns> |
62 | - protected override Price ParseLine(string line) | |
63 | + protected override Price ParseLine(string line, DateTime date) | |
63 | 64 | { |
64 | 65 | var tokens = line.Split(new[] {'\t', ','}); |
65 | 66 | if (tokens.Length < 9) |
@@ -36,6 +36,7 @@ | ||
36 | 36 | { |
37 | 37 | private readonly Object _syncObject = new object(); |
38 | 38 | private Queue<Brand> _brandQueue; |
39 | + private DateTime _date; | |
39 | 40 | private readonly Queue<Price> _priceQueue = new Queue<Price>(); |
40 | 41 | private bool _terminate; |
41 | 42 | private Exception _exception; |
@@ -71,14 +72,15 @@ | ||
71 | 72 | _progress.NumDays = AdjustedDate(ref begin, ref end); |
72 | 73 | _progress.RecordsPerDay = GlobalEnv.BrandData.Count; |
73 | 74 | _progress.Start(); |
74 | - for (Date = begin, EndDate = end; Date <= EndDate; NextDate()) | |
75 | + for (var date = begin; date <= end; date = NextDate(date)) | |
75 | 76 | { |
76 | 77 | lock (_syncObject) |
77 | 78 | { |
79 | + _date = date; | |
78 | 80 | _brandQueue = new Queue<Brand>(GlobalEnv.BrandData); |
79 | 81 | Monitor.PulseAll(_syncObject); |
80 | 82 | } |
81 | - _progress.Show(worker, Date); | |
83 | + _progress.Show(worker, date); | |
82 | 84 | var i = 0; |
83 | 85 | for (; i < _progress.RecordsPerDay; i++) |
84 | 86 | { |
@@ -100,11 +102,11 @@ | ||
100 | 102 | continue; |
101 | 103 | if (price.Code == "1001" && price.Open == 0) // まだ株価が用意されていない。 |
102 | 104 | return; |
103 | - PriceData.Add(price, Date == EndDate); | |
105 | + PriceData.Add(price, date == end); | |
104 | 106 | _progress.IncrementRecords(); |
105 | - _progress.Show(worker, Date); | |
107 | + _progress.Show(worker, date); | |
106 | 108 | } |
107 | - PriceData.MaxDate = Date; | |
109 | + PriceData.MaxDate = date; | |
108 | 110 | _progress.IncrementDays(); |
109 | 111 | } |
110 | 112 | } |
@@ -150,7 +152,7 @@ | ||
150 | 152 | { |
151 | 153 | lock (_priceQueue) |
152 | 154 | { |
153 | - _exception = new Exception(string.Format("{0}: {1} {2:d}", e.Message, code, Date), e); | |
155 | + _exception = new Exception(string.Format("{0}: {1} {2:d}", e.Message, code, _date), e); | |
154 | 156 | Monitor.Pulse(_priceQueue); |
155 | 157 | } |
156 | 158 | } |
@@ -164,7 +166,7 @@ | ||
164 | 166 | code = "998405"; |
165 | 167 | var dl = new DownloadUtil(string.Format( |
166 | 168 | "http://info.finance.yahoo.co.jp/history/?code={0}&sy={1}&sm={2}&sd={3}&ey={4}&em={5}&ed={6}&tm=d", |
167 | - code, Date.Year, Date.Month, Date.Day, Date.Year, Date.Month, Date.Day)); | |
169 | + code, _date.Year, _date.Month, _date.Day, _date.Year, _date.Month, _date.Day)); | |
168 | 170 | for (var i = 0; i < 10; i++) |
169 | 171 | { |
170 | 172 | try |
@@ -217,7 +219,7 @@ | ||
217 | 219 | if (obs.Match(buf).Success || empty.Match(buf).Success) // 上場廃止(銘柄データが空のこともある) |
218 | 220 | return null; |
219 | 221 | if (invalid.Match(buf).Success) // 出来高がないか株価が用意されていない。 |
220 | - return new Price {Date = Date, Open = 0, High = 0, Low = 0, Close = 0, Volume = 0.0}; | |
222 | + return new Price {Date = _date, Open = 0, High = 0, Low = 0, Close = 0, Volume = 0.0}; | |
221 | 223 | throw new Exception("ページから株価を取得できません。"); |
222 | 224 | } |
223 | 225 | try |
@@ -255,9 +257,9 @@ | ||
255 | 257 | /// 使わない |
256 | 258 | /// </summary> |
257 | 259 | /// <returns>使わない</returns> |
258 | - protected override string DownloadUrl | |
260 | + protected override string DownloadUrl(DateTime date) | |
259 | 261 | { |
260 | - get { throw new NotImplementedException(); } | |
262 | + throw new NotImplementedException(); | |
261 | 263 | } |
262 | 264 | |
263 | 265 | /// <summary> |
@@ -264,8 +266,9 @@ | ||
264 | 266 | /// 使わない |
265 | 267 | /// </summary> |
266 | 268 | /// <param name="line">使わない</param> |
269 | + /// <param name="date">使わない</param> | |
267 | 270 | /// <returns>使わない</returns> |
268 | - protected override Price ParseLine(string line) | |
271 | + protected override Price ParseLine(string line, DateTime date) | |
269 | 272 | { |
270 | 273 | throw new NotImplementedException(); |
271 | 274 | } |