Excel VBAで作る自動売買ロボット:注文発注用マーケットスピードⅡRSS関数について

自動売買用ロボット

旧ロボはマーケットスピードRSSの歩み値から使用足種の4本値を作成、注文はVBAのIE操作で行っていましたが、マーケットスピードⅡRSSのリリースにより足種を直接取得可能となり、かつ楽天証券への注文もRSSを介してできるようになりましたのでロボをマーケットスピードⅡRSS対応に修正しました。

冒頭の画像はロボットファイルのマーケットスピードⅡRSS用シートの1部です。

このシートで行っていることは
発注IDの制御
ターゲット銘柄コード取得
新規建注文発注
決済注文発注時に必要となる建玉情報の取得
逆指値決済注文取消時に必要となる逆指値注文状況の取得
逆指値注文取消注文発注
決済注文発注
です。

順に見ていきます。

(注)画像をコピーするタイムミングで内容的に整合性のとれていない場合がありますので以下で表示される画像中の引数の設定値の具体的な内容については無視してください。

発注IDの制御

ロボ稼働時に発注IDカウンターを初期値(100)に戻します。
その後は注文終了ごとにカウンターを1アップ。
初期値は1以上であればOKです。運営者は特に意味なくなんとなく100にしているだけです。

ロボ途中起動の場合で再起動の場合は既に発注が発生している可能性がありますので初期値は200にしています。

ターゲット銘柄コード取得


マーケットスピードⅡRSSの各注文関数のキー項目は銘柄コードです。

銘柄コードを得るためにはまず直近のメジャー限月の限月情報を取得する必要があります。

限月情報は対象限月(セル:E5)で、

=RssIndexMarket(“N225.FUT01.OS”,”限月”)

という関数で取得しています。

取得した限月の形式は例えば2022年9月限月であれば22-09という表示形式です。

このままでは銘柄コードを取得できませんので、

銘柄コード取得用対象限月(セル:F5)のところで

=“20”&LEFT(E5,2)&RIGHT(E5,2)

として頭に20をつけ-を削除して202209という表示形式に整形しています。

ラージの場合(セル:D5)は

=RssFOPCode(C5,F5,””,””)

ミニの場合(セル:D6)は

=RssFOPCode(C6,F5,””,””)

で対象の銘柄コードを取得しています。

別シート(SET_UP)で指定しているラージ・ミニ区分を参照し、ラージであればD5の、ミニであればD6のコードがターゲット銘柄コードとしてD7にセットされます。

各注文関数の銘柄コードはD7を参照しています。

(参考)銘柄コード(9桁)のコード体系

1桁目:取引種別①
2桁目:取引種別②
3桁目:限月の年情報
4・5桁目:限月の月情報
6・7桁目:権利行使価格等
8・9桁目:対象指数

先物の場合は
1桁目:先物/オプションは特殊取引という部類で1
2桁目:先物は6
3桁目:2016年を1とし以降年が変わるごとに9になるまで1カウントアップし、9の翌年は1に戻る。
4・5桁目:3月であれば03
6・7桁目:先物は00
8・9桁目:225先物は18、225先物ミニは19
ですので、例えば限月が2022年6月の225先物ミニの銘柄コードは167060019となります。

ということで、上記の方法で取得しなくてもターゲットの銘柄コードは生成できるのですが、生成時にMSQ日を考慮しなければならないので、運営者の場合はラージの直近限月(メジャー限月)の限月情報をもとに銘柄コードを取得しています。

新規建注文発注

(設定値は無視してください。発注IDが未入力状態ですので入力エラーになっています。↑)

RssFOPOpenOrder関数で新規建て成行注文を発注します。

引数設定値欄は
・プログラムで設定するもの(イエロー)
・他セルを参照するもの(ピンク)
・固定値として設定しておくもの(グリーン)
・設定不要のもの(グレー)
がありますのでわかりやすいように色分けしています。

プログラムでは念のために最初に発注トリガー(※)を0にし、発注ID、売買区分、注文数量をセット後、発注トリガーを1にして成行注文を発注、発注後、発注トリガーを0に戻し、発注IDカウンターを1カウントアップしてルーチンを終了。

※ロボ立ち上げ時の意図しない発注を防ぐため、ロボットファイルクローズ時にイベントプロシージャで本シート上の全発注トリガーと上記新規発注エリアの数量に0をセットしています。

決済注文発注時に必要となる建玉情報の取得

RssFOPPositionList関数で決済注文発注時に必要となる建玉情報(売買建日建玉単価建玉数量)を取得します。

逆指値決済注文取消注文発注時に必要となる逆指値注文情報の取得


決済注文を発注する際には新規建て後に発注済みのロスカット用逆指値注文の取消が必要です。

注文を取り消さずRssFOPModifyOrder関数で注文区分を訂正する方法もありますが、逆指値注文から通常注文への訂正は出来ないようなのでいったん取り消しています。

RssFOPOrderList関数でその際に必要となる逆指値注文情報(注文番号)を取得します。
逆指値注文のみを表示させるために引数2には13を指定します。

システムによっては1日に複数回取引する場合もありますし、投資枚数が多くなれば建玉が割れることもありますので、逆指値注文情報も複数行表示されることがあります。

ロスカット用逆指値注文発注


RssFOPCloseOrder関数で建玉に対してロスカット用逆指値注文を発注します。
新規発注と同様に引数設定欄は設定方法によって色分けしています。

プログラムでは建玉一覧に表示されている建玉情報分、以下の処理を繰り返します。

・発注トリガー:0
・発注ID:発注IDカウンター
・売買区分:建玉情報の売買が買建なら1(転売)、売建なら3(買戻)
・注文数量:建玉情報の建玉数量
・建日:建玉情報の建日
・建単価:建玉情報の建単価
・逆指値条件価格:建玉情報の売買が買建ならシステムの仕掛値 - システムごとの強制ロスカット値
:建玉情報の売買が売建ならシステムの仕掛値 + システムごとの強制ロスカット値
・逆指値条件区分:建玉情報の売買が買建なら2(以下)
:建玉情報の売買が売建なら1(以上)
・逆指値価格区分:1(指値)
・逆指値価格:建玉情報の売買が買建ならシステムの仕掛値 - 500(※)
:建玉情報の売買が売建ならシステムの仕掛値 + 500
をセット後、
発注トリガーを1にしてロスカット用逆指値注文を発注、発注後、発注トリガーを0に戻し、発注IDカウンターを1カウントアップしてルーチンを終了。

※システムごとの強制ロスカット値よりも大きい数値であればいいので取り敢えず500にしています。

逆指値注文取消注文発注


注文一覧を上から順に見ていき、逆指値注文状況が待機中(※)の場合、
注文番号をキーとして、
RssFOPCancelOrder関数で該当注文をキャンセルします。

決済注文発注


RssFOPCloseOrder関数で建玉に対して成行決済注文を発注します。

プログラムでは建玉一覧に表示されている建玉情報分、以下の処理を繰り返します。

・発注トリガー:0
・発注ID:発注IDカウンター
・売買区分:建玉情報の売買が買建なら1(転売)、売建なら3(買戻)
・注文数量:建玉情報の建玉数量
・建日:建玉情報の建日
・建単価:建玉情報の建単価
をセット後、
発注トリガーを1にして成行決済注文を発注、発注後、発注トリガーを0に戻し、発注IDカウンターを1カウントアップしてルーチンを終了。

まとめ

マーケットスピードⅡRSSでの225先物注文発注時に必要となる関数は下記の8関数です。

●銘柄コードを取得する際に必要な限月情報取得にはRssIndexMarket関数

●各注文発注のキーとなる銘柄コード取得にはRssFOPCode関数

●新規建注文発注にはRssFOPOpenOrder関数

●決済注文発注にはRssFOPCloseOrder関数

●注文取消注文発注にはRssFOPCancelOrder関数

●建玉一覧表示にはRssFOPPositionList関数

●注文一覧表示にはRssFOPOrderList関数

●注文訂正発注にはRssFOPModifyOrder関数(逆指値注文から通常注文への変更はできないようなので運営者は使用していません。)

引数のセル内容が数字の場合、数値タイプと文字列タイプがありますので注意が必要です。

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