33个稳定版本 (11个主要版本)
12.0.0 | 2024年6月6日 |
---|---|
11.0.1 | 2024年4月11日 |
10.0.2 | 2024年3月6日 |
10.0.0 | 2023年8月3日 |
1.0.0 | 2021年2月24日 |
#5 in 财务
5MB
2K SLoC
交易汇总
一个高性能、模块化和灵活的交易汇总crate,生成K线数据,适用于低延迟应用和增量更新。它允许用户通过AggregationRule trait选择规定如何创建新K线的规则,例如:基于时间、基于成交量或其他信息驱动规则。它还允许用户通过ModularCandle trait选择从汇总过程中创建哪种类型的K线。结合Candle宏,只要每个组件实现了CandleComponent trait,用户就可以灵活地创建任何类型的K线。汇总过程也是通用的,只要输入交易数据实现了TakerTrade trait,这为下游项目提供了更大的灵活性。
有关具有较少功能和性能的Go实现的详细信息,请参阅MathisWellmann/go_trade_aggregation。
以下是将Bitmex_XBTUSD交易序列汇总到15分钟K线的示例:
功能
AggregationRule
:
此crate中预定义的规则包括
'AggregationRule' | 描述 |
---|---|
TimeRule |
每n秒创建一个K线 |
AlignedTimeRule |
与TimeRule相同,但K线对齐到周期开始 |
VolumeRule |
每交易n个单位创建一个K线 |
TickRule |
每n个tick创建一个K线 |
RelativePriceRule |
每n个基点价格变动创建一个K线(Renko) |
如果这些不能满足您的需求,请通过实现AggregationRule
特质来创建自己的,然后您可以将其插入到GenericAggregator
中。
CandleComponent
:
这些现有的 'CandleComponents' 默认存在
'CandleComponent' | 描述 |
---|---|
开盘价 |
蜡烛图开始时的价格 |
最高价 |
蜡烛图中的最高价格 |
最低价 |
蜡烛图中的最低价格 |
收盘价 |
蜡烛图结束时的价格 |
成交量 |
累计交易量 |
NumTrades |
蜡烛图中的交易次数 |
平均价 |
等权平均价格 |
加权价 |
体积加权价格 |
StdDevPrices |
跟踪价格的标准差 |
StdDevSizes |
跟踪尺寸的标准差 |
TimeVelocity |
基本上是蜡烛图在时间上创建的速度 |
Entropy |
使用交易方向作为输入的二进制香农熵 |
Trades |
仅返回该蜡烛图期间观察到的交易 |
再次,如果这些不能满足您的需求,请通过实现CandleComponent特质并插入到您自己的蜡烛结构体中来自定义。
使用方法
要在项目中使用此crate,请将以下内容添加到您的Cargo.toml中
[dependencies]
trade_aggregation = "12"
让我们将所有交易聚合到基于时间的1分钟蜡烛中,包括开盘、最高、最低和收盘信息。注意指定过程中使用的'AggregationRule'和'ModularCandle'是多么简单。可以轻松地插入对这些特质的自定义实现以进行完全自定义。此示例使用在线风格方法进行每个tick的更新
use trade_aggregation::{
candle_components::{Close, High, Low, Open},
*,
};
#[derive(Debug, Default, Clone, Candle)]
struct MyCandle {
open: Open,
high: High,
low: Low,
close: Close,
}
fn main() {
let trades = load_trades_from_csv("data/Bitmex_XBTUSD_1M.csv")
.expect("Could not load trades from file!");
// specify the aggregation rule to be time based and the resolution each trade timestamp has
let time_rule = TimeRule::new(M1, TimestampResolution::Millisecond);
// Notice how the aggregator is generic over the output candle type,
// the aggregation rule as well as the input trade data
let mut aggregator = GenericAggregator::<MyCandle, TimeRule, Trade>::new(time_rule, false);
for t in &trades {
if let Some(candle) = aggregator.update(t) {
println!(
"candle created with open: {}, high: {}, low: {}, close: {}",
candle.open(),
candle.high(),
candle.low(),
candle.close()
);
}
}
}
注意代码是如何在'MyCandle'结构体上调用'open()'、'high()'、'low()'和'close()'方法的。这些是由与字段同名自动生成的Candle宏,在本例中'MyCandle'的'Candle'推导宏展开为以下内容
use trade_aggregation::{
candle_components::{Close, High, Low, Open},
*,
};
#[derive(Debug, Default, Clone)]
struct MyCandle {
open: Open,
high: High,
low: Low,
close: Close,
}
impl MyCandle {
fn open(&self) -> f64 {
self.open.value()
}
fn high(&self) -> f64 {
self.high.value()
}
fn low(&self) -> f64 {
self.low.value()
}
fn close(&self) -> f64 {
self.close.value()
}
}
impl ModularCandle<Trade> for MyCandle {
fn update(&mut self, trade: &Trade) {
self.open.update(trade);
self.high.update(trade);
self.low.update(trade);
self.close.update(trade);
}
fn reset(&mut self) {
self.open.reset();
self.high.reset();
self.low.reset();
self.close.reset();
}
}
请参阅示例文件夹中的更多内容。使用以下命令运行示例
cargo run --release --example aggregate_all_ohlc
cargo run --release --example streaming_aggregate_ohlc
性能
要运行使用criterion编写的基准测试,请运行
cargo bench
以下是在12代英特尔酷睿i7-12800H上运行,将100万笔交易聚合到1分钟蜡烛中的结果
Candle | 时间 |
---|---|
开盘价 | 1 ms |
OHLC | 2.5 ms |
所有 | 8 ms |
显然,您使用的'CandleComponent'越多,耗时越长。
功能
存在serde功能,当启用时,会派生Serialize和Deserialize
待办事项
- 使价格存储的数据类型泛型(
f64
、f32
、i64
、Decimal
等...)
捐赠 💰 💸
如果您想支持此crate的开发,请随时捐款
Monero (XMR) 地址
47xMvxNKsCKMt2owkDuN1Bci2KMiqGrAFCQFSLijWLs49ua67222Wu3LZryyopDVPYgYmAnYkSZSz9ZW2buaDwdyKTWGwwb
许可
版权 (C) 2020 <Mathis Wellmann [email protected]>
本程序是免费软件:您可以重新分发它并/或修改它,只要遵守自由软件基金会根据GNU Affero通用公共许可证发布的许可证条款,无论是许可证的第3版,还是(根据您的选择)任何较新版本。
本程序是根据希望它会有所帮助的愿望分发的,但没有任何保证;甚至没有关于其商誉或对特定目的适用性的隐含保证。有关详细信息,请参阅GNU Affero通用公共许可证。
您应该已经收到了与该程序一起的GNU Affero通用公共许可证副本。如果没有,请参阅https://www.gnu.org/licenses/。
商业许可证
如果您想在没有GNU AGPLv3许可证限制的情况下合法使用此软件包,请联系我,以便我们可以快速安排一个定制许可证。
依赖项
~2.4–3.5MB
~57K SLoC