Do not refresh candles on "process_throttle_secs" but on intervals

This commit is contained in:
misagh 2018-08-03 18:10:03 +02:00
parent 3987a8aeb8
commit af93b18475
2 changed files with 34 additions and 14 deletions

View File

@ -6,10 +6,11 @@ from typing import List, Dict, Tuple, Any, Optional
from datetime import datetime from datetime import datetime
from math import floor, ceil from math import floor, ceil
import asyncio
import ccxt import ccxt
import ccxt.async_support as ccxt_async import ccxt.async_support as ccxt_async
import arrow import arrow
import asyncio
from freqtrade import constants, OperationalException, DependencyException, TemporaryError from freqtrade import constants, OperationalException, DependencyException, TemporaryError
@ -362,18 +363,6 @@ class Exchange(object):
except ccxt.BaseError as e: except ccxt.BaseError as e:
raise OperationalException(f'Could not fetch ticker data. Msg: {e}') raise OperationalException(f'Could not fetch ticker data. Msg: {e}')
def refresh_tickers(self, pair_list: List[str], ticker_interval: str) -> Dict:
"""
Refresh tickers asyncronously and return the result.
"""
# TODO: maybe add since_ms to use async in the download-script?
# TODO: only refresh once per interval ? *may require this to move to freqtradebot.py
# TODO: Add tests for this and the async stuff above
logger.debug("Refreshing klines for %d pairs", len(pair_list))
datatups = asyncio.get_event_loop().run_until_complete(
self.async_get_candles_history(pair_list, ticker_interval))
return {pair: data for (pair, data) in datatups}
@retrier @retrier
def get_candle_history(self, pair: str, tick_interval: str, def get_candle_history(self, pair: str, tick_interval: str,
since_ms: Optional[int] = None) -> List[Dict]: since_ms: Optional[int] = None) -> List[Dict]:

View File

@ -9,6 +9,7 @@ import traceback
from datetime import datetime from datetime import datetime
from typing import Any, Callable, Dict, List, Optional from typing import Any, Callable, Dict, List, Optional
import asyncio
import arrow import arrow
import requests import requests
@ -56,6 +57,7 @@ class FreqtradeBot(object):
self.exchange = Exchange(self.config) self.exchange = Exchange(self.config)
self._init_modules() self._init_modules()
self._klines: Dict[str, List[Dict]] = {} self._klines: Dict[str, List[Dict]] = {}
self._klines_last_fetched_time = 0
def _init_modules(self) -> None: def _init_modules(self) -> None:
""" """
@ -129,6 +131,34 @@ class FreqtradeBot(object):
time.sleep(duration) time.sleep(duration)
return result return result
def refresh_tickers(self, pair_list: List[str]) -> Dict:
"""
Refresh tickers asyncronously and return the result.
"""
# TODO: maybe add since_ms to use async in the download-script?
# TODO: only refresh once per interval ? *may require this to move to freqtradebot.py
# TODO: Add tests for this and the async stuff above
ticker_interval = self.strategy.ticker_interval
interval_in_seconds = int(ticker_interval[:-1]) * 60
should_not_update = ((self._klines_last_fetched_time + interval_in_seconds +1) > round(time.time()))
if should_not_update:
return False
logger.debug("Refreshing klines for %d pairs", len(pair_list))
datatups = asyncio.get_event_loop().run_until_complete(
self.exchange.async_get_candles_history(pair_list, ticker_interval))
# fetching the timestamp of last candle
self._klines_last_fetched_time = datatups[0][1][-1][0] / 1000
# updating klines
self._klines = {pair: data for (pair, data) in datatups}
return True
def _process(self, nb_assets: Optional[int] = 0) -> bool: def _process(self, nb_assets: Optional[int] = 0) -> bool:
""" """
Queries the persistence layer for open trades and handles them, Queries the persistence layer for open trades and handles them,
@ -149,7 +179,8 @@ class FreqtradeBot(object):
final_list = sanitized_list[:nb_assets] if nb_assets else sanitized_list final_list = sanitized_list[:nb_assets] if nb_assets else sanitized_list
self.config['exchange']['pair_whitelist'] = final_list self.config['exchange']['pair_whitelist'] = final_list
self._klines = self.exchange.refresh_tickers(final_list, self.strategy.ticker_interval) # Refreshing candles
self.refresh_tickers(final_list)
# Query trades from persistence layer # Query trades from persistence layer
trades = Trade.query.filter(Trade.is_open.is_(True)).all() trades = Trade.query.filter(Trade.is_open.is_(True)).all()