会則
@OmegaChartはサポートを終了しています。
ご自身でコンパイルできない方は、他のソフトを利用して下さい。
A連投で初歩的な質問をする人やクレクレ君は、立ち入り禁止。
●公式サイト
OmegaChart公式HP(閉鎖)
ttp://www.omegachart.org/
OmegaChart公式HPのアーカイブ(消滅)
ttp://web.archive.org/web/20131010105520/http://www.omegachart.org/
メーリングリスト(2014年5月28日で終了)
ttp://groups.yahoo.co.jp/group/omegachart/
作者Blog(サポート終了)
ttp://okajima.air-nifty.com/
●有志による維持活動
panacoran氏のサイト
ttp://sourceforge.jp/users/panacoran/pf/OmegaChart/wiki/FrontPage
●前スレ
OmegaChartスレ ver.10
https://egg.5ch.net/test/read.cgi/software/1488866170/
OmegaChartスレ ver.11
■ このスレッドは過去ログ倉庫に格納されています
2018/10/12(金) 16:06:42.77ID:xz6O6ruA0
334名無しさん@お腹いっぱい。
2019/03/10(日) 16:44:03.39ID:9znjn8BB0 >>333
おかしいですね。
メニューというのはコンボボックスの「無尽蔵、Yahoo時系列、edatalab.bet」などのアイテムのことですよね。
コードには1行を追加しただけですから、コンボボックスの最後に「個別銘柄をスキップ」が一つだけ追加されるはずですが。
行435以外にも追加していませんか?
おかしいですね。
メニューというのはコンボボックスの「無尽蔵、Yahoo時系列、edatalab.bet」などのアイテムのことですよね。
コードには1行を追加しただけですから、コンボボックスの最後に「個別銘柄をスキップ」が一つだけ追加されるはずですが。
行435以外にも追加していませんか?
335名無しさん@お腹いっぱい。
2019/03/10(日) 17:01:14.56ID:0nrxpnx50 >>334
すみません 修正したコードを使ってました すばらしいアイデアを有り難うございました
すみません 修正したコードを使ってました すばらしいアイデアを有り難うございました
2019/03/13(水) 18:56:39.41ID:6b+aWHrs0
どうもありがとうございます
2019/03/14(木) 10:17:06.44ID:uhMXW8WL0
株価がなぜか置いてあるサイトの2019年3月13日分がNot Foundになるのですが、ほかの方は閲覧できますでしょうか?
2019/03/14(木) 15:17:53.13ID:8N/gazry0
2019/03/14(木) 20:29:32.04ID:/hrnpTFf0
>>338 ご対応どうもありがとうございます
340名無しさん@お腹いっぱい。
2019/03/17(日) 09:42:02.17ID:+1g2tVyr0341名無しさん@お腹いっぱい。
2019/03/19(火) 16:47:04.29ID:Nefah/eR0 ブックマーク銘柄の株価ダウンロードをしたい ダウンロードメニューは混み合ってるから お気に入りの右クリックが良さそう
自分にできるのは右クリックメニューを表示させることくらいなので恥をしのんで またまた頼んでみる 何とかなりませんか?
自分にできるのは右クリックメニューを表示させることくらいなので恥をしのんで またまた頼んでみる 何とかなりませんか?
2019/03/19(火) 19:43:42.51ID:r9zAqVWb0
善意に甘んじてあまり負担をかけるのはよくないよ
343名無しさん@お腹いっぱい。
2019/03/20(水) 06:23:37.68ID:TJRt14YG0 そだね〜
2019/03/20(水) 08:42:15.05ID:fLe6YufQ0
大まかには、
・BookmarkPane.csのInitContextMenuで項目を追加して、ダウンロードメニューを表示可能にさせる
・OmegaChartのお気に入りに作ったフォルダ配下銘柄がダウンロード対象ならば、これらの銘柄コードを取得する必要がある
→下記のようにすれば銘柄コードを取得できる
ArrayList al = new ArrayList();
BookmarkFolder f = _treeView.SelectedNode.Tag as BookmarkFolder;
foreach(var e in f.Children)
{
al.Add(((BrandBookmark)e).Code);
}
・以下URLの情報を参考にすると銘柄指定して株価ダウンロードする仕組みができる
https://osdn.net/users/omegachartuser/pastebin/6050
UpdateOneBrand uob = new UpdateOneBrand();
uob.Update(al);//このUpdateを改造して、ArrayListを引数して、銘柄コードを取得、順次ダウンロードする仕組みに書き換える
という流れで可能だと思います。
・BookmarkPane.csのInitContextMenuで項目を追加して、ダウンロードメニューを表示可能にさせる
・OmegaChartのお気に入りに作ったフォルダ配下銘柄がダウンロード対象ならば、これらの銘柄コードを取得する必要がある
→下記のようにすれば銘柄コードを取得できる
ArrayList al = new ArrayList();
BookmarkFolder f = _treeView.SelectedNode.Tag as BookmarkFolder;
foreach(var e in f.Children)
{
al.Add(((BrandBookmark)e).Code);
}
・以下URLの情報を参考にすると銘柄指定して株価ダウンロードする仕組みができる
https://osdn.net/users/omegachartuser/pastebin/6050
UpdateOneBrand uob = new UpdateOneBrand();
uob.Update(al);//このUpdateを改造して、ArrayListを引数して、銘柄コードを取得、順次ダウンロードする仕組みに書き換える
という流れで可能だと思います。
345名無しさん@お腹いっぱい。
2019/03/21(木) 06:32:49.82ID:nzO6Ifvu0 >>344
アドバイスありがとうございました 大きな変更でなければ自分でもできるので真面目にソースを追ってみます
アドバイスありがとうございました 大きな変更でなければ自分でもできるので真面目にソースを追ってみます
346名無しさん@お腹いっぱい。
2019/03/22(金) 11:26:52.16ID:T3HLXd5W0 ということは BookmarkPane.cs にコンテキストメニュー表示、そこに例えば OnBookmarkDownloadで引数付きのUpdateを呼び出せば良くて
UpdateOneBrand.cs の改造は Updateのオーバーロード処理を書いてやれば 従来の単一銘柄だけの更新も生かせるということでしょうか
UpdateOneBrand.cs の改造は Updateのオーバーロード処理を書いてやれば 従来の単一銘柄だけの更新も生かせるということでしょうか
2019/03/22(金) 12:37:20.71ID:0TAjLeLf0
OmegaChart TradeStationスキャナから出力したCSVで株価取得に関してなのですが、
TradeStation 9.5ではCSVファイルでの出力ができなくなり、TXTファイルでの出力となっております。
また、出力されたTXTファイルを開きますと中部電力の場合
9502-NG
9502-TS
のように2つコードとともに4本値が出力されます。
この場合、TradeStationスキャナから出力したCSVで株価取得を用いて作成したOmegaChartを用いた場合、どちらの市場の値が取得されるのでしょうか?
TradeStation 9.5ではCSVファイルでの出力ができなくなり、TXTファイルでの出力となっております。
また、出力されたTXTファイルを開きますと中部電力の場合
9502-NG
9502-TS
のように2つコードとともに4本値が出力されます。
この場合、TradeStationスキャナから出力したCSVで株価取得を用いて作成したOmegaChartを用いた場合、どちらの市場の値が取得されるのでしょうか?
2019/03/22(金) 12:41:52.73ID:0TAjLeLf0
index.txtの市場がT1,T2であれば、TSのほうの4本値が取得されるということでよろしいでしょうか?
2019/03/22(金) 15:15:00.18ID:X5aRqTHq0
>>346
仰る通りです。
元のUpdateOneBrand、Updateでは、画面表示している銘柄の株価をダウンロードするということで、
AbstractBrand br = Env.Frame.ChartCanvas.GetBrand();
この1行で済んでいました。
オーバーロードで、銘柄コードを格納した変数を受け取って、格納した銘柄コード分をループさせて株価取得しに行く必要があります。
foreach文などでループさせながら、次のようなコードでOmegaChartが認識できる銘柄コードかを判別します。
foreach (var cd in codes)
{
//略
AbstractBrand br = Env.BrandCollection.FindBrand((int)cd);
//略
}
受け取るのはArrayListよりもListの方がいいかもしれないですね。銘柄コードはint型と決まってるわけですから。
仰る通りです。
元のUpdateOneBrand、Updateでは、画面表示している銘柄の株価をダウンロードするということで、
AbstractBrand br = Env.Frame.ChartCanvas.GetBrand();
この1行で済んでいました。
オーバーロードで、銘柄コードを格納した変数を受け取って、格納した銘柄コード分をループさせて株価取得しに行く必要があります。
foreach文などでループさせながら、次のようなコードでOmegaChartが認識できる銘柄コードかを判別します。
foreach (var cd in codes)
{
//略
AbstractBrand br = Env.BrandCollection.FindBrand((int)cd);
//略
}
受け取るのはArrayListよりもListの方がいいかもしれないですね。銘柄コードはint型と決まってるわけですから。
2019/03/22(金) 15:20:47.40ID:X5aRqTHq0
>>347
仰る通り、東証のレコードの方が選択されます。
これはスキャナから読み取るC#コードですが、
https://osdn.net/users/omegachartuser/pastebin/5755
CheckMarketで、福証などは排除されます。大証やジャスダックとの重複はなくなったので、ここでは問題がおきないという認識です。
もし万が一、重複したコードが通ってしまった場合は、FillDataでエラーになるのでわかります。resultのキーはユニークである必要があるからです。
仰る通り、東証のレコードの方が選択されます。
これはスキャナから読み取るC#コードですが、
https://osdn.net/users/omegachartuser/pastebin/5755
CheckMarketで、福証などは排除されます。大証やジャスダックとの重複はなくなったので、ここでは問題がおきないという認識です。
もし万が一、重複したコードが通ってしまった場合は、FillDataでエラーになるのでわかります。resultのキーはユニークである必要があるからです。
2019/03/22(金) 16:04:31.71ID:0TAjLeLf0
>>350 どうもありがとうございます。
ざっと調べた限りなのですが、TradeStationスキャナから出力したCSVで株価取得のコードを用いて作成したOmegaChartでも、TXTファイルで出力された株価データからデータ取得ができるようです。
ざっと調べた限りなのですが、TradeStationスキャナから出力したCSVで株価取得のコードを用いて作成したOmegaChartでも、TXTファイルで出力された株価データからデータ取得ができるようです。
352名無しさん@お腹いっぱい。
2019/03/23(土) 14:08:06.41ID:dPcTjOiB0 >>349
List型を引数にしてUpdateを書き足してみました うまく行きました どうも有り難うございました
List型を引数にしてUpdateを書き足してみました うまく行きました どうも有り難うございました
353名無しさん@お腹いっぱい。
2019/03/27(水) 11:45:00.60ID:v1FLBsmO0 data.cs では
public const int CREDITSHORT_OFFSET = 24;
public const int CREDITLONG_OFFSET = 28;
他の所ではすべてcreditlongがcreditshortより先に来ている このためデータエキスポートとインポートで信用残の値が逆になりトラブルのもと
DataImporter.cs の中でも以下の様になっていますね
ndd.creditlong = BitConverter.ToInt32(farm.RawDataImage, i * 32 + 24);
ndd.creditshort = BitConverter.ToInt32(farm.RawDataImage, i * 32 + 28);
いっそのこと定義をかえてCREDITSHORT_OFFSETとCREDITLONG_OFFSETを逆にしたらどうでしょう?
public const int CREDITSHORT_OFFSET = 24;
public const int CREDITLONG_OFFSET = 28;
他の所ではすべてcreditlongがcreditshortより先に来ている このためデータエキスポートとインポートで信用残の値が逆になりトラブルのもと
DataImporter.cs の中でも以下の様になっていますね
ndd.creditlong = BitConverter.ToInt32(farm.RawDataImage, i * 32 + 24);
ndd.creditshort = BitConverter.ToInt32(farm.RawDataImage, i * 32 + 28);
いっそのこと定義をかえてCREDITSHORT_OFFSETとCREDITLONG_OFFSETを逆にしたらどうでしょう?
354名無しさん@お腹いっぱい。
2019/03/27(水) 19:50:58.49ID:xHMyQJhm0 >>353
オリジナルのOmegaChartのデータ構造は、作者ページでDate-Open-High-Low-VolumeShort-Longの順で4バイト整数を格納したバイナリファイルと説明されていたと記憶しています。
すでに作者のページが存在しないので確認はできませんが、機能追加等で誤変更されたのではないでしょうか。
ちなみに、DataImporter.csというファイルはオリジナル、panacoran氏の最新ソースのいずれにも見当たらないですね。
オリジナルのOmegaChartのデータ構造は、作者ページでDate-Open-High-Low-VolumeShort-Longの順で4バイト整数を格納したバイナリファイルと説明されていたと記憶しています。
すでに作者のページが存在しないので確認はできませんが、機能追加等で誤変更されたのではないでしょうか。
ちなみに、DataImporter.csというファイルはオリジナル、panacoran氏の最新ソースのいずれにも見当たらないですね。
355名無しさん@お腹いっぱい。
2019/03/28(木) 06:45:26.90ID:p/JV8m+Q0 そうすると逆なんですかね
2019/03/28(木) 15:08:37.62ID:4znjkZFN0
>>353
まったく仰る通りですね。
公式がないので、残った資料から判断するしかないのですが、公式のFAQにあるデータ形式は、買残→売残の順でした。
メーリングリストでそれらしき情報を探っても、売残→買残 の並びである情報はありませんでした。
以前、ユーザーが多数使っていたCSV to Omegaのreadmeを見ても、「信用買残,信用売残」となっています。
ですので、Data.csだけが逆転してるように思えます。
まったく仰る通りですね。
公式がないので、残った資料から判断するしかないのですが、公式のFAQにあるデータ形式は、買残→売残の順でした。
メーリングリストでそれらしき情報を探っても、売残→買残 の並びである情報はありませんでした。
以前、ユーザーが多数使っていたCSV to Omegaのreadmeを見ても、「信用買残,信用売残」となっています。
ですので、Data.csだけが逆転してるように思えます。
357名無しさん@お腹いっぱい。
2019/03/28(木) 18:08:58.64ID:VNXJ3UAk0 >>356
そう言われると自分の思い込みだったかと急に自信がなくなりました。
しかし、Data.csで順番を書き換えると、過去データとの整合性がなくなります。
現在のデータソースで信用残は取れないですが、独自に信用残を追加している場合過去データを全て変更しなければならなくなります。
オリジナルには信用残のエクスポートはなく、Data.csの順番による不具合はないと思います。
他にも不具合があるというのであれば賛成しますが、
追加機能である信用残のエクスポートとデータインポートのコードを書き換えるべきと考えますが、どうでしょうか?
そう言われると自分の思い込みだったかと急に自信がなくなりました。
しかし、Data.csで順番を書き換えると、過去データとの整合性がなくなります。
現在のデータソースで信用残は取れないですが、独自に信用残を追加している場合過去データを全て変更しなければならなくなります。
オリジナルには信用残のエクスポートはなく、Data.csの順番による不具合はないと思います。
他にも不具合があるというのであれば賛成しますが、
追加機能である信用残のエクスポートとデータインポートのコードを書き換えるべきと考えますが、どうでしょうか?
358名無しさん@お腹いっぱい。
2019/03/28(木) 18:30:36.43ID:p/JV8m+Q0 私は勝手に信用売り、信用買いの順で全て統一してしまいました 後はおまかせします
359名無しさん@お腹いっぱい。
2019/03/28(木) 19:40:27.64ID:p/JV8m+Q0 済みませんかきわすれました 353です 今も信用データ取っています過去データの入れ替えはできなくは無いですが結構つらいです
2019/03/28(木) 22:39:58.96ID:4znjkZFN0
よほどのことがない限り、panacoranさんの方のソース変更までは至らないと思うんでご心配には及ばないと思いますよ。
DataImporter.csというのは、私が書いたコードだ思うんですが、時間とやる気が戻り次第、サンプルコードを直すという話にさせてください。
>>248と https://osdn.net/projects/omegachartusers/wiki/FrontPage
について注釈を入れて置くということでご容赦ください。
・OmegaChartのデータファイル・レコードの並び順が、信用売残→信用買残という指摘があり、このサンプルコードは、信用買残→信用売残という並びを想定しているのでこのコードをご使用の際は適宜お気をつけください。
DataImporter.csというのは、私が書いたコードだ思うんですが、時間とやる気が戻り次第、サンプルコードを直すという話にさせてください。
>>248と https://osdn.net/projects/omegachartusers/wiki/FrontPage
について注釈を入れて置くということでご容赦ください。
・OmegaChartのデータファイル・レコードの並び順が、信用売残→信用買残という指摘があり、このサンプルコードは、信用買残→信用売残という並びを想定しているのでこのコードをご使用の際は適宜お気をつけください。
2019/03/29(金) 09:12:57.22ID:GCfk8EGP0
yahoo信用残時系列が売残/買残だからですかね?今となっては分かりませんね。
2019/03/29(金) 15:39:42.41ID:D/G16IIQ0
労力が必要となる割に、プログラムのミスでエラーになる可能性があるならかえって直さないほうがいい気がします
363名無しさん@お腹いっぱい。
2019/03/29(金) 16:50:59.50ID:XBwkRXes0 確かに今となってはどうでも良いとは言わないがそのままでもいいでしょうね
364名無しさん@お腹いっぱい。
2019/03/29(金) 18:13:16.29ID:HTAUnwl20 信用データに関してはほとんどの人が利用していないと思われ、さらに週次データであることから無駄があリます。
また、日々のデータ更新も発表日以外は前日データを参照して埋めなければならずプログラムも多少面倒です。
データをdate-open-high-low-volumeだけにして、信用残に関しては日付の週次データとしてバイナリまたはcsvでサブフォルダに保存。
DailyDataFarmを読み込む時に信用がなければDataFarmを0埋め、信用データがある場合にはメインデータと一緒に読み込んで次の日付までの間をデータを代入。
このような形にすると多少コンパクトになって無駄が省けるようにも思っています。
しかし、信用データがないとしてもデータ読み込みが劇的に早くなるかは疑問符です。
しかもデータ構造を変えるとなると、データ更新系にも影響出る可能性も無いとも言えず、かなり大掛かりになるかもしれません。
ちょっと思いついた机上の空論で、労多く功少なしといったところですから単なる話題提供としてスルーしてください。
また、日々のデータ更新も発表日以外は前日データを参照して埋めなければならずプログラムも多少面倒です。
データをdate-open-high-low-volumeだけにして、信用残に関しては日付の週次データとしてバイナリまたはcsvでサブフォルダに保存。
DailyDataFarmを読み込む時に信用がなければDataFarmを0埋め、信用データがある場合にはメインデータと一緒に読み込んで次の日付までの間をデータを代入。
このような形にすると多少コンパクトになって無駄が省けるようにも思っています。
しかし、信用データがないとしてもデータ読み込みが劇的に早くなるかは疑問符です。
しかもデータ構造を変えるとなると、データ更新系にも影響出る可能性も無いとも言えず、かなり大掛かりになるかもしれません。
ちょっと思いついた机上の空論で、労多く功少なしといったところですから単なる話題提供としてスルーしてください。
365名無しさん@お腹いっぱい。
2019/03/30(土) 06:46:35.06ID:wyYRlang0 Omegachartの自由直線はカーソルを離すと大部分が点線表示になりますよね あれは仕様ですか
2019/03/30(土) 09:26:14.77ID:bKnlqIeX0
クリックしながらマウスを移動して、左クリックを解除した、その部分だけが実線。残りが破線という仕様。
367名無しさん@お腹いっぱい。
2019/03/30(土) 10:13:35.93ID:wyYRlang0 そうでしたか ありがとうございました
2019/03/31(日) 19:26:05.71ID:FhAz5Bp60
>>135
OmegaChartの初期化ファイル(ZIP)更新しました。2019年3月末分まで。
https://drive.google.com/open?id=1yFyFiI1OI-HlJwB9KoBMd9_qqa9y8mAQ
(前回と同じURLです)
OmegaChartの初期化ファイル(ZIP)更新しました。2019年3月末分まで。
https://drive.google.com/open?id=1yFyFiI1OI-HlJwB9KoBMd9_qqa9y8mAQ
(前回と同じURLです)
2019/04/01(月) 11:05:20.44ID:OlRb25lG0
ありがとうございます
370名無しさん@お腹いっぱい。
2019/04/02(火) 18:43:49.25ID:Gz6/SBJ30 株価のダウンロードを自動化したいがメニューのマウスクリックが面倒くさい 解決済みのかたいますか?
2019/04/02(火) 21:52:01.65ID:JQqkzGQB0
タスクスケジューラ起動で、ダウンロードする仕組みを作ったらどうですかね。
372名無しさん@お腹いっぱい。
2019/04/03(水) 07:38:22.75ID:d/SKwv9p0 Omegaで設定してタスクに投げる それありかな
2019/04/03(水) 07:59:18.62ID:ZuL1JM+E0
定形のGUI操作にはautoit使ってる
374名無しさん@お腹いっぱい。
2019/04/03(水) 08:38:17.73ID:d/SKwv9p0 最初はAutoHotkey で行けるのかなと思ったけど autoitで実際に自働DLできますか
Omegachartからダウンロード設定を読み込んでそれをパラメータで渡して起動できれば良さそう
Omegachartからダウンロード設定を読み込んでそれをパラメータで渡して起動できれば良さそう
375名無しさん@お腹いっぱい。
2019/04/03(水) 16:39:01.49ID:d/SKwv9p0 とりあえずやってみたら簡単に出来ました どうもありがとうございました
376名無しさん@お腹いっぱい。
2019/04/03(水) 16:41:57.32ID:d/SKwv9p0 ↑
AutoIt
AutoIt
377名無しさん@お腹いっぱい。
2019/04/03(水) 20:05:16.91ID:IXZ6aFDB0 平日19時に自動ダウンロードするサンプル(ダイアログが出るが何もクリックせずにダウンロード開始して終了後に閉じると思う)
前提として、ダウンロードオーダーを保存して、保存した設定でダウンロードの1が表示されることが必要。
19時以降は起動するごとにダウンロードしますので、修正の余地ありです。
充分検証していないので不具合あるかもしれません。
MainFrame.cs
@ line:120 public MainFrame() { の前々行あたりに以下を追加
//-----------
private Timer _timer;
private void Timer_Tick(object sender, EventArgs e) {
Console.WriteLine("timer" + DateTime.Now.ToString());
if (DateTime.Now.DayOfWeek > DayOfWeek.Sunday & DateTime.Now.DayOfWeek < DayOfWeek.Saturday & DateTime.Now.Hour >= 19) {
_timer.Enabled = false;
//保存した設定でダウンロードメニューの最初の項目が必須
DownloadOrder o = Env.Options.DownloadOrders[0];
DownloadDialog dlg = new DownloadDialog(o);
dlg.Show();
dlg.Refresh();
dlg.OnOK(null, null); } }
//-----------
A public MainFrame(){を以下に変更
//-----------
public MainFrame() {
_timer = new Timer();
_timer.Interval = 60000;
_timer.Tick += Timer_Tick;
_timer.Enabled = true; }
//-----------
B Download.cs 526行のOnOKをpublic に変更
public void OnOK(object sender, EventArgs args) {
前提として、ダウンロードオーダーを保存して、保存した設定でダウンロードの1が表示されることが必要。
19時以降は起動するごとにダウンロードしますので、修正の余地ありです。
充分検証していないので不具合あるかもしれません。
MainFrame.cs
@ line:120 public MainFrame() { の前々行あたりに以下を追加
//-----------
private Timer _timer;
private void Timer_Tick(object sender, EventArgs e) {
Console.WriteLine("timer" + DateTime.Now.ToString());
if (DateTime.Now.DayOfWeek > DayOfWeek.Sunday & DateTime.Now.DayOfWeek < DayOfWeek.Saturday & DateTime.Now.Hour >= 19) {
_timer.Enabled = false;
//保存した設定でダウンロードメニューの最初の項目が必須
DownloadOrder o = Env.Options.DownloadOrders[0];
DownloadDialog dlg = new DownloadDialog(o);
dlg.Show();
dlg.Refresh();
dlg.OnOK(null, null); } }
//-----------
A public MainFrame(){を以下に変更
//-----------
public MainFrame() {
_timer = new Timer();
_timer.Interval = 60000;
_timer.Tick += Timer_Tick;
_timer.Enabled = true; }
//-----------
B Download.cs 526行のOnOKをpublic に変更
public void OnOK(object sender, EventArgs args) {
378名無しさん@お腹いっぱい。
2019/04/04(木) 06:52:53.66ID:h1d9fXHn0 >>377
DLの設定を読み込むにはこういうふうにするんですね参考になります
後は起動するたびにダウンロードするのは具合が悪いので時間帯制限をするとすれば条件の手直しですぐ出来るので
意図せぬDLを防ぐために 例えば "Omegachart.exe /AutoDL”の様に引数を与えた場合だけに限れば可能ですよね
そうするとタスクスケジュラーに渡すのもすんなり行きますが他のやりかたも含めてアドバイス頂ければ助かります
DLの設定を読み込むにはこういうふうにするんですね参考になります
後は起動するたびにダウンロードするのは具合が悪いので時間帯制限をするとすれば条件の手直しですぐ出来るので
意図せぬDLを防ぐために 例えば "Omegachart.exe /AutoDL”の様に引数を与えた場合だけに限れば可能ですよね
そうするとタスクスケジュラーに渡すのもすんなり行きますが他のやりかたも含めてアドバイス頂ければ助かります
379名無しさん@お腹いっぱい。
2019/04/04(木) 12:46:54.46ID:0ERwLm0S0 >>378
起動するたびの再ダウンロードを抑制するには、最後のダウンロードした日付をファイルなどにセーブするなどいくつかの方法が考えられます。
せっかくですから、101の最終データをチェックして再ダウンロードを抑制する例を書いて見ます。
>>377 @のTimer_Tickイベント内の最初に挿入してみてください。
//-------日経最終日のチェック
AbstractBrand nikkei = Env.BrandCollection.FindBrand(101);
DataFarm farm = nikkei.ReserveFarm();
int lastdate = farm.LastDate;
if(int.Parse(DateTime.Now.ToString("yyyyMMdd")) <= lastdate) {
_timer.Enabled = false;
return; }
//--------
多分これで再ダウンロードしないと思われます。
起動するたびの再ダウンロードを抑制するには、最後のダウンロードした日付をファイルなどにセーブするなどいくつかの方法が考えられます。
せっかくですから、101の最終データをチェックして再ダウンロードを抑制する例を書いて見ます。
>>377 @のTimer_Tickイベント内の最初に挿入してみてください。
//-------日経最終日のチェック
AbstractBrand nikkei = Env.BrandCollection.FindBrand(101);
DataFarm farm = nikkei.ReserveFarm();
int lastdate = farm.LastDate;
if(int.Parse(DateTime.Now.ToString("yyyyMMdd")) <= lastdate) {
_timer.Enabled = false;
return; }
//--------
多分これで再ダウンロードしないと思われます。
380名無しさん@お腹いっぱい。
2019/04/04(木) 13:32:21.22ID:h1d9fXHn0 なるほど色んなやり方を良く思いつかれますね 確かに自動ダウンロード可能でした
データが準備できていない時間帯だと取得を繰り返す様ですが取得時間帯を決めてやれば問題なさそうです
どうも有り難うございました
データが準備できていない時間帯だと取得を繰り返す様ですが取得時間帯を決めてやれば問題なさそうです
どうも有り難うございました
381名無しさん@お腹いっぱい。
2019/04/04(木) 17:06:44.26ID:h1d9fXHn0 ttp://datadownload.php.xdomain.jp/data/daily/2019/20190403.txt
は 7277以降取れていない様ですね 本日分は大丈夫みたいですが
は 7277以降取れていない様ですね 本日分は大丈夫みたいですが
2019/04/04(木) 17:27:46.26ID:G4Y9hGed0
>>381
ご指摘ありがとうございます。直しました。
ご指摘ありがとうございます。直しました。
2019/04/04(木) 22:11:44.14ID:fNGT/eXg0
サーバーに障害が起きているのか、index.txtがダウンロード出来なくなっています。
2019/04/05(金) 07:58:57.91ID:1HOwP1xR0
どうもありがとうございます
2019/04/05(金) 18:49:53.36ID:DnxVUqjK0
なぜか株価が置いてあるサイトは、閉鎖になりそうです。BANされたっぽい。
index.txtダウンロードの件は、今確認してみると、問題なさそうですね。
index.txtダウンロードの件は、今確認してみると、問題なさそうですね。
386名無しさん@お腹いっぱい。
2019/04/05(金) 19:33:11.58ID:+a2gm2jn0 もう閉まってるっぽい
2019/04/05(金) 22:07:11.81ID:9UwuJZN90
2017年12月14日は普通に見れますね、一部だけ見れる理由もよくわからないのですが・・・
388名無しさん@お腹いっぱい。
2019/04/08(月) 09:02:10.14ID:og/5HePl0 AngleSharp で書き換えればダウンロード速くなるかな
2019/04/08(月) 15:07:10.09ID:I6awwBeF0
AngleSharpなるものを知りませんでしたが、
https://qiita.com/matarillo/items/a92e7efbfd2fdec62595
かなり良い感じですね。メンテが楽そう。
https://qiita.com/matarillo/items/a92e7efbfd2fdec62595
かなり良い感じですね。メンテが楽そう。
390名無しさん@お腹いっぱい。
2019/04/09(火) 06:33:16.11ID:4Spu8vRK0 vs_community_2019 にしても大丈夫ですか
391名無しさん@お腹いっぱい。
2019/04/12(金) 09:53:55.97ID:qIprkJKA0 omegachartusers さんの5797<private FetchResult.Status GetPage>を使って複数ページを処理したいのですが今は最初しか取れません
開始日付と終了日付を指定する例のあそこのページとは少し違うが頁数をセットして繰り返せば済むと思ったのですがまるで駄目でした
C#は初心者なので上手く書けません。申し訳ありませんがどなたか御教示をお願い出来ませんか
...
var url = string.Format("https://...?code={0:D4}", code);
//これに"&...&page=page_count"の部分を付加して1頁以降を取得?
//var dates = new List<int>(_dates);
//var page_count = dates/DaysAtOnce; //ここは駄目っぽいので取り敢えず2で試す
page = null;
for (int i = 0; i < page_count; i++)
{
try
{
string web = url + (i > 0 ? "&ashi=day&page=" + (i + 1).ToString() : "");
using (var reader = new StreamReader(Util.HttpDownload(web)))
page += reader.ReadToEnd();
}
...
}
... 恥ずかしながら上記でこけて理由も良く分からず(forはtryの中で回しても同じでした)
開始日付と終了日付を指定する例のあそこのページとは少し違うが頁数をセットして繰り返せば済むと思ったのですがまるで駄目でした
C#は初心者なので上手く書けません。申し訳ありませんがどなたか御教示をお願い出来ませんか
...
var url = string.Format("https://...?code={0:D4}", code);
//これに"&...&page=page_count"の部分を付加して1頁以降を取得?
//var dates = new List<int>(_dates);
//var page_count = dates/DaysAtOnce; //ここは駄目っぽいので取り敢えず2で試す
page = null;
for (int i = 0; i < page_count; i++)
{
try
{
string web = url + (i > 0 ? "&ashi=day&page=" + (i + 1).ToString() : "");
using (var reader = new StreamReader(Util.HttpDownload(web)))
page += reader.ReadToEnd();
}
...
}
... 恥ずかしながら上記でこけて理由も良く分からず(forはtryの中で回しても同じでした)
2019/04/12(金) 11:48:31.02ID:sRsZ0kFa0
エラーになってしまう場合は、そのエラー内容を書いた方が良いですよ。
ご自身でエラー原因と解決方法を探る場合は、
var url = の行にブレークポイントを設置
→ Debugモードで実行
→ その行で一時停止したらF11ボタン押下して1行デバッグを進める
→ エラーになるまで進める
一時停止しているときは、カーソルを変数に合わせると中身が表示されますので意図通りにプログラムが動いているかを確かめられます。
また、Debugしているときだけエラーにならないとか新しい発見もあったりします。
ご自身でエラー原因と解決方法を探る場合は、
var url = の行にブレークポイントを設置
→ Debugモードで実行
→ その行で一時停止したらF11ボタン押下して1行デバッグを進める
→ エラーになるまで進める
一時停止しているときは、カーソルを変数に合わせると中身が表示されますので意図通りにプログラムが動いているかを確かめられます。
また、Debugしているときだけエラーにならないとか新しい発見もあったりします。
393名無しさん@お腹いっぱい。
2019/04/12(金) 14:02:07.14ID:qIprkJKA0 ビルドはできるのですが実行すると最初のページしか取れないんですよ
2019/04/12(金) 14:12:07.34ID:sRsZ0kFa0
その理由は、これです。
page += reader.ReadToEnd();
後ほど、理由は書きますね。
page += reader.ReadToEnd();
後ほど、理由は書きますね。
2019/04/12(金) 14:58:53.04ID:dZDY+ftN0
皆さんすごいですね
トレードステーションから排出されたデーターを複数日取得して当日以外にデーター取得できるように取り組んでいるのですが自分も難航しています。
トレードステーションから排出されたデーターを複数日取得して当日以外にデーター取得できるように取り組んでいるのですが自分も難航しています。
2019/04/12(金) 15:55:30.85ID:sRsZ0kFa0
>>394
これ、結構書き直さないとダメそうです。
質問者の方がやったのは、HTMLソースの文字列を物理的に足していっただけです。
正規表現置換で必要な情報を取るときに、最初にヒットした文字列しか取らない仕組みなので、最初の銘柄、最初の日付しか取得できないということになります。
ParsePageというところで、必要なHTMLソース文字列をbufという変数にいれて渡しています。
必要な情報はdictというSortedDictionaryというモノに入れています。
var dict = new SortedDictionary<int, NewDailyData>();
現状のコードは、1銘柄1日分しか処理しないという前提で書かれていますので、そこを修正する必要があります。
日付でループさせるのは、FetchPrices内で行い、都度ParsePageで処理すればいいのですが、ここで問題が一つ。
現状のParsePageは、1日分限定の書き方なのでParsePageは書き換えないといけないです。
銘柄loopは、RunFetchPricesで行われているので実際に書くのは日付loopから下という感じでしょうか。
銘柄loop
{
日付loop
{
GetPage
Regexで情報抽出
dictへ情報格納
}
}
return new FetchResult { Code = code, Prices = dict, ReturnStatus = FetchResult.Status.Success };
これ、結構書き直さないとダメそうです。
質問者の方がやったのは、HTMLソースの文字列を物理的に足していっただけです。
正規表現置換で必要な情報を取るときに、最初にヒットした文字列しか取らない仕組みなので、最初の銘柄、最初の日付しか取得できないということになります。
ParsePageというところで、必要なHTMLソース文字列をbufという変数にいれて渡しています。
必要な情報はdictというSortedDictionaryというモノに入れています。
var dict = new SortedDictionary<int, NewDailyData>();
現状のコードは、1銘柄1日分しか処理しないという前提で書かれていますので、そこを修正する必要があります。
日付でループさせるのは、FetchPrices内で行い、都度ParsePageで処理すればいいのですが、ここで問題が一つ。
現状のParsePageは、1日分限定の書き方なのでParsePageは書き換えないといけないです。
銘柄loopは、RunFetchPricesで行われているので実際に書くのは日付loopから下という感じでしょうか。
銘柄loop
{
日付loop
{
GetPage
Regexで情報抽出
dictへ情報格納
}
}
return new FetchResult { Code = code, Prices = dict, ReturnStatus = FetchResult.Status.Success };
2019/04/12(金) 15:59:55.97ID:sRsZ0kFa0
>>396
修正
銘柄loop
{
var dict = new SortedDictionary<int, NewDailyData>();
日付loop
{
GetPage
Regexで情報抽出
dictへ情報格納
}
return new FetchResult { Code = code, Prices = dict, ReturnStatus = FetchResult.Status.Success };
}
修正
銘柄loop
{
var dict = new SortedDictionary<int, NewDailyData>();
日付loop
{
GetPage
Regexで情報抽出
dictへ情報格納
}
return new FetchResult { Code = code, Prices = dict, ReturnStatus = FetchResult.Status.Success };
}
398名無しさん@お腹いっぱい。
2019/04/12(金) 19:33:29.18ID:qIprkJKA0 恐れていた事が起きましたね お手軽に行かないかと思っていたのが甘かったです
ソースの他の所を見ながらトライするしかなさそうですね
ソースの他の所を見ながらトライするしかなさそうですね
399名無しさん@お腹いっぱい。
2019/04/12(金) 21:02:21.32ID:qIprkJKA02019/04/12(金) 22:46:17.62ID:/3nGHiOF0
400
401名無しさん@お腹いっぱい。
2019/04/13(土) 08:44:57.14ID:iC2zajSW02019/04/13(土) 11:42:18.93ID:T94MFsNa0
となると最初の質問者さんは、ブレークポイントなどを使って自分の意図通りにプログラムが動いているかを確認すれば解決しそうですね。
403名無しさん@お腹いっぱい。
2019/04/14(日) 10:05:55.16ID:UbpiL9V00 util.cs [IsMarketOpenDate(DateTime d)]の開場日誤判定について
祝日は内閣府ウェブページのcsvより
日付 IsMarketOpenDate 内閣府発表祝日
2019/4/30 非休場 休日
2019/5/1 非休場 休日(祝日扱い)
2019/5/2 非休場 休日
2019/10/22 非休場 休日(祝日扱い)
2020/2/24 非休場 休日
2020/7/23 非休場 海の日
2020/7/24 非休場 スポーツの日
2020/8/10 非休場 山の日
市場が開いている日をOmegaが祝日と判定しているかは調べていない。
祝日は内閣府ウェブページのcsvより
日付 IsMarketOpenDate 内閣府発表祝日
2019/4/30 非休場 休日
2019/5/1 非休場 休日(祝日扱い)
2019/5/2 非休場 休日
2019/10/22 非休場 休日(祝日扱い)
2020/2/24 非休場 休日
2020/7/23 非休場 海の日
2020/7/24 非休場 スポーツの日
2020/8/10 非休場 山の日
市場が開いている日をOmegaが祝日と判定しているかは調べていない。
404名無しさん@お腹いっぱい。
2019/04/14(日) 10:40:52.41ID:2G9OsrXE0 誰か教えてください。
移動平均線を増やしたいのですが?
以前どことどこを書き換えれよいのか
見たような気がするのですが見っかり
ません。連休に追加したいのですが。
移動平均線を増やしたいのですが?
以前どことどこを書き換えれよいのか
見たような気がするのですが見っかり
ません。連休に追加したいのですが。
2019/04/14(日) 11:00:57.54ID:2mOccDVK0
移動平均の本数増やすのは拡張キットのほうで対応することになるのではないかな
2019/04/14(日) 13:57:41.74ID:9f6QPbkj0
内閣府から出てる休日CSVは
http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu_kyujitsu.csv
これを自動的に見に行く仕様にすれば、休日チェック漏れはなくなりそう。
でもOmega起動時毎回見に行くのもなんなので、休日CSVをOmegaフォルダに保存して、更新1か月経ってるCSVだったら内閣府サイトを見に行くという感じだと良さげ?
http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu_kyujitsu.csv
これを自動的に見に行く仕様にすれば、休日チェック漏れはなくなりそう。
でもOmega起動時毎回見に行くのもなんなので、休日CSVをOmegaフォルダに保存して、更新1か月経ってるCSVだったら内閣府サイトを見に行くという感じだと良さげ?
407名無しさん@お腹いっぱい。
2019/04/14(日) 15:07:14.30ID:UbpiL9V00 OmegaChartのデータダウンロードはIsMarketOpenDateで市場openを判定して、これ以外はダウンロードしない仕様のようだ。
問題は、市場openを休場日として判定して、ウェブでデータを公開していても取りこぼしになるかもしれないということ。
問題は、市場openを休場日として判定して、ウェブでデータを公開していても取りこぼしになるかもしれないということ。
408名無しさん@お腹いっぱい。
2019/04/14(日) 17:16:57.89ID:Dri35EJe0 休日と判定された日以外は立会日
409名無しさん@お腹いっぱい。
2019/04/14(日) 17:38:41.13ID:UbpiL9V00 12月23日月曜日は祝日ではないし、来年の祝日移動でもOmegaは誤判定すると思うが。
410名無しさん@お腹いっぱい。
2019/04/14(日) 17:50:16.79ID:Dri35EJe0 これを見て修正するのが確実では
https://www.jpx.co.jp/corporate/about-jpx/calendar/
https://www.jpx.co.jp/corporate/about-jpx/calendar/
411名無しさん@お腹いっぱい。
2019/04/14(日) 18:19:19.70ID:2G9OsrXE0412名無しさん@お腹いっぱい。
2019/04/14(日) 18:45:52.58ID:UbpiL9V00 自分はコンソールアプリでデータを取得しているので関係ないけど。
ここでは時系列データを取得している人が多いような印象を受けています。
無尽蔵など日付ごとにアドレスが異なるサイトからの取得に対して、銘柄ごとにアドレスを分けている時系列タイプのデータソースにも取得するdate配列を渡しているのがどうかなと思ってしまう。
祝日を拾ってくるのもいいけどアドレス変更やページの仕様変更でデータ取得同様ソース変更が必要になるかもしれない。
無尽蔵等JPXと契約していないと想像するサイトは将来閉鎖される可能性もあるかもしれない。
保存されている最終日付を渡して、それ以降の土日年末年始以外のデータを読み込みに行って、NoFoundであればスキップするような仕様変更を考えてもよさそうな気がしている。
>>410 このページいいね。ありがとう。
ここでは時系列データを取得している人が多いような印象を受けています。
無尽蔵など日付ごとにアドレスが異なるサイトからの取得に対して、銘柄ごとにアドレスを分けている時系列タイプのデータソースにも取得するdate配列を渡しているのがどうかなと思ってしまう。
祝日を拾ってくるのもいいけどアドレス変更やページの仕様変更でデータ取得同様ソース変更が必要になるかもしれない。
無尽蔵等JPXと契約していないと想像するサイトは将来閉鎖される可能性もあるかもしれない。
保存されている最終日付を渡して、それ以降の土日年末年始以外のデータを読み込みに行って、NoFoundであればスキップするような仕様変更を考えてもよさそうな気がしている。
>>410 このページいいね。ありがとう。
413名無しさん@お腹いっぱい。
2019/04/14(日) 19:38:44.75ID:UbpiL9V00 >>412
Yahoo.csをみて自分が間違っていることに気が付きました。
ソースを見るとページ内の時系列はすべて読み込んでいるようです。
データもれはないと思いました。
しかし、祝日判定の間違いで渡されたdate配列に祝日があれば出来高0の空のDailyDataを作るようです。
チャートでは祝日も表示されてしまいますね。
取引ない場合もあることを失念していました。
やはり祝日判定は必要ですかね。
おさがわせして申し訳ありませんでした。
Yahoo.csをみて自分が間違っていることに気が付きました。
ソースを見るとページ内の時系列はすべて読み込んでいるようです。
データもれはないと思いました。
しかし、祝日判定の間違いで渡されたdate配列に祝日があれば出来高0の空のDailyDataを作るようです。
チャートでは祝日も表示されてしまいますね。
取引ない場合もあることを失念していました。
やはり祝日判定は必要ですかね。
おさがわせして申し訳ありませんでした。
414名無しさん@お腹いっぱい。
2019/04/14(日) 20:15:08.09ID:Dri35EJe0 GetPageの
using (var reader = new StreamReader(Util.HttpDownload(url)))
page = reader.ReadToEnd();
のことですよね
using (var reader = new StreamReader(Util.HttpDownload(url)))
page = reader.ReadToEnd();
のことですよね
415名無しさん@お腹いっぱい。
2019/04/14(日) 21:07:42.49ID:UbpiL9V00 ParsePageの中でforeach (Match m in matches)でテーブル一覧のデータをSortedDictionaryに追加しています。
正規表現が正しければページのすべての行を読み込むと思います。
最後のreturnの直前で、渡されたdate配列のうちSortedDictionaryのキーに存在しない日付を空のNewDailyDataで追加して埋め込んでいます。
そのあとにUpdateDataFarmが呼ばれてデータを更新するようですが、ここで最初にSortedDictionaryのデーター分のDailyDataFarmを作成しています。
foreachで出来高がある場合は4本値で更新して、ない場合は空のままSaveしてデータ更新を終了しているようです。
正規表現が正しければページのすべての行を読み込むと思います。
最後のreturnの直前で、渡されたdate配列のうちSortedDictionaryのキーに存在しない日付を空のNewDailyDataで追加して埋め込んでいます。
そのあとにUpdateDataFarmが呼ばれてデータを更新するようですが、ここで最初にSortedDictionaryのデーター分のDailyDataFarmを作成しています。
foreachで出来高がある場合は4本値で更新して、ない場合は空のままSaveしてデータ更新を終了しているようです。
416名無しさん@お腹いっぱい。
2019/04/15(月) 05:13:37.91ID:XTNGYmxu0 たとえGetPageが単銘柄1日分限定の書き方でもParsePageで全銘柄時系列ループすれば良いみたいですね
ありがとうございました
ありがとうございました
417名無しさん@お腹いっぱい。
2019/04/16(火) 15:43:15.80ID:EpEzWv5A0 ↑
一寸しつこくなるかも知れないが情報提供しますね
GetPage はデータ開始日から終了日までを単に読みに行くだけなので
データが次のページにあるときはアドレスを変えて繰り返し読ませれば良い 従って ParsePage の書き換えは不要
取り敢えず以下でOK 最初の質問者さんが失敗したのは多分 DaysAtOnceの指定値が 1ページ分以下だったせいかな
try
{
for (int i = 0; i < page_count; i++) {
string web = url + (i > 0 ? "&ashi=day&page=" + (i + 1).ToString() : "");
using (var reader = new StreamReader(Util.HttpDownload(web)))
page += reader.ReadToEnd();
}
}
...
こいつはHTML文字列を単純に読み加えるだけなので思わぬデータ重複?や不具合な文字列を拾う可能性もある
詳しくは調べていないが 3回目の読み込みでリモート サーバー エラーが出たのはそのせいかもしれない
ParsePage の正規表現変更で対応できる問題かもしれない
ただこれ以上やると指数の取得だけならまだいいが個別銘柄までとなると
サーバーに大きな負荷をかけて迷惑を起こす恐れもあるので ParsePageで必要になる新しい正規表現は公開しません
(Omegachartにとって必須ではないし自分は別プログラム使ってあちこちから好きに取っていますので悪しからず)
一寸しつこくなるかも知れないが情報提供しますね
GetPage はデータ開始日から終了日までを単に読みに行くだけなので
データが次のページにあるときはアドレスを変えて繰り返し読ませれば良い 従って ParsePage の書き換えは不要
取り敢えず以下でOK 最初の質問者さんが失敗したのは多分 DaysAtOnceの指定値が 1ページ分以下だったせいかな
try
{
for (int i = 0; i < page_count; i++) {
string web = url + (i > 0 ? "&ashi=day&page=" + (i + 1).ToString() : "");
using (var reader = new StreamReader(Util.HttpDownload(web)))
page += reader.ReadToEnd();
}
}
...
こいつはHTML文字列を単純に読み加えるだけなので思わぬデータ重複?や不具合な文字列を拾う可能性もある
詳しくは調べていないが 3回目の読み込みでリモート サーバー エラーが出たのはそのせいかもしれない
ParsePage の正規表現変更で対応できる問題かもしれない
ただこれ以上やると指数の取得だけならまだいいが個別銘柄までとなると
サーバーに大きな負荷をかけて迷惑を起こす恐れもあるので ParsePageで必要になる新しい正規表現は公開しません
(Omegachartにとって必須ではないし自分は別プログラム使ってあちこちから好きに取っていますので悪しからず)
418名無しさん@お腹いっぱい。
2019/04/16(火) 18:15:22.86ID:dBGa9eAq0 OmegaChartのダイアログでのダウンロードは最大2か月間の様です。
Yahoo.csも同様ですが、コードを眺めたかぎりではダイアログの次の日付以降で渡す配列が30本以上あれば銘柄ごとに複数ページを読むと思われます。
(全銘柄を読み終わったのちに残りの日付ページに変更する仕様のようです)
*株探に関しては昨年末にページ変更されて、正規表現の修正をしていないようなことを1か月前に作者が言っていたような記憶があります。
間違いかもしれませんが、300あたりから過去ログを読み返してみてください。
正規表現が正しいと仮定して、2か月間以上の過去データをダウンロードしたければ、下のようにコードを変更してダイアログで目的の日付を選択すればできると思われます。
膨大な時間がかかりそうですが。
Download.cs の ListDates()
DateTime start = ld.AddMonths(-2); //632行 -2を-6などに変更
Yahoo.csも同様ですが、コードを眺めたかぎりではダイアログの次の日付以降で渡す配列が30本以上あれば銘柄ごとに複数ページを読むと思われます。
(全銘柄を読み終わったのちに残りの日付ページに変更する仕様のようです)
*株探に関しては昨年末にページ変更されて、正規表現の修正をしていないようなことを1か月前に作者が言っていたような記憶があります。
間違いかもしれませんが、300あたりから過去ログを読み返してみてください。
正規表現が正しいと仮定して、2か月間以上の過去データをダウンロードしたければ、下のようにコードを変更してダイアログで目的の日付を選択すればできると思われます。
膨大な時間がかかりそうですが。
Download.cs の ListDates()
DateTime start = ld.AddMonths(-2); //632行 -2を-6などに変更
419名無しさん@お腹いっぱい。
2019/04/16(火) 18:52:16.43ID:dBGa9eAq0 >>418 5797のコードであればYahooと違って、株探は複数ページは読まないですね。
失礼しました。
正規表現もオリジナルのままではだめですね。
これでどうでしょう。
var valid = new Regex(@">(?<year>\d{2})/(?<month>\d?\d)/(?<day>\d?\d)</time></th>\r\n" +
"<td>(?<open>[0-9,.]+)</td>\r\n<td>(?<high>[0-9,.]+)</td>\r\n<td>(?<low>[0-9,.]+)</td>\r\n<td>(?<close>[0-9,.]+)</td>\r\n" +
"<td>.*</td>\r\n<td>.*</td>\r\n<td>(?<volume>[0-9,]+)</td>");
失礼しました。
正規表現もオリジナルのままではだめですね。
これでどうでしょう。
var valid = new Regex(@">(?<year>\d{2})/(?<month>\d?\d)/(?<day>\d?\d)</time></th>\r\n" +
"<td>(?<open>[0-9,.]+)</td>\r\n<td>(?<high>[0-9,.]+)</td>\r\n<td>(?<low>[0-9,.]+)</td>\r\n<td>(?<close>[0-9,.]+)</td>\r\n" +
"<td>.*</td>\r\n<td>.*</td>\r\n<td>(?<volume>[0-9,]+)</td>");
420名無しさん@お腹いっぱい。
2019/04/16(火) 19:15:08.10ID:dBGa9eAq0 >>419 C#でNetFrameWorkコンソールアプリを作成して
以下のコードで正規表現試してみてください(urlに時系列ページアドレスを代入のこと)。
using System;
using System.Text.RegularExpressions;
using System.Net.Http;
namespace ConsoleApp1 {
class Program {
static void Main(string[] args) {
var valid = new Regex(@">(?<year>\d{2})/(?<month>\d?\d)/(?<day>\d?\d)</time></th>\r\n" +
"<td>(?<open>[0-9,.]+)</td>\r\n<td>(?<high>[0-9,.]+)</td>\r\n<td>(?<low>[0-9,.]+)</td>\r\n<td>(?<close>[0-9,.]+)</td>\r\n" +
"<td>.*</td>\r\n<td>.*</td>\r\n<td>(?<volume>[0-9,]+)</td>");
string buf = null;
string url = "";
if (url != "") {
using (HttpClient client = new HttpClient()) {
buf = client.GetStringAsync(url).Result; }
var matches = valid.Matches(buf);
foreach (Match m in matches) {
for (int i = 1; i < m.Groups.Count; i++)
Console.Write("{0} ", m.Groups[i].Value);
Console.WriteLine();}} else
Console.WriteLine("コードのurl入力が必要");
Console.WriteLine("何かキーを押すと終了");
Console.ReadKey(); } }
}
以下のコードで正規表現試してみてください(urlに時系列ページアドレスを代入のこと)。
using System;
using System.Text.RegularExpressions;
using System.Net.Http;
namespace ConsoleApp1 {
class Program {
static void Main(string[] args) {
var valid = new Regex(@">(?<year>\d{2})/(?<month>\d?\d)/(?<day>\d?\d)</time></th>\r\n" +
"<td>(?<open>[0-9,.]+)</td>\r\n<td>(?<high>[0-9,.]+)</td>\r\n<td>(?<low>[0-9,.]+)</td>\r\n<td>(?<close>[0-9,.]+)</td>\r\n" +
"<td>.*</td>\r\n<td>.*</td>\r\n<td>(?<volume>[0-9,]+)</td>");
string buf = null;
string url = "";
if (url != "") {
using (HttpClient client = new HttpClient()) {
buf = client.GetStringAsync(url).Result; }
var matches = valid.Matches(buf);
foreach (Match m in matches) {
for (int i = 1; i < m.Groups.Count; i++)
Console.Write("{0} ", m.Groups[i].Value);
Console.WriteLine();}} else
Console.WriteLine("コードのurl入力が必要");
Console.WriteLine("何かキーを押すと終了");
Console.ReadKey(); } }
}
421名無しさん@お腹いっぱい。
2019/04/16(火) 19:40:03.10ID:EpEzWv5A0 あはは 盛り上がって来ましたね
422名無しさん@お腹いっぱい。
2019/04/16(火) 19:50:55.33ID:EpEzWv5A0 連投すまぬ
@"> の所を @"<th scope=""row""><.*>と長ったらしくやってしまったが後は全部同じだった
@"> の所を @"<th scope=""row""><.*>と長ったらしくやってしまったが後は全部同じだった
423名無しさん@お腹いっぱい。
2019/04/16(火) 21:19:39.87ID:dBGa9eAq0424名無しさん@お腹いっぱい。
2019/04/16(火) 21:27:29.50ID:dBGa9eAq0425名無しさん@お腹いっぱい。
2019/04/16(火) 21:37:43.59ID:dBGa9eAq0 >>424
21行目を変更しないと1度ページ毎に20行以上はデータ読めないので変更必要かも。
private const int DaysAtOnce = 60; // 一度に取得する時系列の営業日数
21行目を変更しないと1度ページ毎に20行以上はデータ読めないので変更必要かも。
private const int DaysAtOnce = 60; // 一度に取得する時系列の営業日数
426名無しさん@お腹いっぱい。
2019/04/17(水) 06:21:47.87ID:aEhBulrq0 あそこは構造上 本日分を繰り返し読み込む事になる
試しに1銘柄だけ最大の300本取ってみたら本日分だけが重複して309本取れていた
これは避けられないのでどこかでフィルターする必要がある 正規表現でも良いけど上手い書き方ないかな
試しに1銘柄だけ最大の300本取ってみたら本日分だけが重複して309本取れていた
これは避けられないのでどこかでフィルターする必要がある 正規表現でも良いけど上手い書き方ないかな
427名無しさん@お腹いっぱい。
2019/04/17(水) 07:44:47.28ID:rU6wJGwJ0 >>426
本日分300本?
1銘柄で300ページ読んだのですか?
&ashi=day&page=2 から &ashi=day&page=10 と9ページを追加して読んでも、当日分しか読めなかったのですか?
毎ページごとに最終日付分が最初にあるため、これを省かなければなりません。
そもそもSortedDictionaryは同一キーをを追加できないので、そのまま実行すると、追加の段階でエラーで止まるはずで30本以上は追加できないのでは?
ParsePageの298行で追加する場所に
if (dict.ContainsKey(Util.DateToInt(date)))
を追加することで、すでに追加されているキーはスキップしてエラー回避できると思います。
根本的に改造するとなると、GetPage、FetchPricesにページ番号の引数を追加して、Run()の中でnikkei225の日付データと渡された日付配列を比較しながらページ番号をインクリメントしていく方法もあると思います。
本日分300本?
1銘柄で300ページ読んだのですか?
&ashi=day&page=2 から &ashi=day&page=10 と9ページを追加して読んでも、当日分しか読めなかったのですか?
毎ページごとに最終日付分が最初にあるため、これを省かなければなりません。
そもそもSortedDictionaryは同一キーをを追加できないので、そのまま実行すると、追加の段階でエラーで止まるはずで30本以上は追加できないのでは?
ParsePageの298行で追加する場所に
if (dict.ContainsKey(Util.DateToInt(date)))
を追加することで、すでに追加されているキーはスキップしてエラー回避できると思います。
根本的に改造するとなると、GetPage、FetchPricesにページ番号の引数を追加して、Run()の中でnikkei225の日付データと渡された日付配列を比較しながらページ番号をインクリメントしていく方法もあると思います。
428名無しさん@お腹いっぱい。
2019/04/17(水) 08:06:09.98ID:rU6wJGwJ0 >>426
余計なお世話かもしれないけど、膨大な複数ページを同一サーバーに連続してリクエストするとアクセス拒否やさらに続けていると不正アクセスや攻撃の疑いなどで調査されることもあるかもしれませんよ。
ページ取得ごとにある程度のウェイトをかけた方が安全と思います。
普通はThread.Sleepだけれと、このクラスの書き方はマルチスレッドを想定しているので、もしかするとTaskのように実行スレッドにウェイトをかける方法は別かもしれません。
現在であれば、Taskの非同期処理で書き換えた方がいいのかもしれない。
このスレッドの書き方はよくわからんし、調べる気にもならん。
余計なお世話かもしれないけど、膨大な複数ページを同一サーバーに連続してリクエストするとアクセス拒否やさらに続けていると不正アクセスや攻撃の疑いなどで調査されることもあるかもしれませんよ。
ページ取得ごとにある程度のウェイトをかけた方が安全と思います。
普通はThread.Sleepだけれと、このクラスの書き方はマルチスレッドを想定しているので、もしかするとTaskのように実行スレッドにウェイトをかける方法は別かもしれません。
現在であれば、Taskの非同期処理で書き換えた方がいいのかもしれない。
このスレッドの書き方はよくわからんし、調べる気にもならん。
429名無しさん@お腹いっぱい。
2019/04/17(水) 08:46:58.47ID:aEhBulrq0 オメガからではないが10ページ分300本サーバーの迷惑にはならない様にしている
430名無しさん@お腹いっぱい。
2019/04/17(水) 09:10:58.31ID:zQnQ5QQL0 >>429
余計でしたね。失礼しました。
別のプログラムであれば、SortedListの方が使い勝手がいいかもしれません。
indexによるキーまたはValueのアクセスもできるはずです。
同一キーの存在調査は同じく、ContainsKeyです。
Omegaのデータ更新クラスは難しくて、いろんなところに飛ぶため読んでいて腹が立ちますね。
また、データセブのときにunsafeでポインタも利用しているし。
SortedListでデーターを読み込んでバイナリに保存する方が簡単ですね。
余計でしたね。失礼しました。
別のプログラムであれば、SortedListの方が使い勝手がいいかもしれません。
indexによるキーまたはValueのアクセスもできるはずです。
同一キーの存在調査は同じく、ContainsKeyです。
Omegaのデータ更新クラスは難しくて、いろんなところに飛ぶため読んでいて腹が立ちますね。
また、データセブのときにunsafeでポインタも利用しているし。
SortedListでデーターを読み込んでバイナリに保存する方が簡単ですね。
431名無しさん@お腹いっぱい。
2019/04/17(水) 10:19:05.25ID:aEhBulrq0 C#は殆ど使わない方言なので読めるが上手く書けずに苦労しますわ
2019/04/17(水) 14:40:50.22ID:gTEL/YSP0
>>428
かなりしっかりしたサーバーでないとエラーにならずに適切に全データーを取得できないような気がするのだけど、そこのところどうなのだろう?
かなりしっかりしたサーバーでないとエラーにならずに適切に全データーを取得できないような気がするのだけど、そこのところどうなのだろう?
433名無しさん@お腹いっぱい。
2019/04/17(水) 16:47:24.12ID:zQnQ5QQL0 >>432
ウェブページの読み込みごとに適切にウェイト(1秒とか)をかけるとエラーにはならないと思います。
以前のk-dbではアクセス制限がキツくウェイトかけても数ページ読み込むとすぐにアクセス拒否されましたが。
しかし、Yahooはスクレイピングの禁止を明示していますし、カブタンでも
「複製、編集、加工等を行う行為」
「コンテンツ等を蓄積する行為」
「サーバーに不当な負担をかける行為」
などを禁止していますので、アクセス数などからスクレイピングとデータ蓄積を疑われて調査され訴えられる危険性は常にあると思います。
調査しようと思えば、プロバイダーに協力を求めれば身元はわかると思っています。
自分はこれらのページのスクレイピングをすすめているのではありません。
あくまでC#プログラミングのアドバイスをしているだけのつもりです。
ウェブページの読み込みごとに適切にウェイト(1秒とか)をかけるとエラーにはならないと思います。
以前のk-dbではアクセス制限がキツくウェイトかけても数ページ読み込むとすぐにアクセス拒否されましたが。
しかし、Yahooはスクレイピングの禁止を明示していますし、カブタンでも
「複製、編集、加工等を行う行為」
「コンテンツ等を蓄積する行為」
「サーバーに不当な負担をかける行為」
などを禁止していますので、アクセス数などからスクレイピングとデータ蓄積を疑われて調査され訴えられる危険性は常にあると思います。
調査しようと思えば、プロバイダーに協力を求めれば身元はわかると思っています。
自分はこれらのページのスクレイピングをすすめているのではありません。
あくまでC#プログラミングのアドバイスをしているだけのつもりです。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否★6 [夜のけいちゃん★]
- 「厚かましい挑発的発言だ」中国国連大使が高市首相発言に強く反発 日本の常任理事国入りに明確に反対 [ぐれ★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 ★3 [蚤の市★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★5 [蚤の市★]
- 自民、経済対策で子ども1人に2万円給付へ 児童手当に上乗せ 所要額は約4000億円 [ぐれ★]
- 解体ごみ約2.3トンを山に不法投棄か トルコ国籍解体工を逮捕 埼玉 [どどん★]
- 【緊急】高市早苗 月内辞任か [695089791]
- 僕たちが子供の頃に通い詰めた本屋、ゲームショップ、レンタルCD・ビデオ屋、思い出とともにこの国から消え去ってしまう… [452836546]
- 【速報】中国、水産物輸入停止 [527893826]
- 【高市悲報】官房長官「局長がペコペコしてる画像が拡散しているが日本は承知しとらん😡中国に申し入れした!」🤔 [359965264]
- 【悲報】高市早苗さん、たった一人で日本を崩壊へ導く [714769305]
- 【悲報】「やったー!こだわりまくった洋館仕立ての家を建てたぞ!」➡「「離婚したんで住まずに売ります……」 [158478931]
