Create and use decimal object instead of floats

This commit is contained in:
Jacob Plaster
2019-01-23 13:18:33 +00:00
committed by Jacob Plaster
parent 8dc745f149
commit afbb4a670c
6 changed files with 60 additions and 6 deletions

View File

@@ -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'

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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)

View File

@@ -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