auカブコム証券 kabuステーションAPI W指値用プログラム(5) 利食い損切価格監視

スポンサーリンク

websocket_exit.py

import pprint
import json

import send_order_exit
import settings
import variables
import datetime
import websocket
import sys
import positions


class WebsocketExitC:

    def __init__(self):
        self.isException = True

    def on_message(self, ws, message):
        self.print_with_time('--- RECV MSG. --- ')
        content = json.loads(message)
        symbol = content["Symbol"]
        if symbol != settings.symbol:
            return

        cur_price = content["CurrentPrice"]

        if cur_price is None:
            return

        pprint.pprint("curPrice:" + str(cur_price))
        pprint.pprint("orderPrice:" + str(variables.order_price))

        # 損切り
        if settings.side == 1:
            if cur_price >= variables.order_price + settings.loss_cut_margin:
                self.send_order_market(ws)
        else:
            if cur_price <= variables.order_price - settings.loss_cut_margin:
                self.send_order_market(ws)

        # 利食い
        if settings.side == 1:
            if cur_price <= variables.order_price - settings.take_profit_margin:
                self.send_order_ioc_limit(ws, cur_price)
        else:
            if cur_price >= variables.order_price + settings.take_profit_margin:
                self.send_order_ioc_limit(ws, cur_price)

    def send_order_market(self, ws):
        # 成行
        send_order_exit.send_order_market()

        self.isException = False
        ws.close()

    def send_order_ioc_limit(self, ws, price):
        # IOC指値
        send_order_exit.send_order_ioc_limit(price)

        # 建玉数を更新
        positions.get_positions()

        # 建玉がなくなったら終了
        if variables.exitQty == 0:
            self.isException = False
            ws.close()

    def on_error(self, ws, error):
        if len(error) != 0:
            self.print_with_time('--- ERROR --- ')
            print(error)

    def on_close(self, ws):
        self.print_with_time('--- DISCONNECTED --- ')

    def on_open(self, ws):
        self.print_with_time('--- CONNECTED --- ')

    def stat_push_api_client(self):
        self.print_with_time('--- webSocket_exit Start--- ')
        url = 'ws://localhost:' + settings.port + '/kabusapi/websocket'
        # websocket.enableTrace(True)
        ws = websocket.WebSocketApp(url,
                                    on_message=self.on_message,
                                    on_error=self.on_error,
                                    on_close=self.on_close)
        ws.on_open = self.on_open
        ws.run_forever()

        self.print_with_time('--- websocket_exit --- ')

        if self.isException:
            print("exit")
            sys.exit()

    @staticmethod
    def print_with_time(message):
        print(str(datetime.datetime.now()) + ' ' + message)

以前のプログラムと大体同じなので、56行目の利食い時のIOC指値注文の部分のみ解説します。

前回のブログで説明したように、建玉を指定して返済しているため、返済注文後に残高照会を行って、注文時の約定ごとの残建玉数を最新化しています。

この建玉数が最新状態でないと、次の返済注文がうまくいきません。

W指値
スポンサーリンク
システムトレードでそこそこ儲ける方法

コメント