Tango
注文が実行されないことについて
お世話になります。
環境が変わったわけでもなく、突如、注文が入らないことがあります。
例えば、16:25に寄り成り注文を入れても、注文が実行されない場合があります。(右下のコマンドの窓が現れない現象です。)
注意深くエクセル(プログラム)上の時計を見ていると、1秒ごとに刻まず、飛び飛びで表示される現象が起こっています。
このことが、直接注文の起動に影響を与えているのかは不明ですが、何方か、エクセル上の時間が正確に刻まれないことについてご教示頂けますでしょうか。また、発注が安定的になされないその他の要因等、何かご存知であれば、併せてご指導いただければ幸いです。
よろしくお願い致します。
2017年11月01日
Ryo Ohno
Tangoさん初めまして。
Tangoさんが作成されたExcelシートの状況がわかりませんので、
何点か確認させてくださいっ!!
〇発注はVBAで行われていますでしょうか?
〇onTimeでマクロを繰り返し実行される感じでしょうか?
〇エクセル上の時計と言われますのは
range("A1") = Now()
などの形で、現在の時間をセルに書き出している時間が飛び飛びに表示されるということでしょうか?
もし発注がVBAで、マクロをonTimeで繰り返し実行している形ですと、
時間が飛び飛びになってしまうのは、ロジック次第ですが動き続けている限り問題ありません。
もし、ロジックやPCの負荷の関係で1秒単位での動きでは厳しい場合
If TimeValue(Now) = TimeValue("16:25") Then
などと時間の判定が入っていますと、16:25:00にたまたま動かず、16:25:01にマクロが動いてしまうと、
判定がスルーされてしまいます。
もしPCの負荷や作成されているロジックの関係上1秒毎に動作が厳しい場合は、
If (TimeValue("16:25") <= TimeValue(Now)) And (TimeValue(Now) <= TimeValue("16:26")) Then
などとすると、1分間は判定に余裕がでますので正常に時間を判定できると思われます。
また、この場合、
1分間内に、複数回、寄成の注文が出てしまうと思いますので、
2回目の発注をスルーする処理が必要となります。
2017年11月03日
Tango
Ryo Ohno 様
ご指導頂きありがとうございます。
お礼のご連絡が遅くなり申し訳ございません。
PCを代えて動作確認を行っておりました。
従来の機種はCeleron 2GHzで、現在、 i7-2.6GHzで起動確認をしております。 (WIN10、Office2013の環境です。)
Updateの時に一度変な動作をしてましたが、その後の再起動で問題なく動作してます。
このことから、CPU能力と負荷の関係かと思うのですが、如何でしょうか。
現在、1秒監視なのですが、2秒にすることで、問題が解決されるのか、今のところ、根本的な問題がどこにあるのか、特定出来ていません。
プロシジャーは以下の通りです。
Public Sub tradeBody()
Set s2 = Sheets("Trade")
s2.Range("c2") = Now
runtime = TimeValue(Now)
.......
earlist = Now + TimeValue("00:00:01")
latest = earlist + TimeValue("00:00:05")
Call Application.OnTime(earlist, "tradeBody", latest, True)
現状、そのようなところで推移しております。
また何かお知恵を拝借できるようであれば、ご指導のほどよろしくお願い致します。
2017年11月09日
Ryo Ohno
Tango様
そうですね・・・
1秒おきにマクロが動かない件ですが、
たぶん、ロジックが高度で時間がかかっている、
もしくは外部的要因(ウイルススキャンなどが動いている)かもしれません。
もし2,3秒の間隔でしか、VBAが動けない場合でも、
もしTangoさんのストラテジー的に問題がないのであれば、
現状のままでも問題ないと思われます。
ただ、以下の2点は対応しておいたが良いかもーと思いました。
#Tangoさんのロジックや状況がわからないので、
#的外れなことをことを書いておりましたら、申し訳ありません。
1.寄り成り注文などの判定を・・・
If TimeValue(Now) = TimeValue("16:25") Then
から
If (TimeValue("16:25") <= TimeValue(Now)) And (TimeValue(Now) <= TimeValue("16:26")) Then
のように幅を持たせる
この判定文『If TimeValue(Now) = TimeValue("16:25") Then』
で、1秒間隔で動かない場合・・・
もし・・・
16:24:58
16:24:59
16:25:01
のような間隔で、VBAが動いてしまったときに、16:25の発注が動きません。
もしかするとこれが、たまに発注がかからない原因かもしれませんので、
If (TimeValue("16:25") <= TimeValue(Now)) And (TimeValue(Now) <= TimeValue("16:26")) Then
として頂けますと、もしかすると発注ミスはなくなると思います。
2.onTimeの終了時間を外す
earlist = Now + TimeValue("00:00:01")
latest = earlist + TimeValue("00:00:05")
Call Application.OnTime(earlist, "tradeBody", latest, True)
こちらの場合、何かしらの理由で5秒間VBAの動作の感覚が空いてしまうと、
PGが止まってしまう可能性があります。
もし問題がなければ
Call Application.OnTime(earlist, "tradeBody")
として頂けますと、VBAの間隔が、30分空いても、次のtradeBodyを必ず実行してくれますので、
TangoさんのVBAのプログラム次第ではこちらの方がよいかもしれません。
以上、少しでもご参考になれば幸いです。
2017年11月09日
Tango
Ryo Ohno 様
色々とご教示頂きありがとうございます。
Queue自体がなぜ蓄積されるのかという根本的な理由を探らなければならないと考えておりました。と言いますのも、時間が1秒ではなく、5秒以上停止することも以前に確認したことがあったからです。そうすると、時間を引き伸ばすだけでは、解決しない可能性があると考えておりました。
また、1秒ごとに監視することを重要視したのは、価格の変動が著しいとき、秒数をあけることにより、変動リスクが増すことも懸念材料としてありました。
とはいうものの、具体的な問題の解決策が見当たらないことから、まずは、監視時間の間隔を2~3秒に設定すると同時に、時間が飛ぶ瞬間にバックグラウンドで何が動いているのかなどをモニターするなどをして、原因究明と対処を平行して行っていこうと思います。
2017年11月11日
Ryo Ohno
Tangoさん
申し訳ありません。
一度、送信が正常にできなくて返信が滞っておりました。
遅くなってしまい申し訳ありません。
確かに、5秒も止まるとなるとTangoさんがおっしゃられている通り、
値動きが激しいときはあぶないですね・・・
外的要因(ウイルスチェックなど)とは思いますが、
VBAの動作がもたつくときはExcelが原因のことが多いので、
ExcelでVBAを阻害するような別のアドインが入っていないかも確認していただけますと幸いです。
原因究明の少しでもお手伝いになれば・・・
自分もほかに何か思いつきましたら、また連絡致します。
2017年11月19日