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)

⚡ PoC: Hide a c&c botnet in the discord client. (Proof Of Concept)

👨‍💻 Discord Self Bot 👨‍💻 A Discord Self-Bot in Python by natrix Installation Run: selfbot.bat Python: version : 3.8 Modules

0хVιcнy#1337 37 Oct 21, 2022
This is a free python bot program that crosses you to farm with auto click in space crypto NFT game, having fun :) Creator: Marlon Zanardi

🚀 Space Crypto auto click bot ready-to-use 🚀 This is a free python bot program that crosses you to farm with auto click in space crypto NFT game, ha

170 Dec 20, 2022
Rapid Sms Bomber For Indian Number.

Bombzilla Rapid Sms Bomber For Indian Number. Installation git clone https://github.com/sarv99/Bombzilla cd Bombzilla chmod +x setup.sh ./setup.sh Af

Saurav Jangid 1 Jan 12, 2022
A python Discord wrapper made in well, python.

discord.why A python Discord wrapper made in well, python. Made to be used by devs who want something a bit more, general. Basic Examples Sending a me

HellSec 6 Mar 26, 2022
Throttle and debounce add-on for Pyrogram

pyrothrottle Throttle and debounce add-on for Pyrogram Quickstart implementation on decorators from pyrogram import Client, filters from pyrogram.type

7 Oct 01, 2022
A discord.py extension for sending, receiving and handling ui interactions in discord

discord-ui A discord.py extension for using discord ui/interaction features pip package ▪ read the docs ▪ examples Introduction This is a discord.py u

34 Dec 29, 2022
Os-Remoter with Python (Telegram Bot)

Remote-Os Os-Remoter with Python (Telegram Bot) [1] First install "python -m pip install --upgrade pip" [2] Second install the modules inside file ins

Alisa Alikhani 2 Nov 09, 2022
Simple progressbar for discord

⚙️ DiscordProgressbar 📂 Установка | Installation pip install discordbar 📚 Документация | Documentation 📞 Связаться со мной | Сontact with me 📜 Ли

DenyS 26 Nov 30, 2022
A pypi packages finder telegram bot.

PyPi-Bot A pypi packages information finder telegram bot. Made with Python3 (C) @FayasNoushad Copyright permission under MIT License License - https:

Fayas Noushad 17 Oct 21, 2022
The program for obtaining a horoscope in Python using API from rapidapi.com site.

Python horoscope The program allows you to get a horoscope for your zodiac sign and immediately translate it into almost any language. Step 1 The firs

Architect 0 Dec 25, 2021
DongTai API SDK For Python

DongTai-SDK-Python Quick start You need a config file config.json { "DongTai":{ "token":"your token", "url":"http://127.0.0.1:90"

huoxian 50 Nov 24, 2022
Fast discord token checker with high cpm

Discord-Token-checker Fast discord token checker with high cpm preivew Download git clone https://github.com/TusTusDev/Discord-Token-checker pip insta

Tustus 1 Oct 15, 2021
Powerful Ethereum Smart-Contract Toolkit

Heimdall Heimdall is an advanced and modular smart-contract toolkit which aims to make dealing with smart contracts on EVM based chains easier. Instal

Jonathan Becker 69 Dec 26, 2022
Unofficial Python wrapper for official Hacker News API

haxor Unofficial Python wrapper for official Hacker News API. Installation pip install haxor Usage Import and initialization: from hackernews import H

147 Sep 18, 2022
The official Python library for Shodan

shodan: The official Python library and CLI for Shodan Shodan is a search engine for Internet-connected devices. Google lets you search for websites,

John Matherly 2.1k Dec 31, 2022
A simple Telegram bot that can add caption to any media on your channel

Channel Auto Caption This bot can add a caption for any media/document sent to a channel. Just deploy bot and add bot as admin to a channel. Deploy to

22 Nov 14, 2022
Python wrapper for Wikipedia

Wikipedia API Wikipedia-API is easy to use Python wrapper for Wikipedias' API. It supports extracting texts, sections, links, categories, translations

Martin Majlis 369 Dec 30, 2022
🎵 RythmReloaded 🎵 A bot that can play music on Telegram Group and Channel Voice Chats

🎵 RythmReloaded 🎵 A bot that can play music on Telegram Group and Channel Voice Chats POWERED BY MARSHALX TGCALLS Available on telegram as @OptimusP

0 Nov 03, 2021
Twitter Analysis of MIUUL CEO

Twitter Analysis of MIUUL CEO Business Problem I got last @mvahitkeskin 184 twee

Çağrı Karadeniz 6 Mar 12, 2022
Eva Maria Bot With Python

Eva Maria Bot Features Auto Filter Manual Filter IMDB Admin Commands Broadcast Index IMDB search Inline Search Random pics ids and User info Stats, Us

Aadhi 3 Jan 06, 2022