An unofficial Python wrapper for the 'Binance exchange REST API'

Overview

Welcome to binex_f v0.1.0

many interfaces are heavily used by myself in product environment, the websocket is reliable (re)connected.

Latest version: v0.1.0

Quick Start

Install from pip:

pip install binex-f==0.1.0

Install from source code:

python3 setup.py install
import time
from binex_f import Dict2Class, RestApi as RA

restapi = RA()

# Dict2Class object as response of all the interfaces.
# Dict2Class has to_val(static method) to convert obj to a python struct value.
def __print_obj(resp):
    if resp.hasattr("code") and 200 != int(resp.code):
        print ("ERROR: %s" % Dict2Class.to_val(resp))
    else:
        print (Dict2Class.to_val(resp))
    time.sleep(0.5)

# Test Connectivity
resp = restapi.ping()
__print_obj(resp)

# Check Server Time
resp = restapi.get_servertime()
__print_obj(resp)

# Exchange Information
resp = restapi.get_exchange_info()

# Order Book
resp = restapi.get_book_depth(symbol="btcusdt", limit=10)
__print_obj(resp)

# Recent Trades List
resp = restapi.get_recent_trades(symbol="btcusdt", limit=100)
__print_obj(resp)

# Old Trades Lookup (MARKET_DATA)
resp = restapi.get_historical_trades(symbol="btcusdt")
__print_obj(resp)

# Compressed/Aggregate Trades List
resp = restapi.get_aggregate_trades(symbol="btcusdt")
__print_obj(resp)

# Kline/Candlestick Data
resp = restapi.get_klines(symbol="btcusdt", interval="4h", limit=100)
__print_obj(resp)

# Continuous Contract Kline/Candlestick Data
resp = restapi.get_continuous_klines(pair="btcusdt", contractType="PERPETUAL", interval="4h", limit=100)
__print_obj(resp)

# Index Price Kline/Candlestick Data
resp = restapi.get_index_price_klines(pair="btcusdt", interval="4h", limit=100)
__print_obj(resp)

# Mark Price Kline/Candlestick Data
resp = restapi.get_mark_price_klines(symbol="btcusdt", interval="4h")
__print_obj(resp)

# Mark Price
resp = restapi.get_mark_price()
__print_obj(resp)

# Get Funding Rate History
resp = restapi.get_funding_rate()
__print_obj(resp)

# 24hr Ticker Price Change Statistics
resp = restapi.get_ticker_24hr()
__print_obj(resp)

#Symbol Price Ticker
resp = restapi.get_ticker_price()
__print_obj(resp)

# Symbol Order Book Ticker
resp = restapi.get_book_ticker()
__print_obj(resp)

# Open Interest
resp = restapi.get_open_interest(symbol="btcusdt")
__print_obj(resp)

# Open Interest Statistics
resp = restapi.get_open_interest_hist(symbol="btcusdt", period="4h", limit=30)
__print_obj(resp)

# Top Trader Long/Short Ratio (Accounts)
resp = restapi.get_top_long_short_account_ratio(symbol="btcusdt", period="4h", limit=30)
__print_obj(resp)

# Top Trader Long/Short Ratio (Positions)
resp = restapi.get_top_long_short_position_ratio(symbol="btcusdt", period="4h", limit=30)
__print_obj(resp)

# Long/Short Ratio
resp = restapi.get_global_long_short_account_ratio(symbol="btcusdt", period="4h", limit=30)
__print_obj(resp)

# Taker Buy/Sell Volume
resp = restapi.get_taker_long_short_ratio(symbol="btcusdt", period="4h", limit=30)
__print_obj(resp)

# Historical BLVT NAV Kline/Candlestick
resp = restapi.get_lvt_klines(symbol="BTCDOWN", interval="4h", limit=300)
__print_obj(resp)

# Composite Index Symbol Information
resp = restapi.get_index_info()
__print_obj(resp)

# Multi-Assets Mode Asset Index
resp = restapi.get_asset_index()
__print_obj(resp)

Websocket Example

An almost finished code example to subscribe user data, enjoy it.

import _thread, time
from binex_f import Dict2Class, RestApi, WsSubscription

class _UserData:
    def __init__(self):
        self.restapi = RestApi(api_key="****************", secret_key="****************")
        self.__ws_subscription = WsSubscription()
        self.channel_id = None

    def get_listenKey(self):
        resp = self.restapi.start_user_data_stream()
        if resp.hasattr("listenKey"):
            return resp.listenKey
        return None

    def subscribe(self, listenKey):
        self.channel_id = self.__ws_subscription.unsubscribe(self.channel_id).\
                                    subscribe_user_data(listenKey, payload_handler, error_handler)

__user_data = _UserData()

def __subscribe_user_data():
    try:
        listenKey = __user_data.get_listenKey()
        if listenKey:
            __user_data.subscribe(listenKey)
            return True
    except Exception as e:
        print (str(e))
    return False

def payload_handler(payload):
    if "ORDER_TRADE_UPDATE" == payload.eventType:
        pass
    elif "listenKeyExpired" == payload.eventType:
        _thread.start_new_thread(__subscribe_user_data, ())
    elif "MARGIN_CALL" == payload.eventType:
        pass
    elif "ACCOUNT_UPDATE" == payload.eventType:
        pass
    elif "ORDER_TRADE_UPDATE" == payload.eventType:
        pass
    elif "ACCOUNT_CONFIG_UPDATE" == payload.eventType:
        pass
    print (Dict2Class.to_val(payload))

def error_handler(err_msg: 'dict'):
    print (err_msg)

def __listenKey_watch(restapi):
    while True:
        time.sleep(2_400)
        resp = restapi.keep_user_data_stream()

if __name__ == "__main__":
    if __subscribe_user_data():
        _thread.start_new_thread(__listenKey_watch, (__user_data.restapi,))

Websocket Example

import _thread
from binex_f import Dict2Class, WsSubscription

ws = WsSubscription()
def f01(pl, el):
    # Aggregate Trade Streams
    ws.subscribe_aggregate_trade(symbol="btcusdt", payload_handler=pl, error_handler=el)

def f02(pl, el):
    # Mark Price Stream
    ws.subscribe_mark_price(symbol="btcusdt", update_time=None, payload_handler=pl, error_handler=el)

def f03(pl, el):
    # Mark Price Stream for All market
    ws.subscribe_all_mark_price(update_time=None, payload_handler=pl, error_handler=el)

def f04(pl, el):
    # Continuous Contract Kline/Candlestick Streams
    ws.subscribe_continuous_kline(pair="btcusdt", contract_type="perpetual", interval="4h", payload_handler=pl, error_handler=el)

def f05(pl, el):
    # Kline/Candlestick Streams
    ws.subscribe_kline(symbol="btcusdt", interval="4h", payload_handler=pl, error_handler=el)

def f06(pl, el):
    # Individual Symbol Mini Ticker Stream
    ws.subscribe_symbol_miniticker(symbol="btcusdt", payload_handler=pl, error_handler=el)

def f07(pl, el):
    # All Market Mini Tickers Stream
    ws.subscribe_all_miniticker(payload_handler=pl, error_handler=el)

def f08(pl, el):
    # Individual Symbol Ticker Streams
    ws.subscribe_symbol_ticker(symbol="btcusdt", payload_handler=pl, error_handler=el)

def f09(pl, el):
    # All Market Tickers Streams
    ws.subscribe_all_ticker(payload_handler=pl, error_handler=el)

def f10(pl, el):
    # Individual Symbol Book Ticker Streams
    ws.subscribe_symbol_bookticker(symbol="btcusdt", payload_handler=pl, error_handler=el)

def f11(pl, el):
    # All Book Tickers Stream
    ws.subscribe_all_bookticker(payload_handler=pl, error_handler=el)

def f12(pl, el):
    # Liquidation Order Streams
    ws.subscribe_symbol_liquidation(symbol="btcusdt", payload_handler=pl, error_handler=el)

def f13(pl, el):
    # All Market Liquidation Order Streams
    ws.subscribe_all_liquidation(payload_handler=pl, error_handler=el)

def f14(pl, el):
    # Partial Book Depth Streams
    ws.subscribe_book_depth(symbol_list=["btcusdt", "ethusdt"], limit=5, update_time="@100ms", payload_handler=pl, error_handler=el)

def f15(pl, el):
    # Diff. Book Depth Streams
    ws.subscribe_diff_book_depth(symbol_list=["btcusdt", "ethusdt"], update_time="@100ms", payload_handler=pl, error_handler=el)

def f16(pl, el):
    # BLVT Info Streams
    ws.subscribe_nav(tokenName="TRXDOWN", payload_handler=pl, error_handler=el)

def f17(pl, el):
    # BLVT NAV Kline/Candlestick Streams
    ws.subscribe_nav_kline(tokenName="TRXDOWN", interval="4h", payload_handler=pl, error_handler=el)

def f18(pl, el):
    # Composite Index Symbol Information Streams
    ws.subscribe_composite_index(symbol="btcusdt", payload_handler=pl, error_handler=el)

def __payload_handler(payload: 'Dict2Class'):
    print (Dict2Class.to_val(payload))

def __error_handler(err_msg: 'dict'):
    print (err_msg)

_thread.start_new_thread(f01, (__payload_handler, __error_handler,))

Bash Show

>> from binex_f import RestApi >>> restapi = RestApi() >>> restapi.ping().asdict() {'limits': {}} >>> restapi.get_servertime() >>> restapi.get_servertime().asdict() {'serverTime': 1639041680361, 'limits': {'X-MBX-USED-WEIGHT-1M': '2'}} >>> restapi.get_servertime().serverTime 1639041691379 >>> exc = restapi.get_exchange_info() >>> print (len(exc.symbols)) 145 >>> print (exc.symbols[0]) >>> print (exc.symbols[0].asdict()) {'symbol': 'BTCUSDT', 'pair': 'BTCUSDT', 'contractType': 'PERPETUAL', 'deliveryDate': 4133404800000, 'onboardDate': 1569398400000, 'status': 'TRADING', 'maintMarginPercent': '2.5000', 'requiredMarginPercent': '5.0000', 'baseAsset': 'BTC', 'quoteAsset': 'USDT', 'marginAsset': 'USDT', 'pricePrecision': 2, 'quantityPrecision': 3, 'baseAssetPrecision': 8, 'quotePrecision': 8, 'underlyingType': 'COIN', 'underlyingSubType': [], 'settlePlan': 0, 'triggerProtect': '0.0500', 'liquidationFee': '0.012000', 'marketTakeBound': '0.05', 'filters': [{'minPrice': '556.72', 'maxPrice': '4529764', 'filterType': 'PRICE_FILTER', 'tickSize': '0.01'}, {'stepSize': '0.001', 'filterType': 'LOT_SIZE', 'maxQty': '1000', 'minQty': '0.001'}, {'stepSize': '0.001', 'filterType': 'MARKET_LOT_SIZE', 'maxQty': '120', 'minQty': '0.001'}, {'limit': 200, 'filterType': 'MAX_NUM_ORDERS'}, {'limit': 10, 'filterType': 'MAX_NUM_ALGO_ORDERS'}, {'notional': '5', 'filterType': 'MIN_NOTIONAL'}, {'multiplierDown': '0.9500', 'multiplierUp': '1.0500', 'multiplierDecimal': '4', 'filterType': 'PERCENT_PRICE'}], 'orderTypes': ['LIMIT', 'MARKET', 'STOP', 'STOP_MARKET', 'TAKE_PROFIT', 'TAKE_PROFIT_MARKET', 'TRAILING_STOP_MARKET'], 'timeInForce': ['GTC', 'IOC', 'FOK', 'GTX']} ">
Python 3.8.8 (default, Apr 13 2021, 19:58:26)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from binex_f import RestApi
>>> restapi = RestApi()
>>> restapi.ping().asdict()
{'limits': {}}
>>> restapi.get_servertime()
<binex_f.utils.Dict2Class object at 0x7f43a355a070>
>>> restapi.get_servertime().asdict()
{'serverTime': 1639041680361, 'limits': {'X-MBX-USED-WEIGHT-1M': '2'}}
>>> restapi.get_servertime().serverTime
1639041691379
>>> exc = restapi.get_exchange_info()
>>> print (len(exc.symbols))
145
>>> print (exc.symbols[0])
<binex_f.utils.Dict2Class object at 0x7f43a34fc8e0>
>>> print (exc.symbols[0].asdict())
{'symbol': 'BTCUSDT', 'pair': 'BTCUSDT', 'contractType': 'PERPETUAL', 'deliveryDate': 4133404800000, 'onboardDate': 1569398400000, 'status': 'TRADING', 'maintMarginPercent': '2.5000', 'requiredMarginPercent': '5.0000', 'baseAsset': 'BTC', 'quoteAsset': 'USDT', 'marginAsset': 'USDT', 'pricePrecision': 2, 'quantityPrecision': 3, 'baseAssetPrecision': 8, 'quotePrecision': 8, 'underlyingType': 'COIN', 'underlyingSubType': [], 'settlePlan': 0, 'triggerProtect': '0.0500', 'liquidationFee': '0.012000', 'marketTakeBound': '0.05', 'filters': [{'minPrice': '556.72', 'maxPrice': '4529764', 'filterType': 'PRICE_FILTER', 'tickSize': '0.01'}, {'stepSize': '0.001', 'filterType': 'LOT_SIZE', 'maxQty': '1000', 'minQty': '0.001'}, {'stepSize': '0.001', 'filterType': 'MARKET_LOT_SIZE', 'maxQty': '120', 'minQty': '0.001'}, {'limit': 200, 'filterType': 'MAX_NUM_ORDERS'}, {'limit': 10, 'filterType': 'MAX_NUM_ALGO_ORDERS'}, {'notional': '5', 'filterType': 'MIN_NOTIONAL'}, {'multiplierDown': '0.9500', 'multiplierUp': '1.0500', 'multiplierDecimal': '4', 'filterType': 'PERCENT_PRICE'}], 'orderTypes': ['LIMIT', 'MARKET', 'STOP', 'STOP_MARKET', 'TAKE_PROFIT', 'TAKE_PROFIT_MARKET', 'TRAILING_STOP_MARKET'], 'timeInForce': ['GTC', 'IOC', 'FOK', 'GTX']}

Other examples

See example/

Owner
DeepLn
DeepLn
A Script to automate fowarding all new messages from one/many channel(s) to another channel(s), without the forwarded tag.

Channel Auto Message Forward A script to automate fowarding all new messages from one/many channel(s) to another channel(s), without the forwarded tag

16 Oct 21, 2022
Surfline Forecast Bot For Python

Surfline Forecast Bot A telegram bot created using Telethon that allows users to

1 May 08, 2022
Cryptocurrency Prices Telegram Bot For Python

Cryptocurrency Prices Telegram Bot How to Run Set your telegram bot token as environment variable TELEGRAM_BOT_TOKEN: export TELEGRAM_BOT_TOKEN=your_

Sina Nazem 3 Oct 31, 2022
A Simple, LightWeight, Statically-Typed Python3 API wrapper for GogoAnime.

AniKimi API A Simple, LightWeight, Statically-Typed Python3 API wrapper for GogoAnime The v2 of gogoanimeapi (depreciated) Made with JavaScript and Py

17 Dec 09, 2022
Send GitHub Issues, PRs or Discussions Updates to Wechat

Send GitHub Issues, PRs or Discussions Updates to Wechat

Hollow Man 2 Jul 12, 2022
Darkflame Universe Account Manager

Darkflame Universe Account Manager This is a quick and simple web application intended for account creation and management for a DLU instance created

31 Nov 29, 2022
Simple script to ban bots at Twitch chats using a text file as a source.

AUTOBAN 🇺🇸 English version Simple script to ban bots at Twitch chats using a text file as a source. How to use Windows Go to releases for further in

And Paiva 5 Feb 06, 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
An Async Bot/API wrapper for Twitch made in Python.

TwitchIO is an asynchronous Python wrapper around the Twitch API and IRC, with a powerful command extension for creating Twitch Chat Bots. TwitchIO co

TwitchIO 590 Jan 03, 2023
Python SDK for IEX Cloud

iexfinance Python SDK for IEX Cloud. Architecture mirrors that of the IEX Cloud API (and its documentation). An easy-to-use toolkit to obtain data for

Addison Lynch 640 Jan 07, 2023
An open source development framework to help you build data workflows and modern data architecture on AWS.

AWS DataOps Development Kit (DDK) The AWS DataOps Development Kit is an open source development framework for customers that build data workflows and

Amazon Web Services - Labs 111 Dec 23, 2022
Telegram 聊天機器人,追蹤momo降價、重新上架

簡介 price-tracker-bot is a telegram bot that can trace the price on momoshop. 功能 降價通知 上架通知 收藏商品 清空已收藏商品 顯示目前已收藏商品 Demo Bot Telegram bot search @momo_pr

92 Dec 28, 2022
This is a Python bot, which automates logging in, purchasing and planting the seeds. Open source bot and completely free.

🌻 Sunflower Land Bot 🌻 ⚠️ Warning I am not responsible for any penalties incurred by those who use the bot, use it at your own risk. This BOT is com

Newerton 18 Aug 31, 2022
One of Best renamer bot with python

🌀 One of Best renamer bot repo Please Give a ☆ if You like This Open Source and Don't Forget to Follow Me On Github For More Repos And Codes. Scrappe

1 Dec 14, 2021
An API wrapper around Discord API.

NeoCord This project is work in progress not for production use. An asynchronous API wrapper around Discord API written in Python. Features Modern API

Izhar Ahmad 14 Jan 03, 2022
This script books automatically a slot on Doctolib in one of the public vaccination centers in Berlin.

BOOKING IN BERLINS VACCINATION CENTERS This python script books automatically a slot on Doctolib in one of the public vaccination centers in Berlin. T

17 Jan 13, 2022
A user reconnaisance tool that extracts a target's information from Instagram, DockerHub & Github.

A user reconnaisance tool that extracts a target's information from Instagram, DockerHub & Github. Also searches for matching usernames on Github.

Richard Mwewa 127 Dec 22, 2022
HackerNews and Reddit in one placce

EDIT: this project is 3.5 years old. I found it sad it's just laying around, so I did some minimal fixes and deployed it. Hope you enjoy! (PR's welcom

Hugo Montenegro 1 Nov 13, 2021
Light weight Scripts and Apps for checking availability of Covid Vaccines in India. Notifies when vaccine becomes avialable in your area.

vaccine-checker Light weight Scripts and Apps for checking availability of Covid Vaccines in India. Notifies when vaccine becomes avialable in your ar

Abishek V Ashok 8 Jun 16, 2021
Auto-Rollnumber-sender - Auto Rollnumber sender with python

Auto-Rollnumber-sender The above code fits better on my system but it can vary s

Riya Tripathi 2 Feb 14, 2022