Excel VBAで作る自動売買用ロボット:ループ処理はOntimeメソッドを使用する

自動売買用ロボット

RSSを受信するロボットファイルを作成する際に留意しなければならないことの一つにループ処理はOntimeメソッドを使用した再帰処理で実現するということがあります。

通常の処理ですと、下記のコーディング例のようにDo ~ Loopを使用してループを実現するのが一般的です。

Sub コントロール()

開始プロシージャを呼ぶ

Do Until 稼働終了フラグ = True
メインプロシージャを呼ぶ
Loop

終了プロシージャを呼ぶ

End Sub

メインプロシージャの大まかな流れはこんな感じです。

Sub メイン()

稼働中止ボタンが押されたら稼働中止メッセージ画面表示後、Exit Sub

使用シート再計算

処理対象時刻の4本値が完成したら、

サインファイルへ4本値引き渡しサインファイルでサインが発生して場合はサインに応じた注文処理を実行する。

夜間の最終時刻の処理が完了したら、Exit Sub

次の処理対象時刻の処理を行うために行数カウンターに加算する

稼働状況を画面に表示する

End Sub

運営者もロボットを作り始めた時の最初のコーディングではなんの疑いもなくDo ~ Loopを使用しました。

ところが、いざ実行してみると処理が全く進行せず。

調べてみるとRSS受信データが全く更新されていないことが判明。

あらっ、ということでネットで検索してみるとVBAの命令実行中はRSSは受信できないとのことで、その解決法の一つが通常はマクロ実行のスケジューリングに使用するOntimeメソッドでの再帰処理(プロシージャ内で自分自身を呼び出す処理)です。

具体的なコーディングとしては、

上記のメインプロシージャに現時刻プラス指定時間後(時間は任意、例は2秒)にメインプロシージャを実行しなさいという以下のステートメントを追加するだけです。

Application.OnTime Now() + TimeValue(“00:00:02”), “メイン”

このステートメントにより、いったんVBAの命令実行は停止されますので、その間にRSSの配信データは更新されるわけです。

次に自分自身を呼び出した時は更新された受信データを対象に処理が実行されるというしくみです。

あと、コントロールプロシージャの方でメインプロシージャをループさせる必要はなくなったので、

ループの部分は、

もし稼働終了フラグ = Falseなら、
メインプロシージャを呼ぶ

のように変更しました。

稼働終了フラグは開始プロシージャの各種エラーチェックでエラーが見つかった場合は稼働終了フラグをTrueにしてメインプロシージャの呼び出しをスルーされるために設定したフラグです。

以上、ロボットファイル作成に不可欠なOntimeメソッドでの再帰処理についての解説でした。

VBAの命令実行を止めるということであれば、OSにいったん制御を渡すDoEventsも使えそうですが、RSSの関数によってはDoEventsでは更新されないようなこともあるようなのでOntimeメソッドでの再帰処理の採用がベターだと思います。

ロボットファイルは受信した4本値データを定期的に監視し、4本値の完成をトリガーとしてサイン判定とサインに応じた注文処理を実行、それをセッションの引けまで繰り返すだけですので処理の流れとしては至極単純です。

RSS関連やIE操作については、最初はブラックボックスの部分も多くなかなか苦労しますが、いくつかポイントとなりそうなところさえ押さえておけば、ロボットファイル作成自体は難しいものではありません。

その辺のポイントについては順次、別稿で解説していければと思っています。

 

 

タイトルとURLをコピーしました