2018年5月13日日曜日

python-binanceを使ってみているのだけれど、かゆいところに手が届かない。

少し関数を作ってみたので共有まで。

# 自分の持っているコイン一覧(BTC除く)をリストで返す関数(遅い)
# >>> get_my_coin_list()
# >>> ['ETH', 'DNT', 'MCO']
g_account = client.get_account()['balances']
def get_my_coin_list ():    
    lst = []
    for bal in g_account:
        basset = bal['asset']
        bfree = float(bal['free'])
        blocked = float(bal['locked'])
        ttl = bfree + blocked
        if ttl == 0 or basset == 'BTC':
            continue
        elif ttl < float(client.get_symbol_info(basset+'BTC')['filters'][1]['minQty']):
            continue
        else:
            lst.append(basset)
    return lst

# あるコインの現在価格(ティッカー/対BTC)を返す関数
# >>> get_current_price('ETH')
# >>> 0.080845
g_tickers = client.get_all_tickers()
def get_current_price (sym):
    return float((i for i in g_tickers if i['symbol'] == sym+'BTC').__next__()['price'])

# あるコインをいくつ自分が持っているかを返す関数
# >>> get_current_amount('ETH')
# >>> {'asset': 'ETH', 'free': '0.47080900', 'locked': '0.00000000'}
g_account = client.get_account()['balances']
def get_current_amount (sym):
    return (i for i in g_account if i['asset'] == sym).__next__()

# 全てのコイン(BTCとペアがあるもののみ)を返す関数
# >>> get_all_coin_lst()
# >>> ['ETH', 'LTC', 'BNB', 'NEO', ... (省略)
g_tickers = client.get_all_tickers()
def get_all_coin_list ():
    lst = []
    for t in g_tickers:
        if t['symbol'].endswith('BTC'):
            lst.append(t['symbol'][0:-3])
    return lst

# 自分の持っているコインの合計(BTC換算)を返す関数
# >>> get_my_asset()
# 0.009220648101
def get_my_asset ():
    lst = get_my_coin_list()
    ast = 0.0
    for l in lst:
        a = get_current_amount(l)
        ast += (float(a['free']) + float(a['locked'])) * get_current_price(l)
    a = get_current_amount('BTC')
    ast += (float(a['free']) + float(a['locked']))
    return ast

# 持っているコイン全てにストップロス注文を行う関数(ムダが多いのは歴史的経緯)
# >>> stop_loss_orders(0.9)
#     引数の0.9は、現在値の0.9倍にストップロスを入れる、という意味
# >>> Stop-Loss, ETH, 0.07291600, 0.470, 0.03427052
# >>> Stop-Loss, ICN, 0.00011859, 290.000, 0.03439110
g_account = client.get_account()['balances']
def stop_loss_orders (num):
    for bal in g_account:
        basset = bal['asset']
        bfree = float(bal['free'])
        blocked = float(bal['locked'])
        ttl = bfree + blocked
        if ttl == 0 or basset == 'BTC':
            continue
        elif ttl < float(client.get_symbol_info(basset+'BTC')['filters'][1]['minQty']):
            continue
        else:
            sym = basset
            b = bfree
            s = client.get_symbol_info(sym+'BTC')
            mq = float(s['filters'][1]['minQty'])
            mp = float(s['filters'][0]['minPrice'])
            i = get_current_price(sym)
            qty = round(math.floor(b / mq) * mq, 10)
            p = "%.8f" % round(math.floor(float(i) * num / mp) * mp, 10)
            o = client.create_order(
                symbol = sym+'BTC',
                side = SIDE_SELL,
                type = ORDER_TYPE_STOP_LOSS_LIMIT,
                timeInForce = TIME_IN_FORCE_GTC,
                quantity = qty,
                price = p,
                stopPrice = p)
            print('Stop-Loss, {0}, {1:.8f}, {2:.3f}, {3:.8f}'.format(sym, float(p), qty, float(p) * qty))

プログラミングは大学出て以来なので、お行儀悪いところがあればご指摘いただければ幸いです。
基本、「動けば良い」「すごい遅かったチューニング」の発想でやっています。。。

なお、上記関数のご使用はご自身の責任にてお願いします。

python-binanceを使ってみているのだけれど、かゆいところに手が届かない。 少し関数を作ってみたので共有まで。 # 自分の持っているコイン一覧(BTC除く)をリストで返す関数(遅い) # >>> get_my_coin_list() # &...