山本
VBAによる四本値の取得の仕方について
国内株式で5MAの傾きが3日連続下向きの銘柄を抽出したい場合の質問です。
VBAで直接四本値を取得できないと伺っており、いったんエクセルのセルに四本値を出力し、それをVBAで読み取り、5MAを計算させて、傾きを判定し、抽出するシステムを作成したのですが、VBAの処理が速すぎ、エクセルのセルに四本値を表示する前に次の銘柄をの四本値を取り込みに行ってしまい、うまくいきません。
DOEVENT関数で処理を遅らせたりもしたのですが、駄目でした。
このようなことをしたい場合、どのようなやり方をすればよろしいのでしょうか。
ご教授をお願いいたします。
2021年03月06日
大野 了
山本さん、こんにちは!!
どの部分が速すぎるのかいまいち想像できなかったので、
どのような動きをするか整理させてください!!
1.CANDLE関数はセルに事前に書いておく
2.VBAで取得したい銘柄のコードを、CANDLE関数の第一引数が指定されているセルに書き込む
3.4本値が更新される
4.VBAで更新された4本値を取得しに行く
5.次の銘柄コードを、CANDLE関数の第一引数が指定されているセルに書き込む
6.4本値が更新される
7.VBAで更新された4本値を取得しに行く
というような動きをしたい際に、4と7の処理が速すぎて、
取得できないという事でしょうかー?
2021年03月06日
山本
大野様
お世話になります。
質問が分かりにくくてすみません。
私の意図していたのは、3の四本値が更新された時、エクセルのセルに四本値が表示され、その表示された4本値を4のVBAで読み取るというものでした。
しかし実際はエクセルの処理が遅いため、セルに表示される前に4.が実行されてしまいます。
昨夜時点での質問は以上でした。
ただ昨夜この質問をさせていただいた後に、3と4の間にFOR NEXTで35000回DoEvents関数をループさせればうまくいくことが分かりました。
ただし検索する銘柄数がかなり多く、時間も要するので、もっとスマートなやり方があればご教授願います。
あと四本値をエクセルを介さず直接VBAに取り込むのは無理なことでしょうか。(これができれば一番良いように思います)
2021年03月06日
大野 了
繰り返し取得.xlsx (23.7KB)
山本さん、こんにちは!!
なるほど!!
いろいろと理解できましたー!!
FOR NEXTで35000回ループでも、とりあえず大丈夫と思うのですが、
このやり方だと、CANDLE関数の取得が早く終わったとしても、
35000回無駄に回らないといけないですし、
逆に何かの理由でCANDLE関数の応答が遅かった場合、
35000回では足らない場合が出てくると思います!!
一番いいのは、CANDLE関数が取得することを判断して、
CANDLE関数が取得中のみVBA内で待ってあげるのがよいと思います。
言葉で説明する自信がなかったので(笑)、サンプルPGを作ってみました。
添付したファイルのVBAの中の『WaitForGetCandleData』という関数が
CANDLE関数の応答を待つ関数となります!!
簡単に中身を説明しますと・・・
〇G2~G4が取得したい銘柄コードのリスト
〇H2がCANDLE関数が観に行く銘柄コード
〇A1~E1に実際のCANDLE関数がされている
〇始値取得のボタンを押下すると、取得銘柄コードリストに指定されている銘柄の
始値をK列に表示する。
VBAの動きとしては、簡単で
1.K列の初期化
2.取得したい銘柄コードの分だけ以下の処理を繰り返す
2-1.CANDLE関数が観に行くH2に取得したい銘柄コードを指定
2-2.CANDLE関数の出力先の初期化
2-3.CANDLE関数が出力されるまで、永久に待機(笑
2-4.CANDLE関数が出力されたら、始値をK列に転記
という流れになります。
これだと、CANDLE関数が取得できた瞬間にその銘柄の判断処理が実行できますし
逆にCANDLE関数の応答が遅い場合でも、取得できるまで最短で待ち続けます。
注意点としては、CANDLE関数の応答を最大何秒待つという処理は入れていないので、
もし何かの拍子でCANDLE関数の応答が返ってこない場合、永久に待ち続けてしまいます。
DoEventsを使用しているため、もしかしたら山本さんの他のコードに影響があるかもしれませんが
ご参考になれば幸いです!!
※ここにxlsmが上げれないので、拡張子をxlsxに変えています。
※ファイルをダウンロードされた後は、拡張子をxlsmに変更してファイルを開いてください。
2021年03月07日
山本
大野様
私の拙い説明を理解していただきありがとうございます。
FOR NEXTでなく Do While LOOPで待機するということですね。
確かに35000回が妥当かどうか判断しかねるところで、こちらのやり方のほうが無駄がありませんね。
やってみます、ありがとうございました。
※岡三RSSで個別銘柄を一定の条件でスクリーニングすることは特別なことではないと思っていて、決まったやり方が確立していると思っていました。
2021年03月07日
大野 了
山本さん
確かに言われてみると、
スクリーニングはよくするので、
定石のようなやり方があってもよさそうですね・・・
なにはともあれ、お役に立てて幸いです!!
もし不明な点がございましたら、再度返信いただけますと幸いです!!
2021年03月07日
山本
大野様
早速やってみました。
日経225の225社のスクリーニングの時間を測定したところ
FOR NEXT 35000回--10分27秒
Do While LOOP--7分37秒
格段に速くなっていました。
ちなみに抽出結果は同じでした。
これで次のステップに進めます。
ありがとうございました。
2021年03月07日
大野 了
山本さん
上手く行きましたか!!
それはよかったです!!
とはいえ、処理速度とか言われると・・・
最速を目指したくなりますね・・・(笑
2021年03月07日