0

我正在尝试使用krakenexPython 3.6.9 加载 Ethereum-GBP 交易的交易历史。我目前在最近的一些交易中加载如下:

# Load in my private key
k = krakenex.API()
k.load_key('mykraken.key')

# Trade pair
tradePair = 'XETHZGBP'

# Get a list of the most recent trades
recentTrades = k.query_public('Trades',{'pair':tradePair})


# Cast to numeric
recentTrades[0] = pd.to_numeric(recentTrades[0], errors='coerce')
recentTrades[1] = pd.to_numeric(recentTrades[1], errors='coerce')
recentTrades[2] = pd.to_numeric(recentTrades[2], errors='coerce')

这似乎在价格、数量和日期戳的列表中为我提供了最后 1000 笔交易。但是我怎样才能得到超过 1000 个呢?无论我做什么,我似乎都无法使其正常工作,并且我不确定该krakenex行为是否完全符合 kraken API 文档。

4

2 回答 2

0

默认情况下,kraken.com API 仅服务于最后 1000 笔交易。您需要指定since查询参数以接收较旧的数据。
来源:kraken.com API 文档 https://docs.kraken.com/rest/#operation/getRecentTrades

krakenex 包似乎不支持此参数。

于 2021-08-15T12:24:32.753 回答
0

如前所述,Kraken API 将getRecentTrades端点限制为 1000 笔交易。要绕过此限制,您可以循环某个时间范围,直到检索到所有订单。请注意,以下代码未实现错误检查和处理。

使用pykrakenapi 包,输出是按降序排列的 Pandas DataFrame。

import time
import krakenex
from pykrakenapi import KrakenAPI
from datetime import datetime, timezone, timedelta


def nano_after_epoch(t):
    """Converts DateTime object to int nanoseconds after epoch"""
    return int(t.replace(tzinfo=timezone.utc).timestamp() * 1000000000)


# Connect to the kraken API
api = krakenex.API(key=<<key>>,
                   secret=<<optional>>)
api = KrakenAPI(api)

"""Specify requirements"""
# Start and end time for which period to retrieve data
start_time = nano_after_epoch(datetime(2021, 10, 12))
end_time = nano_after_epoch(datetime.utcnow())
leeway = 180 * 1000000000 # Seconds * nanoseconds converter
pair = 'XETHZGBP'

# Loop until the last retrieved date is within X seconds of the desired end date to account
# for a lack of recent trades. If set too strictly, loop will continue until a new trade has been made
df = None
while start_time < end_time - leeway:
    print(f"Retrieving data from {datetime.fromtimestamp(start_time // 1000000000)}...")
    qry = api.get_recent_trades(since=start_time, pair=pair)
    # Append new data to dataframe
    df = qry[0] if df is None else qry[0].append(df)

    # Determine last retrieved date
    start_time = df.index[0]

    # New 'retrieve from' date is latest_time + 1 nanosecond
    start_time = nano_after_epoch(start_time) + 1

    # Sleep to avoid being rate limited
    time.sleep(1.8)

print(df)

输出:

Retrieving data from 2021-10-12 02:00:00...
Retrieving data from 2021-10-12 17:53:38...
Retrieving data from 2021-10-13 16:31:48...
                                 price    volume  ...  market_limit misc
dtime                                             ...                   
2021-10-13 19:15:17.854300022  2580.07  0.004000  ...         limit     
2021-10-13 19:13:12.930500031  2580.07  1.380691  ...         limit     
2021-10-13 19:08:06.569099903  2578.75  0.016780  ...         limit     
2021-10-13 19:04:16.453200102  2575.33  0.190738  ...        market     
2021-10-13 19:04:16.452300072  2575.70  0.001800  ...        market     
...                                ...       ...  ...           ...  ...
2021-10-12 00:03:43.447799921  2593.58  0.084000  ...         limit     
2021-10-12 00:03:05.378900051  2591.09  0.004732  ...         limit     
2021-10-12 00:03:03.912699938  2593.58  0.084077  ...         limit     
2021-10-12 00:02:38.695899963  2603.86  1.120000  ...         limit     
2021-10-12 00:00:20.313299894  2604.47  0.014493  ...         limit     

[2286 rows x 6 columns]
于 2021-10-13T19:18:38.903 回答