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

取得した決算予定をレーダースクリーンに表示 [データ共有]

GlobalDictionaryを使うとトレーディングアプリとレーダースクリーンでデータが共有できて、取得した決算予定をレーダースクリーンに挿入できました。
スクリーンショット (85).png
Global変数とGlobalDictionaryに関しては、ヘルプによると「EasyLanguage 分析テクニックとストラテジーの間で共有可能」と記載されているので、これまでトレーディングアプリケーションのデータをレーダースクリーンで利用できないだろうと思い込んでいました。
GlobalDictionaryの共有の検証のつもりでダメもとで試したところ、簡単にデータがレーダースクリーンでも表示できて感動しました。
トレステプログラミングの可能性が大きく開けた(大げさ)ように思いました。


アプリの方は、前回のコードにGlobalDictionaryを追加しただけです(//****グローバル追加****)。

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)
	, GlobalDictionary gDicKessan(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
	gDicKessan = GlobalDictionary.Create(true, "kessan");			//****グローバル追加****
	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();	//データ変更時には全行クリアして再度追加時間かかるが仕方ない
	gDicKessan.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()));
		gDicKessan.Add(sCode, dKessan);			//****グローバル追加****
	End;
End;


続いて、レーダースクリーンに表示するためのショウミーまたはインジケーターを新規作成します。
チャート以外では、この違いがいまいちわからない。

using elsystem.collections;

Variables: GlobalDictionary gDicKessan(null)
	, string sCode("");

sCode = LeftStr(Symbol, 4);

Once Begin
	gDicKessan = GlobalDictionary.Create(true, "kessan");
	If gDicKessan.Contains(sCode) then
		Plot1(gDicKessan[sCode].ToString());
End;

決算予定のアプリを起動して完全に決算予定が表示された後にレーダースクリーンに作成した分析テクニックを挿入すると決算予定の日付が表示されると思います。

注意点:
(1)再起動した場合には、GlobalDictionary変数がクリアされるので、レーダースクリーンの決算予定はブランクになるはずです。

(2)決算ニュースの取得変更はレーダースクリーン表示後には反映されません。
実行の順番が重要です。
「表示」メニューの更新で反映されるようです(全行を選択している状態で)。

(3)一度アプリでデータが取得できれば、アプリを終了させても変数は残るようですので、トレステを閉じるまでは表示されたままのはずです。

(4)トレステのニュースは時々「本文を取得中です」で止まっていることがあるようです。
この時には、タイトルヘッダ含めてニュースが取得できません。
再度ログイン(右下ステータスバーの緑色の「取引ライブ」を何回かダブルクリックすると再ログインできるようです)すると取得できるようになる場合もあるようです。

(5)時間帯によっては決算予定のニュースが配信されず、この時に起動した場合には取得できません。

(6)ショウミーで取得した文字列を日付に変更して、FormatでPlot1に入れてやると「月/日」で表示したり、曜日を表示することもできると思います。

(7)決算期も表示させたい場合には、アプリの「UpdateDgvKessan()」の最後の部分gDicKessan.Add(sCode, dKessan);のDateTime変数dKessanを文字列に変更して決算期sQを加える、またはもう一つ決算期用のGlobalDictionaryを作成する方法などが考えられます。

(8)トレーディングアプリを起動しなくても、ショウミーの方でNewsProviderの宣言とUpdateイベントを追加して、「If gDicKessan.Count = 0 then」などとして一度だけインスタンスを作成実行することもできるかもしれません。


充分検証していませんので、不具合多々あると思いますので了解願います。



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

nice! 1

コメント 0

コメントを書く

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

トラックバック 0

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