So-net無料ブログ作成
検索選択

ニュスから決算予定日を取得 [ニュース]

決算発表予定のニュースが朝夕?配信されていますが、読みづらいのでDataGridViewで一覧表示するトレーディングアプリを作成してみました。スクリーンショット 2017-01-17 20.22.53.png
決算発表予定のニュースは2種類ありますが、「コード順」の方を読み込んでDataGridViewに表示します。
起動中に決算予定が見つかるたびにDataGridViewを書き換えるので、20〜30秒ほど表示までかかるためフリーズしたように思えるかもしれません。
開きっぱなしにしておいて、発表予定のニュースが配送されるとその都度データを更新して書き換えます(この時も時間がかかってしまいます。)。
時間を短縮する方法が思いつかなかったので、そのまま公開します。

使用方法
(1)トレーディングアプリケーションを新規作成してコードを貼り付けます。
(2)開発環境でコードを表示して、右側のプロパティをクリックしてInitializedイベントに「AnalysisTechnique_Initialized」を追加してから検証します。
(3)ワークスペースに戻り、トレーディングアプリの中から選択して実行してください。

using platform;
using elsystem;
using elsystem.windows.forms;
using elsystem.collections;
using tsdata.marketdata;

Variables: Form Form1(null)
	, DataGridView dgvKessan(null), DataGridView dgvNews(null)
	, TabControl tab(null), TabPage page1(null), TabPage page2(null)
	, NewsProvider NewsProvider1(null)
	, Dictionary dicName(null), Dictionary dicSdate(null), Dictionary dicUpdate(null)
	;
Array: Quoter[7]("");

method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
Variables: int counter;
begin
	Clearprintlog();
	Form1 = Form.Create();
	//Form1.FormClosing += Form1_FormClosing;
	//決算の記号
	Quoter[1] = "本";
	Quoter[2] = "修";
	Quoter[3] = "①";
	Quoter[4] = "②";
	Quoter[5] = "③";
	Quoter[6] = "④";
	Quoter[7] = "⑤";
	
	tab = TabControl.Create();
	Form1.AddControl(tab);
	tab.Dock = elsystem.windows.forms.DockStyle.Fill;
//----Tabpage1
	page1 = TabPage.Create();
	page1.Text = "決算予定";
	tab.AddControl(page1);
	dgvKessan = DataGridView.Create();
	dgvKessan.Height = 20;
	dgvKessan.Columns.Add("コード");
	dgvKessan.Columns.Add("name");
	dgvKessan.Columns.Add("予定日");
	dgvKessan.Columns.Add("期");
	dgvKessan.Columns.Add("update");
	For counter = 0 to 4 begin
		dgvKessan.Columns[counter].AutoSizeMode = elsystem.windows.forms.DataGridViewAutoSizeColumnMode.AllCells;
	End;
	dgvKessan.ColumnHeadersDefaultCellStyle.Alignment = elsystem.windows.forms.DataGridViewContentAlignment.MiddleCenter;
	dgvKessan.Columns[2].DefaultCellStyle.Format = "yyyy/M/d";
	dgvKessan.AllowUserToAddRows = false;
	dgvKessan.Name = "dgvKessan";
	page1.AddControl(dgvKessan);
	dgvKessan.Dock = elsystem.windows.forms.DockStyle.Fill;
	tab.AddControl(page1);
	//page1.Dock = elsystem.windows.forms.DockStyle.Fill;

//---------Tabpage2
	page2 = TabPage.Create();
	dgvNews = DataGridView.Create();
	page2.AddControl(dgvNews);
	dgvNews.Dock = elsystem.windows.forms.DockStyle.Fill;
	page2.Text = "ニュース";
	dgvNews.Columns.Add("date");
	dgvNews.Columns.Add("Title");
	dgvNews.Columns.Add("Source");
	dgvNews.Columns.Add("Summary");
	dgvNews.Columns.Add("Content");
	dgvNews.Columns[0].AutoSizeMode = elsystem.windows.forms.DataGridViewAutoSizeColumnMode.AllCells;
	dgvNews.Columns[1].Width = 360;
	dgvNews.AllowUserToAddRows = false;
	tab.AddControl(page2);
//-------NewsProvider
	NewsProvider1 = NewsProvider.Create();
	NewsProvider1.Updated += NewsProvider1_Updated;
	NewsProvider1.FilterType = 0;	//all
	//NewsProvider1.DaysBack = 1;
	NewsProvider1.Keywords = "決算";	//決算で絞込
	NewsProvider1.Load = true;
	//print("DaysBack:", NewsProvider1.DaysBack, " From:", NewsProvider1.From.ToString(), " TimeZone:", NewsProvider1.TimeZone.ToString());
	//DaysBack:  10.00 From:2017/01/10 TimeZone:local
	Form1.Dock = elsystem.windows.forms.DockStyle.Fill;
	Form1.Show();
	
end;

Method void NewsProvider1_Updated( elsystem.Object sender, NewsUpdatedEventArgs args ) 
Begin
	If args.Data <> null then
	Begin
		If args.Data.Title.Contains("決算発表") and args.Data.Title.Contains("コード順") then 
			args.Data.Content.Load();	//記事の内容を読み込む
		args.Data.PublishDate.AddHours(9);	//日本時間に変更
		dgvNews.rows.Add(args.Data.PublishDate, args.Data.Title
			, args.Data.SourceFeed.Description
			, args.Data.Summary,  args.Data.Content.Text);
		dgvNews.Sort(dgvNews.Columns[0], 1); //ListSortDirection  2ページ目のニュース一覧日付逆順で表示
		If args.Data.Title.Contains("決算発表") and args.Data.Title.Contains("コード順") then 
			AddKessan(args.Data.Content.Text, args.Data.PublishDate);
	End;
End ;

Method void AddKessan(string content, DateTime dPub)
Vars: int counter, int counter2, int pos1, int pos2
	, string sCode, string name, string sDate, string sQ
	, int code, DateTime dKessan;
Begin
	If dicName = null then 
	Begin
		dicName = Dictionary.Create();		//銘柄名
		dicSdate = Dictionary.Create();		//日付と決算期
		dicUpdate = Dictionary.Create();
	End;
	If content.Length > 0 then
	Begin
		pos1 = content.IndexOf("<");
		While pos1 > 0 Begin
			pos2 = content.IndexOf(">", pos1);	//codeは<>でくくられている
			If pos2 < pos1 then break;
			sCode = content.Substring(pos1 + 1, pos2 - pos1 - 1);
			pos1 = content.IndexOf("(", pos2);	//銘柄名に続き()の中に発表日と期
			If pos1 < pos2 then break;
			name = content.Substring(pos2 + 1, pos1 - pos2 - 1);
			pos2 = content.IndexOf(")", pos1);
			If pos2 < pos1 then break;
			sDate = content.Substring(pos1 + 1, pos2 - pos1 - 1);
			If int.TryParse(sCode, code) then
			Begin
				If dicName.Contains(sCode) then
				Begin	//銘柄コードの決算登録済みであれば一度削除
					dicName.Remove(sCode);
					dicSdate.Remove(sCode);
					dicUpdate.Remove(sCode);
				End;
				dicName.Add(sCode, name);
				dicSdate.Add(sCode, sDate);
				dicUpdate.Add(sCode, dPub);
			End;
			pos1 = content.IndexOf("<", pos2);
			If pos1 < pos2 then break;	//"<"がみつからなければ抜ける
		End; 
		{
		If code > 9000 then
		Begin	//1000台から順番に発表されると仮定9000になったらデータ表示
			UpdateDgvKessan();
		End;	//もしも順番がくずれるとだめなので時間かかるが毎回書き換え
		}
		UpdateDgvKessan();
	End;
End;

Method void UpdateDgvKessan()
Vars: int counter, int counter2, int pos1, string sCode, string name
	, string sDate, string sQ, int code, int yy, int mm,int dd, DateTime dKessan;
Begin
	dgvKessan.Rows.Clear();	//データ変更時には全行クリアして再度追加時間かかるが仕方ない
	For counter = 0 to dicName.Count - 1 Begin
		sCode = dicName.Keys[counter].ToString();
		sQ = "";
		For counter2 = 1 to 7 begin
			If dicSdate[sCode].ToString().Contains(Quoter[counter2]) then
			Begin
				sQ = Quoter[counter2];
				sDate = dicSdate[sCode].ToString().Replace(sQ, "");
				pos1 = sDate.IndexOf("/");
				mm = int.Parse(sDate.Substring(0, pos1));
				dd = int.Parse(sDate.Substring(pos1 + 1));
				//年末の日付に対応するため
				If mm < DateTime.Now.Month then yy = DateTime.Now.Year + 1 else yy = DateTime.Now.Year;
				dKessan = DateTime.Create(yy, mm, dd);
				Switch(counter2)
				Begin
				Case 1:
					sQ = "本決算";
				Case 2:
					sQ = "業績修正";
				Case 3:
					sQ = "第1四半期";
				Case 4:
					sQ = "第2四半期";
				Case 5:
					sQ = "第3四半期";
				Case 6:
					sQ = "1年超決算の第4四半期";
				Case 7:
					sQ = "1年超決算の第5四半期";
				End;
				Break;
			End;
		End;
		dgvKessan.Rows.Add(int.Parse(sCode)
			, dicName[sCode].ToString(), dKessan, sQ, DateTime.Parse(dicUpdate[sCode].ToString()));
	End;
End;


この決算発表予定のニュースは取得できなくなる時間もあるため、この時に立ち上げると決算予定は取得できません。
「ニュース」タブページには、「決算」をキーワードとしてフィルターをかけたニュース一覧が表示されていますので、ここに決算発表予定がなければニュースが配布されていないということになります。
スクリーンショット 2017-01-17 21.34.44.png

オリジナルのニュースアプリで見ると、個別では表示されていることもあるのですがここらへんの仕組みはまだよくわかりません。

ニュースの表示書式が変更されると、取得できなくなり「AddKessan」のコード修正が随時必要になりますので了承願います。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。