質問掲示板
岡三RSS
集いの広場

アップロードされたファイルおよび投稿内容についての注意事項 別窓

複数の単語で検索する方法 別窓

【国内株式、先物・オプション】岡三RSS質問箱

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日

ログインしてコメントを投稿する

すべての投稿を表示する

to_top
to_top

アップロードされたファイルにはウイルスチェックを行っておりますが、未知のウイルス等に感染されている場合がありますので、アップロードされたファイルのご利用はご注意ください。
また、取引パスワード等の重要な情報を投稿内容に含めないようご注意ください。
なお、アップロードされたファイルの利用や投稿内容によって、投稿者自身や他の利用者が被った損害に対して当社は一切責任を負いません。

また、セキュリティの関係上、一部コマンド等を含む内容を送信するとエラー画面が表示され、投稿ができない場合がございます。何卒ご了承ください。

岡三RSS集いの広場では、複数の単語による検索が可能です。

例)関数 and サンプル
→AND検索となり、「関数」および「サンプル」を含む検索結果が表示されます。

例)関数 or サンプル
→OR検索となり、「関数」または「サンプル」を含む検索結果が表示されます。

例)関数 not サンプル
→NOT検索となり、「関数」を含むが「サンプル」は含まない検索結果が表示されます。

※and、or、notの前後は半角スペースで区切ってください。
※単語の間を半角スペースで区切るだけだと、OR検索となります。