"""Write recent Hyperliquid candles and funding as Freqtrade data, using your key."""
import os
import time
from pathlib import Path
import pandas as pd
import requests
from freqtrade.data.history import get_datahandler
from freqtrade.enums import CandleType
API = "https://api.ironflow.sh/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['IRONFLOW_KEY']}"}
COINS = ["BTC"]
TIMEFRAME = "5m"
DAYS = 13 # free key: 14 days, Explorer: 90, Builder: 365
end = pd.Timestamp.now("UTC").floor("h")
span = {"from": int((end - pd.Timedelta(days=DAYS)).floor("D").timestamp() * 1000), "to": int(end.timestamp() * 1000)}
def fetch(path, **params):
rows = []
params.update(span, limit=1000)
while True:
r = requests.get(f"{API}/{path}", params=params, headers=HEADERS, timeout=30)
if r.status_code == 429:
time.sleep(int(r.headers.get("Retry-After", 5)))
continue
r.raise_for_status()
body = r.json()
rows += body["data"]
if not body["pagination"]["has_more"]:
df = pd.DataFrame(rows)
df["date"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True)
return df
params["cursor"] = body["pagination"]["next_cursor"]
def candles(market, interval):
df = fetch("candles", market=market, interval=interval)
df[["open", "high", "low", "close", "volume"]] = df[["open", "high", "low", "close", "volume"]].astype(float)
return df
datadir = Path("user_data/data/hyperliquid")
(datadir / "futures").mkdir(parents=True, exist_ok=True)
store = get_datahandler(datadir, "feather")
for coin in COINS:
pair, market = f"{coin}/USDC:USDC", f"{coin}-PERP"
store.ohlcv_store(pair, TIMEFRAME, candles(market, TIMEFRAME), CandleType.FUTURES)
store.ohlcv_store(pair, "1h", candles(market, "1h"), CandleType.FUTURES) # Freqtrade needs 1h for funding
funding = fetch("funding", market=market)
funding["date"] = funding["date"].dt.floor("h")
funding = funding.drop_duplicates("date") # first reading of each hour
funding["funding_rate"] = funding["rate"].astype(float)
store.ohlcv_store(pair, "1h", funding, CandleType.FUNDING_RATE)
print(pair, "done")