こんな記事を書いた。 コードを改良したので続き。
team-6.hatenablog.jp team-6.hatenablog.jp
前回のコードをちょいちょい見直したら結構違うコードになった。
追加になったのは、これまでのトレードの利得を最後に表示するようになった点だ。
API呼び出しに時間がかかるので注意。
ALL_COINS
はそのうち使うので残しておく。
同じディレクトリにkeys.json をおいて、中にAPI KeyとAPI Secretを記述すること(フォーマットはコードから類推してくださいです)。
pip install requests python-binace
#!/usr/bin/env python import json import requests from binance.client import Client from binance.exceptions import BinanceAPIException ALL_COINS = ['BTC', 'LTC', 'ETH', 'BNC', 'ICO', 'NEO', 'BNB', '123', '456', 'QTUM', 'EOS', 'SNT', 'BNT', 'GAS', 'BCC', 'BTM', 'USDT', 'HCC', 'HSR', 'OAX', 'DNT', 'MCO', 'ICN', 'ELC', 'PAY', 'ZRX', 'OMG', 'WTC', 'LRX', 'YOYO', 'LRC', 'LLT', 'TRX', 'FID', 'SNGLS', 'STRAT', 'BQX', 'FUN', 'KNC', 'CDT', 'XVG', 'IOTA', 'SNM', 'LINK', 'CVC', 'TNT', 'REP', 'CTR', 'MDA', 'MTL', 'SALT', 'NULS', 'SUB', 'STX', 'MTH', 'CAT', 'ADX', 'PIX', 'ETC', 'ENG', 'ZEC', 'AST', '1ST', 'GNT', 'DGD', 'BAT', 'DASH', 'POWR', 'BTG', 'REQ', 'XMR', 'EVX', 'VIB', 'ENJ', 'VEN', 'CAG', 'EDG', 'ARK', 'XRP', 'MOD', 'AVT', 'STORJ', 'KMD', 'RCN', 'EDO', 'QASH', 'SAN', 'DATA', 'DLT', 'GUP', 'MCAP', 'MANA', 'PPT', 'OTN', 'CFD', 'RDN', 'GXS', 'AMB', 'ARN', 'BCPT', 'CND', 'GVT', 'POE', 'ALIS', 'BTS', 'FUEL', 'XZC', 'QSP', 'LSK', 'BCD', 'TNB', 'GRX', 'STAR', 'ADA', 'LEND', 'IFT', 'KICK', 'UKG', 'VOISE', 'XLM', 'CMT', 'WAVES', 'WABI', 'SBTC', 'BCX', 'GTO', 'ETF', 'ICX', 'OST', 'ELF', 'AION', 'WINGS', 'BRD', 'NEBL', 'NAV', 'VIBE', 'LUN', 'TRIG', 'APPC', 'CHAT', 'RLC', 'INS', 'PIVX', 'IOST', 'STEEM', 'NANO', 'AE', 'VIA', 'BLZ', 'SYS', 'RPX', 'NCASH', 'POA', 'ONT', 'ZIL', 'STORM', 'XEM', 'WAN', 'WPR', 'QLC', 'GRS', 'CLOAK', 'LOOM', 'BCN'] IGNORE_COINS = ['BTC', 'BNC', 'ICO', '123', '456', 'BTM', 'USDT', 'PAY', 'LRX', 'FID', 'CVC', 'STX', 'CAT', 'PIX', '1ST', 'CAG', 'EDG', 'AVT', 'QASH', 'SAN', 'DATA', 'GUP', 'MCAP', 'OTN', 'CFD', 'ALIS', 'GRX', 'STAR', 'IFT', 'KICK', 'UKG', 'VOISE', 'SBTC', 'BCX', 'ETF'] class Coin: class Status: def __init__(self, symbol, btc_amount, amount, position, price, ratio, profit): self.symbol = symbol self.btc_amount = btc_amount self.amount = amount self.position = position self.price = price self.ratio = ratio self.profit = profit def __init__(self, symbol, amount, client): self._symbol = symbol self._amount = amount self._client = client self._btc_amount = 0 self._position = 0 self._profit = 0 self._ratio = 0 def _get_price(self): recent_trade = self._client.get_recent_trades(symbol=f'{self._symbol}BTC', limit=1) return float(recent_trade[0]['price']) def _get_current_position_and_profit(self): position = 0 amount = 0 profit = 0 try: trades = self._client.get_my_trades(symbol=f'{self._symbol}BTC') for trade in trades: qty = float(trade['qty']) price = float(trade['price']) if trade['isBuyer']: position = (amount * position + price * qty) / (amount + qty) amount += qty else: profit += price - position amount -= qty return position, profit except BinanceAPIException: return 0, 0 except Exception as e: print(e) return 0, 0 def get_current_status(self): position, profit = self._get_current_position_and_profit() if self._amount > 0 or profit != 0: if self._amount > 0: price = self._get_price() btc_amount = price * self._amount ratio = ((price - position) / position) * 100 else: price = 0 btc_amount = 0 ratio = 0 return Coin.Status(self._symbol, btc_amount, self._amount, position, price, ratio, profit) else: return None class Trader: def __init__(self, key, secret): self._client = Client(key, secret) def coin_factory(self, symbol, amount): return Coin(symbol, amount, self._client) def print_status(self): account = self._client.get_account() btc_total = 0 btc_profit_total = 0 for balance in account['balances']: amount = float(balance['free']) + float(balance['locked']) if balance['asset'] == 'BTC': print(f'BTC:\t{amount}') btc_total += amount elif balance['asset'] not in IGNORE_COINS: coin = self.coin_factory(balance['asset'], amount) status = coin.get_current_status() if status is not None: print(f'{status.symbol}:\t{status.btc_amount:.3f}({status.amount:8.2f})\t{status.position:.10f}\t({status.price:12.10f} {status.ratio:5.2f}%)\t{status.profit:13.10f}') btc_total += status.btc_amount btc_profit_total += status.profit print('Total:', btc_total) response = requests.get('https://api.cryptowat.ch/markets/bitflyer/btcjpy/price') btcjpy_price = response.json()['result']['price'] print('Total(JPY):', btc_total * btcjpy_price) print('Total profit:', btc_profit_total) print('Total profit(JPY):', btc_profit_total * btcjpy_price) if __name__ == '__main__': with open('keys.json', 'r') as f: keys = json.load(f) trader = Trader(keys['binance']['key'], keys['binance']['secret']) trader.print_status()
先の2つの記事含めコードのライセンスはUnlicense, もちろん無保証、無責任で。
- 出版社/メーカー: プレジャー・パブリッシング
- 発売日: 2018/04/23
- メディア: ムック
- この商品を含むブログを見る
アフター・ビットコイン: 仮想通貨とブロックチェーンの次なる覇者
- 作者: 中島真志
- 出版社/メーカー: 新潮社
- 発売日: 2017/10/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
仮想通貨リップルの衝撃 Rippleが実現する"価値のインターネット"
- 作者: 四條寿彦(著)、Giant Gox(監修)
- 出版社/メーカー: 天夢人
- 発売日: 2018/03/17
- メディア: 単行本
- この商品を含むブログを見る
- 作者: ロジャー・バー,兼元謙任,松田元
- 出版社/メーカー: 創芸社
- 発売日: 2018/04/27
- メディア: Kindle版
- この商品を含むブログを見る