auカブコム証券 kabuステーションAPI W指値用プログラム(3) 新規建て注文情報取得

スポンサーリンク

トークン取得、PUSH API銘柄登録、発注までの処理は前と大体同じなので説明を割愛します。

order_info.py

import urllib.request
import urllib.parse
import urllib.error
import json
import pprint
import settings
import variables
import sys


def orders_info():
    url = 'http://localhost:' + settings.port + '/kabusapi/orders'
    params = {'product': 0, 'id': variables.entryOrderID}
    req = urllib.request.Request('{}?{}'.format(url, urllib.parse.urlencode(params)), method='GET')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', variables.token)

    try:
        print('###order_info')
        with urllib.request.urlopen(req) as res:
            print(res.status, res.reason)
            for header in res.getheaders():
                print(header)
            print()
            res_json = res.read()
            content = json.loads(res_json)
            first_order = content[len(content) - 1]

            # 注文状態を取得
            state = first_order['State']
            # 全約定じゃない場合はFalse
            if state != 5:
                return False

            # 注文情報を取得
            print(first_order['Details'])
            order_details = first_order['Details']

            # 返済用の配列
            close_positions_array = []
            for orderDetail in order_details:
                hold_id = orderDetail['ExecutionID']
                if hold_id is None:
                    continue

                close_positions_dic = {}
                qty = int(orderDetail['Qty'])
                close_positions_dic['HoldID'] = hold_id
                close_positions_dic['Qty'] = qty
                close_positions_array.append(close_positions_dic)

                # エントリ値で最も不利な値をエントリ値にする
                if first_order['Side'] == 1:
                    if variables.order_price is None or orderDetail['Price'] < variables.order_price:
                        variables.order_price = orderDetail['Price']
                else:
                    if variables.order_price is None or orderDetail['Price'] > variables.order_price:
                        variables.order_price = orderDetail['Price']

            # 建玉データを保存
            variables.closePositions = close_positions_array

            return True

    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        pprint.pprint(content)
    except Exception as e:
        print(e)

    sys.exit()

建玉情報を保存

39行目からの処理で、返済注文の建玉指定にしてするための変数に、注文結果情報から建玉情報を詰め替えています。

口数が多い発注だと、約定が複数に分かれることが多いのですが、その約定ごとにそれぞれの建玉数を正しくしていしないと、建玉を特定した返済注文は通りません。

kabuステーションAPIは、注文情報照会や残高照会では”ExecutionID“という項目名で建玉IDを表しているのに、返済注文では”HoldID“という項目名で指定しなければならないという狂気の仕様なので、わざわざ項目名を変えて建玉情報を保存する必要があります。

新規建ての約定値を特定し保存

このプログラムでは約定値±の価格で利食い損切り値を決めるため、基準となる約定値を取得する必要があります。

52行目からの処理で、約定した平均値ではなく、一番不利な値を基準の約定値としています。

つまり、売建てのときは約定したなかで一番安い価格、買建てのときは一番高い価格 というわけです。

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

コメント