じぱんぐ
VBAマクロ内での発注と発注(約定)確認
こんにちは。VBAマクロ内での発注確認がうまくいきません。
お知恵をお借りできれば幸いです。
1. NEWORDERをセルに書き込んで発注
2. POSITION_M, ORDQUERY_Mを更新
3. 更新されたPOSITION_M, ORDQUERY_Mから発注(約定)を確認
(4. 買い注文の確認後、同一のVBAマクロ内でそのまま売り注文を発注)
というコードを書きたいと考えております。
下記のコードで発注はかかるのですが、POSITION関数およびORDQUERY関数が更新されず、発注確認ができないため、ループを抜けられない状態になってしまいます。
なぜ岡三RSSの更新がかからないのか、思いあたる原因がありません。
(なお、NEWORDER関数を用いない場合は、岡三RSSの更新ができることを確認しています。)
NEWORDER関数を用いた場合、一度VBAマクロを抜けないと岡三RSSの更新ができない仕様になっているのでしょうか?
ご存知の方がいらっしゃいましたらご教示いただけますと幸いです。
どうぞよろしくお願いいたします。
2020年06月16日
じぱんぐ
VBAコード.xlsx (467B)
(上記質問の続きです)
すみません、VBAのコードをコメント欄に投稿しようとすると"Access Denied"となって投稿できないようですので、テキストファイルとして添付しております。
(拡張子がxlsxになっていないと投稿できないようですので、拡張子を変更しております。)
どうぞよろしくお願いいたします。
2020年06月16日
大野 了
じぱんぐさん、こんにちは!!
VBA実行中は、岡三RSSと言いうよりExcelの仕様上
岡三RSSの更新は通常かからないので、
onTimeを使用して、繰り返しマクロを呼ぶ形にするか、
Doeventsを使用して、岡三RSSが動けるようにする必要があります。
じぱんぐさんのロジックを観るとDoeventsが書いてあるので、
確かに更新がかかっても良いような気がします。
よくあるロジックですし・・・
とりあえず、解決策としては
NEWORDERの兄弟関数で、『NEWORDER_CL』という関数があり、
こちらはセルに書き込まなくてもVBAから直接実行できますので、
こちらの関数に変更しVBAから直接発注するか、
onTimeを使用してマクロを繰り返し実行にすると解決すると思います!!
2020年06月16日
じぱんぐ
大野様
お返事いただきまして、誠にありがとうございます。
NEWORDER_CL関数については、以前試したことがあります。
本日も試してみたのですが、やはり、発注はかかるのですが、どれだけ待っても更新がかかりませんでした。
こういうものだと認識して、別のやり方を考えてみることにします。
どうもありがとうございました。
2020年06月17日
大野 了
じぱんぐさん
更新掛かりませんか・・・
掛かってもいい気がします・・・
家に帰ったら、自分も試してみます。
結果は報告します!!
別の方法ですが、onTimeを使ってマクロを繰り返し実行に変更すると
確実に岡三RSSの更新はかかると思います。
2020年06月17日
大野 了
じぱんぐさん
今、先物で試してみたのですが正常に動作しましたー
じぱんぐさんのロジックをまるまる使って、
先物の関数に書き換えてDoEventsが回ってる間に
更新のロジックが通ることを確認しました。
多分、頂いた部分でのロジックは問題が無いと思います。
後は、ExcelかVBAの別の部分のソースが関係しているかもしれません!!
============================================
取得関数:FOPORDQUERY_M
VBAのソース:
Dim Start As Long
Dim PauseTime As Long
Call FNEWORDER("N225mini", 0, "1", "", "", "3", "1", "21000", "1", "1", "1", "1", "password", "3", "1", "")
PauseTime = 2
Do
Application.CommandBars("岡三RSS2").Controls.Item("更新").Execute
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
Loop While Cells(2, 9) = "***END***"
Call MsgBox("end")
==================================
一部記号が全角になっています。
2020年06月17日
大野 了
一応、セルに発注関数を書き込む形式でも正常に動作しましたー
Cells(1, 1).Formula = "=FNEWORDER(""N225mini"", 0, ""1"", """", """", ""3"", ""1"", ""21000"", ""1"", ""1"", ""1"", ""1"", ""password"", ""4"", ""1"", """")"
2020年06月17日
じぱんぐ
大野様
ロジックの動作確認までしていただき、誠にありがとうございます。
ロジックには問題ないとのこと、承知いたしました。
ThisWorkbookモジュールに処理を書いているのですが、これがよくないのでしょうかね?
処理部分を標準モジュールに移すなど、もう少しいろいろ試してみます。
どうもありがとうございました。
2020年06月18日
大野 了
じぱんぐさん、こんにちは!!
自分はめんどくさくて、ThisWorkSheetでやったのですが
それでも大丈夫だったので大丈夫と思います。
じぱんぐさんに頂いたソースだけで想像すると・・・
PauseTimeに値が何かしたらで入っていないということはありえませんでしょうか?
もし、PauseTimeが空っぽの場合、
DoEventsの処理が通らないので岡三RSSの更新がかかりません。
Loop Whileの処理の書き方次第では、
発注が無い時はDoLoopを抜けて、岡三RSSの更新が走り
(DoLoop内のDoEventsで岡三RSSが更新をしているわけではない)
発注があった時はDoLoopを回り続けるが、
DoEventsを踏まないので更新が掛からないということがありえます。
もし、他の方法ででもダメな時は、
じぱんぐさんの発注シグナルのノウハウの部分は消して、
発注とポジションの確認だけのソースをもう少し頂くことができれば、全体的に見てみます!!
2020年06月18日
じぱんぐ
更新できないコード.xlsx (6.1KB)
大野さま
お返事いただきまして、誠にありがとうございます。
標準モジュールに移してみてもダメでした。
PauseTime = 3 と設定しているので、そこの部分は問題ないはずなのですが。
お言葉に甘えてチェックをお願いしてよろしいでしょうか。
VBAマクロ部分のコードを添付しております(テキストファイルですが、アップロードのために拡張子を変更しております)。このマクロは、ThisWorkbookモジュールに記述されています。
エクセルのワークブックは、1枚のSummaryシートと、b1 – b10と名前を付けられた10枚のシートの、計11枚のシートから構成されています。
・Summaryは、Position, Ordquery, 発注情報等をまとめて管理しているシートです。
・b1-b10には、各1銘柄ずつ(計10銘柄)の1分足情報が出力されており、銘柄ごとに発注条件を計算しています。計算は非常に単純なので、ここでの負荷は問題にならないはずです。
・b1-b10のいずれかで発注シグナルが出ると、情報がSummaryシートに反映されて、これをモニターしているVBAマクロ(1個め)によって、注文処理用のVBAマクロ(2個め Sub OrderProcessing)が呼び出されて、「買い注文の発注⇒約定確認⇒売り注文の発注」を行います。が、RSSが更新されず、約定の確認ができないために、約定確認のためのループからいつも抜けられません。
なぜ更新されないのかが、いまだに分かりません。
どうぞよろしくお願いいたします。
2020年06月19日
大野 了
確認テスト.xlsx (32.7KB)
じぱんぐさん、こんばんは!!
PG見てみました!!
PGはコピーしてシート側はPGからそれっぽくおこして、動くファイルを起こしてみました(笑
結果から申しますと、発注した際も正常に動作しましたー
夜だったというのもあり、発注自体は先物にソースを変更し、
実際に動かしたのですが、
発注後に、ループで回りつつポジション関数が返ってくるのを待機して
発注した数とマニュアル系関数で戻ってきた数が同じになった場合は、
ばっちりループを抜けましたー
※動きすぎて、大量に発注してしまいましたw
動くことは動いたのですが、負荷が高めな傾向にありました。
大量にデータ取得関数を書くなど負荷が高くなると、岡三RSSは表示が上手くいかない事があるので、
もしかしたらそれが原因かもしれません。
ソースを観て負荷を下げれる点をいくつか思い付きましたので、記載します!!
1.SheetChangeイベントが大量に発生しているので、
Application.EnableEventsを使用してVBAが動いている間はイベントを起こさないようにする
多分、今でも SummaryシートのB2にフラグを立てて、VBA実行中のイベントが
空回りするようにされてると思いますが、それでもイベントが発生してしまいますので、
Application.EnableEvents = Falseなどを使用してイベントが起きないようにしてあげると良いかもしれません
2.DoEventsが繰り返し呼ばれている
岡三RSSが動けるようにするために、3秒間DoEventsが動き続けていますが、
DoEventsは処理コストがむちゃくちゃ高いので、繰り返し呼び続けると負荷がめちゃめちゃ上がります
Sleep関数などを使用して1秒間隔でDoEventsを動くようにするとかなり負荷が下がります。
サンプルソースや注意点をソース中に開催していますのでー
『じぱんぐさんへ』で検索して頂けますと幸いです!!
個人的には、onTimeに書き直す方がよいと思うのですが、
これだけ作られてると、書き直すのも大変そうですね・・・
ファイルは、拡張子を変えてます。
.xlsx → .xlsm に変えて頂けますと幸いです!!
これで直ると良いんですがー
2020年06月20日
大野 了
あっ
動かすと連続で発注してしまう可能性がありますので、
動かすときはご注意ください!!
また、負荷を下げる感じだけですとー
DoEventsを1秒置きに呼ぶようにするだけで大丈夫かもです!!
イベントを止める方はエラーの時とかの処理が面倒なのでー
2020年06月20日
じぱんぐ
大野さま
夜分遅くにも関わらず、ご丁寧にお返事をいただき、誠にありがとうございます。
また、VBAについてご教示いただき、本当にありがとうございます。
ロジックではなく、処理の負荷が問題であるとのこと、承知致しました。
・DoEventsの呼び出しによる負荷については、認識しておりませんでした。確かに、ループ中休まず呼び出し続けていると、呼び出しで処理が手一杯になる可能性がありますね・・・。
・Application.EnableEventsについては、実は作り始めのころは使っていました。しかしながら、これをFalseにすると岡三RSSの更新もできなくなるのでは?と思い始めて、途中から使うのをやめていました。岡三RSSもVBAマクロの一種なのかなと思っていたのですが、そうではないということですね。EnableEventsをFalseにしても岡三RSSの動作には問題ないとのことで承知致しました。
1. Sleep関数を用いて、DoEventsの呼び出し時間間隔をあける。
2. Application.EnableEventsを利用して、発注シグナルモニタ用マクロによる負荷を下げる。
3. イベントの発生をWorkbook_SheetChange からOnTimeに変更して負荷を下げる。
の順で負荷の軽減に取り組んで行きたいと思います。
大変勉強になりました。来週動作テストをして、うまく動きましたらご報告いたします。
本当にありがとうございました。
2020年06月20日
大野 了
じぱんぐさん
自分のPCでは問題なく動いてしまったので、
負荷が高いことが原因であることは、まだ予想でしかないのですがー
それでも、自分が頂いた範囲でのソースだと
じぱんぐさんの狙っている通りの動きになるので、
ソース自体には問題が無いことがわかって、一歩前進ですねー
2020年06月20日
じぱんぐ
大野さま
上記コメントの 1、および1と2の併用を行っても、やはり更新されませんでした。負荷の問題ではないようです。
NEWORDERとFNEWORDERでは動作が異なるということなのでしょうね。
返事がくるのかはわかりませんが、気が向いたときに公式に問い合わせてみます。
お力になっていただき、どうもありがとうございました。
2020年06月25日
大野 了
じぱんぐさん
更新されませんでしたか・・・
家に帰って、NEWORDERでちょっとやってみますねー
多分、NEWORDERとFNEWORDERで違いは無いはずですが、一応・・・
onTimeだとさすがに確実だとは思うのですがー
あれなら、発注してポジションを確認する程度のonTimeのサンプル作りましょうか?
2020年06月25日
大野 了
じぱんぐさん
だいぶ間が空いてしまったので、伝わるかどうか微妙ですが・・・
一応、現物株のNEWORDERでも試してみたところ、
じぱんぐさんのソースで正常に動作しました!!
なので、やはりじぱんぐさんのPG自体は問題ないと思います!!
もう解決してると良いのですが・・・
2020年07月10日
じぱんぐ
大野様
お返事が遅くなりまして申し訳ありません。
わざわざご確認までしていただき、誠にありがとうございます。
ロジックそのものは問題なしとのこと、承知いたしました。
また見直してみます。
どうもありがとうございました。
2020年07月20日