私のauカブコム証券のkabuステーションで自動売買プログラムの構成

スポンサーリンク

全体構成

私がgithubで公開している、auカブコム証券のkabuステーションで自動売買プログラムの構成は以下です。

初期処理

プログラムの全体に関わる初期設定を行う部分です

トークン取得(token.py)

auカブコムはWebAPIの呼び出しに「トークン」と呼ばれる変数を必要とします。この「トークン」はログインごとに発行されます。

kabuステーションでは毎日早朝に強制ログアウトが行われますで、毎日トークンの取得を行う必要があります。

このモジュールで取得したトークンは、グローバル変数格納用モジュール(setting.py)に格納し、この後すべてのWebAPIの呼び出しで使用します。

WebSocket監視銘柄登録(register.py)

kabuステーションのWebAPIには、通常のREST APIと、もう1つWebSocketというものがあります。具体的な処理内容は、後で説明しますが、初期処理としてまとめてここで銘柄登録だけしておきます。

エントリ処理

現在の価格を監視(board.py)

エントリのタイミングを探るために、1分間隔で株価をチェックします。

エントリ基準に達していると判断すると、エントリ処理を呼び出します。

エントリ成行注文発注(sendorder_entry.py)

エントリの成行注文を発注します。

WebAPIの戻り値でエントリした注文のID(受付注文番号)が返ってくるので、それを後続の処理で使うため、setting.pyに格納します。

エントリ注文が約定した価格を取得(order_info.py)

setting.pyからエントリした注文の注文番号を取り出し、それをもとに約定した価格を取得します。

その価格をsetting.pyに格納します。

成り行き注文なので、発注したときの戻り値では、どの価格で約定したかわからないためこの処理を行っています。
発注を指値にする場合はこの処理はいりませんが、その場合は約定するまでにトレンドが変わってしまう恐れがあります。

利食い処理

すでに株価が利食い価格を超えていないかチェック(board2.by)

エントリ注文からこれまでの間にすでに値動きがあり、すでに利食い価格を超えている場合がありえます。

そうすると、利食い注文を指値で発注しても、現在の株価より不利な条件で指値をすることになり、エラーとして注文がはじかれてしまいます。

そのため、ここでもう一度、現在の株価をチェックします。そして、setting.pyからエントリで約定した価格を取得し、そこに利食い幅を付加した値と比較します

株価が利食い価格を超えている場合は、利食い成り行き注文を発注し、プログラム終了(settle_now.py)

株価が利食い価格を超えている場合は、即利食い注文を発注します。

注文の種類は、エントリ注文とは反対方向の成行注文です。

発注が終わったら、その日の取引は終了なので、プログラムを終了します。

株価が利食い価格を超えていない場合は、利食い指値注文発注(sendorder_takeprofit.py)

株価が利食い価格を超えていない場合は、setting.pyからエントリで約定した価格を取得し、そこに利食い幅を付加した値で指値発注します。

注文番号をsetting.pyに格納します。

損切り処理

現在の価格が損切り価格に達していないかを監視(websoket.py①)

WebSoketという仕組みを使い、auカブコム証券のkabuステーションのサーバーに対して、株価が変わったらすぐに通知を受ける接続をします。

setting.pyからエントリの約定価格を取得し、現在の株価がそこから損切り幅を差し引いた値に達したら損切り注文を発注します。

kabuステーションAPIは、1つのエントリ注文に対して、2つ以上の決済注文を発注することができないので、このような仕組みを取っています。

1分間隔でWebAPIを呼び出すなどして価格を調査することも可能ですが、どうしてもタイムラグが生じてしまいます。
WebSoketの仕組みを使うと、できるだけタイムリーに株価の変化に反応することができます。

利食い注文が決済されていないかを監視(websoket.py②)

同じwebsoket.pyの中で、setting.pyから利食い注文の注文番号を取得し、1分間隔で利食い注文が決済されていないかのチェックも行っています。

利食い注文が決済された場合は、websoket.py①の損切り監視処理を中断し、以降の処理は行いません。

ここでは例外的に1つのモジュールの中で2つの処理を行っています。
これは、同じモジュールで処理したほうが、websoket.py①の監視処理の中断がやりやすいからです。詳細は別途説明します。

利食い注文キャンセル(cancelorder.py)

同一エントリ注文の複数決済注文同時発注は行えないので、損切り注文を行う前に、setting.pyから利食い注文の注文番号を取り出し、まず利食いの注文をキャンセルしておきます。

損切り注文(settle_now.py)

損切り注文を成り行き注文で発注します。

利食い成り行き注文を発注と内容は同じなので、同じモジュールを流用します

コメント