トークン取得、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行目からの処理で、約定した平均値ではなく、一番不利な値を基準の約定値としています。
つまり、売建てのときは約定したなかで一番安い価格、買建てのときは一番高い価格 というわけです。
コメント