From 016232a8e97cc13e3cf292096d57d95609397c5e Mon Sep 17 00:00:00 2001 From: Matthias Voppichler Date: Sun, 25 Mar 2018 13:32:46 +0200 Subject: [PATCH] Revert OHLVC dataformat to ccxt format * Also fixes backtesting - but data must be refreshed for now as no conversation is happening yet --- freqtrade/analyze.py | 13 +++++++------ freqtrade/exchange/__init__.py | 20 ++++++-------------- freqtrade/optimize/__init__.py | 15 ++++++++++----- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py index f3e44b57b..e6e8023f0 100644 --- a/freqtrade/analyze.py +++ b/freqtrade/analyze.py @@ -44,12 +44,13 @@ class Analyze(object): :param ticker: See exchange.get_ticker_history :return: DataFrame """ - columns = {'C': 'close', 'V': 'volume', 'O': 'open', 'H': 'high', 'L': 'low', 'T': 'date'} - frame = DataFrame(ticker) \ - .rename(columns=columns) - if 'BV' in frame: - frame.drop('BV', 1, inplace=True) - frame['date'] = to_datetime(frame['date'], utc=True, infer_datetime_format=True) + cols = ['date', 'open', 'high', 'low', 'close', 'volume'] + frame = DataFrame(ticker, columns=cols) + + frame['date'] = to_datetime(frame['date'], + unit='ms', + utc=True, + infer_datetime_format=True) frame.sort_values('date', inplace=True) return frame diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index 2a9222141..e2e22a358 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -181,26 +181,18 @@ def get_ticker(pair: str, refresh: Optional[bool] = True) -> dict: # @cached(TTLCache(maxsize=100, ttl=30)) @retrier -def get_ticker_history(pair: str, tick_interval) -> List[Dict]: +def get_ticker_history(pair: str, tick_interval) -> List[List]: # TODO: tickers need to be in format 1m,5m # fetch_ohlcv returns an [[datetime,o,h,l,c,v]] if 'fetchOHLCV' not in _API.has or not _API.has['fetchOHLCV']: - logger.warning('Exhange %s does not support fetching historical candlestick data.', _API.name) + logger.warning('Exhange %s does not support fetching historical candlestick data.', + _API.name) return [] try: - history = _API.fetch_ohlcv(pair, timeframe=str(tick_interval)+"m") - history_json = [] - for candlestick in history: - history_json.append({ - 'T': datetime.fromtimestamp(candlestick[0]/1000.0).strftime('%Y-%m-%dT%H:%M:%S.%f'), - 'O': candlestick[1], - 'H': candlestick[2], - 'L': candlestick[3], - 'C': candlestick[4], - 'V': candlestick[5], - }) - return history_json + ohlcv = _API.fetch_ohlcv(pair, timeframe=str(tick_interval)+"m") + + return ohlcv except IndexError as e: logger.warning('Empty ticker history. Msg %s', str(e)) except ccxt.NetworkError as e: diff --git a/freqtrade/optimize/__init__.py b/freqtrade/optimize/__init__.py index 61694d884..be2300de7 100644 --- a/freqtrade/optimize/__init__.py +++ b/freqtrade/optimize/__init__.py @@ -4,6 +4,7 @@ import gzip import json import os from typing import Optional, List, Dict, Tuple +from datetime import datetime from freqtrade import misc from freqtrade.exchange import get_ticker_history @@ -135,8 +136,8 @@ def download_backtesting_testdata(datadir: str, pair: str, interval: int = 5) -> if os.path.isfile(filename): with open(filename, "rt") as file: data = json.load(file) - logger.debug("Current Start: %s", data[1]['T']) - logger.debug("Current End: %s", data[-1:][0]['T']) + logger.debug("Current Start: %s", format_ms_time(data[1][0])) + logger.debug("Current End: %s", format_ms_time(data[-1:][0][0])) else: data = [] logger.debug("Current Start: None") @@ -146,10 +147,14 @@ def download_backtesting_testdata(datadir: str, pair: str, interval: int = 5) -> for row in new_data: if row not in data: data.append(row) - logger.debug("New Start: %s", data[1]['T']) - logger.debug("New End: %s", data[-1:][0]['T']) - data = sorted(data, key=lambda data: data['T']) + logger.debug("New Start: %s", format_ms_time(data[0][0])) + logger.debug("New End: %s", format_ms_time(data[-1:][0][0])) + data = sorted(data, key=lambda data: data[0]) misc.file_dump_json(filename, data) return True + + +def format_ms_time(date: str) -> str: + return datetime.fromtimestamp(date/1000.0).strftime('%Y-%m-%dT%H:%M:%S')