私のauカブコム証券のkabuステーションで自動売買プログラムの説明(9) 現在の株価が損切り値に達していないかを監視(websocket.py) その1 まずはkabuステーションAPIのサンプルを説明

スポンサーリンク

kabuステーションAPIでは逆指値注文ができないため、損切り処理に工夫が必要

kabuステーションAPIには現状、逆指値注文機能がありません。
したがって、利食い注文の指値注文はできるのですが、損切り注文の指値注文ができません。

そこで、自分で株価情報を取得し、損切り価格に達したら損切り注文を発注するというプログラムを組む必要があります。

PUSH API(WebSocket)ならリアルタイムに株価が取得できる

損切り注文こそ価格の動きに迅速に反応する必要があります。

もちろん、普通に無限ループで短い間隔で株価を取得するプログラムでも悪くはありません。

しかし、私はもっと迅速に反応する方法として、kabuステーションAPIが提供するPUSH API(WebSocket)を使用するようにしています。

まずはkabuステーションAPIの公式サンプルを説明

kabusapi_websocket.py

kabucom/kabusapi
kabuステーションAPI ポータル. Contribute to kabucom/kabusapi development by creating an account on GitHub.
import sys
import websocket
import _thread

def on_message(ws, message):
    print('--- RECV MSG. --- ')
    print(message)

def on_error(ws, error):
    print('--- ERROR --- ')
    print(error)

def on_close(ws):
    print('--- DISCONNECTED --- ')

def on_open(ws):
    print('--- CONNECTED --- ')
    def run(*args):
        while(True):
            line = sys.stdin.readline()
            if line != '':
                print('closing...')
                ws.close()
    _thread.start_new_thread(run, ())

url = 'ws://localhost:18080/kabusapi/websocket'
# websocket.enableTrace(True)
ws = websocket.WebSocketApp(url,
                          on_message = on_message,
                          on_error = on_error,
                          on_close = on_close)
ws.on_open = on_open
ws.run_forever()

auカブコム証券さんも、何の説明もなしにこのサンプルコードをgithubに公開するなんて、結構不親切ですね。

でも、これが基本形になるので、それぞれの関数について説明していきます。

まず、どこから始まるのか

それは、26行目の「url = ‘ws://localhost:18080/kabusapi/websocket’」からです。

26行目から始まる流れで、最後に33行目で「ws.run_forever()」の関数を呼ぶことで、WebSoketが開始されます。
言い換えれば、kabuステーションAPIのPUSHU APIからの通知を自動的に受け付けるようになるのです。

それより上に定義している関数は「コールバック関数」といって、Pythonのwebsocket-clientモジュール(WebSoketの機能)から、勝手に呼ばれるものです。どういうときに呼ばれるのかは、モジュールの仕様で決まっています。

websocket-client
WebSocket client for Python with low level API options

それぞれのタイミングでやりたいことを定義していきます。

次に呼ばれるのは「def on_open(ws):」

WebSoketが開始されると、すぐにコールバックされるのがこの関数です。

もじどおり、WebSoketが開くと呼ばれます。

サンプルでは、ここで無限ループでコマンド入力をチェックし、何か入力されるとWebSoketを終了(close)しています。

必ずしもこの流れでなくてもいいのですが、WebSoketは自分で終了しないと永遠に終わらないことを考慮してコーディングする必要があります。

「def on_message(ws, message):」はkabuステーションのサーバから通知が来た時に呼ばれる

このトレードシステムの場合は、株価が変わった場合にこの関数が呼ばれることになります。

このモジュールでやりたいことは「株価をチェックして損切り値になっているか確認」なので、この関数の中に書いていくことになります。

「def on_error(ws, error):」「def on_close(ws):」は特に何も書かなくてもOK

「def on_error(ws, error):」はエラーが発生したとき、「def on_close(ws):」はWebSoketが終了(close)したときに、それぞれ呼ばれます。

特にやりたいことが無い場合は、「def on_error(ws, error):」でログを出力するくらいで、あとは何もしなくてもよいです。

次の処理を呼び足したいときは、「ws.run_forever()」の後に書こう

次の処理を数珠繋ぎ方式で呼び出したいときは、「def on_close(ws):」の中に書いてもいいのですが、私は最後の「ws.run_forever()」の後に書くことをお勧めします。

なぜならば、そのほうが、このモジュールと入口から出口への流れが見やすいからです
(ただそれだけの理由です)。

コメント