Excel VBAで作る自動売買用ロボット:シート設定とプロシージャについて

自動売買用ロボット

本稿では自動売買ロボットファイルの自作を考えている方のヒントになればということでシート設定、プロシージャ構造、そして各プロシージャの処理概要ついて運営者のロボを例に解説しています。

自動売買ロボットと言ってもいろいろなタイプがあるかと思います。

本稿での対象はサインファイルと連動して自動売買を実現するタイプです。

まずロボットファイルとサインファイルの関係を知っておいていただいた方がよろしいかと思いますので、大まかな処理の流れを以下に記述しておきます。

まず手作業で、

サインファイルを立ち上げ後(複数システム運用の場合は運用するシステム分)、ロボットファイルを立ち上げます。

マーケットスピードⅡRSSの発注フラグを発注可に変更後、ロボット起動ボタン押下でロボットの起動処理が開始します。

ここからがロボットの仕事です。

【開始処理】

ロボットは起動ボタンを押されるとまず変数やセルに初期値をセット、その後、サインファイルについての各種チェック(立ち上げたサインファイルの数は指定した数と一致しているか、前日の4本値データは格納されているか、指定している使用足種のファイルか)等を実行。

エラーがなかった場合、

使用する全ての口座の建玉の有無をチェックし、ロボットを稼働します。

エラーが有った場合、

エラー表示後起動処理を中止します。

【メイン処理】夜間引けもしくは稼働中止ボタン押下までメイン処理は繰り返されます

ロボットファイルでRSSデータを受信、処理ターゲット時刻の4本値が完成した時点でサインファイルに4本値を渡します。

4本値を受けたサインファイルは、過去データと新たに受け取った4本値で売買を判定します。

その結果、

新規建ての売買サインが出た場合、

ロボットファイルは証券会社に新規建て注文を発注、続いて損切用の逆指値注文を発注します。

建玉に対する決済サインが出た場合、

損切用逆指値注文をキャンセル後、成り行きの決済注文を発注します。

【終了処理】

使用したオブジェクトの開放処理等の実行後ロボットは停止します。

以上がロボットファイルとサインファイルの関係です。

この関係を頭に入れておいていただいて、

シート設定

まずシート設定から説明していきます。

サインファイル

サインファイルで設定しているシートはパラメータ指定&結果集計シート明細シートの2シートです。

パラメータ指定&結果集計シート

パラメータ指定&結果集計シートは、シミレーションし易いようにパラメータ指定部分と結果集計部分を同一シートで管理しています。
結果集計エリアでは利益額、損益額、勝率、PF、POR、ドローダウン額等のパフォーマンス評価項目とパフォーマンス検証用データについて月単位で12か月分管理しています。

パラメータ指定エリアです。具体的なパラメータ数値は空白にしています。↓

極力、勝つ確率が低そうな局面では参戦したくないということで、一番力を入れているのが局面分析でこの下にもいろいろ設定欄が続いていますが、当初これならある程度使えるかと思って設定した項目もテストをしてみると今一使えずで見ての通り******印が多く、実際使用しているのは1/3程度です。

結果集計エリアの上部です。↓

結果集計エリアの下部です。↓

下部の局面分析用データは検証用のデータです。
パフォーマンスが悪かった時等、その原因を探る際に使用しています。

明細シート

明細シートは、ロボットファイルから4本値をもらい、新規売買サインもしくは決済サインを出しています。

左端です。↓

その右側です。中央の部分がパラメータ指定&結果集計シートの戦略選定部分と連動しています。この右側には個々のテクニカルの計算結果や資産管理用計算エリア等が続いています。↓

ロボットファイル

ロボットファイルで設定しているシートは下記の6シートです。

メインシート
初期設定用シート
マーケットスピードⅡRSS4本値受信用シート
マーケットスピードⅡRSS注文発注用シート
チャート表示用4本値加工シート
テスト用注文シート

メインシート

冒頭の画像イメージがメインシートです。ロボの表の顔です。
システム運用状況や各種マーケット情報を表示しています

初期設定用シート

本シートで使用証券口座のID、パスワードを管理しています。
システム運用のための前提条件も本シートで指定しています。

マーケットスピードⅡRSS4本値受信用シート

RssChart関数で4本値を受信するためのシートです。

RSS受信では約定がなかった足の4本値は空欄で配信されてきてしまいます。

そのままでは使えませんので左側のエリアで直前の足の終値を4本値に入れて足を完成させています。

メインプロシージャでは本シートの受信データを定期的に監視し、4本値の完成(注)をトリガーとしてサインファイルへ4本値を引き渡し、それを受けたサインファイルからのシグナルに応じた処理を実行しています。

(注)足が完成したか否かの判定方法

受信データの作成中の足の次行の全項目にはーーーーーーーーが入っていますので、例えば次行の始値の項目を定期的にチェックし、次行の始値が数値になれば足の完成と判断できます。

マーケットスピードⅡRSS注文発注用シート

マーケットスピードⅡRSS注文発注用関数と引数をここで一括管理しています。

チャート表示用4本値加工シート

イメージは省略

マーケットスピードⅡRSS4本値受信用シートのデータそのままではチャートを表示できませんので、受信用シートのデータを参照し、ーーーーーーーーか空白だった場合はNA()に変更しています。

テスト用注文シート

イメージは省略

一連の流れの中で注文テストをする前に、コマンドボタン起動で個々の注文用プロシージャのテストを行うためのシートです。
運用に関係したシートではありません。

シート設定に関しては以上です。

次にロボットファイルのプロシージャ構造およびそれぞれのプロシージャの処理概要やコーディング時に留意すべき点等について解説していきます。

プロシージャの構造と処理概要

次の図は別稿でモジュールについての説明に使用したプロシージャ構造図です。
(実際にはもっとプロシージャは存在します。)

プロシージャの説明に入る前にコントロールプロシージャ等を格納しているコントロールモジュールの記述内容の解説をしておきます。

コントロールモジュールの宣言セクションで記述しているのは、

変数の宣言を強制する

Option Explicit

Windows APIのSleep関数の使用を宣言する

Declare Sub Sleep Lib “Kernel32” (ByVal dwMilliseconds As Long)

ちなみに上記宣言はPCのOSが32ビット版用なので、64ビット版の場合は次のように宣言してください。

Declare PtrSafe Sub Sleep Lib “Kernel32” (ByVal dwMilliseconds As LongPtr)

そして、プロジェクト全体で変数を共有するために

各種Public変数の宣言。

以上がコントロールモジュール上部の宣言セクションの宣言内容です。

では、最上位に位置するコントロールプロシージャから順に処理概要を説明していきます。

コントロールプロシージャ

コントロールプロシージャは単純で以下のように3つのプロシージャを呼び出しているだけです。

Sub コントロール()

Call 開始

開始のチェック処理でエラーがなければ、Call メイン

Call 終了

End Sub

メインシートに設置しているロボット起動ボタン(コマンドボタン)押下時に本プロシージャが呼ばれ起動処理が開始します。

開始プロシージャ

本プロシージャの役割はメインプロシージャに入る前の事前準備です。

下記が主な処理内容です。

  • 宣言で設定した変数や以降の処理で使用予定のセルのイニシャライズ
  • サインファイルに関するチェック
  • 建玉の有無チェック
  • 正常稼働メッセージ表示
  • ロボット起動(通常起動・途中起動)

処理としては単純ですが、変数やセルの初期値設定は誤った数値を設定してしまうと以降の処理でいろいろ不具合が発生してしまいますのでコーディング時にはかなり気を使うプロシージャです。

取引時間の延長等に伴う修正作業が楽になるように、極力、このエリアでの変数の設定値の変更さえすれば対処できるようにしています。

サインファイルのチェックとしては下記のようなチェックをかけています。、

・処理対象月のサインファイルか
・前日のデータが格納されているか
・指定したサインファイル数と立ち上げたサインファイル数が一致しているか
・指定した使用足種とサインファイルの使用足種が異なっていないか

etc.

ロボットの起動時はけっこうドタバタしますからファイルチェックはシビアーにしておいた方がいいと思います。

途中起動は8:45から途中起動時刻直前までの4本値データをサインファイルにセット後、ロボを起動する処理です。

メインプロシージャ

下記が大まかな処理の流れです。

  1. ロボ稼働中止ボタン(トグルボタン)押下でExit Sub
  2. 使用シート再計算
  3. マーケットスピードⅡRSS受信用シートの4本値を監視し対象時刻の4本値が完了した場合、運用システム分カッコ内の処理を繰り返す(サインファイルに4本値を引き渡し、サインファイルでサインが発生した場合はサインに応じて証券会社への注文発注等を実行する)
  4. 夜間セッションの最終4本値の処理が終了したらExit Sub
  5. 稼動状況を画面表示する
  6. Ontimeメソッドを使用した再帰処理でループを実行する

処理の流れとしては単純です。

処理の流れとして一番留意しなければならないのは

Ontimeメソッドを使用した再帰処理でループを実現する

ということです。

VBAの命令実行中はRSSを受信できませんので、通常のループでは処理が前に進みません。

OntimeメソッドでVBAの実行を一定時間停止、RSS受信後、Ontimeメソッドが記述されているプロシージャ自身を呼び出すことでこの問題に対処できます。

Ontimeメソッドの具体的なコーディング例です。↓

時間は任意にしてください。

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

詳細はこちら↓を参照願います。

ループさえ実現できれば、あとの処理の流れは下記のようにシンプルですからその辺で苦労することはそうないと思います。

  • RssChart関数で受信している4本値を監視し処理対象時刻の4本値の完成を待つ
  • >>>完成した時点でサインファイルの処理対象時刻の4本値欄に4本値を代入する
  • サインファイルは過去のデータと新規の4本値で新規の売買もしくは決済の有無を判定する
  • ロボットファイルはサインファイルのサインに応じた注文を証券会社に発注する<<<
  • サインファイルを複数立ち上げている場合は>>>から<<<までの処理を立ち上げているサインファイル分繰り返す

処理の流れとしてはシンプルですが、細かいところでは少々面倒なこともあります。

主な所を思いつくまま列挙しておきます。

証券会社の注文画面のIE操作

RSSを介して発注できない証券会社への発注はIE操作で実現しています。

注文完了までの画面遷移とそれぞれの画面の構造を調べ、IE操作で画面のデータを取得したり項目にデータを流し込んだりボタンを押したりして注文を発注します。

エレメントにID名やNAME名がついていればすぐエレメントを特定できて楽なのですが、ついていない場合は特定に少々苦労します。

また、画面遷移のタイミングの問題でけっこうやられたりします。

その辺のタイミング調整は手探りの作業です。

実際に建玉しないとテストできませんので、ちょこちょこテストしているうちに気がつくとかなり損金を出してしまっているようなこともしばしば。

その辺の覚悟は要ります。

IE操作についてはこちらでまとめています。↓

メジャーSQに関連した処理

・ターゲットはメジャー限月の先物にしていますので、3,6,9,12月の第2金曜日の前日の日中セッションの引けをもって取引は不可となります。

ですから、もし建玉を保有していた場合、日中セッションの引けでの決済が必要となってきます。
決済しなくても翌日のSQ値で強制処分されますが、夜間で大きく値が動いてしまうことがありますから引けで決済しておいた方が無難です。

・メジャーSQ前日の夜間セッションで次のメジャー限月の先物を新規建てする際、ラージは常に直近がメジャー限月ですから問題はないのですが、ミニの場合、通常は上から3番目が対象のメジャー限月なのですが、翌日にならないと画面が更新されないようで旧メジャー限月欄が残っているために対象のメジャー限月が4番目になっているケースがありますのでその対応が必要です。

・新規建てに対してロスカット用の逆指値注文を発注する際、有効期限として取引最終日を指定可能な証券会社はいいのですが、そうでない場合は残存日数を判断して有効期限を指定してやらなければなりません。

以上、現時点で思いついたのはこんなところです。

また思いついた時点で追記したいと思います。

終了プロシージャ

ここでの主な処理は
・システムごとの損益額の画面表示
・ロボ稼働終了メッセージ画面表示
・IEオブジェクトの開放
etc.
です。

まとめ

以上、ロボットとサイン両ファイルのシート設定およびロボットのプロシージャ構造と各プロシージャの処理概要についての解説でした。

自動売買ロボを作成する場合は、いきなりコーディングに入るのではなく、少なくとも設定するシートの概要、プロシージャの構造、そして各プロシージャの処理概要等についてはメモ的なものでもいいのでドキュメントを作成してから具体的な作業に入ることをお薦めします。

 

 

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