会則
@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
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#プログラミングのアドバイスをしているだけのつもりです。
2019/04/18(木) 14:33:52.09ID:QCAT4hwG0
株式投資メモというサイトだといろいろデータがそろっているようなのですが、こちらのサイトについて検討された方ございますでしょうか?
435名無しさん@お腹いっぱい。
2019/04/18(木) 15:21:18.54ID:5jGUExc90 ここすんなり取れそうですね
2019/04/19(金) 10:11:14.71ID:XSqCpuoc0
k-db.comみたく東証から警告されて、突然閉鎖になるリスクはないのかな
437名無しさん@お腹いっぱい。
2019/04/19(金) 12:30:26.81ID:j0Bn8SzG0 その可能性はあるね 個別銘柄の緊急取得には良さそう 地方市場のも揃っていて簡単にCSVで300本取れる
438名無しさん@お腹いっぱい。
2019/04/19(金) 14:51:14.55ID:wcnFnut+0 k tanから指定日または保存最終日以降の複数ページをTaskの非同期で取得してアップデートするクラスほぼ完成。
非同期なので、ダウンロード中も他の銘柄を表示が可能(スクリーンングはダメだが)。
ダウンロード経過はステータスバーに出力。
全部を試す気にはならないが、数銘柄で試してみた。
当日分はザラ場中なので確定した終値でないが。
以下は取得ログ
2019-04-19 14:36:33 200[OK] 201 円/ドル ?code=0950
2019-04-19 14:36:34 200[OK] 201 円/ドル ?code=0950&ashi=day&page=2
201 円/ドル 60件 2019-01-24-2019-04-19
2019-04-19 14:36:36 200[OK] 525 情報 ?code=0275
2019-04-19 14:36:37 200[OK] 525 情報 ?code=0275&ashi=day&page=2
525 情報 60件 2019-01-24-2019-04-19
2019-04-19 14:36:38 200[OK] 6758 ソニー ?code=6758
2019-04-19 14:36:40 200[OK] 6758 ソニー ?code=6758&ashi=day&page=2
6758 ソニー 60件 2019-01-24-2019-04-19
非同期なので、ダウンロード中も他の銘柄を表示が可能(スクリーンングはダメだが)。
ダウンロード経過はステータスバーに出力。
全部を試す気にはならないが、数銘柄で試してみた。
当日分はザラ場中なので確定した終値でないが。
以下は取得ログ
2019-04-19 14:36:33 200[OK] 201 円/ドル ?code=0950
2019-04-19 14:36:34 200[OK] 201 円/ドル ?code=0950&ashi=day&page=2
201 円/ドル 60件 2019-01-24-2019-04-19
2019-04-19 14:36:36 200[OK] 525 情報 ?code=0275
2019-04-19 14:36:37 200[OK] 525 情報 ?code=0275&ashi=day&page=2
525 情報 60件 2019-01-24-2019-04-19
2019-04-19 14:36:38 200[OK] 6758 ソニー ?code=6758
2019-04-19 14:36:40 200[OK] 6758 ソニー ?code=6758&ashi=day&page=2
6758 ソニー 60件 2019-01-24-2019-04-19
2019/04/19(金) 18:07:24.91ID:/+xRDzBc0
最近上場した銘柄のみスクリーニングってできますか?
440名無しさん@お腹いっぱい。
2019/04/19(金) 20:01:27.47ID:j0Bn8SzG0 ブックマークフォルダーに新規上場銘柄を入れてやる
2019/04/21(日) 15:29:43.88ID:MVgGksjO0
スクリーニングにするときに毎回お気に入りフォルダを選択するのがめんどいので
固定にしたいんですけどreturn _selectedFolderを
どうやって指定すればいいでしょうか
固定にしたいんですけどreturn _selectedFolderを
どうやって指定すればいいでしょうか
2019/04/21(日) 16:33:29.91ID:hHjH+BvG0
スクリーニングの条件設定画面、フィルタを「お気に入りのフォルダ」に強制的に変えるには、
ScreeningDialog.cs の一番上の方
_filterBox.SelectedIndex = 5;//0から5に変更
たぶん、フォルダ指定もしたいという話だと思いますが、それは自分もわからなかったです。
SelectBookmarkFolder.csの_treeViewを見ればできるような気もする。
ScreeningDialog.cs の一番上の方
_filterBox.SelectedIndex = 5;//0から5に変更
たぶん、フォルダ指定もしたいという話だと思いますが、それは自分もわからなかったです。
SelectBookmarkFolder.csの_treeViewを見ればできるような気もする。
2019/04/22(月) 22:09:20.80ID:kuR5QUfl0
>>442
やっとわかった。Bookmarkの中にBookmarkFolderという要素がある。
foreach でRoot.Children(ルートのBookmarkFolderの子供)を回して、フォルダ名で検索すれば見つけられる。
ただし、ネストが深いところにフォルダを作るとハンドリングが難しくなるのでなるべく浅いところに作る。
やっとわかった。Bookmarkの中にBookmarkFolderという要素がある。
foreach でRoot.Children(ルートのBookmarkFolderの子供)を回して、フォルダ名で検索すれば見つけられる。
ただし、ネストが深いところにフォルダを作るとハンドリングが難しくなるのでなるべく浅いところに作る。
444panacoran
2019/04/24(水) 22:12:01.65ID:PQ3O0S170 panacoranです
Yahoo.csで日経平均とTOPIX取得できないバグを直して、
休日の変更に対応させておきました
Yahoo.csで日経平均とTOPIX取得できないバグを直して、
休日の変更に対応させておきました
2019/04/24(水) 23:28:01.40ID:gl0vPH100
>>444
お疲れ様です! ありがとうございます。
お疲れ様です! ありがとうございます。
2019/04/25(木) 00:27:17.35ID:YhM8CEHJ0
447名無しさん@お腹いっぱい。
2019/04/25(木) 00:58:46.68ID:dm94bElt0 >>444
Yahoo、K-tanなどからのダウンロードを非同期で実行する試作クラスを作成してみました。
この例では、ダウンロードダイアログのOKボタンをフックして作動させています。
銘柄間のウェブアクセスに必要以上にウェイトを置いており、試作では全銘柄をダウンロードしないようにしているのでこのままでは実用的ではないかも知れません。
簡単にY等の全銘柄ダウンロードに改変可能と思います。
バグが多いと思いますが参考にしてみてください。
pastebinで1週間の限定公開となるはずです(5/1頃まで?)。
https://pastebin.com/3bffC5aP
Yahoo、K-tanなどからのダウンロードを非同期で実行する試作クラスを作成してみました。
この例では、ダウンロードダイアログのOKボタンをフックして作動させています。
銘柄間のウェブアクセスに必要以上にウェイトを置いており、試作では全銘柄をダウンロードしないようにしているのでこのままでは実用的ではないかも知れません。
簡単にY等の全銘柄ダウンロードに改変可能と思います。
バグが多いと思いますが参考にしてみてください。
pastebinで1週間の限定公開となるはずです(5/1頃まで?)。
https://pastebin.com/3bffC5aP
2019/04/25(木) 08:01:46.44ID:elCy5TET0
449名無しさん@お腹いっぱい。
2019/04/25(木) 12:05:44.40ID:fNVmryL40 >>447
UsYahooで終了後にメニューがオフのままで、ステータスバーが表示したままで非表示にならないバグ。
745行に以下を追加(class UsYahooDownloaderのpublic async Task Start(int[] codes))
await Task.Delay(5000);
Env.Frame.Menu.GetMainMenu().MenuItems[0].MenuItems[0].Visible = true;
Env.Frame.Menu.GetMainMenu().MenuItems[0].MenuItems[1].Visible = true;
base.Disopse();
UsYahooで終了後にメニューがオフのままで、ステータスバーが表示したままで非表示にならないバグ。
745行に以下を追加(class UsYahooDownloaderのpublic async Task Start(int[] codes))
await Task.Delay(5000);
Env.Frame.Menu.GetMainMenu().MenuItems[0].MenuItems[0].Visible = true;
Env.Frame.Menu.GetMainMenu().MenuItems[0].MenuItems[1].Visible = true;
base.Disopse();
450panacoran
2019/04/25(木) 14:22:52.39ID:CaWghIm/0 panacoranです
>>447
そのコードが私のコードベースに取り込まれることはありません
私が書いた株価取得コードはすべてProtraからの移植です
バグ修正等の共通化ができなくなるので、
OmegaChart独自の変更を取り込むことはありません
>>447
そのコードが私のコードベースに取り込まれることはありません
私が書いた株価取得コードはすべてProtraからの移植です
バグ修正等の共通化ができなくなるので、
OmegaChart独自の変更を取り込むことはありません
451名無しさん@お腹いっぱい。
2019/04/25(木) 14:42:33.41ID:fNVmryL40 >>450
了解しました
了解しました
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 毒親「働かないでいつもゴロゴロして!」俺「…」毒親「あっ近隣に熊が出たって!」俺「ふぅ」毒親「どこ行くんだ」
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 生活保護の受給額ってなんでこんなに安いの?
- お前らは“スカイマイルタワー”建設計画を知っているか?
- これ誰か分かるか?
- 支払い詰まってインターネット止まった
