おおぎ
先物1分足の終値がぶれて取得できない
お世話になっております。先物で1分足が更新された瞬間(つまり毎正分に)その始値と1つ前の終値を取得しようとしています。
FCANDLEの対象セルがWorksheet_Calculateする度に取得しています。
さて更新されたばかりの始値は正しく取得できるのですが、それと同時に取りに行こうとしている1つ前の終値が取得できません。
ワークシート上には正しく表示されているのですが、VBAの変数に代入すると1つ2つズレたものが入ってしまいます。
どこにずれるのか非常に不規則で使い物になりません。
数秒程度待ってから実行しても同じ結果です。(画面上では正しく表示されています)
ちなみに終値のセルのWorksheet_Calculateで取得しようとすると1秒間に数十回も更新されているようで使い物にならないスピードです。
いったん=CANDLEの関数を文字列化して更新を止めようと試みましたが、この関数は消してもワークシート上の終値は更新されつづけます。まるでゾンビのようです。
どうすればこのぶれ続ける終値のセルの数値を正しくとらえることができるでしょうか?
ほとほと困っております。 よろしくお願い申し上げます。
2020年03月12日
大野 了
おおぎさん、こんにちは!!
まず、分足の始値と終値がずれる件ですが、
こちらは岡三RSSのFCANDLEの関数が始値と終値で個別で動く仕様のため、
発生しています!!
例えば・・・
A1:FCANDLE("始値")
B1:FCANDLE("終値")
とあった場合、A1の始値の取得が行われたのちに、B1の終値の取得が動く前に、
式の判断やCalculateイベントが動いた場合、
B1の終値がまだ実行されていないため、時間軸がずれた値が同じ行に表示されてしまいます。
※VBAの処理を抜けてシートを見てみると、VBAを抜けた直後に終値のFCANDLEが実行されて更新るため、
※VBAで取得した値と、シートに表示されている値が違って見えます・・・
これを対応するには、取得できている件数が同じことを確認する方法があるのですが、
以前、ご質問を頂いた内容のコピペで申し訳ないですが、
以下のURLを見て頂けますと幸いです。
https://bbs.okasan-online.co.jp/ont/rss/board/?page=1&topic_id=222#comment_1214
こちらのサンプルのG2が"取得済み"となっていますと、
FCANDLEの関数がすべて実行済みとなりますので、この条件をVBAに入れて頂けますと
データのずれは無くなると思います!!
また、Worksheet_Calculateイベントは、ワークシートに対する更新が起きた時に動くイベントではなく、
再計算のイベントになるため、セル関数の書き方や内容によっては、
岡三RSSの更新とは関係なしにイベントが動く可能性があります!!
2020年03月12日
おおぎ
分足完全取得 サンプル.xlsx (47.2KB)
大野様
早速のアドバイス誠に有難うございます。
ご指摘に基づき、貴ワークシートにやりたい内容を書き加えてみました。
"取得済み"を要件とするためにif分を使用しています。
(本来であればWhile~等使用すべきですが、なぜか常に"取得済み"であると判定されるので、ここでは簡易にif文を使用しています)
"分足"というシートに最新の始値のセルがリンクしてあり、それがWorksheet_Calculateのトリガーで値を取得しにいきます。
作成したファイルを添付申し上げます(拡張子は .xlsm に変更お願いいたします)
さて結果ですが、やはり始値は正しく取得しますが、1つ前の終値はほぼ取得できません。2つ前の終値が入ってくることが多いようです。
そこで再度質問で恐縮なのですが、
1)このようなif文等で条件判断をする手法がよろしくないのでしょうか?
2)またWorksheet_Calculateは誤動作するとのご指摘をいただきましたが、他によいイベントがあればご教示いただけないでしょうか?
(Worksheet_Changeではなにも動かないようです)
種々初心者なので恐縮ながら、本件よろしくお願い申し上げます。
2020年03月12日
大野 了
おおぎさん、こんばんは!!
ファイル見ました!!
そして原因がわかりました。
おおぎさんのVBAは問題ないと思います。
間違った値が出てしまった原因としましては、
ファイルに元々入っていたデータが悪さをしているようです。
FCANDLEが正常にすべてをとれているかどうかの判断として、
『FCANDLEで取得したデータの件数が同じこと』という判断を
このサンプルでは行っています。
例えば、
8:45に取得されたデータは1件
8:46に取得されたら、データが2件に増える
8:47に取得されたら、データが3件に増える
という感じです・・・
始値の件数が3件、終値の件数が3件であれば、8:47のデータは完全に取得できている
という理論です!!
今回は、もともとのデータ(2019/01/21)が残っており、
常にデータ件数が750件と表示されるため、常に『取得済み』と表示されています。
ご使用前に、3行目以降のデータを一度消してからご使用されると大丈夫と思います!!
また、Worksheet_Calculateに代わるイベントですが、
岡三RSSが動いた際に、動くイベントは残念ながらWorksheet_Calculateしかありません。
Changeイベントは、シートに対する入力があった時に起きるイベントですので、
おおぎさんがおっしゃられます通り残念ながら、岡三RSSが書き込んでもイベントが置きません(涙
他によるある方法としましては、
Application.OnTime を使う方法があります。
これは、指定した時間にVBAの関数を動かす機能になり、
これを利用して、VBAの関数を繰り返して動かすことにより、
1秒間隔などで、岡三RSSの値などを確認することができます。
これまた、以前のスレッドのコピーになりますが
https://bbs.okasan-online.co.jp/ont/rss/board/?page=1&topic_id=258#comment_1385
のonTimeの部分を見て頂けますと幸いです。
わかり辛い部分も多いと思ますので、何かありましたら再度ご連絡頂けますと幸いです!!
2020年03月12日