#trading #candle #candles

trade_aggregation

根据信息驱动规则,将交易汇总到用户定义的K线中

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线的示例:时间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

待办事项

  • 使价格存储的数据类型泛型(f64f32i64Decimal等...)

捐赠 💰 💸

如果您想支持此crate的开发,请随时捐款

Monero (XMR) 地址

47xMvxNKsCKMt2owkDuN1Bci2KMiqGrAFCQFSLijWLs49ua67222Wu3LZryyopDVPYgYmAnYkSZSz9ZW2buaDwdyKTWGwwb

monero

许可

版权 (C) 2020 <Mathis Wellmann [email protected]>

本程序是免费软件:您可以重新分发它并/或修改它,只要遵守自由软件基金会根据GNU Affero通用公共许可证发布的许可证条款,无论是许可证的第3版,还是(根据您的选择)任何较新版本。

本程序是根据希望它会有所帮助的愿望分发的,但没有任何保证;甚至没有关于其商誉或对特定目的适用性的隐含保证。有关详细信息,请参阅GNU Affero通用公共许可证。

您应该已经收到了与该程序一起的GNU Affero通用公共许可证副本。如果没有,请参阅https://www.gnu.org/licenses/

GNU AGPLv3

商业许可证

如果您想在没有GNU AGPLv3许可证限制的情况下合法使用此软件包,请联系我,以便我们可以快速安排一个定制许可证。

依赖项

~2.4–3.5MB
~57K SLoC