営業利益・進捗
実績データの検証をしてみて通期のデータだけじゃなく、四半期データも存在する事が分かったので、そのデータを読込んで作成してみました
既存の営業利益インジケーターは実績は前期、予想は今期のみで、
今期の実績がないので隙間を埋めるインジケーターになると思います
無駄にサブルーチンとか使ってみたりして過去最長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 }
サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶