シグナル取得

シグナルを表示するセル

売買ロジック、シグナル発生ロジックをVBAで組んでしまえば、連想配列などを使って、セルを一切介さずにシグナルを配列上で発生させて、それを直接発注に結びつけることもできますし、一旦セルを介する場合でも、固定した任意のセルにシグナルを置いて、それを監視ルーチンがチェックするということができます。
ただ、エクセルを使う利点として、過去に作成したシート関数によって発生したシグナルを使うと言うことがあります。
こうしたセル関数で発生するシグナルを監視ルーチンが拾うためには、多少の工夫が必要です。

時系列データが昇順で並んでいる場合、つまり古いものから新しいものへと並んでいる場合にはシグナルを発生させるデータは最下行となり、今最下行が何行目かと言うことを検出した上で所定の列セルを求めるという事になります。
これとは逆に時系列データが降順、つまり新しいものから古いものへと並んでいる場合には常に最上部の固定された行にシグナル発生セルがあると言う事になります。

固定されたセルに発注情報がある場合にはそのセルの内容を参照すれば良いので問題はないのですが、多くの場合価格四本値データは昇順であるため、これを元にロジックが組まれている場合には最終行の検出と言う作業が必要ということになります。

最終行の検出

最終行を割り出すにはいくつかの方法がありますが、もっとも簡単なのはカウント関数を使う方法です。
これはセル関数ですが、このセル関数をVBAで使うことができます。
この関数で日付列や終値列などのデータ数を数えて、これにデータ最初の行を加えれば最終行が割り出せます。

Signal = WorksheetFunction.Count(Range(Cells(1, "A"), Cells(65536, "A")))

これはA列1行目から最終行のあたり?までを数える命令文です。
WorksheetFunction. ←の部分がワークシート関数を使うと言う意味です。
VBAではこの方法で多くのワークシート関数を利用できるため、シート関数版のロジックブックをVBA版に置き換えることもできます。

こうして、抽出したデータ数にデータの最初の行を加えれば良いわけです。
なおデータの最初の行以前の同じ列にカウントされそうなデータがある場合には、例えば最初の行が五行目なら

Signal = WorksheetFunction.Count(Range(Cells(5, "A"), Cells(65536, "A")))

とするか…、
数えられそうなデータが数値以外ならCountA関数を使って、

Signal = WorksheetFunction.CountA(Range(Cells(1, "A"), Cells(65536, "A")))

にするなどの方法があります。

  VBAコードサンプル エクセルファイル



 サイトからのお知らせ。
・07/27日、東証主体別売買動向表(部門別投資動向)の表記変更について。
     従来「百万円単位」で表記していましたが、視認性をわかり易くするため「億円単位」に変更します。

エクセル用無料ファイル(四本値&インジケーター)
 各種ファイルは利用者の共有資料です。(ダウンロードフリー)

・このサイトはグーグルクロム(PC)に最適化しています。
スポンサーリンク


TOP