mirror of
https://github.com/aljazceru/bitfinex-api-py.git
synced 2025-12-19 23:04:21 +01:00
Create and use decimal object instead of floats
This commit is contained in:
committed by
Jacob Plaster
parent
8dc745f149
commit
afbb4a670c
@@ -6,5 +6,6 @@ from .client import Client
|
|||||||
from .models import (Order, Trade, OrderBook, Subscription, Wallet,
|
from .models import (Order, Trade, OrderBook, Subscription, Wallet,
|
||||||
Position, FundingLoan, FundingOffer, FundingCredit)
|
Position, FundingLoan, FundingOffer, FundingCredit)
|
||||||
from .websockets.GenericWebsocket import GenericWebsocket
|
from .websockets.GenericWebsocket import GenericWebsocket
|
||||||
|
from .utils.Decimal import Decimal
|
||||||
|
|
||||||
NAME = 'bfxapi'
|
NAME = 'bfxapi'
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ Module used to describe all of the different data types
|
|||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
class OrderType:
|
class OrderType:
|
||||||
"""
|
"""
|
||||||
Enum used to describe all of the different order types available for use
|
Enum used to describe all of the different order types available for use
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ Module used to describe all of the different data types
|
|||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
class OrderType:
|
class OrderType:
|
||||||
"""
|
"""
|
||||||
Enum used to describe all of the different order types available for use
|
Enum used to describe all of the different order types available for use
|
||||||
|
|||||||
@@ -22,11 +22,13 @@ class BfxRest:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, API_KEY, API_SECRET, host='https://api.bitfinex.com/v2', loop=None,
|
def __init__(self, API_KEY, API_SECRET, host='https://api.bitfinex.com/v2', loop=None,
|
||||||
logLevel='INFO', *args, **kwargs):
|
logLevel='INFO', parse_float=float, *args, **kwargs):
|
||||||
self.loop = loop or asyncio.get_event_loop()
|
self.loop = loop or asyncio.get_event_loop()
|
||||||
self.API_KEY = API_KEY
|
self.API_KEY = API_KEY
|
||||||
self.API_SECRET = API_SECRET
|
self.API_SECRET = API_SECRET
|
||||||
self.host = host
|
self.host = host
|
||||||
|
# this value can also be set to bfxapi.Decimal for much higher precision
|
||||||
|
self.parse_float = parse_float
|
||||||
self.logger = CustomLogger('BfxRest', logLevel=logLevel)
|
self.logger = CustomLogger('BfxRest', logLevel=logLevel)
|
||||||
|
|
||||||
async def fetch(self, endpoint, params=""):
|
async def fetch(self, endpoint, params=""):
|
||||||
@@ -42,7 +44,8 @@ class BfxRest:
|
|||||||
if resp.status is not 200:
|
if resp.status is not 200:
|
||||||
raise Exception('GET {} failed with status {} - {}'
|
raise Exception('GET {} failed with status {} - {}'
|
||||||
.format(url, resp.status, text))
|
.format(url, resp.status, text))
|
||||||
return await resp.json()
|
parsed = json.loads(text, parse_float=self.parse_float)
|
||||||
|
return parsed
|
||||||
|
|
||||||
async def post(self, endpoint, data={}, params=""):
|
async def post(self, endpoint, data={}, params=""):
|
||||||
"""
|
"""
|
||||||
@@ -61,7 +64,8 @@ class BfxRest:
|
|||||||
if resp.status is not 200:
|
if resp.status is not 200:
|
||||||
raise Exception('POST {} failed with status {} - {}'
|
raise Exception('POST {} failed with status {} - {}'
|
||||||
.format(url, resp.status, text))
|
.format(url, resp.status, text))
|
||||||
return await resp.json()
|
parsed = json.loads(text, parse_float=self.parse_float)
|
||||||
|
return parsed
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Public Data #
|
# Public Data #
|
||||||
|
|||||||
52
bfxapi/utils/Decimal.py
Normal file
52
bfxapi/utils/Decimal.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import decimal as dec
|
||||||
|
|
||||||
|
class Decimal(dec.Decimal):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_float(cls, f):
|
||||||
|
return cls(str(f))
|
||||||
|
|
||||||
|
def __new__(cls, value=0, *args, **kwargs):
|
||||||
|
if isinstance(value, float):
|
||||||
|
value = Decimal.from_float(value)
|
||||||
|
return super(Decimal, cls).__new__(cls, value, *args, **kwargs)
|
||||||
|
|
||||||
|
def __mul__(self, rhs):
|
||||||
|
if isinstance(rhs, float):
|
||||||
|
rhs = Decimal.from_float(rhs)
|
||||||
|
return Decimal(super().__mul__(rhs))
|
||||||
|
|
||||||
|
def __rmul__(self, lhs):
|
||||||
|
return self.__mul__(lhs)
|
||||||
|
|
||||||
|
def __add__(self, rhs):
|
||||||
|
if isinstance(rhs, float):
|
||||||
|
rhs = Decimal.from_float(rhs)
|
||||||
|
return Decimal(super().__add__(rhs))
|
||||||
|
|
||||||
|
def __radd__(self, lhs):
|
||||||
|
return self.__add__(lhs)
|
||||||
|
|
||||||
|
def __sub__(self, rhs):
|
||||||
|
if isinstance(rhs, float):
|
||||||
|
rhs = Decimal.from_float(rhs)
|
||||||
|
return Decimal(super().__sub__(rhs))
|
||||||
|
|
||||||
|
def __rsub__(self, lhs):
|
||||||
|
return self.__sub__(lhs)
|
||||||
|
|
||||||
|
def __truediv__(self, rhs):
|
||||||
|
if isinstance(rhs, float):
|
||||||
|
rhs = Decimal.from_float(rhs)
|
||||||
|
return Decimal(super().__truediv__(rhs))
|
||||||
|
|
||||||
|
def __rtruediv__(self, rhs):
|
||||||
|
return self.__truediv__(rhs)
|
||||||
|
|
||||||
|
def __floordiv__(self, rhs):
|
||||||
|
if isinstance(rhs, float):
|
||||||
|
rhs = Decimal.from_float(rhs)
|
||||||
|
return Decimal(super().__floordiv__(rhs))
|
||||||
|
|
||||||
|
def __rfloordiv__ (self, rhs):
|
||||||
|
return self.__floordiv__(rhs)
|
||||||
@@ -7,7 +7,6 @@ import json
|
|||||||
import time
|
import time
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from decimal import *
|
|
||||||
from .GenericWebsocket import GenericWebsocket, AuthError
|
from .GenericWebsocket import GenericWebsocket, AuthError
|
||||||
from .SubscriptionManager import SubscriptionManager
|
from .SubscriptionManager import SubscriptionManager
|
||||||
from .WalletManager import WalletManager
|
from .WalletManager import WalletManager
|
||||||
|
|||||||
Reference in New Issue
Block a user