Как получить исторические данные с интервалом в одну минуту?
Мне нужно получить исторические торговые данные с интервалом в одну минуту.
Я пытаюсь получить это с помощью ccxt
, Но я получаю несколько велосипедных значений.
Что я сделал не так?
import ccxt
import pandas as pd
import numpy as np
import time
np.set_printoptions(threshold=np.inf)
hitbtc = ccxt.hitbtc({'verbose': True})
bitmex = ccxt.bitmex()
huobi = ccxt.huobipro()
exchange = ccxt.exmo({
'apiKey': 'K-...',
'secret': 'S-...',
})
symbol = 'BTC/USD'
tf = '1m'
from_timestamp = exchange.parse8601('2019-01-10 00:00:00')
end = exchange.parse8601('2019-01-10 03:00:00')
# set timeframe in msecs
tf_multi = 60 * 1000
hold = 30
# make list to hold data
data = []
candle_no = (int(end) - int(from_timestamp)) / tf_multi + 1
print('downloading...')
while from_timestamp < end:
try:
ohlcvs = exchange.fetch_ohlcv(symbol, tf, from_timestamp)
from_timestamp += len(ohlcvs) * tf_multi
print(from_timestamp)
data += ohlcvs
print(str(len(data)) + ' of ' + str(int(candle_no)) + ' candles loaded...')
except (ccxt.ExchangeError, ccxt.AuthenticationError, ccxt.ExchangeNotAvailable, ccxt.RequestTimeout) as error:
print('Got an error', type(error).__name__, error.args, ', retrying in', hold, 'seconds...')
time.sleep(hold)
header = ['t', 'o', 'h', 'l', 'c', 'v']
df = pd.DataFrame(data, columns=header)
open('btcusd.txt', 'w')
np.savetxt('btcusd.txt', df.o, fmt='%.8f')
// https://pastebin.com/xy1Ddb5z - btcusd.txt
2 ответа
Это потому что в CCXT exmo.has['fetchOHLCV'] == 'emulated'
как объяснено здесь:
- https://github.com/ccxt/ccxt/issues/3178
- https://github.com/ccxt/ccxt/wiki/Manual
- https://github.com/ccxt/ccxt/wiki/Manual
- https://github.com/ccxt/ccxt/wiki/Manual
- https://exmo.me/en/api
Смотрите описание trades
метод в API EXMO, он не принимает никаких временных параметров, поэтому аргумент с fetch_ohlcv
не имеет никакого эффекта и игнорируется в случае EXMO.
import ccxt
import pandas as pd
import numpy as np
import time
import sys # ←---------------- ADDED
np.set_printoptions(threshold=np.inf)
hitbtc = ccxt.hitbtc({'verbose': True})
bitmex = ccxt.bitmex()
huobi = ccxt.huobipro()
exchange = ccxt.exmo({
'apiKey': 'K-...',
'secret': 'S-...',
})
symbol = 'BTC/USD'
tf = '1m'
from_timestamp = exchange.parse8601('2019-01-10 00:00:00')
end = exchange.parse8601('2019-01-10 03:00:00')
# set timeframe in msecs
tf_multi = 60 * 1000
hold = 30
# make list to hold data
data = []
# -----------------------------------------------------------------------------
# ADDED:
if exchange.has['fetchOHLCV'] == 'emulated':
print(exchange.id, " cannot fetch old historical OHLCVs, because it has['fetchOHLCV'] =", exchange.has['fetchOHLCV'])
sys.exit ()
# -----------------------------------------------------------------------------
candle_no = (int(end) - int(from_timestamp)) / tf_multi + 1
print('downloading...')
while from_timestamp < end:
try:
ohlcvs = exchange.fetch_ohlcv(symbol, tf, from_timestamp)
# --------------------------------------------------------------------
# ADDED:
# check if returned ohlcvs are actually
# within the from_timestamp > ohlcvs > end range
if (ohlcvs[0][0] > end) or (ohlcvs[-1][0] > end):
print(exchange.id, "got a candle out of range! has['fetchOHLCV'] =", exchange.has['fetchOHLCV'])
break
# ---------------------------------------------------------------------
from_timestamp += len(ohlcvs) * tf_multi
print(from_timestamp)
data += ohlcvs
print(str(len(data)) + ' of ' + str(int(candle_no)) + ' candles loaded...')
except (ccxt.ExchangeError, ccxt.AuthenticationError, ccxt.ExchangeNotAvailable, ccxt.RequestTimeout) as error:
print('Got an error', type(error).__name__, error.args, ', retrying in', hold, 'seconds...')
time.sleep(hold)
header = ['t', 'o', 'h', 'l', 'c', 'v']
df = pd.DataFrame(data, columns=header)
open('btcusd.txt', 'w')
np.savetxt('btcusd.txt', df.o, fmt='%.8f')
// https://pastebin.com/xy1Ddb5z - btcusd.txt
Я думаю, проблема в том, что
fetch_ohlcv
возвращает повторяющиеся значения в вашем
while
-петля. Как только у вас будет
df
просто попробуй с
# Keep only needed rows
df = df[df.Timestamp <= end]
# Delete duplicate rows
df = df.drop_duplicates()
Затем вы можете построить график (по индексу), например
df['Close'].plot()
Или, если вы конвертируете временные метки в более читаемый формат (например, используя
exchange.iso8601()
,
plt.plot(df['Date']._values, df['Close']._values)