public static void UpdateFx() {
Dictionary<int, string> symbols = new Dictionary<int, string>() { { 201, "USDJPY" }, { 202, "EURJPY" } };
foreach (int code in symbols.Keys) {
string url = $"https://stocks.finance.yahoo.co.jp/stocks/history/?code={symbols[code]}=X";
using (MemoryStream ms = Util.HttpDownload(url)) {
string source = Encoding.UTF8.GetString(ms.ToArray());
string pattern = "<td>(\\d{4}年\\d{1,2}月\\d{1,2}日)</td>\\s{0,1}<td>([\\d,.]+)</td>\\s{0,1}<td>([\\d,.]+)</td>\\s{0,1}<td>([\\d,.]+)</td>\\s{0,1}<td>([\\d,.]+)</td>";
MatchCollection mc = Regex.Matches(source, pattern, RegexOptions.IgnoreCase);
File.AppendAllText("fx.log", $"{DateTime.Now:M-d HH:mm:ss:fff} {code} {symbols[code]} 最新{mc.Count}件\r\n");
if (mc.Count == 0) {
Env.Frame.SetStatusBarText($"エラー {code}", "ソースをファイルに保存しました");
File.WriteAllText($"error_{code}_{DateTime.Now:MMdd}.html", $"< !--{url}-- >\r\n{source}");
return;}
var farm = (DailyDataFarm)Env.BrandCollection.FindBrand(code).CreateDailyFarm(mc.Count);
foreach (Match m in mc) {
DateTime date = DateTime.Parse(m.Groups[1].Value);
NewDailyData td = new NewDailyData();
td.open = decimal.ToInt32((decimal.Parse(m.Groups[2].Value) * 100));
td.high = decimal.ToInt32((decimal.Parse(m.Groups[3].Value) * 100));
td.low = decimal.ToInt32((decimal.Parse(m.Groups[4].Value) * 100));
td.close = decimal.ToInt32((decimal.Parse(m.Groups[5].Value) * 100));