システムトレード(自動売買)するなら必須
楽天証券のマーケットスピードⅡの新機能、RSS(リアルタイムスプレッドシート)を有効活用し、自動で売買するためにはサンプルシートのようにエクセル上に関数を埋め込むだけでなく、VBAを利用した発注を行っていく必要がある。
楽天証券マーケットスピードⅡの関数一覧表を読むとぱっと見だけで脱落してしまいたくなるところだが、よくよく読むと関数は4と5ページのみ記載された36の関数のみである。その内訳は以下のようになる。
関数の種類 | 数 | VBAでの操作 |
注文関数 | 11 | 可(自動売買では必須) |
注文約定関数 | 13 | 不可 |
投資情報関数 | 8 | 不可 |
チャート関数 | 3 | 不可 |
補助関数 | 1 | 不可 |
また、そのほとんどは使う人によっては必要のない関数であり、必須といえるのものは少ない。私の場合、以下のような感じになる。
まずは必須といえる関数から読み解いていく。
国内株式の現物注文を出すRssStockOrder_v
これが自動で出せなければ自動売買が成り立たない。引数は驚異の19個( RssStockOrderと異なりNo.2の発注トリガーはないため。)で開幕から心を折りに来る。とりあえず発注するだけなら以下のようなコードで可能(ここで記載したコードによるいかなる損失も補償できません。利用の際は自己責任で使用してください。)
'ここで記載したコードによるいかなる損失も補償できません。利用の際は自己責任で使用してください。 '発注に成功した場合、不要な注文であれば注文取り消しを忘れないようにしてください Sub Stock_Purchase_Order() Dim ret ret = RssStockOrder_v(10, "8918.T", "3", "0", "0", "100", "1", "2", "1", , 0) Debug.Print ret End Sub
自動化するのであれば変数にする必要がある。ただし、国内株式の現物限定で使用するのであれば、省略や、固定値でOKな箇所も多い。
※引数12以降はこの場合省略できる。赤字の項目は自動化の際変数にした方がいい。
国内株式の注文取消しを出すRssCancelOrder_v
注文取消しを出すだけなら引数は(発注id,注文番号)と簡単そうに見える。ただし、自動売買を考慮した場合、結構難しい。そもそも注文番号て何だ?発注idと違うのか?
本家ヘルプを読むとRssOrderListで取得するとあるが、取得項目が多すぎて勝手が悪く、RssOrderIDListのほうが勝手がいい。この場合(発注ID,関数名,発注日, 発注時刻,注文番号,発注結果)で返ってくる。この中の注文番号を取得して、RssCancelOrder_vを投げる。
気を付けないといけないことがいくつかある。
①idずれ
発注後、idをインクリメントしているとそれで検索かけようとすると注文とずれるため、何とかする必要がある(発注時のidを別の変数に保存して検索する等)
②キャンセルしようと思った銘柄が約定している場合
面倒。防止策としてRssOrderStatusで注文の状態を確認し、ステータスが2(有効)の場合のみキャンセルするようにする。
先物関連
先物口座を楽天証券では開いていないが、指標としては使うために確認した。基本的には公式のサンプルがあるため、まずはそれを参考にすると罠にはまりにくいと思います。
先物OP銘柄コード取得を行うRssFOPCode
補助関数として一番最後に記載がありますが、まずこれを理解しないと先物は何もできません。
他の先物関数では下の図のように一見、例としてN225.YYYYMM.Cが記載してあるように見えるんですがここでこれを入力するわけではありません。(YYYYMMは指定する限月<必須項目>と書いてあるところが余計に…)
RssFOPCodeとしての引数は(銘柄種類、限月、C/P区分、行使価格)になります。先物であればC/P区分と行使価格は不要で、セルに=RssFOPCode(“N225F”,”202203″,,)という形で入力すると9桁の銘柄コードが表示されるため、これを用いて他の先物OP関数で利用します。
情報取得用
VBAではなく、Excelシートに関数として埋め込んで使用する。割と必須に近いものが多い。
所持しているポジションをExcelシート上に表示するRssPositionList
手持ちのポジションをシート上に表示して自動で更新します。使い方は簡単でどこかかのセルで
=RssPositionList(
と入力してエンターを押せば補完してポジション情報を表示してくれます。
銘柄の現在株価等を取得するRssMarket
買いや売りを判断するために現在株価を何らかの方法で取得する必要がありますが、私はRssMarketを使用しています。RssPositionListと比べると意味不明な使いにくさです。必要な引数は2つで銘柄コードと戻り値(セルに取ってくる情報)になります。戻り値の種類が相当多く、148種類ありますが、私が使っているのは多分3種類だけです。最良売気配値と最良買気配値、あと銘柄コードから銘柄名称を自動で埋めてもらうために銘柄名称を利用しています。銘柄名称はいらないですが、最良売気配値は購入の判断に、最良買気配値は売却の判断に使用しています。現在値を使う手もあるかもしれないですが、結局売りを出して約定できるのは最良買気配値、買いを出して約定できるのは最良売気配値のため、こちらを使う方がいいと思います。例えば最良買気配値を取得するには=RssMarket(9984,”最良買気配値”)とします。銘柄コード(例でいう9984)は別のセルに銘柄コードを入力して参照した方が使い勝手がいいです。
RssOrderIDListで発注キャンセル用の注文番号を取得する
出した注文をキャンセルしたい場合というのは多々あるがこれが結構面倒で、発注IDだけでなく注文番号が必要になる。本家HELPはRssOrderListを利用しているみたいなんですが、戻り値が28個ある上、発注IDはないため、RssOrderIDListの方が使い勝手がいいのではないかと思います。
使い方は簡単で=RssOrderIDList(
と入力してエンターを押せば補完して発注IDや注文番号が取得できます。
注文の状況を示すRssOrderStatus
注文をキャンセルしようにも、注文を出し終えていないとキャンセルはできないし、約定していたらキャンセルはできません。というわけでその注文の状態を表示することができるのがRssOrderStatusになります。使い方としては=RssOrderStatus(発注ID)という形になります。
戻り値は-1だと該当なし、1だと無効(キャンセル済み等)2だと有効、3だと約定となります。
上で書いているんですが、注文を出し終えていない(-1)とキャンセルできません。これは楽天証券側が注文を受け付けてからになります。2の場合のみキャンセルするようにしましょう。
コメント
初めまして、楽天RSS2で自動売買に取り組んでおります。
素晴らしい情報を発信していただき、感謝してます。
こちらのブログを参考にさせていただき、RssOrderIDListから、発注番号を取得して、その発注に対して訂正注文や、取り消し注文などを出せるようになりました。
問題は、RssOrderIDListで発注に使ったIDに対して、発注番号が返ってこない時があります。表示は、「-」になっていて、取得できません。
これは、かなりの頻度で起こります。
しかも、RssOrderListには、ちゃんと発注番号が返ってきています。
どの発注に対して、訂正や取り消しを出すかを特定したいので、付与したIDから注文番号を取得したいので、困っています。
このような現象は、ありませんでしたか?
また、他のやり方で解決することは考えられますでしょうか。
ご意見いただければ幸いです。
コメントありがとうございます。
お役に立ててよかったです。
RssOrderIDListで発注に使ったIDに対して、発注番号が返ってこない時があるということに対しては
あまり知見がありません。
発生率が100%であれば、RssOrderIDListで表示されている発注結果欄の内容を参照して対応すると解消する可能性があると思います。
発生率100%でなければ楽天証券側に発注オーダーが届いてその結果をRssOrderIDList等で受信するまでのタイムラグがあるため、その時間を少しだけ待つのと
更新自体が行われにくくなるためwaitやsleepを使わずにApplicationOntimeで処理待ちを行うようにする。
くらいですね。
ご回答ありがとうございます。
このような現象に遭遇されませんでしたか。
発生率は、100%ではないですが、RssOrderStatusで確認すると「-1」の「該当なし」になっていて、いくら待っても発注番号は返ってこないんです。
それでも注文は執行中になっていて、RssOrderListには、ちゃんと発注番号が返ってきてるのです。
ApplicationOntimeでループさせて、条件が合ったときに発注させるようにしているのですが、私だけこのような現象が起きるということは、ループ処理の中に問題があるのかもしれません。
もう一度検証してみます。
アドバイスありがとうございました!!!
RssOrderStatusでかなり高確率で-1となる現象は昔私も遭遇しました。
RssOrderStatusは注文直後にIDを更新すると自動更新されない謎機能で、
発注オーダーが楽天証券側で処理された後にIDをセルを上書きしないと高確率で-1を表示し続けます。
文章ベースであまり参考にならないのですがこちらについては以下に記載しています。
RssOrderStatusがうまく動作しない
ありがとうございます、参考記事を拝読させていただきました。
とても参考になりました。
ただ、私の場合RssOrderIDListに返ってきたIDをRssOrderStatusに参照させているので、流れとしては、
新規注文を発注後、楽天側で受付→使用したIDがRssOrderIDListに返ってくる→RssOrderStatusが返ってきたIDを参照して、結果を表示
という感じですので、「-1」が結果として表示されるのはおかしいと思っています。
で、おっしゃられるように、時間がたてば正確な戻り値が返ってくるのかもと思って、再配信させてもかたくなに間違った戻り値のままです。
なので、やはり私のマクロのどこかに問題があるのかもしれません。
少し、話がそれますが、RssFOPOrderListの戻り値も発注したはずの注文情報が返ってこない現象が高確率で起こります。でもこちらは再配信させると正確な戻り値が返ってきます。
なので、RssOrderIDListに発注番号が返ってこないという現象の解決策が見いだせていない状況です。
これらの現象に対する質問を楽天証券に送っていて、回答待ちですので何らかの原因が分かれば、こちらでも共有させていただきたく思います。
実は、これらの発注シートは岡三RSS用に作って動作良好だったのですが、岡三がまさかの先物撤退を表明したので、楽天RSSに急遽書き直しております。
なかなかうまくいかず、悩ましいです(涙)
kotatsu様
こんにちは、RssOrderIDListの戻り値に不具合がある件でコメントを送らせて頂いたまーしーです。
やっと、楽天から回答が来ました。
検証結果は、MS2RSSのプログラムにエラーが見つかったようです。
9月末頃を目処に、修正バージョンをリリースする予定で、これにより不具合はすべて解消されるようです。
回答が返ってくるまでの間、225マイクロにて、実際に約定させて色々検証した結果、
RssFOPOrderList
RssOrderIDList
RssFOPExecutionList
RssFOPPositionList
これらの戻り値に不具合があるケースがありました。
【分かったこと】
発注確認画面が開いている間に、RSS関数の戻り値に変化があると、確認画面を閉じても、更新されない。
これは、確認画面を開かなくても、VBAによる発注が複数同時に発注されたときなどにも起こる。
【他の方のブログより】
同じようにIDリストの戻り値が安定しない現象に遭遇された方のブログを見つけて「取引注意喚起画面」をオフにすると不具合が減ったと書いてあるのを見て、オフにしてみたら、IDリストの戻り値が安定した。
ただこれも、オフにしてもまれに不具合が起こるようです。
これらを楽天証券にキャプチャ付きで報告したところ、エラーが見つかったようです。
修正に時間がかかるようですけど、無料ですから仕方ないですね(汗)
せっかくの自動売買がエラーで利益を取りそこねたら悲しいですよね。修正バージョンを待ちましょう!!
以下、一応楽天証券からの検証結果を貼っておきます。
参考にしてください!!!
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
【調査結果について】
本事象につきまして、VBA内で注文用関数を複数回コールする際に、
必要のない処理が実行されていることが要因となり、
プログラム内部でエラーが発生していることが判明いたしました。
エラーが発生する箇所は注文処理の完了後となるため、
該当注文自体には影響ありませんが、エラー発生により、
プログラム内部のメモリがクリアされることがあり、
その影響で一部の注文が実行されない場合がございます。
また、常に発生するわけではなく、PCが重たい場合や、一度に複数の
注文を同時に発注する際に、本事象が発生することが判明しております。
以下、不具合が発生する際の流れとなります。
1.VBAでRSS注文用関数を実行
2.注文確認画面 もしくは 取引注意喚起画面を起動
3.[2]の画面起動中に注文情報の追加・更新、約定情報の追加などの
通知をサーバから受信
4.[2]の画面を閉じる → 該当注文が執行される →
注文執行後にVBA注文関数の不具合によりMSⅡRSSで内部的な
エラーが発生
5.[4]の内部エラー発生により、[3]で通知を受けていたデータが欠損
6.[5]により、「RssFOPOrderList」、「RssFOPExecutionLis」に
最新情報の更新、追加が行われない
【対応時期について】
9月末頃に修正バージョンのリリースを予定しております。
VBA関数の不具合を改善し内部エラーが発生しないようにします。
【推察1について】
確認画面起動中は戻り値は更新されません。
画面終了後に追加、更新が反映されるというのが正しい動作なのですが、
現在はRSSのVBA注文関数の不具合が原因で、注文執行後に画面起動中に
受信していた通知が注文情報、約定情報に反映されないという不具合が
起きています。
【推察2について】
考察1の回答と同じ内容となりますが、
注文確認画面、取引注意喚起画面を起動しない場合は、
本不具合は発生しずらくなります。
注文確認画面、取引注意喚起画面を起動しない場合でも
注文執行しているわずかな時間に注文情報、約定情報の通知を受けた場合は、
その通知は画面表示されないという問題が起きますので
100%と発生しなくなるわけではありません。
プログラム改修後は、注文確認画面、取引注意喚起画面する/しないに関わらず
この不具合は発生しなくなります。
以上、この度はご不便をおかけし申し訳ございません。
対応完了まで、今しばらくお時間いただきますようお願い申し上げます。
ーーーーーーーーーーーーーー
ここまで。
情報展開いただき誠にありがとうございます。
まーしー様の尽力により楽天証券側も不具合を再現して改修するに至ったという感じですね。
実際のデバッグでも発生条件が明確にならないとなかなか不具合の立証難しい場合がありますが、
すごいです。
楽天RSSの品質が上がったことで私も取りこぼしが減ると大変助かります。
9月末が待ち遠しいですね。
丁寧な回答ありがとうございます。
VBAのコードを書くところから 「ツール」→「参照設定」
から marketspeed のライブラリファイルを追加しようとしましたがここに
marketspeedの ファイルがない状態でできませんでした。
楽天証券に電話して 回答を待っている状態です。
多分これが原因ぽいので 何とか解決したいです。
楽天から回答ありましたでしょうか。
おそらくまずはアドイン設定が必要かと思います。
アドイン設定
初めまして 自動発注を検討しておりまして VBA初級者ですが
なかなか うまく発注ができない状態です。
‘ここで記載したコードによるいかなる損失も補償できません。利用の際は自己責任で使用してください。
‘発注に成功した場合、不要な注文であれば注文取り消しを忘れないようにしてください
Sub Stock_Purchase_Order()
Dim ret
ret = RssStockOrder_v(10, “8918.T”, “3”, “0”, “0”, “100”, “1”, “2”, “1”, , 0)
Debug.Print ret
End Sub
実行をしますと コンパイルエラー sub または functionが定義されていませんとでてしまい 発注ができません。
ret = RssStockOrder_v(10, “8918.T”, “3”, “0”, “0”, “100”, “1”, “2”, “1”, , 0)
のところで 止まってしまう状態です。
解決方法を享受いただけたら幸いです。
コメントありがとうございます。
私も最初作成する際にはいろいろとエラーが出て苦戦しました。
その症状ですと
参照設定で楽天RSSが登録されていない可能性があります。参照設定をしてみてください。
以下の記事の中盤に上記症状含め発注までに私が引っかかったエラーが記載してありますので参考にしてください。
楽天RSS2(マーケットスピード2 RSS)をエクセルで利用する