OmegaChartのソースコードの保守
Révision | 9850eb177d43ed9d8e9fbd89ef909dd091222a20 (tree) |
---|---|
l'heure | 2014-07-12 21:02:42 |
Auteur | panacoran <panacoran@user...> |
Commiter | panacoran |
@@ -31,12 +31,13 @@ namespace Zanetti.DataSource | ||
31 | 31 | { |
32 | 32 | Mujinzou, |
33 | 33 | KdbCom, |
34 | - Yahoo | |
34 | + Yahoo, | |
35 | + Edatalab | |
35 | 36 | } |
36 | 37 | |
37 | 38 | static public string[] StockDataSourceNames |
38 | 39 | { |
39 | - get { return new[] {"無尽蔵", "k-db.com", "Yahoo時系列"}; } | |
40 | + get { return new[] {"無尽蔵", "k-db.com", "Yahoo時系列", "edatalab.net"}; } | |
40 | 41 | } |
41 | 42 | |
42 | 43 | private string _name; //名前をつけていなければnull |
@@ -170,6 +171,9 @@ namespace Zanetti.DataSource | ||
170 | 171 | case StockDataSource.Yahoo: |
171 | 172 | stock_ds = new Specialized.YahooDataSource(_dateArray); |
172 | 173 | break; |
174 | + case StockDataSource.Edatalab: | |
175 | + stock_ds = new Specialized.EdatalabDataSource(_dateArray); | |
176 | + break; | |
173 | 177 | } |
174 | 178 | break; |
175 | 179 | } |
@@ -0,0 +1,134 @@ | ||
1 | +// Copyright (c) 2014 panacoran <panacoran@users.sourceforge.jp> | |
2 | +// This program is part of OmegaChart. | |
3 | +// OmegaChart is licensed under the Apache License, Version 2.0. | |
4 | + | |
5 | +using System.Collections.Generic; | |
6 | +using System.Diagnostics; | |
7 | +using System.IO; | |
8 | +using System.Text; | |
9 | +using Zanetti.Data; | |
10 | + | |
11 | +namespace Zanetti.DataSource.Specialized | |
12 | +{ | |
13 | + internal class EdatalabDataSource : DailyDataSource | |
14 | + { | |
15 | + public EdatalabDataSource(int[] dates) : base(dates) | |
16 | + { | |
17 | + } | |
18 | + | |
19 | + public override void Run() | |
20 | + { | |
21 | + var newdata = new Dictionary<int, Dictionary<int, NewDailyData>>(); | |
22 | + foreach (var date in _dates) | |
23 | + { | |
24 | + newdata[date] = FillData(date); | |
25 | + SendMessage(AsyncConst.WM_ASYNCPROCESS, (date | DATE_MASK), AsyncConst.LPARAM_PROGRESS_SUCCESSFUL); | |
26 | + } | |
27 | + foreach (AbstractBrand br in Env.BrandCollection.Values) | |
28 | + { | |
29 | + if (br.Market == MarketType.B && !IsIndex(br.Code) || br.Market == MarketType.Custom) | |
30 | + continue; | |
31 | + using (var farm = (DailyDataFarm)br.CreateDailyFarm(_dates.Length)) | |
32 | + { | |
33 | + var traceFlag = false; | |
34 | + foreach (var date in _dates) | |
35 | + { | |
36 | + NewDailyData td; | |
37 | + if (newdata[date].TryGetValue(br.Code, out td)) | |
38 | + { | |
39 | + farm.UpdateDataFarm(date, td); | |
40 | + } | |
41 | + else | |
42 | + { | |
43 | + if (traceFlag) | |
44 | + continue; | |
45 | + traceFlag = true; | |
46 | + Debug.WriteLine("Data not found(edatalab.net) : code=" + br.Code + " market=" + br.Market); | |
47 | + } | |
48 | + } | |
49 | + farm.Save(Util.GetDailyDataFileName(br.Code)); | |
50 | + SendMessage(AsyncConst.WM_ASYNCPROCESS, br.Code, AsyncConst.LPARAM_PROGRESS_SUCCESSFUL); | |
51 | + } | |
52 | + } | |
53 | + } | |
54 | + | |
55 | + private Dictionary<int, NewDailyData> FillData(int date) | |
56 | + { | |
57 | + var result = new Dictionary<int, NewDailyData>(); | |
58 | + var d2 = Util.IntToDate(date); | |
59 | + var url = "http://www.edatalab.net/kabu/data" + | |
60 | + d2.ToString(d2.Year < 2006 ? "yyyy/yyyyMMdd" : "yyyy/DyyMMdd") + ".LZH"; | |
61 | + using (var reader = new StreamReader(Util.ExtractData(url), Encoding.GetEncoding("shift_jis"))) | |
62 | + { | |
63 | + string line; | |
64 | + while ((line = reader.ReadLine()) != null) | |
65 | + { | |
66 | + var tokens = line.Split(','); | |
67 | + var code = int.Parse(tokens[1]); | |
68 | + if (code > 1002 && code < 1300) // 各種指数を無視する。 | |
69 | + continue; | |
70 | + code = code == 1001 ? (int)BuiltInIndex.Nikkei225 : code == 1002 ? (int)BuiltInIndex.TOPIX : code; | |
71 | + var br = Env.BrandCollection.FindBrand(code) as BasicBrand; | |
72 | + if (br == null || | |
73 | + (d2.Year < 2006 ? !CheckMarketOld(br.Market, tokens[8]) : !CheckMarket(br.Market, tokens[2]))) | |
74 | + continue; | |
75 | + var vv = IsIndex(code) ? 0.001 : 1; | |
76 | + var pv = IsIndex(code) ? 100 : 1; | |
77 | + result[code] = new NewDailyData | |
78 | + { | |
79 | + open = (int)(double.Parse(tokens[3]) * pv), | |
80 | + high = (int)(double.Parse(tokens[4]) * pv), | |
81 | + low = (int)(double.Parse(tokens[5]) * pv), | |
82 | + close = (int)(double.Parse(tokens[6]) * pv), | |
83 | + volume = (int)(double.Parse(tokens[7]) * vv), | |
84 | + }; | |
85 | + } | |
86 | + } | |
87 | + return result; | |
88 | + } | |
89 | + | |
90 | + private bool CheckMarketOld(MarketType market, string name) | |
91 | + { | |
92 | + switch (int.Parse(name)) | |
93 | + { | |
94 | + case 1: | |
95 | + return market == MarketType.T1 || | |
96 | + market == MarketType.B; // 指数は東証1部 | |
97 | + case 2: | |
98 | + return market == MarketType.T2; | |
99 | + case 3: | |
100 | + return market == MarketType.J; | |
101 | + } | |
102 | + return false; | |
103 | + } | |
104 | + | |
105 | + private bool CheckMarket(MarketType market, string name) | |
106 | + { | |
107 | + switch (int.Parse(name)) | |
108 | + { | |
109 | + case 1: | |
110 | + return market == MarketType.T1 || | |
111 | + market == MarketType.B; // 指数は東証1部 | |
112 | + case 2: | |
113 | + return market == MarketType.T2; | |
114 | + case 3: | |
115 | + return market == MarketType.M; | |
116 | + case 4: | |
117 | + return market == MarketType.J; | |
118 | + case 6: | |
119 | + return market == MarketType.O1; | |
120 | + case 7: | |
121 | + return market == MarketType.O2; | |
122 | + case 8: | |
123 | + return market == MarketType.H; | |
124 | + } | |
125 | + return false; | |
126 | + } | |
127 | + | |
128 | + private bool IsIndex(int code) | |
129 | + { | |
130 | + return code == (int)BuiltInIndex.Nikkei225 || | |
131 | + code == (int)BuiltInIndex.TOPIX; | |
132 | + } | |
133 | + } | |
134 | +} | |
\ No newline at end of file |
@@ -119,6 +119,7 @@ | ||
119 | 119 | </Compile> |
120 | 120 | <Compile Include="DownloadOrder.cs" /> |
121 | 121 | <Compile Include="DreamVisor.cs" /> |
122 | + <Compile Include="Edatalab.cs" /> | |
122 | 123 | <Compile Include="EnumDescription.cs" /> |
123 | 124 | <Compile Include="Env.cs" /> |
124 | 125 | <Compile Include="EnvironmentDialog.cs"> |