ファンダメンタルデータを取得するインジケーターを解析する

Pocket

プログラムから決算日などのファンダメンタルデータを取得する方法を調べてみます。今回はその準備としてカスタムファンダメンタルというインジケーターのソースを解析してみます。わたしの解析のメモのようなものなので、適宜、わからない部分だけ参照してください。


カスタムファンダメンタルのソースを開きます。TradeStationとEasyLanguageを起動してください。チャートを表示させて、分析テクニックの挿入からカスタムファンダメンタルを選択して、EasyLanguageを編集(E)…を選択します。少し長いですが、とりあえずソースをそのまま以下に掲載します。(コメントも含めて改変せずにそのまま載せています)

ソースを解析します。

行数 内容
1 プログラム名を記載しているコメントです。EasyLanguageのコメントは”{“で始めることもできます。
2~17 空行もしくはコメント行です。
18~20 階層の深いクラスを使う時に冗長な名前を書かないための定義です。
21 空行です。
22~36 このインジケーターの引数(入力)です。
1: 財務基礎データの設定(ファンダメンタルデータの取得キー文字列です)
2: レポート期間の月数を入力する。基礎データは通常3,6,12の月数をサポートする。
3: 連結決算(1),単独決算(1以外)のそれぞれどの値を取得するかの指定
4: 会計基準
5: 遡る期間
6: ゼロラインを描画するかどうかの設定
7: エラー時に描画する値
37 空行です。
38 変数を定義を開始する予約語です。ここで定義された変数はグローバルなスコープを持つのでどの関数からも参照可能です。グローバルスコープの変数はコードの視認性を下げるので定義は最小限にするべきです。
39 チャートから起動されているかどうかのフラグです。intrabarpersistという宣言は、通常EasyLanguageの変数は足が確定しないと更新されないようです。この宣言をつけると足が確定していない状態(ティック=値動きごと)でも内容が変わります。ちょっとなんのことだかわからないと思いますが、プログラムを書いてデバッグしていて値が更新されないなと感じたら付けてみるくらいで考えていていいと思います。
40 連結決算値を取るか単独決算値を取るかを格納する変数です。
41 会計基準を格納する変数です。
42 取得した値を格納する辞書型の変数です。辞書型の配列については、以下のコラムに書いておきますので、興味があってよくわからない方はご参照ください。
43 ファンダメンタルデータの取得に使うクラスです。
44 値の取得が行われたかどうかのフラグです。
45 値の取得結果です。
46 空行です。
47 固定値の定義を開始する予約語です。固定値を使う目的はコードの視認性を上げることと、複数の箇所で使っている場合に変更しやすくする目的があります。
48 レポート期間の月数(拡張プロパティ)にアクセスするための文字列です。
49 連結決算か単独決算かの別(拡張プロパティ)にアクセスするための文字列です。
50 会計基準(拡張プロパティ)にアクセスするための文字列です。
51 辞書型の変数に値を格納する時にプレフィックスを付けるための文字列です。
52 連結決算であることを示す文字列です。
53 単独決算であることを示す文字列です。
54 国際会計基準であることを示す文字列です。
55 米国の会計基準であることを示す文字列です。
56 会計基準の種類だと思われますが、Jから始まっているところを見ると日本の会計基準を示す文字列でしょうか。
57 空行です。
58 ファンダメンタルデータ(以下、FQ)を取得するクラスを初期化する関数です。
59 関数の開始を宣言する予約語です。
60 FQPオブジェクトを生成します。
61 銘柄コードを設定しています。これは、変数でもパラメータでもなく予約語のようなものです。今開いているチャートなどの銘柄コードが自動的に格納されます。
62 取得するFQのキー文字列を追加します。
63 提供されるデータがリアルタイムであるかどうかの値みたいです。FQの取得にはリアルタイム性は必要ないと思われます。
64 タイムゾーンを指定します。
65 FQを取得するクラスをロードします。
66 格納した変数も使っていないですし謎の格納ですが、コメントを読むと、これを書かないとロードが正常に行われないようです。おまじないと思っていいと思います。
67 ブロックの終了を示す予約語です。
68~75 空行およびコメントです。
76,77 値の描画の直前に呼ばれる関数で、FQを取得するクラスでデータを取得して辞書型の変数に格納した後に、ここで辞書から値を取得しているような感じです。戻り値は値があったかどうかで、取得した結果は第4引数で受け取ります。通常の関数は引数に値を格納することはできませんが、第4変数は”out”で定義されており、値の受け取りが可能です。第1引数はFQのキー文字列。第2引数はチャートなどの現在の日付で変数ではなく予約語的な扱いの値です。第3引数はどこまで遡って値を取得するかのパラメータの値です。
78 変数の定義を開始することを宣言する予約語です。ここの変数は関数の中でしか参照できません。
79 ループカウンタを定義しています。
80 値が取得できたかどうかのフラグです。この値を戻り値として戻しています。
81 値を設定できるかどうかを示すフラグです。期間が一致しているかどうかを見てフラグをセットします。
82 日付データを一時的に格納する変数です。
83~84 格納したデータ(日付と値)を一時的に格納する変数です。
85 関数の開始をあらわす予約語です。
86~87 値を取得できない場合は戻り値をFalseで関数を抜けます。条件は引数で渡された値が異常か、データ用の辞書データが初期化状態かです。
88 空行です。
89~90 データと値を配列から取得します。
91 空行です。
92~93 それぞれフラグを初期化します。
94 空行です。
95 データ配列でループさせます。このループは後ろから回します。データが日付順に入っていることが想定されており、今のチャートの時間よりも小さい(以下)日付が出てきたら値を使います。
96 for文の処理の開始をあらわす予約語です。
97 値を取得するフラグを初期化します。
98 ループしているデータの日付を取得します。
99 空行です。
100~103 チャートの日付とループで取得した日付を比較して、取得した日付の方が小さい(以下)の場合は値を使うフラグを立てる。
104~108 上のif文の条件にあてはまらなかった場合はbreakして次のデータを参照するためのブロックと空行です。
109 日付の比較にヒットしてフラグが立っているか判定しています。
110 上のif文の開始をあらわす予約語です。
111 引数で指定した遡る期間内に含まれているかどうかを判定します。
112 上のif文の開始をあらわす予約語です。
113 double型の値を取り出して格納します。
114 値が見つかったことをあらわすフラグを立てます。値がみつかった段階で抜けている感じでもないので、値が見つかれば何度でも上書きするロジックになっています。
115~118 if文とループのfor文の終わりをあらわす予約語と空行です。
119 値が設定できたかどうかの結果(フラグ)を戻り値として返して関数を終了させます。
120~123 コメントと関数の終わりをあらわす予約語と空行です。
124 FQを取得するための関数で、決算などを考慮する必要のない単純な方の値を取る関数です。引数はFQのキー文字列です。
125 変数の定義を開始することを宣言する予約語です。
126 ループカウンタを定義しています。
127 取得したデータの日付を格納するデータ型の配列です。
128 取得したデータを格納するdouble型(小数点以下がある値を格納する領域)の配列です。
129 FQの値を受け取るクラスを定義しています。
130 関数の開始を宣言する予約語です。
131 データを格納する辞書型の変数が初期化されているか判定しています。
132 辞書型の変数を初期化(クラスのオブジェクトを生成)しています。
133 空行です。
134~135 Vector配列を初期化しています。
136 空行です。
137~138 Vector型の配列をデータを格納する辞書型の変数に格納しています。この時点では値は入っていないので空箱を入れているだけです。
139 空行です。
140 FQの値を取得しています。
141 空行です。
142 FQのデータ数分だけループして値を取得します。
143 for文(繰り返し)の開始を宣言する予約語です。
144 データの日付を格納しています。
145 データの値を格納しています。
146~147 ループと関数の終わりをあらわす予約語です。
148 空行です。
149 決算などを考慮する必要のある値を取得するための関数です。引数はFQのキーとなる文字列です。
150 変数の定義を開始する予約語です。
151 ループカウンタを定義しています。
152 データの日付を格納するVector型の配列を定義してます。この配列の扱いは上記の単純な方の関数と同じです。
153 FQのdouble型の値を格納するための配列を定義しています。この配列の扱いは上記の単純な方の関数とは少し違っていて、値が更新されることがあります。
154 FQの値を受け取るクラスを定義しています。
155 会計基準の文字列を受け取るための変数です。
156 格納済の値の会計基準の文字列を保存しておく変数です。条件によっては格納した値を上書きするために使用します。
157 新しい日付が入ってきたことを判定して値を設定するためのフラグです。
158 会計基準の値により値を上書きするかどうかを判定した結果が入るフラグです。
159 データの期間を判定して格納すべきものかどうか判定した結果のフラグです。
160 連結決算か単独決算かを判定して一致しているかどうかを判定した結果のフラグです。
161 データの日付を保存しておいて、新しい日付(この値と一致しない)が入ってきたかどうかを判定するための変数です。
162 関数の開始を宣言する予約語です。
163 データを格納する辞書型の変数が初期化されているか判定しています。
164 辞書型の変数を初期化(クラスのオブジェクトを生成)しています。
165 空行です。
166~167 Vector配列を初期化しています。
168 空行です。
169~170 Vector型の配列をデータを格納する辞書型の変数に格納しています。この時点では値は入っていないので空箱を入れているだけです。
171 空行です。
172 FQの値を取得しています。
173 比較用の日付型の変数を一致することのない日付で初期化しています。
174 空行です。
175 FQのデータ数分だけループさせて値を取得します。
176 for文(繰り返し)の開始をあらわす予約語です。
177~178 フラグをFalseに初期化しています。
179 空行です。
180 会計基準の文字列を取得して格納しています。
181 空行です。
182~183 期間をあらわす数値を取得して格納しています。
184 空行です。
185~186 連結決算か単独決算かの値を取得して格納しています。
187 空行です。
188~190 値を使用できるかどうかの判定の1つ目の判定です。条件は期間と連結決算/単独決算の一致と会計基準が未指定かもしくは一致していることです。
191 上のif文が真になった場合に実行されるブロックの開始位置をあらわす予約語です。
192 すでに取得済の日付の値であるかを判定しています。
193~195 新しい日付が入ってきた場合に実行されるブロックで、フラグを設定しています。
196~197 同じ日付が入ってきた場合の処理の開始をあらわす予約語です。
198~203 コメントです。会計基準の優先順位に関して記載されています。IFRS->SEC->JSTDの順番みたいです。
204 会計基準の文字列により、分岐(switch文)させる記述です。
205 switch文の開始をあらわす予約語です。
206~207 会計基準がIFRSの場合はここに入って、フラグが立って値の置き換えが行われます。
208 空行です。
209~211 会計基準がSECの場合はここに入って、もし前の会計基準がIFRSでなければフラグが立って値の置き換えが行われます。(IFRS優先)
212 空行です。
213~215 会計基準がJSTDの場合はここに入って、もし前の会計基準がIFRSかSECでなければフラグが立って値の置き換えが行われます。(IFRS,SEC優先)
216~219 switch文、else文、if文の終わりをあらわす予約語と空行です。
220 新しい日付があった場合に立つフラグが立っているかの判定です。
221 上のif文の開始をあらわす予約語です。
222 データに日付を配列の最後に格納します。
223 double型のデータを配列の最後に格納します。
224 次のループ時に前回の会計基準として使うために、会計基準を保存します。
225 次のループ時に前回の日付として使うために、日付を保存します。
226 if文の終わりをあらわす予約語です。
227 単なるelse文ではなく、else if文です。値の置き換えをするフラグが立っている場合に以下が実行されます。
228 else if文が真の場合に実行される処理の開始をあらわす予約語です。
229 前回データを置き換えます。日付は同じなので置き換える必要はありません。
230 次のループ時に前回の会計基準として使うために、会計基準を保存します。
231 else if文の終わりをあらわす予約語です。
232 空行です。
233~235 for文と関数の終わりをあらわす予約語と空行です。for文と対になっている最初の方のendのところで、データ数分だけループさせます。
236 会計基準をあらわす文字列を返す関数です。グローバルな変数を参照しているので引数はありません。
237 戻り値として戻す会計基準をあらわす文字列を定義しています。
238 関数の開始をあらわす予約語です。
239 会計基準の文字列によって分岐させるswitch文です。
240 switch文の開始をあらわす予約語です。
241~242 会計基準がJSTDの場合にここに入って、JSTDの文字列を設定します。
243~244 会計基準がSECの場合にここに入って、SECの文字列を設定します。
245~246 会計基準がIFRSの場合にここに入って、IFRSの文字列を設定します。
247~248 上記のどれにも当てはまらない場合にここに入って、空文字を設定します。
249~250 switch文の終わりをあらわす予約語と空行です。
251 設定した文字列を会計基準として返します。
253 関数の終わりをあらわす予約語と空行です。
254 このブロックを1回だけ実行することを指示する予約語です。このインジケーターはここから実行されます。
255 ブロックの開始宣言です。
256 このインジケーターを実行するベースを調べて、チャートであれば変数(InAChart)にTrueを設定しています。後ろの=は通常の代入ではなく、GetAppInfo関数の戻り値を調べて”cChart”であればTrueを返すという意味です。
257 関数(58行目)の呼び出しです。
258,259 空行およびコメントです。
260 FundamentalQuotesProviderクラスのメソッドで、引数(FondField)で指定されたフィールド名のファンダメンタルデータが存在しているかを示すbool値を返します。
261 引数で指定されたフィールドの値のタイプがdouble型かどうか判定しています。
262 引数で指定されたフィールドの値のタイプがinteger型かどうか判定しています。
263 if文が真の場合に実行されるブロックです。フィールドの値が存在して、かつ、double型もしくはint型でなければ実行されないので、それ以外はすべてエラーになります。このブロックに入らないと、”OkayToPlot”がTrueにならないからです。
264 描画を行うフラグをONにします。
265 関数(236行目)を呼び出します。会計基準を表す文字列を返す関数です。
266 空行です。
267~270 連結決算/単独決算を変数に代入します。連結決算/単独決算の区分けがある値の場合に有効な値で、引数で渡されます。連結決算であれば”1″を単独決算であれば”1以外”を指定します。
271 空行です。
272~275 拡張プロパティに期間を考慮する必要のあるパラメータが設定されている場合は、フィルター付きの値取得関数を、そうでない場合はフィルター無しの値取得関数を呼び出します。
276,277 ブロックの終わりを示す予約後です。
278 空行です。
279 値の取得が行われているかどうかを示すフラグの判定です。
280 直前のif文である値の取得が行われた場合に行われる処理のブロックです。
281 ロードしてデータを取得する関数(76行目)を呼び出しています。
282 直前のif文である関数の戻り値が正常であれば実行されるブロックです。
283 値をチャートなどに描画します。
284 空行です。
285 ゼロラインを描画するかどうかの判定です。チャート以外か、チャートで引数のゼロラインを描画がTrueであればゼロラインが描画されます。チャート以外のレーダースクリーンなどで数値の”0″が描画されますが、なんの意味があるのかよくわかりません。
286 ゼロを描画します。チャートであればゼロの位置に線が引かれます。
287,288 ブロックの終わりを示す予約後です。
289 279行目の値が取得できているかを示す判定が真でなかった場合に実行される処理です。
290 直前のelseの実行ブロックです。
291 エラーの場合の値を描画します。描画される値は引数で指定されます。
292 ブロックの終わりを示す予約後です。
293~297 空行もしくはコメントです。
COLUMN 辞書型の変数について
辞書型(Dictionary)について説明します。辞書型の変数は、所謂、連想配列というもので配列を拡張したものになります。通常配列は以下のように値の格納・取得ができます。

一方、連想配列は以下のように使います。

連想配列は、キーと値をペアでセットするので、ソースコードを見れば何にアクセスしようとしているかすぐにわかり、ソースコードの視認性が上がります。順番は保証されないので、格納した値を順番に取り出すみたいな使い方はできますが、取り出される順番はわかりません。それと配列と連想配列の中間的な位置づけとして”Vector”というものもあります。以下のように使用します。

配列はデータ型が同じである必要がありますが、”Vector”は異なる型を持つことができるところと、”insert”や”push_back”などの関数で入れる場所を指定したり、最後に入れるみたいなことが可能です。

ファンダメンタルデータを取得するためのインジケーターを解析しました。長くなってしまってすみませんでした。次はこのインジケーターを関数から使えるように改良したいと思います。
このソースコードはTradeStationの標準ソースコードを抜き取ったもので、著作権はTradeStationにあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です