ファンダメンタルデータを連続で取得する(その1)

Pocket

今回は、前回解析したTradeStationの標準のファンダメンタルデータ取得のインジケーターを改変してファンダメンタルデータを連続で取得できるアプリケーションを作成します。
※今回のプログラムは、TradeStationの標準インジケーターのソースコードを改変したものです。


今回のプログラムは、TradeStationのサーバに過大な負荷をかける恐れがあります。ファンダメンタルデータはそうそう値が変わらないので、頻繁に取る必要はありませんが、自分は時間がかかっても問題ないからと無駄に値を取得するようなプログラムを頻繁に動かさないようにしてください。何も考えずにすべての人が無駄にアクセスしてしまうとあっという間にパンクします。間隔をあけるとか取引時間中に動かさないなどの対策を適宜実施してください。このプログラムは以下のような対策をしています。

  1. 5秒間隔のタイマーを使ってアクセスの間隔をあける。
  2. 取得結果をローカルファイルに保存する。(使う側は書いていませんが、使う側はローカルファイルを読み込むことで何度も同じデータを取得しないことを想定しています)

プログラムを作成します。前回の関数ですが、データをロードして使用する時にエラーが発生していました。”Count”を”Value99″に入れて強制ロードしているところでエラーが発生しています。この使い方が正しい使い方なのかわかりませんが、チャートとかレーダースクリーンに表示することを想定したコードなのかもしれません。今回のプログラムは、以下のような流れでデータを処理するようにします。

  1. データ取得対象の銘柄をCSVデータから取得してDictionary配列にセットする。
  2. FundamentalQuotesProviderを初期化する。
  3. FundamentalQuotesProviderの値更新インベントとステータスチェンジイベントを受け取る関数を登録する。
  4. 銘柄データを進ませるタイマー(A)を起動させる。
  5. タイマー(A):データ取得中でなければ銘柄コードを変更してロードする。
  6. 値更新インベント:値を取得してDictionary配列を上書きする。
  7. ステータスチェンジイベント:エラーが発生した場合はタイマー(A)を止めて強制終了する。
  8. 処理する銘柄がなくなった場合はタイマー(A)を止めて、結果をファイルに出力する。

ちょっと長いですが、コントロールの配置とイベントハンドラの設置(FundamentalQuotesProviderのイベントは手書きしてコードの中でイベントハンドラと結びつけます)の部分を以下のように操作します。最後にアプリケーションを掲載するので面倒であればインポートすればそのまま使えます。TradeStationとEasyLanguageを起動します。

ファイル(F) → 新規作成(N) → トレーディングアプリケーション(T) → 名前(N):$get_fundamental_sample → OK → ツールボックスのTime:Timerをダブルクリック → コード部分で右クリック → フォームの追加(A) → フォームのプロパティのDockをRightに変更 → ツールボックスのWinforms:ButtonとWinforms:Labelをダブルクリック → フォームとラベルの幅を適切に広げる(色などの見た目は好きに変更してください) → ボタンを選択してプロパティの雷マークからClickのところをダブルクリックする → ウィンドウ(W)からアプリケーション側のコードに戻る → タイマーを選択してGeneral:Intervalを5000(5秒)に変更 → 雷マークからElapsed(タイマー経過イベント)のところをダブルクリック

フォームとタイマーとボタン設置後

前回の関数の問題点は同期で処理していることが問題なのではないかと考えました。つまり、データの取得が終わっていないのに参照して異常な状態になっているのではと判断しました。ですので、データの取得が終わるまで待つ形にして非同期で処理するように組み直します。

COLUMN 同期処理と非同期処理
同期処理というのは、バッチプログラムのように上から下に処理が流れる形で、前の処理が完全に終わってから次の処理が走るので遅い処理が挟まっていた場合は後続の処理が遅れます。処理は遅くなりますが、プログラムは見やすくなります。一方、非同期処理は、ファイルのダウンロードなど取得結果を待たずに次の処理を開始します。非同期処理の終了は、コールバック関数を定義しておいて、終了時にそれが呼び出されることで終了後の処理が実行できます。コードが飛び飛びになりますし、変数の受け渡しの問題とかがあるのでプログラムが複雑になります。それと、2つ以上の処理が同時に実行される可能性があるので、ファイルなどの1つの資源にお互いがアクセスする場合は、ある1点ではどちらかしかアクセスさせない排他制御が必要になります。今回のプログラムでは、そういった面倒なことをしたくないので、ロジック的に直列にしか処理させないようなコードにしています。

コードは次回のその2以降で掲載します。

コメントを残す

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