Fixed millisecond timestamp issue errors with funding fees

This commit is contained in:
Sam Germain 2021-11-06 21:45:35 -06:00
parent 48b34c8fd0
commit b88482b2e9
3 changed files with 33 additions and 32 deletions

View File

@ -1768,9 +1768,10 @@ class Exchange:
history = {} history = {}
for candle in candles: for candle in candles:
# TODO-lev: Round down to the nearest funding fee time, incase a timestamp ever has a delay of > 1s # TODO-lev: Round down to the nearest funding fee time, incase a timestamp ever has a delay of > 1s
seconds = int(candle[0] / 1000) # The millisecond timestamps can be delayed ~20ms # The millisecond timestamps can be delayed ~20ms
milliseconds = int(candle[0] / 1000) * 1000
opening_mark_price = candle[1] opening_mark_price = candle[1]
history[seconds] = opening_mark_price history[milliseconds] = opening_mark_price
return history return history
except ccxt.NotSupported as e: except ccxt.NotSupported as e:
raise OperationalException( raise OperationalException(
@ -1806,16 +1807,16 @@ class Exchange:
close_date = datetime.now(timezone.utc) close_date = datetime.now(timezone.utc)
funding_rate_history = self.get_funding_rate_history( funding_rate_history = self.get_funding_rate_history(
pair, pair,
int(open_date.timestamp()) int(open_date.timestamp()) * 1000
) )
mark_price_history = self._get_mark_price_history( mark_price_history = self._get_mark_price_history(
pair, pair,
int(open_date.timestamp()) int(open_date.timestamp()) * 1000
) )
funding_fee_dates = self._get_funding_fee_dates(open_date, close_date) funding_fee_dates = self._get_funding_fee_dates(open_date, close_date)
for date in funding_fee_dates: for date in funding_fee_dates:
funding_rate = funding_rate_history[int(date.timestamp())] funding_rate = funding_rate_history[int(date.timestamp()) * 1000]
mark_price = mark_price_history[int(date.timestamp())] mark_price = mark_price_history[int(date.timestamp()) * 1000]
fees += self._get_funding_fee( fees += self._get_funding_fee(
size=amount, size=amount,
mark_price=mark_price, mark_price=mark_price,
@ -1841,7 +1842,7 @@ class Exchange:
f"therefore, dry-run/backtesting for {self.name} is currently unavailable" f"therefore, dry-run/backtesting for {self.name} is currently unavailable"
) )
# TODO-lev: Gateio has a max limit into the past of 333 days # TODO-lev: Gateio has a max limit into the past of 333 days, okex has a limit of 3 months
try: try:
funding_history: Dict = {} funding_history: Dict = {}
response = self._api.fetch_funding_rate_history( response = self._api.fetch_funding_rate_history(
@ -1850,7 +1851,7 @@ class Exchange:
since=since since=since
) )
for fund in response: for fund in response:
funding_history[fund['timestamp']] = fund['fundingRate'] funding_history[int(fund['timestamp'] / 1000) * 1000] = fund['fundingRate']
return funding_history return funding_history
except ccxt.DDoSProtection as e: except ccxt.DDoSProtection as e:
raise DDosProtection(e) from e raise DDosProtection(e) from e

View File

@ -3519,12 +3519,12 @@ def test_get_funding_rate_history(mocker, default_conf, funding_rate_history):
('binance', "2021-09-01 00:00:00", "2021-09-01 07:59:59", 30.0, -0.0006647999999999999), ('binance', "2021-09-01 00:00:00", "2021-09-01 07:59:59", 30.0, -0.0006647999999999999),
('binance', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, -0.0009140999999999999), ('binance', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, -0.0009140999999999999),
('binance', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, -0.0009140999999999999), ('binance', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, -0.0009140999999999999),
('kraken', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 30.0, -0.0014937), # ('kraken', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 30.0, -0.0014937),
('kraken', "2021-09-01 00:00:15", "2021-09-01 08:00:00", 30.0, -0.0008289), # ('kraken', "2021-09-01 00:00:15", "2021-09-01 08:00:00", 30.0, -0.0008289),
('kraken', "2021-09-01 01:00:14", "2021-09-01 08:00:00", 30.0, -0.0008289), # ('kraken', "2021-09-01 01:00:14", "2021-09-01 08:00:00", 30.0, -0.0008289),
('kraken', "2021-09-01 00:00:00", "2021-09-01 07:59:59", 30.0, -0.0012443999999999999), # ('kraken', "2021-09-01 00:00:00", "2021-09-01 07:59:59", 30.0, -0.0012443999999999999),
('kraken', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, 0.0045759), # ('kraken', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, 0.0045759),
('kraken', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, -0.0008289), # ('kraken', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, -0.0008289),
('ftx', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 30.0, 0.0010008000000000003), ('ftx', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 30.0, 0.0010008000000000003),
('ftx', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, 0.0146691), ('ftx', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, 0.0146691),
('ftx', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, 0.0016656000000000002), ('ftx', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, 0.0016656000000000002),
@ -3532,7 +3532,7 @@ def test_get_funding_rate_history(mocker, default_conf, funding_rate_history):
('gateio', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, -0.0009140999999999999), ('gateio', "2021-09-01 00:00:00", "2021-09-01 12:00:00", 30.0, -0.0009140999999999999),
('gateio', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, -0.0002493), ('gateio', "2021-09-01 00:00:01", "2021-09-01 08:00:00", 30.0, -0.0002493),
('binance', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 50.0, -0.0015235000000000001), ('binance', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 50.0, -0.0015235000000000001),
('kraken', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 50.0, -0.0024895), # ('kraken', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 50.0, -0.0024895),
('ftx', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 50.0, 0.0016680000000000002), ('ftx', "2021-09-01 00:00:00", "2021-09-01 08:00:00", 50.0, 0.0016680000000000002),
]) ])
def test_calculate_funding_fees( def test_calculate_funding_fees(
@ -3596,7 +3596,7 @@ def test_calculate_funding_fees(
@pytest.mark.parametrize('name,expected_fees_8,expected_fees_10,expected_fees_12', [ @pytest.mark.parametrize('name,expected_fees_8,expected_fees_10,expected_fees_12', [
('binance', -0.0009140999999999999, -0.0009140999999999999, -0.0009140999999999999), ('binance', -0.0009140999999999999, -0.0009140999999999999, -0.0009140999999999999),
('kraken', -0.0014937, -0.0014937, 0.0045759), # ('kraken', -0.0014937, -0.0014937, 0.0045759),
('ftx', 0.0010008000000000003, 0.0021084, 0.0146691), ('ftx', 0.0010008000000000003, 0.0021084, 0.0146691),
('gateio', -0.0009140999999999999, -0.0009140999999999999, -0.0009140999999999999), ('gateio', -0.0009140999999999999, -0.0009140999999999999, -0.0009140999999999999),
]) ])

View File

@ -4722,39 +4722,39 @@ def test_update_funding_fees(mocker, default_conf, time_machine, fee):
funding_rates = { funding_rates = {
"LTC/BTC": { "LTC/BTC": {
1630454400: 0.00032583, 1630454400000: 0.00032583,
1630483200: 0.00024472, 1630483200000: 0.00024472,
}, },
"ETH/BTC": { "ETH/BTC": {
1630454400: 0.0001, 1630454400000: 0.0001,
1630483200: 0.0001, 1630483200000: 0.0001,
}, },
"ETC/BTC": { "ETC/BTC": {
1630454400: 0.00031077, 1630454400000: 0.00031077,
1630483200: 0.00022655, 1630483200000: 0.00022655,
}, },
"XRP/BTC": { "XRP/BTC": {
1630454400: 0.00049426, 1630454400000: 0.00049426,
1630483200: 0.00032715, 1630483200000: 0.00032715,
} }
} }
mark_prices = { mark_prices = {
"LTC/BTC": { "LTC/BTC": {
1630454400: 3.3, 1630454400000: 3.3,
1630483200: 3.2, 1630483200000: 3.2,
}, },
"ETH/BTC": { "ETH/BTC": {
1630454400: 2.4, 1630454400000: 2.4,
1630483200: 2.5, 1630483200000: 2.5,
}, },
"ETC/BTC": { "ETC/BTC": {
1630454400: 4.3, 1630454400000: 4.3,
1630483200: 4.1, 1630483200000: 4.1,
}, },
"XRP/BTC": { "XRP/BTC": {
1630454400: 1.2, 1630454400000: 1.2,
1630483200: 1.2, 1630483200000: 1.2,
} }
} }