Binanceに上場予定の通貨が並んだら指定した分の指値を入れてLINEにお知らせするBOT(予定)

相変わらず素人プログラムです。当たり前のようにエラー処理はしていません。あと、今回は損失が発生する場合があるので事前に言っておきます。

使うのは自己責任やで!

ではコードです。テストコードがそのまま残ってますが気にしないでください。使用する通貨をETHに変えれば多分ETH建てにも対応すると思います。あとBNBとか?そこらへんは自分で試してください。あと、使用する通貨が指定残高に足りない場合、持っているBTCで全力買いをします。たとえ10BTCあろうが全力です。くれぐれも間違えないように。指値の単位はサトシです。
6/5 なんとなくエラー処理を追加

#!/usr/bin/python3
# coding: utf-8

import requests
import time
import logging
import logging.handlers
import datetime
from decimal import Decimal, ROUND_DOWN
from binance.client import Client
from binance.exceptions import BinanceAPIException
from binance.enums import *

# BTCで買う場合の値段(現状は300satoshi)
BUY_PRICE = 0.000003
# BUY_PRICE = 0.00008628
# 買うときに使用するBTCの量(現状は0.1BTC)
BUY_AMOUNT = 0.1
# 目的の通貨
P_COIN = 'QKC'
# P_COIN = 'XRP'
# 使用する通貨
U_COIN = 'BTC'
# APIKEY&SECRET
key = ''
secret = ''
# 休止時間
sleeptimes = 5

def log_info():
    # logging設定
    # ログの出力名を設定
    logger = logging.getLogger('binance_chkLog')
    # ログレベルの設定
    logger.setLevel(10)
    # ログの出力形式の設定
    formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
    # ログの出力ローテーションハンドル
    trh = logging.handlers.TimedRotatingFileHandler(filename='binance_chk.log', when='midnight', backupCount=5)
    trh.setLevel(10)
    trh.setFormatter(formatter)
    logger.addHandler(trh)
    # ログのコンソール出力設定
    sh = logging.StreamHandler()
    logger.addHandler(sh)
    sh.setFormatter(formatter)
    return logger

# LINEに通知する場合は自分のトークンを入れる
line_notify_token = ''
line_notify_url = 'https://notify-api.line.me/api/notify'

if __name__ == '__main__':
    # ログ設定
    loggers = log_info()
    # クライアント情報取得
    client = Client(key, secret)
    # クライアントのBTC総量を取得
    balance = client.get_asset_balance(asset=U_COIN)
    # 取得したBTC総量が設定した買う際に使用するBTC量より少ない場合、取得したBTC総量を設定
    if Decimal(balance['free']) < Decimal(BUY_AMOUNT):
        loggers.info("設定したBTCの総量が足りません。現在の総量は" + str(balance['free']) + "になります。")
        # 後で面倒なのでここで両方ともDecimalへ
        BUY_AMOUNT = Decimal(balance['free'])
        BUY_PRICE = round(Decimal(BUY_PRICE), 8)
        loggers.info("購入に使用するBTCの総量は" + str(BUY_AMOUNT))
        loggers.info("購入価格は" + str(BUY_PRICE))
    # ペア情報の初期化
    info = None
    # ペア情報が取得できるまで回す
    loggers.info("**************巡回を始めます**************")
    try:
        while info is None:
            loggers.info("**************只今巡回中です**************")
            # ペア情報を取得
            info = client.get_symbol_info(str(P_COIN) + str(U_COIN))
            # ペア情報が取得出来た場合
            if info is not None:
                # 価格を設定
                # BTC量から価格を除算することで総量を決定(小数点以下は四捨五入)
                alt_amount = Decimal(BUY_AMOUNT / BUY_PRICE).quantize(Decimal('0'), rounding=ROUND_DOWN)
                loggers.info("購入できる総量は" + str(alt_amount) + "になります")

                # 買いオーダー処理
                order = client.create_order(
                    symbol=str(P_COIN) + str(U_COIN),
                    side=SIDE_BUY,
                    type=ORDER_TYPE_LIMIT,
                    timeInForce=TIME_IN_FORCE_GTC,
                    quantity=alt_amount,
                    price=BUY_PRICE)

                # テスト買いオーダー
                # order = client.create_test_order(
                #    symbol=str(P_COIN) + str(U_COIN),
                #    side=SIDE_BUY,
                #    type=ORDER_TYPE_LIMIT,
                #    timeInForce=TIME_IN_FORCE_GTC,
                #    quantity=alt_amount,
                #    price=str(BUY_PRICE))

                # 以下LINE通知設定
                payload = {'message': 'オーダーを送信しました'}
                headers = {'Authorization': 'Bearer ' + line_notify_token}
                line_notify = requests.post(line_notify_url, data=payload, headers=headers)
                loggers.info("オーダーを送信しました")
                break
            time.sleep(sleeptimes)
    except BinanceAPIException as x:
        loggers.info(x)
    except Exception as e:
        loggers.info(e)

この記事が気に入ったらサポートをしてみませんか?