Kraken API 用于 OHLC 数据仅附加最新条目

Kraken API for OHLC data to only append latest entries

所以我在 Kraken API 上 运行 宁代码,我正在以 718 行和 8 列的 OHLC 数据的形式获取我想要的数据。我想获得有关此数据的实时更新,所以我想我会使用线程 运行 每 5 秒定期对代码进行处理,但这所做的只是一次又一次地打印整个数据块。

如何只附加上一个输出中不存在的数据。 IE。每五秒更新一次条目。

我的代码如下:

import krakenex
from pykrakenapi import KrakenAPI
import threading

api = krakenex.API()
api.load_key('/path/kraken.txt')
k = KrakenAPI(api)

ohlc, last = k.get_ohlc_data("BCHUSD")

def printit():
    threading.Timer(5.0,printit).start()
    print(ohlc)

printit()

Kraken OHLC endpoint设计了9种不同的时间间隔(1、5、15、30、60、240、1440、10080、21600分钟),其中1分钟为默认间隔。这样做的一个问题是您将无法使用此端点每 5 秒获取一次新数据,尽管每分钟都可以。
在这种情况下,您可以使用 OHLC 端点的 since 参数,如下所示,以获取您之前找到的最后一个实例之后的所有实例。

import time
import krakenex
import pandas as pd
from pykrakenapi import KrakenAPI

api = krakenex.API()
k = KrakenAPI(api)

# Initial OHLC dataframe
df, last = k.get_ohlc_data("BCHUSD", ascending=True)

# Infinite loop for additional OHLC data
while True:
    # Wait 60 seconds
    time.sleep(60)

    # Get data and append to existing pandas dataframe
    ohlc, last = k.get_ohlc_data("BCHUSD", since=last + 60000, ascending=True)
    df = pd.concat([df, ohlc])

    print(f'1 new data point downloaded. Total: {len(df.index)} data points.')

如果您想要以 5 秒为间隔获取 OHLC 数据,您将必须根据使用 Kraken Recent Trades endpoint 获得的交易数据自行构建此数据。

import time
import krakenex
import pandas as pd
import numpy as np
from pykrakenapi import KrakenAPI
from datetime import timedelta


def convert_to_ohlc(df, granularity):
    # Determine time frame of data
    since = df['time'].iloc[0] * 1000000000
    to =  df['time'].iloc[-1] * 1000000000

    # Create an initial data table with entries from start till end time, with steps of 5 seconds
    timestamps = pd.date_range(since, to, freq=str(granularity) + 's')

    # Initialise output dataframe
    output = pd.DataFrame(index=timestamps, columns=['open', 'high', 'low', 'close'])

    # Step through data in steps of 5 seconds
    df['dtime'] = df.index
    df = df.set_index('time')
    for i in range(0, len(output.index)):
        # Select the relevant datapoints for this step
        relevant_rows = df[
            (df['dtime'] >= output.index[i]) &
            (df['dtime'] < (output.index[i] +
                              timedelta(seconds=granularity)))
            ]

        # Convert data in time frame to OHLC data
        if len(relevant_rows) > 0 and not relevant_rows.empty:
            # open
            output.loc[output.index[i], 'open'] = relevant_rows['price'].iloc[0]
            # high
            output.loc[output.index[i], 'high'] = np.max(relevant_rows['price'])
            # low
            output.loc[output.index[i], 'low'] = np.min(relevant_rows['price'])
            # close
            output.loc[output.index[i], 'close'] = relevant_rows['price'].iloc[-1]
        else:
            for col in output.keys():
                output.loc[output.index[i], str(col)] = np.nan

    return output

api = krakenex.API()
k = KrakenAPI(api)

# Get trades data
df, last = k.get_recent_trades("BCHUSD", ascending=True)

# Convert data to OHLC data, steps of 5 seconds
df = convert_to_ohlc(df, 5)

# Infinite loop for additional OHLC data
while True:
    # Wait 60 seconds for new trades to happen
    time.sleep(60)

    # Get new trades data
    data, last = k.get_recent_trades("XBTUSD", since=last, ascending=True)

    # Convert data to OHLC data, steps of 5 seconds
    if not data.empty:
        data = convert_to_ohlc(data, 5)
        df = pd.concat([df, data])

        print(f'{len(data.index)} new data point{"s" if len(data.index) > 1 else ""} downloaded. Total: {len(df.index)} data points.')
    else:
        print("Could not find new trades. Retrying...")

您应该意识到 OHLC 数据是在特定时间范围内进行的交易的汇总。在 5 秒内,通常不会进行任何交易,这意味着无法生成 OHLC 数据。可解释性是另一个问题,因为极少数交易的 OHLC 数据可能没有什么意义,尤其是当只进行了一笔交易时。