見出し画像

営業利益・進捗

実績データの検証をしてみて通期のデータだけじゃなく、四半期データも存在する事が分かったので、そのデータを読込んで作成してみました
既存の営業利益インジケーターは実績は前期、予想は今期のみで、
今期の実績がないので隙間を埋めるインジケーターになると思います
無駄にサブルーチンとか使ってみたりして過去最長100ステップ超えとなっておりますが(°_°)安心して下さいコピペできますよ!

コードが長いので先にザックリ概要を説明すると
最初にクラスの参照、変数や定数の宣言をして、サブルーチンの記述、
その後に銘柄コード毎に1回だけの処理の中でサブルーチンの処理をしてデータをプロットしています
・入力項目 "各期合計"、"予想営業利益" 両方ともデフォルト0でセット
・"各期合計"=0で各期毎のデータを表示し、
 0以外で合計表示(2Q、3Qは前のQまでの値を含んで表示)
・"予想営業利益"=0の時は最新の予想営業利益を表示、連結/単独の関係で 違う数字やゼロ、数字を変えたい時等は入力した数字を表示
・4Qの所に予想営業利益を表示しています
・進捗の%は各期×25%を超えていれば上昇色、
 超えてなければ下降色にしています(色は入力項目で変更可)

プログラム

using tsdata.marketdata;
using elsystem;

inputs: 																					//入力変数宣言
	int QTotal( 0 ) [DisplayName = "各期合計", ToolTip = "0=各期毎表示,0‡各期合計表示"],
	int Ex_Profit( 0 ) [DisplayName = "予想営業利益", ToolTip = "ゼロや稀に違う予想営業利益対応"], 
	UpColor( UpColorDefault ) [DisplayName = "上昇色", ToolTip = "上昇時"], 
	DnColor( DownColorDefault ) [DisplayName = "下降色", ToolTip = "下降時"] ;
vars:																						//変数宣言
	FundamentalQuotesProvider FQP( null ),
	double Quarter1( 0 ),						//1Q実績 
	double Quarter2( 0 ),						//2Q実績 
	double Quarter3( 0 ),						//3Q実績 
	double Quarter4( 0 ),						//4Q実績 
	DateTime Kessan( null );					//直近決算日
constants:																					//定数宣言
	string KeyTermType( "TermType" ),
	string KeyFullTerm( "FullTerm" ),
	string KeyMonthsReported( "MonthsReported" ),
	string KeyActualFieldName( "CR_Op" );		//実績営業利益

method bool GetQuoteVal { GetQuoteVal サブルーチン }
( FundamentalQuote fq,DateTime tempdt,out double Quarter1,out double Quarter2,out double Quarter3,out double Quarter4,out DateTime Kessan )
variables:										//サブルーチン内変数宣言
	int fqCount,								//カウント
	int fqMonth,								//決算期間
	bool QuoteFound,							//データの存在有無
	DateTime LastDateTime,						//直近本決算日
	DateTime fqDateTime;						//発表日
begin
	if fq = null or tempdt = null then return false;										//データ存在無し、又は現在日なしの時、falseでサブルーチン終了
		QuoteFound = false;																	//データの存在無セット
		LastDateTime = DateTime.Create( 1900, 1, 1 );										//直近本決算日セット1900/01/01
	for fqCount = fq.Count - 1 downto 0 begin												//カウント分繰り返し古いデータから逆順に確認
		fqDateTime = fq.PostDate[fqCount];													//発表日セット
		Kessan = fq.PostDate[fqCount];														//直近決算日セット
		fqMonth = fq.ExtendedProperties[fqCount][KeyMonthsReported].IntegerValue;			//期間セット
		if fq.ExtendedProperties[fqCount][KeyTermType].StringValue = KeyFullTerm then begin	//FullTerm 本決算判断
			if tempdt >= fqDateTime and fqDateTime >= LastDateTime then	begin				//現在日時以下、直近本決算日以上の時
				LastDateTime = fqDateTime;													//直近本決算日セット
				Quarter1 = 0;																//各Q実績リセット
				Quarter2 = 0;
				Quarter3 = 0;
			end;
		end else if tempdt >= fqDateTime and fqDateTime >= LastDateTime then begin			//FullTerm本決算以外 現在日時以下、直近本決算日以上の時
			switch(fqMonth) begin															//各Q実績セット
				case = 3:
					if Quarter2 = 0 then begin Quarter1 = fq.DoubleValue[fqCount];			//期間3で2Qが0の時、1Qにセット
					end else if Quarter2 <> 0 then Quarter3 = fq.DoubleValue[fqCount];		//期間3で2Qが0以外の時、3Qにセット
				case = 6:
					Quarter2 = fq.DoubleValue[fqCount];										//期間6の時、2Qにセット
				default:
					Quarter3 = fq.DoubleValue[fqCount];										//期間3、6以外の時、3Qにセット
			end;{ switch }
		end;
		QuoteFound = true;																	//データの存在有セット
	end;{ for downto }
return QuoteFound;																			//データ存在有りはtrue、無しはfalseでサブルーチン終了
end;{ GetQuoteVal method }

once begin
	FQP = new FundamentalQuotesProvider();													//クラスのオブジェクトを作成し、そのクラスのコンストラクターを起動
	FQP.Symbol = Symbol;																	//銘柄指定
	FQP.Fields += KeyActualFieldName;														//項目指定 CR_Op 実績営業利益
	FQP.LoadProvider();																		//データプロバイダーへの接続を確立
end;{ once }
//GetQuoteVal サブルーチン実行、データ存在時のみ以下実行	
if GetQuoteVal( FQP[KeyActualFieldName], BarDateTime, Quarter1, Quarter2, Quarter3, Quarter4, Kessan ) then begin
	if Quarter1 <> 0 then Plot1( Quarter1, !( "1Q" ) );
	if QTotal = 0 then begin																//各期毎表示の場合
		if Quarter2 <> 0 then Plot2( Quarter2 - Quarter1, !( "2Q" ) );
		if Quarter3 <> 0 then Plot3( Quarter3, !( "3Q" ) );
	end else if QTotal <> 0 then begin														//各期合計表示の場合
		if Quarter2 <> 0 then Plot2( Quarter2, !( "2Q" ) );
		if Quarter3 <> 0 then Plot3( Quarter3 + Quarter2, !( "3Q" ) );
	end;
//予想営業利益
	if Ex_Profit = 0 then begin																//入力予想営業利益ゼロの時
		Quarter4 = GetFundData("CE_OP", 0);													//最新予想営業利益
	end else if Ex_Profit <> 0 then begin													//入力予想営業利益ゼロ以外の時
		Quarter4 = Ex_Profit;																//入力した予想営業利益
	end;
	if Quarter4 <> 0 then Plot4( Quarter4, !( "4Q" ) );
	if Kessan <> 0 then Plot6( Kessan.ToString(), !( "直近決算日" ) );
//進捗%
	if Plot1 <> 0 and Quarter4 <> 0 then begin
		Value1 = ( Plot1 / Quarter4 );
		Value2 = 0.25; 
	end;
	if Plot2 <> 0 and Quarter4 <> 0 then begin
		if QTotal = 0 then begin Value1 = ( Quarter2 / Quarter4 );							//各期毎表示の場合
		end else if QTotal <> 0 then Value1 = ( Plot2 / Quarter4 );							//各期合計表示の場合
		Value2 = 0.5;
	end;
	if Plot3 <> 0 and Quarter4 <> 0 then begin
		if QTotal = 0 then begin Value1 = (( Quarter3 + Quarter2 ) / Quarter4 );			//各期毎表示の場合
		end else if QTotal <> 0 then Value1 = ( Plot3 / Quarter4 );							//各期合計表示の場合
		Value2 = 0.75;
	end;
	if Value1 <> 0 then Plot5( Value1, !( "進捗%" ) ) ;
//上下色分け
	if Value1 > Value2 then begin SetPlotColor( 5, UpColor );								//上昇色:各期×25%より大きい場合
	end else if Value1 < Value2 and Value1 > 0 then begin SetPlotColor( 5, DnColor );		//下降色:各期×25%より小さく、0より大きい場合
	end;
end;{ GetQouteVal }

サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶