pub struct HyperliquidData {
pub symbol: String,
pub datetime: Vec<DateTime<FixedOffset>>,
pub open: Vec<f64>,
pub high: Vec<f64>,
pub low: Vec<f64>,
pub close: Vec<f64>,
pub volume: Vec<f64>,
pub funding_rates: Vec<f64>,
}
Expand description
Main data structure for Hyperliquid market data
This structure contains OHLC price data along with funding rates for perpetual futures. It provides a comprehensive view of market conditions including both price action and funding dynamics.
§Fields
symbol
: Trading pair symbol (e.g., “BTC”, “ETH”)datetime
: Timestamps for each data point (UTC with timezone info)open
,high
,low
,close
: OHLC price datavolume
: Trading volume for each periodfunding_rates
: Funding rates (NaN for non-funding periods)
§Data Alignment
All arrays have the same length and are aligned by index. The funding_rates array contains NaN values for periods where funding is not applied (typically every 8 hours).
§Example
use hyperliquid_backtest::prelude::*;
#[tokio::main]
async fn main() -> Result<(), HyperliquidBacktestError> {
let data = HyperliquidData::fetch("BTC", "1h", start_time, end_time).await?;
// Access price data
println!("Latest close price: ${:.2}", data.close.last().unwrap());
// Check data integrity
assert_eq!(data.datetime.len(), data.close.len());
assert_eq!(data.close.len(), data.funding_rates.len());
Ok(())
}
Fields§
§symbol: String
Trading pair symbol (e.g., “BTC”, “ETH”, “SOL”)
datetime: Vec<DateTime<FixedOffset>>
Array of timestamps for each data point (UTC with timezone information)
open: Vec<f64>
Array of opening prices for each period
high: Vec<f64>
Array of highest prices for each period
low: Vec<f64>
Array of lowest prices for each period
close: Vec<f64>
Array of closing prices for each period
volume: Vec<f64>
Array of trading volumes for each period
funding_rates: Vec<f64>
Array of funding rates (NaN for non-funding periods, typically every 8 hours)
Implementations§
Source§impl HyperliquidData
impl HyperliquidData
Sourcepub async fn fetch(
coin: &str,
interval: &str,
start_time: u64,
end_time: u64,
) -> Result<Self>
pub async fn fetch( coin: &str, interval: &str, start_time: u64, end_time: u64, ) -> Result<Self>
Fetch historical market data from Hyperliquid API
This is the primary method for obtaining market data for backtesting. It fetches both OHLC price data and funding rate information from the Hyperliquid API.
§Arguments
coin
- Trading pair symbol (e.g., “BTC”, “ETH”, “SOL”)interval
- Time interval for candles (“1m”, “5m”, “15m”, “1h”, “4h”, “1d”)start_time
- Start timestamp in Unix secondsend_time
- End timestamp in Unix seconds
§Returns
Returns a Result<HyperliquidData, HyperliquidBacktestError>
containing the market data
or an error if the fetch operation fails.
§Errors
This method can return several types of errors:
UnsupportedInterval
- If the interval is not supportedInvalidTimeRange
- If start_time >= end_timeHyperliquidApi
- If the API request failsDataConversion
- If the response data is invalidNetwork
- If there are network connectivity issues
§Examples
use hyperliquid_backtest::prelude::*;
use chrono::Utc;
#[tokio::main]
async fn main() -> Result<(), HyperliquidBacktestError> {
let end_time = Utc::now().timestamp() as u64;
let start_time = end_time - (24 * 60 * 60); // 24 hours ago
// Fetch BTC data with 1-hour intervals
let data = HyperliquidData::fetch("BTC", "1h", start_time, end_time).await?;
println!("Fetched {} data points", data.len());
println!("Latest price: ${:.2}", data.close.last().unwrap());
Ok(())
}
§Performance Notes
- Larger time ranges will take longer to fetch and process
- Consider caching data locally for repeated backtests
- Use appropriate intervals for your analysis (higher frequency = more data)
Sourcepub fn with_ohlc_data(
symbol: String,
datetime: Vec<DateTime<FixedOffset>>,
open: Vec<f64>,
high: Vec<f64>,
low: Vec<f64>,
close: Vec<f64>,
volume: Vec<f64>,
) -> Result<Self>
pub fn with_ohlc_data( symbol: String, datetime: Vec<DateTime<FixedOffset>>, open: Vec<f64>, high: Vec<f64>, low: Vec<f64>, close: Vec<f64>, volume: Vec<f64>, ) -> Result<Self>
Create a new HyperliquidData instance with OHLC data only
This constructor creates a HyperliquidData instance with OHLC price data but no funding rate information. Funding rates will be set to NaN for all periods.
§Arguments
symbol
- Trading pair symboldatetime
- Vector of timestampsopen
- Vector of opening priceshigh
- Vector of high priceslow
- Vector of low pricesclose
- Vector of closing pricesvolume
- Vector of trading volumes
§Returns
Returns a Result<HyperliquidData, HyperliquidBacktestError>
or a validation error
if the input arrays have different lengths.
§Examples
use hyperliquid_backtest::prelude::*;
use chrono::{DateTime, FixedOffset, Utc};
let timestamps = vec![Utc::now().with_timezone(&FixedOffset::east_opt(0).unwrap())];
let prices = vec![50000.0];
let volumes = vec![1000.0];
let data = HyperliquidData::with_ohlc_data(
"BTC".to_string(),
timestamps,
prices.clone(), // open
prices.clone(), // high
prices.clone(), // low
prices.clone(), // close
volumes,
)?;
Sourcepub fn with_ohlc_and_funding_data(
symbol: String,
datetime: Vec<DateTime<FixedOffset>>,
open: Vec<f64>,
high: Vec<f64>,
low: Vec<f64>,
close: Vec<f64>,
volume: Vec<f64>,
funding_rates: Vec<f64>,
) -> Result<Self>
pub fn with_ohlc_and_funding_data( symbol: String, datetime: Vec<DateTime<FixedOffset>>, open: Vec<f64>, high: Vec<f64>, low: Vec<f64>, close: Vec<f64>, volume: Vec<f64>, funding_rates: Vec<f64>, ) -> Result<Self>
Create a new HyperliquidData instance with OHLC and funding data
Sourcepub fn validate_all_data(&self) -> Result<()>
pub fn validate_all_data(&self) -> Result<()>
Validate all data for consistency
Sourcepub fn to_rs_backtester_data(&self) -> Data
pub fn to_rs_backtester_data(&self) -> Data
Convert to rs-backtester Data format
Sourcepub fn get_funding_rate_at(
&self,
timestamp: DateTime<FixedOffset>,
) -> Option<f64>
pub fn get_funding_rate_at( &self, timestamp: DateTime<FixedOffset>, ) -> Option<f64>
Get funding rate at a specific timestamp
Sourcepub fn get_price_at_or_near(
&self,
timestamp: DateTime<FixedOffset>,
) -> Option<f64>
pub fn get_price_at_or_near( &self, timestamp: DateTime<FixedOffset>, ) -> Option<f64>
Get the price (close) at or near a specific timestamp
Sourcepub fn calculate_funding_statistics(&self) -> FundingStatistics
pub fn calculate_funding_statistics(&self) -> FundingStatistics
Calculate funding statistics
Sourcepub fn validate_fetch_parameters(
coin: &str,
interval: &str,
start_time: u64,
end_time: u64,
) -> Result<()>
pub fn validate_fetch_parameters( coin: &str, interval: &str, start_time: u64, end_time: u64, ) -> Result<()>
Validate fetch parameters
Sourcepub fn popular_trading_pairs() -> &'static [&'static str]
pub fn popular_trading_pairs() -> &'static [&'static str]
Get list of popular trading pairs
Sourcepub fn is_popular_pair(coin: &str) -> bool
pub fn is_popular_pair(coin: &str) -> bool
Check if a trading pair is popular
Trait Implementations§
Source§impl Clone for HyperliquidData
impl Clone for HyperliquidData
Source§fn clone(&self) -> HyperliquidData
fn clone(&self) -> HyperliquidData
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for HyperliquidData
impl Debug for HyperliquidData
Source§impl<'de> Deserialize<'de> for HyperliquidData
impl<'de> Deserialize<'de> for HyperliquidData
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for HyperliquidData
impl RefUnwindSafe for HyperliquidData
impl Send for HyperliquidData
impl Sync for HyperliquidData
impl Unpin for HyperliquidData
impl UnwindSafe for HyperliquidData
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.