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)

Role Based Access Control for Slack-Bolt Applications

Role Based Access Control for Slack-Bolt Apps Role Based Access Control (RBAC) is a term applied to limiting the authorization for a specific operatio

Jeremy Schulman 7 Jan 06, 2022
A file-based quote bot written in Python

Let's Write a Python Quote Bot! This repository will get you started with building a quote bot in Python. It's meant to be used along with the Learnin

1 Nov 01, 2021
Scrape Twitter for Tweets

Backers Thank you to all our backers! 🙏 [Become a backer] Sponsors Support this project by becoming a sponsor. Your logo will show up here with a lin

Ahmet Taspinar 2.2k Jan 02, 2023
Telegram bot for Whisper Message.

Whisper Bot @WhisperStarkBot A star ⭐ from you means a lot to us! Telegram bot for Whisper Message. Usage Deploy to Heroku Tap on above button and fil

Stark Bots 33 Nov 24, 2022
This repository contains code written in the AWS Cloud Development Kit (CDK)

This repository contains code written in the AWS Cloud Development Kit (CDK) which launches infrastructure across two different regions to demonstrate using AWS AppSync in a multi-region setup.

AWS Samples 5 Jun 03, 2022
Web3 Pancakeswap Sniper & honeypot detector Take Profit/StopLose bot written in python3, For ANDROID WIN MAC & LINUX

Web3 Pancakeswap Sniper & honeypot detector Take Profit/StopLose bot written in python3, For ANDROID WIN MAC & LINUX

HYDRA 3 Dec 27, 2021
Template to create a telegram bot in python

Template for Telegram Bot Template to create a telegram bot in python. How to Run First add src to PYTHONPATH: export PYTHONPATH=${PWD} Then run: pyt

Ali Hejazizo 12 Dec 24, 2022
PYAW allows you to call assembly from python

PYAW allows you to call assembly from python

2 Dec 13, 2021
Telegram Bot to save Posts or Files that can be Accessed via Special Links

OKAERI-FILE Bot Telegram untuk menyimpan Posting atau File yang dapat Diakses melalui Link Khusus. Jika Anda memerlukan tambahan module lagi dalam rep

Wahyusaputra 5 Aug 04, 2022
Telegram Bot for updating ongoing matches of Fotmob.com in channel by @AbirHasan2005

Fotmob-Bot A very simple Telegram Bot which will update ongoing matches of Fotmob in a channel. Demo Channel Configs API_ID - Get this from @TeleORG_B

Abir Hasan 22 Oct 21, 2022
FAIR Enough Metrics is an API for various FAIR Metrics Tests, written in python

☑️ FAIR Enough metrics for research FAIR Enough Metrics is an API for various FAIR Metrics Tests, written in python, conforming to the specifications

Maastricht University IDS 3 Jul 06, 2022
Download videos from Youtube and other platforms through a Telegram Bot

ytdl-bot Download videos from YouTube and other platforms through a Telegram Bot Usage: https://t.me/benny_ytdlbot Send link from YouTube directly to

Telegram Bot Collection 289 Jan 03, 2023
Make WhatsApp ChatBot and use WhatsApp API to send the WhatsApp messages in python .

Ultramsg.com WhatsApp Bot using WhatsApp API and ultramsg Demo WhatsApp API ChatBot using Ultramsg API with python. Opportunities and tasks: The outpu

Ultramsg 64 Dec 29, 2022
股票量化

StockQuant Gary-Hertel 请勿提交issue!可以加入交流群与其他朋友一起自学交流,加微信mzjimmy 一、配置文件的设置 启动框架需要先导入必要的模块,并且载入一次配置文件! 配置文件是一个json格式的文件config.json,在docs文件夹中有模板

218 Dec 25, 2022
Python Markov Chain chatbot running on Telegram

Hanasubot Hanasubot (Japanese 話すボット, talking bot) is a Python chatbot running on Telegram. The bot is based on Markov Chains so it can learn your word

12 Dec 27, 2022
A code that can make an account bump your discord server 24/7!

BumpCord A code that can make an account bump your discord server 24/7! The main.py is the main file. keep_alive.py prevents your repl from going to s

Phantom 28 Aug 20, 2022
With this program you can work English & Turkish

1 - How Can I Work This? You must have Python compilers in order to run this program. First of all, download the compiler in the link. Compiler 2 - Do

Mustafa Bahadır Doğrusöz 3 Aug 07, 2021
Análise de dados abertos do programa Taxigov.

Análise de dados do Taxigov Este repositório contém os cadernos Jupyter usados no projeto de análise de dados do Taxigov. Conjunto de dados O conjunto

Augusto Herrmann 1 Jan 10, 2022
An Telegram Bot By @AsmSafone To Stream Videos in Telegram Voice Chat. This is Also The Source Code of The Bot Which is Being Used In @SafoTheBot Group! ❤️

Telegram Video Player Bot (Beta) An Telegram Bot By @AsmSafone To Stream Videos in Telegram Voice Chat. Special Features Supports Live Streaming From

SAF ONE 206 Jan 03, 2023
Passive income method via SerpClix. Uses a bot to accept clicks.

SerpClixBotSearcher This bot allows you to get passive income from SerpClix. Each click is usually $0.10 (sometimes $0.05 if offer isnt from the US).

Jason Mei 3 Sep 01, 2021