自動車エンジニアのアップデート

自動車エンジニアのアップデート

自動車部品メーカー勤務ソフトエンジニアの情報発信ブログ

~ 車載 ソフト エンジニア の 情報発信 ブログ ~

【Python学習】ビットコイン自動売買プログラム#3 ~ request.postで送信して売買要求~

f:id:Vefortec:20220209181440p:plain

こんにちは。

 

ビットコイン自動売買プログラム作成を進めるレオハルです。

 

~前回記事~

vefortec.hatenablog.com

 

 

今回は、ついにコインチェックの売買をPythonで行います。

実際に売買が出来れば、あとは、儲かるロジックを考えるだけです!

それが出来れば、世の中の人みんな大儲けできるわけですが……

 

ともかく、まずは売買できる仕組みを構築します。

 

 

POSTメソッド

APIへアクセスするということは、HTTPでHTMLをインターネット経由で送受信していることと同じです。

 

HTTPで送受信する仕組みとして、GETとPOSTがあります。

GET:サーバから情報取得してくるときに使用する

POST:サーバへ情報を登録するときに使用する

だそうです。

 

ビットコインの購入・売却には、利用者からいくらで買うのか、何ビットコイン売るのか、などをこちらから指定する必要がるため、POSTを利用します。

パラメータの指定

公式のAPIドキュメントから、パラメータの指定方法を確認します。

f:id:Vefortec:20220225173247p:plain

今回は、現在価格を取得して、成行注文で購入することにします。

    params = {
        'pair': 'btc_jpy',
        'order_type': 'market_buy',
        'market_buy_amount': 現在価格
    }

売却は、所有しているビットコインをすべて一度に売却します。

    params = {
        'pair': 'btc_jpy',
        'order_type': 'market_sell',
        'amount': 保有ビットコイン
    }

現在価格・保有ビットコインは、これまで利用していたAPIを駆使してどうにか設定します。

Pythonコード

リクエスト処理

認証コードをすべての機能に入れ込むのは面倒なので、関数化します。

アクセスURL:endoint
売買時のパラメータ:params(未指定の場合、None)
GET/POST切り替え:method(未指定の場合、GET)

def reqest(endpoint, params=None, method='GET'):
    time.sleep(1)

    nonce = str(int(time.time()))
    body = json.dumps(params) if params else ''
    message = nonce + endpoint + body
    signature = hmac.new(SECRET_KEY.encode(),
                         message.encode(),
                         hashlib.sha256).hexdigest()
    headers = {
        'ACCESS-KEY': ACCESS_KEY,
        'ACCESS-NONCE': nonce,
        'ACCESS-SIGNATURE': signature,
        'Content-Type': 'application/json'
    }
    
    if method == 'GET':
        r = requests.get(endpoint,headers=headers,params=params)
    else:
        r = requests.post(endpoint, headers=headers, data=body)

    return r.json()

 

購入処理

購入時は、購入したいビットコイン量を指定してorder_buyを実行します。

def private_rate(buy_amount):
    params = {'order_type': 'buy',
              'pair': 'btc_jpy',
              'amount': buy_amount}
    endpoint = url+'/api/exchange/orders/rate'
    r=reqest(endpoint=endpoint,params=params)

    return r
    
def order_buy(buy_amount):
    market_buy_amount =private_rate(buy_amount)
    buy_amount_jpy=market_buy_amount['price']

    params = {
        'pair': 'btc_jpy',
        'order_type': 'market_buy',
        'market_buy_amount': buy_amount_jpy
    }
    endpoint = url + '/api/exchange/orders'

    r = reqest(endpoint, params=params, method='POST')
    
    print(r)

売却処理

売却時は、order_sellを実行することで保有しているビットコインを全部売却します。

def private_balance():
    endpoint = url+'/api/accounts/balance'
    return reqest(endpoint=endpoint)

def private_position():
    balance = private_balance()
    return {k: v for k, v in balance.items()
            if isinstance(v, str) and float(v)}

def order_sell():
    position = private_position()
    params = {
        'pair': 'btc_jpy',
        'order_type': 'market_sell',
        'amount': positions['btc']
    }
    endpoint = url + '/api/exchange/orders'

    r = reqest(endpoint, params=params, method='POST')

    print(r)

実行結果

購入時・売却時それぞれ成功すれば、下記のような応答が表示されます。

購入時
{'success': True, 'id': 4399663184, 'amount': None, 
'rate': None, 'order_type': 'market_buy', 
'pair': 'btc_jpy', 'created_at': '2022-02-25T09:08:09.000Z', 
'market_buy_amount': '22111.07', 'stop_loss_rate': None}

 

売却時
{'success': True, 'id': 4399663801, 'amount': '0.005', 
'rate': None, 'order_type': 'market_sell', 
'pair': 'btc_jpy', 'created_at': '2022-02-25T09:08:26.000Z', 
'market_buy_amount': None, 'stop_loss_rate': None}

 

これで、自動売買システムの基礎となる購入処理・売却処理が実装できました。

あとは、自動で売り買いするロジックと24時間稼働させればOKですね。