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

ファンダメンタルデータ2(複数フィールドデータをエクセルで確認) [ファンダメンタル]

前回1つのフィールドを表示しました。
これが概ね理解できたと仮定して、複数フィールドのデータをエクセルで表示して実際の発表業績と比較しやすいように工夫してみます。
スクリーンショット 2017-01-21 13.27.53.png


*まずはエクセルファイルを作成して保存終了させてください。
作成したファイルパスを下のコードの「fileExcel」変数に代入変更してください。
ファイルがないとエラー(E)がレーダースクリーンに小さく表示されてPlotされません。
**レーダースクリーンに表示される銘柄で、デバッグしたいシンボルを「targetSymbolForDebug」に入力してください。
銘柄コードだけではダメで、シンボルで記入してください。複数銘柄は続けて追加書き込みしてください。
コードです。

using elsystem;
using tsdata.marketdata;
using elsystem.office.excel;

Inputs: fileExcel("c:\data\TradeStation\debug.xls")	//先にエクセルファイルを作成してパスを変更してください
	, targetSymbolForDebug("6758-TS,2931-TS")	//印刷ログ及びエクセルに出力するシンボル 複数銘柄入力できます 区切り文字はなくてもOK
	;
	
Vars: 	FundamentalQuotesProvider fundamental( null )
	, bool flagDebugPrint(false)		//印刷ログに出力するか
	, bool toExcel(true), Workbook wb(null)
	, GlobalValue gVal(null), int row(0)
	;

method void Fundamental_Updated( elsystem.Object sender, tsdata.marketdata.FundamentalQuoteUpdatedEventArgs args ) 
Vars: int fieldNo, int counter, string output, int col;
begin
	If fundamental.HasQuoteData(0) then
	Begin		//ヘルプ FundamentalQuote クラスを参照のこと
		Plot1(fundamental.Fields[0], "name", white, GetBackgroundColor);	//多数Plotすると勝手に背景色が変わって見にくいのでコードで指定
		Plot2(fundamental.Quote[0].ValueLast.ToString(), "LastValue", white, GetBackgroundColor); //最後のデータ(doubleと明確に分かっていればDoubleValueLastの方が数値比較やフォーマットに有利)
		Plot3(fundamental.Quote[0].PostDateLast.ToString(), "LastDate", white, GetBackgroundColor);	//最後の発表日
	End;
	If fundamental.HasQuoteData(1) then
	Begin
		Plot4(fundamental.Fields[1], "name", white, GetBackgroundColor);
		Plot5(fundamental.Quote[1].ValueLast.ToString(), "LastValue", white, GetBackgroundColor);
		Plot6(fundamental.Quote[1].PostDateLast.ToString(), "LastDate", white, GetBackgroundColor);
	End;
	If fundamental.HasQuoteData(2) then
	Begin
		Plot7(fundamental.Fields[2], "name", white, GetBackgroundColor);
		Plot8(fundamental.Quote[2].ValueLast.ToString(), "LastValue", white, GetBackgroundColor);
		Plot9(fundamental.Quote[2].PostDateLast.ToString(), "LastDate", white, GetBackgroundColor);
	End;

	
	//------debug print------
	If targetSymbolForDebug.Contains(Symbol) then	//複数行用に印刷ログに出力する銘柄絞込
	Begin
		If toExcel then
		Begin
			row = gVal.IntegerValue;
			If wb = null then
			Begin
				wb = Workbook.Create();
				wb.FileName = fileExcel;
				wb.SaveOnClose = false;	//変更を保存したいときはtrueにしてね
				wb.Load = true;
				wb.Visible = true;
			End;
			row += 1;	
			wb.Sheets[1].Cells[1, row] = Symbol;
		End;
		If flagDebugPrint then print(Symbol);
		For fieldNo = 0 to fundamental.Fields.Count - 1
		Begin
			If fundamental.HasQuoteData(fieldNo) then
			Begin
				If flagDebugPrint then
				print(fundamental.Fields[fieldNo]
					, " " , fundamental.Quote[fieldNo].Description		//「Sales」説明
					, " " , fundamental.Quote[fieldNo].Type.ToString()	//「doubleval」などデータ型
					//, " " , fundamental.Quote[fieldNo].EffectiveDate.ToString()	//これは取得できない
					);
			End
			Else
				print(fundamental.Fields[fieldNo], " is not avalable"); //これは出力
			
		End;
		
		If fundamental.HasQuoteData(0) then
		Begin	//1番目のフィールドデータが無ければ次以降のデータも表示されないのは注意
			If wb <> null then
			Begin
				row += 1;
				wb.Sheets[1].Cells[1,row] = "counter";
				col = 1;
				For fieldNo = 0 to fundamental.Fields.Count - 1
				Begin
					wb.Sheets[1].Cells[col + 1,row] = fundamental.Fields[fieldNo];
					wb.Sheets[1].Cells[col + 2,row] = "PostDate";
					wb.Sheets[1].Cells[col + 1,row + 1] = fundamental.Quote[fieldNo].Description;
					wb.Sheets[1].Cells[col + 1,row + 2] = fundamental.Quote[fieldNo].Type.ToString();
					col += 2;
				End;
				row += 2;			
			End;
			
			For counter = 0 to fundamental.Quote[0].Count -1  
			//最初のフィールドよりも2番目あるいは3番目のデータ数が多い場合は表示漏れするけど確認なので勘弁して
			Begin	//Quote全データをPrintlogに表示(最終発表日から逆順に表示される)
				output = NumToStr(counter, 0);
				output += " " + fundamental.Fields[0];
				output += ": " + fundamental.Quote[0].Value[counter].ToString();
				output += " " + fundamental.Quote[0].PostDate[counter].ToString();
				If wb <> null then
				Begin
					row += 1;
					wb.Sheets[1].Cells[1,row] = counter;
					wb.Sheets[1].Cells[2,row] = fundamental.Quote[0].Value[counter];
					wb.Sheets[1].Cells[3,row] = fundamental.Quote[0].PostDate[counter];
				End;
				For fieldNo = 1 to fundamental.Fields.Count - 1
				Begin
					If fundamental.HasQuoteData(fieldNo) then
					Begin
						If counter < fundamental.Quote[fieldNo].Count then
						Begin
							output += " " + fundamental.Fields[fieldNo] 
								+ ": " + fundamental.Quote[fieldNo].Value[counter].ToString()
								+ " " + fundamental.Quote[fieldNo].PostDate[counter].ToString();
							If wb <> null then
							Begin
								wb.Sheets[1].Cells[fieldNo * 2 + 2, row] = fundamental.Quote[fieldNo].Value[counter];
								wb.Sheets[1].Cells[fieldNo * 2 + 3,row] = fundamental.Quote[fieldNo].PostDate[counter];
							End;
						End;
					End;
				End;
				If flagDebugPrint then print(output);
				gVal.IntegerValue = row;
			End;
		End;
	End;
	//------------------

End;

Once begin	//銘柄ごとに一度実行される
	//銘柄が変更されるたびに変数はリセットされてしまう
	//エクセルに書き込んだ最終行(row)も初期化されて複数銘柄を出力すると上書きされてしまう
	//GlobalValueを使うと変数が保持されて追加書き込みできた  これば便利
	gVal = GlobalValue.Create();
	gVal.Load = true;
	fundamental = FundamentalQuotesProvider.Create();	//初期化
	//or  fundamental = new FundamentalQuotesProvider();
	fundamental.Symbol = Symbol;			//銘柄を指定
	fundamental.Fields.Add("CR_SALES,CR_SALES_YOY,CE_SALES");		//順に実績売上高、売上前期比、予想売上
	fundamental.Updated += Fundamental_Updated;		//イベントを設定
	fundamental.Load = true;	//これで初めてデータが取得可能になりイベントが機能する
End;

かなり複雑で長いコードになってしまいましたが、1行1行のコードを理解できれば他のFundamentalQuotesProviderを試して確認することが容易になりますので、わからない部分はヘルプを確認しながら熟読してください。

なるべくQuoteの使えるプロパティを利用したつもりです。
なお、Quoteのデータは、IntegerValue、DoubleValue、StringValue、BoolValue、DateValueに分けて取得するように設計されているようですが、Valueで取得すると型指定せずにオブジェクトとして取得できます。
ヘルプを見ると型も書いてあるので明確であれば型指定が望ましいですが、チェックの目的でループで回す場合には型指定しないほうがエラー回避になると思っています。


ソニーの決算確認をします。
4月の決算発表が2行に分かれています。
分析テクニックで売上高をもう一つ追加して、「連結/単独」のプロパティを0にして見ると、片方は最終単独本決算の値と一致しているようです。
スクリーンショット 2017-01-21 14.49.56.png
また、エクセルで色分けしましたが売り上げ実績と予想ではカウンターで同じ発表日とは限らないのでこれも注意が必要です。

ヘルプに記載されている情報だけでは、本決算や連結決算で絞り込むのは難しいという結論です。

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

nice! 0

コメント 3

坂本

お世話になります
パソコン2台使ってます。トレードステーションとエクセルは別々のパソコンで使っております。
この場合トレードステーション側のパソコンにOpenOfficeみたいなフリーソフトをダウンロードして使用しても大丈夫でしょうか。
甘えてばかりで申し訳ありません
よろしくお願いします


by 坂本 (2017-01-22 07:00) 

nari

Excel以外は使えないはずです。
エラーになると思うので、諦めてtoExcelはfalseで印刷ログで確認してください。
あくまでわかりやすくするだけで、必要ありません。
by nari (2017-01-22 07:29) 

坂本

エクセルの件ありがとうございます
ヘルプ確認しながら頑張ってみます。
by 坂本 (2017-01-22 13:15) 

コメントを書く

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

トラックバック 0

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