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
企业微信消息推送的python封装接口,让你轻松用python实现对企业微信的消息推送

👋 corpwechat-bot是一个python封装的企业机器人&应用消息推送库,通过企业微信提供的api实现。 利用本库,你可以轻松地实现从服务器端发送一条文本、图片、视频、markdown等等消息到你的微信手机端,而不依赖于其他的第三方应用,如ServerChan。 如果喜欢该项目,记得给个

Chaopeng 161 Jan 06, 2023
Starlink Order Status Notification

Starlink Order Status Notification This script logs into Starlink order portal, pulls your estimated delivery date and emails it to a designated email

Aaron R. 1 Jul 08, 2022
Check your bot status automatically using userbot, simply and easy

Status Checker Userbot check your bot status automatically using userbot, simply and easy. Mandatory Vars API_ID : Telegram API_ID, get it from my.tel

ALBY 6 Feb 20, 2022
pylunasvg - Python bindings for lunasvg

pylunasvg - Python bindings for lunasvg Pylunasvg is a simple wrapper around lunasvg that uses pybind11 to create python bindings. All public API of t

Eren 6 Jan 05, 2023
ToqueIO Nuke tools - A collection of tools designed to assist in enhancing your workflows within nuke

ToqueIO Nuke tools - A collection of tools designed to assist in enhancing your workflows within nuke

4 Feb 19, 2022
Minimal API for the COVID Booking System of the Offices at the UniPD Math Dep

Simple and easy to use python BOT for the COVID registration booking system of the math department @ unipd (torre archimede). This API creates an interface with the official website, with more useful

Guglielmo Camporese 4 Dec 24, 2021
WhatsApp Multi Device Client

WhatsApp Multi Device Client

23 Nov 18, 2022
🚀 A fast, flexible and lightweight Discord API wrapper for Python.

Krema A fast, flexible and lightweight Discord API wrapper for Python. Installation Unikorn unikorn add kremayard krema -no-confirmation Pip pip insta

Krema 20 Sep 04, 2022
Sample code helps get you started with a simple Python web service using AWS Lambda and Amazon API Gateway

Welcome to the AWS CodeStar sample web service This sample code helps get you started with a simple Python web service using AWS Lambda and Amazon API

0 Jan 20, 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
With this simple app you can customize your presence in Discord.

Discord Rich Presence This a simple console app which can customize your Discord Presence easily, with only one config file! Setup Go to Discord Devel

Mai 1 Jan 06, 2022
AWS Workmail Migration Tool

WMigrate A tool for migrating AWS Workmail Users and Groups cross region and cross accounts. It also creates user and group aliases and adds the users

NK 1 Oct 27, 2021
IdeasBot - Funny telegram bot to generate ideas for a project

Repository of PIdeas_bot About Funny telegram bot for generating projects ideas.

Just Koala 5 Oct 16, 2022
Stackoverflow Telegram Bot With Python

Template for Telegram Bot Template to create a telegram bot in python. How to Run Set your telegram bot token as environment variable TELEGRAM_BOT_TOK

PyTopia 10 Mar 07, 2022
Some python code to make twitter bots ;)

How to set up a twitter bot using python's tweepy library Create a twitter developer account and project Make sure you are logged into your twitter ac

Wael 2 Jan 10, 2022
Make a command interpreter that manages AirBnb objects

AirBnB Clone Project Description This is part 1 of our AirBnb Clone project. The purpose of this project is to make a command interpreter that manages

Firdaus H. Salim 1 Nov 14, 2021
An example of a chatbot with a number-based menu that can be used as a starting point for a project.

NumMenu Bot NumMenu Bot is an example chatbot showing a way to design a number-based menu assistant with Rasa. This type of bot is very useful on plat

Derguene 19 Nov 14, 2022
Flood discord webhooks

Webhook-Spammer Flood discord webhooks Asynchronous webhook spammer Fast & Efficient Usage - Use it with atleast 500 threads Put a valid webhook Use a

trey 1 Apr 22, 2022
RevSpotify is a fast, useful telegram bot to have Spotify music on Telegram.

RevSpotify A Telegram Bot that can download music from Spotify RevSpotify is a fast, useful telegram bot to have Spotify music on Telegram. ✨ Features

Alireza Shabani 12 Sep 12, 2022
Discord feeder for AIL

ail-feeder-discord Discord feeder for AIL Warning! Automating user accounts is technically against TOS, so use at your own risk! Discord API https://d

ail project 6 Mar 09, 2022