FX・シストレ Python

【Python】KabuステーションAPIのサンプルコードと使い方③(現物取引・信用取引の注文発注)

この記事は約14分で読めます。

 

前回に引き続き、KabuステーションAPIについて、現物取引・信用取引の注文発注・注文取消のやり方をサンプルコードを紹介していきたい思います

 

留意事項

 

サンプルコードに使用しているtokenっや注文一覧の確認方法はAPIを叩く際に必要な認証トークンで作り方は過去記事で作った関数を元にしています。

 

新規注文の発注

 

現物取引の注文発注

 

<現物注文のサンプルコード>

# 現物注文を出す関数

def send_cashorder(token, pass_, symbol, exchange, side, ordertype, qty, price, expire):

    if side == 'buy':
        side = '2'
        dtype = 2
        ftype = 'AA'

    elif side == 'sell':
        side = '1'
        dtype = 0
        ftype = '  '

    # 成行注文のときのオプション
    if str(ordertype) == '10':  
        price = 0
    obj = { 'Password': pass_,
            'Symbol': str(symbol),       # 銘柄コード
            'Exchange': int(exchange),          #1が「東証」
            'SecurityType': 1,      # 1が「株式」
            'Side': side,            # 1が「売り」、2が「買い」
            'CashMargin': 1,  #1が「現物」 2が「信用新規」 3が「信用返済」
            'DelivType': dtype, 
            'AccountType': 2, # 口座の種類 2が「一般」
            'Qty': int(qty),
            'FrontOrderType': int(ordertype),
            'FundType':ftype,
            'Price': price,
            'ExpireDay': expire
              }

    #print(obj)
    json_data = json.dumps(obj).encode('utf-8')
    url = 'http://localhost:18080/kabusapi/sendorder'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', token)

    try:
        with urllib.request.urlopen(req) as res:
            #print(res.status, res.reason)
            for header in res.getheaders():
                #print(header)
            content = json.loads(res.read())
            return content
    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        return content
    except Exception as e:
        print(e)
        return e

 

  • token:認証トークン
  • pass_:取引パスワード
  • symbol:銘柄コード
  • exchange:取引所(東証は1)
  • side:’buy’ ‘sell’
  • ordertype:成行が「10」指値が「20」
  • qty:注文数
  • price:注文価格
  • expire:期限

 

## 使用例 ##

#指値注文(買)
send_cashorder(token, '取引パスワード', 5104, 1, 'buy',20, 100, 400, 0)

#指値注文(売)
send_cashorder(token, '取引パスワード', 5104, 1, 'sell',20, 100, 400, 0)

#成行注文(買)
send_cashorder(token, '取引パスワード', 5104, 1, 'buy',10, 100, 400, 0)

#成行注文(売)
send_cashorder(token, '取引パスワード', 5104, 1, 'sell',10, 100, 400, 0)

 

信用取引の注文の発注

 

# 信用取引の注文を出す関数
def send_marginorder(token, pass_, symbol, exchange, side, margintype, ordertype,qty, price, expire):
    if side == 'buy':
        side = '2'
    elif side == 'sell':
        side = '1'
    if int(ordertype) == 10: #成行注文の場合は価格が0でないとエラーになるため
        price = 0
    obj = { 'Password': pass_,
            'Symbol': str(symbol),       # 銘柄コード
            'Exchange': int(exchange),          #1が「東証」
            'SecurityType': 1,      # 1が「株式」
            'Side': side,            # 1が「売り」、2が「買い」
            'CashMargin': 2,  #1が「現物」 2が「信用」
            'MarginTradeType': margintype, #1が「制度信用」2が「長期」3が「デイトレ」
            'DelivType': 0,
            'AccountType': 2, # 口座の種類 2が「一般」
            'Qty': int(qty),
            'FrontOrderType': ordertype,
            'Price': price,
            'ExpireDay': expire
        }
    #print(obj)
    json_data = json.dumps(obj).encode('utf-8')
    url = 'http://localhost:18080/kabusapi/sendorder'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', token)

    try:
        with urllib.request.urlopen(req) as res:
            #print(res.status, res.reason)
            #for header in res.getheaders():
                #print(header)
            content = json.loads(res.read())
            return content
    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        #pprint.pprint(content)
        return content
    except Exception as e:
        #print(e)
        return e

 

<使用例>

send_marginorder(token=token, pass_='取引パスワード',  symbol=5104, exchange=1, side='sell', margintype=3, ordertype=20, qty=100, price=360, expire=0)

 

信用ポジの決済

 

# ポジションを決済する関数

def send_margin_closeorder(token, pass_, exchange, order_id, order_type, price, expire):
    position_data = get_position(token,2)
    posi_data = position_data[position_data['ポジションID']==order_id]
    qty = posi_data['注文数'][0]
    if order_type == 10:
        price = 0
    if posi_data['売買'][0]=='買':
        side = '1'
    elif posi_data['売買'][0]=='売':
        side = '2'
    margintype = posi_data['信用注文タイプ'][0]
    symbol = posi_data['コード'][0]
    obj = { 'Password': pass_,
            'Symbol': str(symbol),       # 銘柄コード
            'Exchange': int(exchange),          #1が「東証」
            'SecurityType': 1,      # 1が「株式」
            'FrontOrderType': order_type,
            'TimeInForce': 0,
            'Side': side,
            'CashMargin': 3,
            'MarginTradeType': int(margintype),
            'DelivType': 2,
            'FundType': 11,
            'AccountType': 2, # 口座の種類 2が「一般」
            'Qty': int(qty),
            'Price': int(price),
            'ExpireDay': expire,
            'ClosePositions': [{'HoldID':order_id ,'Qty':int(qty)}]
        }
    print(obj)
    json_data = json.dumps(obj).encode('utf-8')
    url = 'http://localhost:18080/kabusapi/sendorder'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', token)
    
    try:
        with urllib.request.urlopen(req) as res:
            print(res.status, res.reason)
            for header in res.getheaders():
                print(header)
            content = json.loads(res.read())
            return content
    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        #pprint.pprint(content)
        return content
    except Exception as e:
        #print(e)
        return e

 

<使用例>

# 成行で決済注文を出す
send_margin_closeorder(token, '取引パスワード', 1, 'E~で始まるポジションID', 10, 0, 0)

#指値注文で決済注文を出す
send_margin_closeorder(token, '取引パスワード', 1, 'E~で始まるポジションID', 20, 2000, 0)

 

 

よくあるエラーメッセージ

 

{'Code': 5, 'Message': '正しい有効期限を設定してください'}

 

デフォルトではexpire=0だが、引け後に注文だすと当日は既に締め切っているのでエラーになる。

解決策は翌営業日以降の日付を数値型で入力する。

例;send_cashorder(token, ‘取引パスワード’, 5104, 1, ‘sell’,10, 100, 400, 20220414)

 

 

注文の取消

 

<関数化したサンプルコード>

# 注文を取り消す関数
def cancel_order(token, pass_, id_):
    url = 'http://localhost:18080/kabusapi/cancelorder'
    obj = {
        'Password': pass_,
        'OrderId': id_
    }
    json_data = json.dumps(obj).encode('utf-8')
    req = urllib.request.Request(url, json_data, method='PUT')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', token)

    try:
        with urllib.request.urlopen(req) as res:
            #print(res.status, res.reason)
            for header in res.getheaders():
                print(header)
            content = json.loads(res.read())
        return content

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

 

注文の取消は「注文ID」を使います。

 

<使用例>

cancel_order(token, '取引パスワード', '注文ID')

 

インデントがずれている場合はGITのコードを参照していただけると幸いです。

https://github.com/beginerSE/kabustationAPI_samplecode

 

注文IDは以前定義したget_order(token)で取得できます。

 

参照:【Python】AUカブコム証券のKabuステーションAPIのサンプルコードと使い方①(口座残高・注文一覧の確認)

 

 

オススメ参考書

 

 

 

 

コメント

タイトルとURLをコピーしました