Monitor your Binance portfolio

Overview

Binance Report Bot

The intent of this bot is to take a snapshot of your binance wallet, e.g. the current balances and store it for further plotting.

Install

Create the file conf_user.py based on conf_default.py. If a field is missing in conf_user.py, it will defaults to the one in conf_default.py.

Then run

pip3 install -r requirements.txt

Basic Usage

To save a snapshot of the binance account run:

python3 -m brb snapshot

To show the previously saved snapshots

python3 -m brb output # --help for options

Deployment

One can use crontab to use this code:

0 * * * * cd [FOLDER] ; python3 -m brb snapshot
2 19 * * * cd [FOLDER] ; python3 -m brb output --quiet

To have a snaphsot made every hour and a report made every day at 19:02.

The output can be sent to an external service, that can be configured with the APPRISE_URL parameter. See here to choose your external service and to create your APPRISE_URL. Please use a service that supports attachment, in order to send images. Recommended services : Discord, Telegram or Email.

Output example

Plot EOS equivalent holdings:

python3 -m brb output --symbol EOS

Plot ICX relative equivalent holdings:

python3 -m brb output --symbol ICX --relative

Plot ICX and EOS equivalent holdings since three days ago:

python3 -m brb output --symbol ICX,EOS --days 3

Plot the equivalent holdings of all soins registered in the conf file:

python3 -m brb output --symbol * # or '*' if using zsh

Plot the price of EOS and BTC over the last 10 days expressed in WIN:

python3 -m brb output --symbol EOS,BTC --graph-type price --price-in WIN

Note : The equivalent holding is your portfolio's value in a certain currency. It represents what you would be holding if all your portfolio was under this single currency.

CLI specification

$ python3 -m brb --help
Usage: python -m brb [OPTIONS] COMMAND [ARGS]...

  Binance Report Bot

  Take a snapshot of your binance wallet, e.g. the current balances and store
  it for further plotting.

Options:
  --debug / --no-debug  Prints debug data
  --help                Show this message and exit.

Commands:
  output    Output the previously stored data
  snapshot  Take a snapshot of your wallet
$ python3 -m brb snapshot --help
Usage: main.py snapshot [OPTIONS]

  Take a snapshot of the binance wallet and save it for further plotting

Options:
  --help                Show this message and exit.
$ python3 -m brb output --help
Usage: python -m brb output [OPTIONS

  Output the previously stored data with 'snapshot'

Options:
  --quiet / --no-quiet            Set to true if you don't want to print in
                                  the console or display an image
  --text / --no-text              Can be used to prevent the generation of the
                                  text report
  --graph / --no-graph            Can be used to prevent the generation of the
                                  graph report
  -r, --relative / --no-relative  If the graph should be plotted relative to

                                  its initial value
  -s, --symbol TEXT               The currency the graph will be plotted on.
                                  To plot several symbols on the same graph,
                                  separate them by a coma. If plotting several
                                  symbols, the --relative option is enabled.
                                  To plot all symbols, use '*'. Default : FIAT
  -d, --days INTEGER              The number of days over which the graph will
                                  be plotted. If set to 0, the graph will plot
                                  all the records. Default : 7 days
  -t, --graph-type [amount|price]
                                  Graph type. Amount : shows the equivalent
                                  amount that you are holding on your wallet.
                                  Price : shows price over time
  -p, --price-in TEXT             Currency in which to express the prices.
                                  Default : USD
  --help                          Show this message and exit.
Comments
  • KeyError: 'LDBNB'

    KeyError: 'LDBNB'

    Hey, after doing pip3 install -r requirements.txt and python3 main.py snapshot i get this message:

    Traceback (most recent call last):
      File "main.py", line 75, in <module>
        cli()
      File "/home/ubuntu/.local/lib/python3.8/site-packages/click/core.py", line 1137, in __call__
        return self.main(*args, **kwargs)
      File "/home/ubuntu/.local/lib/python3.8/site-packages/click/core.py", line 1062, in main
        rv = self.invoke(ctx)
      File "/home/ubuntu/.local/lib/python3.8/site-packages/click/core.py", line 1668, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/ubuntu/.local/lib/python3.8/site-packages/click/core.py", line 1404, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/ubuntu/.local/lib/python3.8/site-packages/click/core.py", line 763, in invoke
        return __callback(*args, **kwargs)
      File "main.py", line 19, in snapshot
        crypto_report = bot.crypto.get_report()
      File "/home/ubuntu/binance-report-bot/bot/crypto.py", line 58, in get_report
        total_usdt += balances[symbol]*tickers[symbol]
    KeyError: 'LDBNB'
    

    heres my config.py

    BINANCE_API_KEY = "XXXX"
    BINANCE_API_SECRET = "XXXX"
    COINS = ["ATOM","BAT","BTT","CAKE","ETC","ICX","IOTA","OMG","QTUM","ROSE","SRM","XLM","ONT","BNB","ZIL","ALGO","ADA","XRP","LTC","LINK","EOS","TRX","VET","NEO","DASH","MANA","OCEAN","UNI","MATIC","DOT"]
    CURRENCY = "EUR" #Or USD
    CURRENCY_SYMBOL = "€"
    RICH_PRINTING = True
    

    any idea? Thanks in Advance

    bug discussion 
    opened by SaLuci 14
  • KeyError: 'ATA'

    KeyError: 'ATA'

    Hey, its me again ;)

    the bug mentioned in #5 is fixed, however a new one appeared.

    Theres a coin called ATA, which is not "tradable" yet, but you can get them if you stake BNB. So the EUR/USD Value of those coins will be zero, till they become "tradable". I think thats the Problem.

    I will probably take a look at the code myself in the evening, should be a simple fix. (just ignoring coins with a USD value of zero)

    bug good first issue 
    opened by SaLuci 10
  • ZeroDivisionError: float division by zero

    ZeroDivisionError: float division by zero

    Hi there, I have cloned project at VPS server and created snapshot of account and run next command: python main.py --output print and I received next error at console:

    Traceback (most recent call last):
      File "main.py", line 54, in <module>
        main()
      File "/home/manager/binance-trade-bot/binance-trade-bot/venv/lib/python3.8/site-packages/click/core.py", line 829, in __call__
        return self.main(*args, **kwargs)
      File "/home/manager/binance-trade-bot/binance-trade-bot/venv/lib/python3.8/site-packages/click/core.py", line 782, in main
        rv = self.invoke(ctx)
      File "/home/manager/binance-trade-bot/binance-trade-bot/venv/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/manager/binance-trade-bot/binance-trade-bot/venv/lib/python3.8/site-packages/click/core.py", line 610, in invoke
        return callback(*args, **kwargs)
      File "main.py", line 49, in main
        figname = bot.crypto.plot_symbol(reports, plot_symbol)
      File "/home/manager/binance-trade-bot/binance-report-bot/bot/crypto.py", line 92, in plot_symbol
        Y.append(report['total_usdt']/ticker)
    ZeroDivisionError: float division by zero
    
    opened by DmytroLitvinov 5
  • KeyError: 'NFT'

    KeyError: 'NFT'

    python -m brb snapshot leads to

    Traceback (most recent call last):
      File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/srv/bot/crypto/brb/__main__.py", line 92, in <module>
        cli()
      File "/srv/bot/crypto/venv/lib/python3.7/site-packages/click/core.py", line 1134, in __call__
        return self.main(*args, **kwargs)
      File "/srv/bot/crypto/venv/lib/python3.7/site-packages/click/core.py", line 1059, in main
        rv = self.invoke(ctx)
      File "/srv/bot/crypto/venv/lib/python3.7/site-packages/click/core.py", line 1665, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/srv/bot/crypto/venv/lib/python3.7/site-packages/click/core.py", line 1401, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/srv/bot/crypto/venv/lib/python3.7/site-packages/click/core.py", line 767, in invoke
        return __callback(*args, **kwargs)
      File "/srv/bot/crypto/brb/__main__.py", line 29, in snapshot
        crypto_report = brb.crypto.get_report()
      File "/srv/bot/crypto/brb/crypto.py", line 80, in get_report
        total_usdt += balances[symbol] * tickers[symbol]
    KeyError: 'NFT'
    
    bug 
    opened by titulebolide 1
  • Calculate from reports current coin's quantity or equivalent quantity through time

    Calculate from reports current coin's quantity or equivalent quantity through time

    Here is the code:

    CRYPTOCOMPARE_API_KEY = "your_key_here"
    COINS = ["ADA","ATOM","BAT","BTT","CAKE","DASH","EOS","ETC","ICX","NEO","OMG","ONT","QTUM","ROSE","TRX","VET","WIN","XLM"]
    
    import numpy as np
    import requests
    import threading
    import copy
    import time
    from progress.bar import Bar
    crypto = np.load('crypto.npy', allow_pickle=True)
    
    time = [i['time'] for i in crypto]
    
    def get_ticker(ts, symbol, datas):
        data = requests.get(
            f'https://min-api.cryptocompare.com/data/v2/histominute?fsym={symbol}&tsym=EUR&limit=1&toTs={ts}&api_key={CRYPTOCOMPARE_API_KEY}'
        ).json()
        try:
            ticker = data['Data']['Data'][0]['open']
        except KeyError:
            print(ts,symbol, data)
        if datas is not None:
            datas[ts][symbol] = ticker
        return ticker
    
    try:
        tickers = np.load('ticker.npy', allow_pickle=True).tolist()
    
    except:
        bar = Bar('', max=len(time))
        datas = {}
        simultaneous = 0
        threads = []
        for t in time:
            bar.next()
            ts = int(t)
            datas[ts] = {}
            threads = [threading.Thread(target=get_ticker, args=(ts, symbol, datas)) for symbol in COINS]
    
            for th in threads: th.start()
            for th in threads: th.join()
        bar.finish()
    
        np.save('ticker.npy', datas, allow_pickle=True)
        tickers = datas
    
    value = []
    for data in crypto:
        ts = int(data['time'])
        total = data['report']['total']
        value.append({})
        for symbol in COINS:
            value[-1][symbol] = total/tickers[ts][symbol]
    
    opened by titulebolide 0
  • Road to v1.0.0

    Road to v1.0.0

    This issue will be mapping the road to v1.0.0 and what's left to do before this code gets out of beta.

    Here is a first throw:

    • [x] Use of apprise as an output
    • [ ] Display of holding graphs (not only equivalent holdings) (see this branch)
    • [ ] Recovery of the binance history to prevent the need of calling repeatedly the snapshot
    • [x] Stabilisation of the API
    • [x] Use of logging
    • [x] ERROR level in logging should be forwarded to apprise
    • [x] Display of daily and weekly PNL in text report
    • [x] Support other fiats than USD and EUR
    • [x] Handling of error (e.g. when a user add a coin in conf.COINS after some snapshots it can mess up things
    • [x] Set the duration over the which the graph is plotted
    • [x] Plot the price of the currencies over time
    • [ ] Migrate from the current .npy database to an sqlite3 db
    • [x] When a currency is rejected (e.g. if it has no ticker), send log message with DEBUG level
    • [x] Make DEBUG mode (i.e. logging level is DEBUG) toggable easily (with a environment variable or a configuration line or a flag)

    Help is wanted!

    enhancement help wanted good first issue discussion 
    opened by titulebolide 0
Releases(v0.6.3)
  • v0.6.3(Sep 3, 2021)

  • v0.6.2(Jul 9, 2021)

    :warning: Reminder of the breaking changes since v0.5.1:

    • Replace python3 main.py calls by python3 -m brb
    • Rename conf.py to conf_user.py

    Features

    • Plot the prices of the symbols in your list over the time (see --graph-type argument)
    • Choose the currency in which the price is written (see --price-in argument)
    • Prevent the output of the text or the graph report (see --no-text and --no--graph arguments)

    Bugfix

    • Forward warning level to apprise
    • Ignore conf.py and conf_user.py
    Source code(tar.gz)
    Source code(zip)
  • v0.6.1(Jun 25, 2021)

    :warning: Please rename conf.py to conf_user.py

    Features

    • Forward log of level errors and warning to apprise
    • Wrap around every exception to forward them to apprise
    • The text report computes the difference between now and whenever you want (e.g. a day ago, a month, a year, four decades...)

    Improvement

    • Place the legend out of the graph zone fro a better reading
    • Increase the size of the graph if plotting more than ten currencies
    • Revisions of the configuration should no longer break your install since a missing information in the conf_user.py is fetched in conf_default.py

    Bugfix

    • Handle symbols in the wallet that has not ticker
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Jun 10, 2021)

    :warning: 0.5.0 -> 0.6.0 INTRODUCES A BREAKING CHANGE IN THE API :warning:

    You have to replace python3 main.py calls by python3 -m brb

    Improvements:

    • Support many other currencies than USD and EUR
    • Check configuration file for insconsitancies
    • Use logging module
    • Converted to a module

    Bugfixes:

    • Minor fix for printing
    Source code(tar.gz)
    Source code(zip)
  • v0.5.1(Jun 3, 2021)

    Improvements:

    • Send notification via apprise
    • Choose the numbers of days over which the graph is plotted

    API and conf modification:

    • For output command:
      • Drop --port and --type as this is replaced by APPRISE_URL
      • Add --days option to choose the number of days over whick the graph is plotted
      • Add --quiet to prevent printing in the terminal and the opening of a window displaying the graph
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Jun 2, 2021)

    Official release of v0.5.0 based on rc2

    Improvements:

    • Beautiful formating of the time axis
    • Plotting of relative holdings
    • Plotting of several coins

    Bugfixes:

    • COIN not found if havinc coin in binance savings
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0-rc2(Jun 1, 2021)

  • v0.5.0-rc1(May 31, 2021)

  • v0.4.0(May 27, 2021)

    Improvements:

    • Add output option to choose which way to use to ouput data
    • Add snapshot option to make clear what is going on
    • Enrichment of README and help option.

    Bugfix:

    • If plot-symbol is used, the graph in FIAT is not generated.
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(May 26, 2021)

    The last release (0.3.0) was mistagged, jumping to the 0.3.1 direcly. Fixes:

    • Incorrect calculation of the overall owning in the text report

    The attached update.py file update the database to this new version. A cryptocompare API key is required.

    Source code(tar.gz)
    Source code(zip)
    update.py(1.75 KB)
  • v0.3.0(May 26, 2021)

  • v0.3.0-rc1(May 24, 2021)

    Changes:

    • Wipe old gsheet way of fetching data
    • Drop miner logging scripts
    • Change DB keys to store in USDT
    • Add option to change report currency
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(May 22, 2021)

Facebook Clooning Tool BD...

Facebook Clooning Tool BD...

Ariyan Ahmed Mamun 2 Feb 16, 2022
PR Changes Matrix Builder

Pr-changes-matrix-builder - A Github Action that will output a variable to be used in a matrix strategy job based on a PR&'s changes

Kyle James Walker (he/him) 21 Oct 04, 2022
The official wrapper for spyse.com API, written in Python, aimed to help developers build their integrations with Spyse.

Python wrapper for Spyse API The official wrapper for spyse.com API, written in Python, aimed to help developers build their integrations with Spyse.

Spyse 15 Nov 22, 2022
DevSecOps pipeline for Python based web app using Jenkins, Ansible, AWS, and open-source security tools and checks.

DevSecOps pipeline for Python Web App A Jenkins end-to-end DevSecOps pipeline for Python web application, hosted on AWS Ubuntu 20.04 Note: This projec

Devanshu Vashishtha 4 Aug 15, 2022
Notflix - Notion / Netflix and IMDb to organise your movie dates. Happy Valentine <3 from 0x1za

Welcome to notflix 👋 This is a project to help organise shows to watch with my

Mwiza Ed' Simbeye 3 Feb 15, 2022
And now, for the first time, you can send alerts via action from ArcSight ESM Console to the TheHive when Correlation Rules are triggered.

ArcSight Integration with TheHive And now, for the first time, you can send alerts via action from ArcSight ESM Console to the TheHive when Correlatio

Amir Hossein Zargaran 3 Jan 19, 2022
Apprise - Push Notifications that work with just about every platform!

ap·prise / verb To inform or tell (someone). To make one aware of something. Apprise allows you to send a notification to almost all of the most popul

Chris Caron 7.2k Jan 07, 2023
Unofficial Medium Python Flask API and SDK

PyMedium - Unofficial Medium API PyMedium is an unofficial Medium API written in python flask. It provides developers to access to user, post list and

Engine Bai 157 Nov 11, 2022
API which returns cusswords , can be used to check cusswords in bots etc.

Anti-abuse-api-flask API which returns cusswords , can be used to check cusswords in bots etc. Run pip install -r requirements.txt py app.py API Endpo

8 Jan 03, 2023
Yes, it's true :purple_heart: This repository has 353 stars.

Yes, it's true! Inspired by a similar repository from @RealPeha, but implemented using a webhook on AWS Lambda and API Gateway, so it's serverless! If

510 Dec 28, 2022
Telegram bot that let's you flip a coin in a dialog

coin_flip Telegram bot that let's you flip a coin in a dialog Report issue · Request feature About Software development tool that lets you finally dec

Ivan Akostelov 2 Dec 12, 2021
Graviti-python-sdk - Graviti Data Platform Python SDK

Graviti Python SDK Graviti Python SDK is a python library to access Graviti Data

Graviti 13 Dec 15, 2022
칼만 필터는 어렵지 않아(저자 김성필) 파이썬 코드(Unofficial)

KalmanFilter_Python 칼만 필터는 어렵지 않아(저자 김성필) 책을 공부하면서, Matlab 코드를 Python으로 변환한 것입니다. Contents Part01. Recursive Filter Chapter01. Average Filter Chapter0

Donghun Park 20 Oct 28, 2022
An integrated information collection tool

infoscaner 环境配置 目前infoscaner仅支持在linux上运行,建议运行在最新版本的kali中 infoscaner是基于python3版本实现的,运行之前首先安装python库 如果同时存在python2和python3,请输入以下命令 pip3 install -r requi

CMACCKK 74 Sep 13, 2021
Asyncevents: a small library to help developers perform asynchronous event handling in Python

asyncevents - Asynchronous event handling for modern Python asyncevents is a small library to help developers perform asynchronous event handling in m

Mattia 5 Aug 07, 2022
A little proxy tool based on Tencent Cloud Function Service.

SCFProxy 一个基于腾讯云函数服务的免费代理池。 安装 python3 -m venv .venv source .venv/bin/activate pip3 install -r requirements.txt 项目配置 函数配置 开通腾讯云函数服务 在 函数服务 新建 中使用自定义

Mio 716 Dec 26, 2022
A small repository with convenience functions for working with the Notion API.

Welcome! Within this respository are a few convenience functions to assist with the pulling and pushing of data from the Notion API.

10 Jul 09, 2022
A python library to interact with the EarnApp API

EarnApp.py Table of contents General info Documentation Setup General info A python library to interact with the EarnApp API. Documentation First, imp

3 Dec 14, 2022
Send notification to your telegram group/channel/private whenever a new video is uploaded on a youtube channel!

YouTube Feeds Bot. Send notification to your telegram group/channel/private whenever a new video is uploaded on a youtube channel! Variables BOT_TOKEN

Aditya 30 Dec 07, 2022
A.I and game for gomoku, working only on windows

Gomoku (A.I of gomoku) The goal of the project is to create an artificial intelligence of gomoku. Goals Beat the opponent. Requirements Python 3.7+ Wo

Luis Rosario 13 Jun 20, 2021