global: snapshot

This commit is contained in:
nym21
2026-03-10 14:25:11 +01:00
parent 9aed86cbf2
commit ed0c9ade1a
26 changed files with 599 additions and 674 deletions
+164 -174
View File
@@ -1483,6 +1483,34 @@ impl CapitulationCumulativeNegativeRawRelSumValuePattern {
}
}
/// Pattern struct for repeated tree structure.
pub struct CoindaysCoinyearsDormancySentVelocityPattern {
pub coindays_destroyed: CumulativeRawSumPattern<StoredF64>,
pub coindays_destroyed_supply_adjusted: MetricPattern1<StoredF32>,
pub coinyears_destroyed: MetricPattern1<StoredF64>,
pub coinyears_destroyed_supply_adjusted: MetricPattern1<StoredF32>,
pub dormancy: MetricPattern1<StoredF32>,
pub dormancy_supply_adjusted: MetricPattern1<StoredF32>,
pub sent: RawSumPattern3<Sats>,
pub velocity: MetricPattern1<StoredF32>,
}
impl CoindaysCoinyearsDormancySentVelocityPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
coindays_destroyed: CumulativeRawSumPattern::new(client.clone(), _m(&acc, "coindays_destroyed")),
coindays_destroyed_supply_adjusted: MetricPattern1::new(client.clone(), _m(&acc, "coindays_destroyed_supply_adjusted")),
coinyears_destroyed: MetricPattern1::new(client.clone(), _m(&acc, "coinyears_destroyed")),
coinyears_destroyed_supply_adjusted: MetricPattern1::new(client.clone(), _m(&acc, "coinyears_destroyed_supply_adjusted")),
dormancy: MetricPattern1::new(client.clone(), _m(&acc, "dormancy")),
dormancy_supply_adjusted: MetricPattern1::new(client.clone(), _m(&acc, "dormancy_supply_adjusted")),
sent: RawSumPattern3::new(client.clone(), _m(&acc, "sent")),
velocity: MetricPattern1::new(client.clone(), _m(&acc, "velocity")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct Pct1Pct2Pct5Pct95Pct98Pct99SmaPattern {
pub pct1: BpsPriceRatioPattern,
@@ -1591,32 +1619,6 @@ impl _1m1w1y24hBpsPercentRatioPattern {
}
}
/// Pattern struct for repeated tree structure.
pub struct CoindaysCoinyearsDormancySentVelocityPattern {
pub coindays_destroyed: CumulativeRawSumPattern<StoredF64>,
pub coindays_destroyed_supply_adjusted: MetricPattern1<StoredF32>,
pub coinyears_destroyed: MetricPattern1<StoredF64>,
pub coinyears_destroyed_supply_adjusted: MetricPattern1<StoredF32>,
pub dormancy: MetricPattern1<StoredF32>,
pub sent: RawSumPattern3<Sats>,
pub velocity: MetricPattern1<StoredF32>,
}
impl CoindaysCoinyearsDormancySentVelocityPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
coindays_destroyed: CumulativeRawSumPattern::new(client.clone(), _m(&acc, "coindays_destroyed")),
coindays_destroyed_supply_adjusted: MetricPattern1::new(client.clone(), _m(&acc, "coindays_destroyed_supply_adjusted")),
coinyears_destroyed: MetricPattern1::new(client.clone(), _m(&acc, "coinyears_destroyed")),
coinyears_destroyed_supply_adjusted: MetricPattern1::new(client.clone(), _m(&acc, "coinyears_destroyed_supply_adjusted")),
dormancy: MetricPattern1::new(client.clone(), _m(&acc, "dormancy")),
sent: RawSumPattern3::new(client.clone(), _m(&acc, "sent")),
velocity: MetricPattern1::new(client.clone(), _m(&acc, "velocity")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct CumulativeDistributionRawRelSumValuePattern {
pub cumulative: MetricPattern1<Cents>,
@@ -1648,9 +1650,9 @@ pub struct GrossInvestedInvestorLossNetProfitSentimentPattern2 {
pub gross_pnl: CentsUsdPattern,
pub invested_capital: InPattern4,
pub investor_cap: InPattern2,
pub loss: NegativeRawRelSumSupplyPattern2,
pub loss: NegativeRawRelSumPattern2,
pub net_pnl: CentsRelUsdPattern2,
pub profit: RawRelSumSupplyPattern2,
pub profit: RawRelSumPattern2,
pub sentiment: GreedNetPainPattern,
}
@@ -1661,40 +1663,14 @@ impl GrossInvestedInvestorLossNetProfitSentimentPattern2 {
gross_pnl: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_gross_pnl")),
invested_capital: InPattern4::new(client.clone(), _m(&acc, "invested_capital_in")),
investor_cap: InPattern2::new(client.clone(), _m(&acc, "investor_cap_in")),
loss: NegativeRawRelSumSupplyPattern2::new(client.clone(), acc.clone()),
loss: NegativeRawRelSumPattern2::new(client.clone(), acc.clone()),
net_pnl: CentsRelUsdPattern2::new(client.clone(), _m(&acc, "net_unrealized_pnl")),
profit: RawRelSumSupplyPattern2::new(client.clone(), acc.clone()),
profit: RawRelSumPattern2::new(client.clone(), _m(&acc, "unrealized_profit")),
sentiment: GreedNetPainPattern::new(client.clone(), acc.clone()),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct NegativeRawRelSumSupplyPattern2 {
pub negative: MetricPattern1<Dollars>,
pub raw: CentsUsdPattern,
pub rel_to_market_cap: BpsPercentRatioPattern,
pub rel_to_own_gross_pnl: BpsPercentRatioPattern,
pub rel_to_own_market_cap: BpsPercentRatioPattern,
pub sum: _24hPattern,
pub supply: BtcCentsRelSatsUsdPattern3,
}
impl NegativeRawRelSumSupplyPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
negative: MetricPattern1::new(client.clone(), _m(&acc, "neg_unrealized_loss")),
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_loss")),
rel_to_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_loss_rel_to_market_cap")),
rel_to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_loss_rel_to_own_gross_pnl")),
rel_to_own_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_loss_rel_to_own_market_cap")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_loss_24h")),
supply: BtcCentsRelSatsUsdPattern3::new(client.clone(), _m(&acc, "supply_in_loss")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct BtcCentsRelSatsUsdPattern3 {
pub btc: MetricPattern1<Bitcoin>,
@@ -1768,25 +1744,73 @@ impl ChangeCumulativeDeltaRawRelSumPattern {
}
/// Pattern struct for repeated tree structure.
pub struct RawRelSumSupplyPattern2 {
pub struct DeltaHalvedInRelTotalPattern {
pub delta: ChangeRatePattern,
pub halved: BtcCentsSatsUsdPattern,
pub in_loss: BtcCentsRelSatsUsdPattern,
pub in_profit: BtcCentsRelSatsUsdPattern,
pub rel_to_circulating_supply: BpsPercentRatioPattern,
pub total: BtcCentsSatsUsdPattern,
}
impl DeltaHalvedInRelTotalPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
delta: ChangeRatePattern::new(client.clone(), _m(&acc, "delta")),
halved: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "halved")),
in_loss: BtcCentsRelSatsUsdPattern::new(client.clone(), _m(&acc, "in_loss")),
in_profit: BtcCentsRelSatsUsdPattern::new(client.clone(), _m(&acc, "in_profit")),
rel_to_circulating_supply: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_circulating_supply")),
total: BtcCentsSatsUsdPattern::new(client.clone(), acc.clone()),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct DeltaHalvedInRelTotalPattern2 {
pub delta: ChangeRatePattern2,
pub halved: BtcCentsSatsUsdPattern,
pub in_loss: BtcCentsRelSatsUsdPattern3,
pub in_profit: BtcCentsRelSatsUsdPattern3,
pub rel_to_circulating_supply: BpsPercentRatioPattern,
pub total: BtcCentsSatsUsdPattern,
}
impl DeltaHalvedInRelTotalPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
delta: ChangeRatePattern2::new(client.clone(), _m(&acc, "delta")),
halved: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "halved")),
in_loss: BtcCentsRelSatsUsdPattern3::new(client.clone(), _m(&acc, "in_loss")),
in_profit: BtcCentsRelSatsUsdPattern3::new(client.clone(), _m(&acc, "in_profit")),
rel_to_circulating_supply: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_circulating_supply")),
total: BtcCentsSatsUsdPattern::new(client.clone(), acc.clone()),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct NegativeRawRelSumPattern2 {
pub negative: MetricPattern1<Dollars>,
pub raw: CentsUsdPattern,
pub rel_to_market_cap: BpsPercentRatioPattern,
pub rel_to_own_gross_pnl: BpsPercentRatioPattern,
pub rel_to_own_market_cap: BpsPercentRatioPattern,
pub sum: _24hPattern,
pub supply: BtcCentsRelSatsUsdPattern3,
}
impl RawRelSumSupplyPattern2 {
impl NegativeRawRelSumPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_profit")),
rel_to_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_profit_rel_to_market_cap")),
rel_to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_profit_rel_to_own_gross_pnl")),
rel_to_own_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_profit_rel_to_own_market_cap")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_profit_24h")),
supply: BtcCentsRelSatsUsdPattern3::new(client.clone(), _m(&acc, "supply_in_profit")),
negative: MetricPattern1::new(client.clone(), _m(&acc, "neg_unrealized_loss")),
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_loss")),
rel_to_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_loss_rel_to_market_cap")),
rel_to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_loss_rel_to_own_gross_pnl")),
rel_to_own_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "unrealized_loss_rel_to_own_market_cap")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_loss_24h")),
}
}
}
@@ -1796,7 +1820,7 @@ pub struct ActivityOutputsRealizedSupplyUnrealizedPattern {
pub activity: CoindaysSentPattern,
pub outputs: UtxoPattern2,
pub realized: CapLossMvrvNetNuplPriceProfitSentSoprPattern,
pub supply: DeltaHalvedRelTotalPattern,
pub supply: DeltaHalvedInRelTotalPattern,
pub unrealized: InvestedInvestorLossNetProfitPattern,
}
@@ -1807,7 +1831,7 @@ impl ActivityOutputsRealizedSupplyUnrealizedPattern {
activity: CoindaysSentPattern::new(client.clone(), acc.clone()),
outputs: UtxoPattern2::new(client.clone(), _m(&acc, "utxo_count")),
realized: CapLossMvrvNetNuplPriceProfitSentSoprPattern::new(client.clone(), acc.clone()),
supply: DeltaHalvedRelTotalPattern::new(client.clone(), _m(&acc, "supply")),
supply: DeltaHalvedInRelTotalPattern::new(client.clone(), _m(&acc, "supply")),
unrealized: InvestedInvestorLossNetProfitPattern::new(client.clone(), acc.clone()),
}
}
@@ -1818,7 +1842,7 @@ pub struct ActivityOutputsRealizedSupplyUnrealizedPattern2 {
pub activity: CoindaysSentPattern,
pub outputs: UtxoPattern2,
pub realized: CapLossMvrvNetNuplPriceProfitSentSoprPattern,
pub supply: DeltaHalvedRelTotalPattern,
pub supply: DeltaHalvedInRelTotalPattern,
pub unrealized: LossNetProfitPattern,
}
@@ -1829,7 +1853,7 @@ impl ActivityOutputsRealizedSupplyUnrealizedPattern2 {
activity: CoindaysSentPattern::new(client.clone(), acc.clone()),
outputs: UtxoPattern2::new(client.clone(), _m(&acc, "utxo_count")),
realized: CapLossMvrvNetNuplPriceProfitSentSoprPattern::new(client.clone(), acc.clone()),
supply: DeltaHalvedRelTotalPattern::new(client.clone(), _m(&acc, "supply")),
supply: DeltaHalvedInRelTotalPattern::new(client.clone(), _m(&acc, "supply")),
unrealized: LossNetProfitPattern::new(client.clone(), acc.clone()),
}
}
@@ -1949,9 +1973,9 @@ impl EmaHistogramLineSignalPattern {
pub struct InvestedInvestorLossNetProfitPattern {
pub invested_capital: InPattern2,
pub investor_cap: InPattern2,
pub loss: NegativeRawSumSupplyPattern,
pub loss: NegativeRawSumPattern,
pub net_pnl: CentsUsdPattern,
pub profit: RawSumSupplyPattern,
pub profit: RawSumPattern,
}
impl InvestedInvestorLossNetProfitPattern {
@@ -1960,9 +1984,9 @@ impl InvestedInvestorLossNetProfitPattern {
Self {
invested_capital: InPattern2::new(client.clone(), _m(&acc, "invested_capital_in")),
investor_cap: InPattern2::new(client.clone(), _m(&acc, "investor_cap_in")),
loss: NegativeRawSumSupplyPattern::new(client.clone(), acc.clone()),
loss: NegativeRawSumPattern::new(client.clone(), acc.clone()),
net_pnl: CentsUsdPattern::new(client.clone(), _m(&acc, "net_unrealized_pnl")),
profit: RawSumSupplyPattern::new(client.clone(), acc.clone()),
profit: RawSumPattern::new(client.clone(), _m(&acc, "unrealized_profit")),
}
}
}
@@ -1989,6 +2013,28 @@ impl PhsReboundThsPattern {
}
}
/// Pattern struct for repeated tree structure.
pub struct RawRelSumPattern2 {
pub raw: CentsUsdPattern,
pub rel_to_market_cap: BpsPercentRatioPattern,
pub rel_to_own_gross_pnl: BpsPercentRatioPattern,
pub rel_to_own_market_cap: BpsPercentRatioPattern,
pub sum: _24hPattern,
}
impl RawRelSumPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
raw: CentsUsdPattern::new(client.clone(), acc.clone()),
rel_to_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_market_cap")),
rel_to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_own_gross_pnl")),
rel_to_own_market_cap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_own_market_cap")),
sum: _24hPattern::new(client.clone(), _m(&acc, "24h")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct _1m1w1y24hHeightPattern<T> {
pub _1m: MetricPattern1<T>,
@@ -2272,40 +2318,20 @@ impl CumulativeNegativeRawSumPattern {
}
/// Pattern struct for repeated tree structure.
pub struct DeltaHalvedRelTotalPattern {
pub delta: ChangeRatePattern,
pub struct HalvedInTotalPattern {
pub halved: BtcCentsSatsUsdPattern,
pub rel_to_circulating_supply: BpsPercentRatioPattern,
pub in_loss: BtcCentsSatsUsdPattern,
pub in_profit: BtcCentsSatsUsdPattern,
pub total: BtcCentsSatsUsdPattern,
}
impl DeltaHalvedRelTotalPattern {
impl HalvedInTotalPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
delta: ChangeRatePattern::new(client.clone(), _m(&acc, "delta")),
halved: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "halved")),
rel_to_circulating_supply: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_circulating_supply")),
total: BtcCentsSatsUsdPattern::new(client.clone(), acc.clone()),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct DeltaHalvedRelTotalPattern2 {
pub delta: ChangeRatePattern2,
pub halved: BtcCentsSatsUsdPattern,
pub rel_to_circulating_supply: BpsPercentRatioPattern,
pub total: BtcCentsSatsUsdPattern,
}
impl DeltaHalvedRelTotalPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
delta: ChangeRatePattern2::new(client.clone(), _m(&acc, "delta")),
halved: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "halved")),
rel_to_circulating_supply: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "rel_to_circulating_supply")),
in_loss: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "in_loss")),
in_profit: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "in_profit")),
total: BtcCentsSatsUsdPattern::new(client.clone(), acc.clone()),
}
}
@@ -2331,31 +2357,11 @@ impl InvestedMaxMinPercentilesPattern {
}
}
/// Pattern struct for repeated tree structure.
pub struct NegativeRawSumSupplyPattern {
pub negative: MetricPattern1<Dollars>,
pub raw: CentsUsdPattern,
pub sum: _24hPattern,
pub supply: BtcCentsRelSatsUsdPattern,
}
impl NegativeRawSumSupplyPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
negative: MetricPattern1::new(client.clone(), _m(&acc, "neg_unrealized_loss")),
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_loss")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_loss_24h")),
supply: BtcCentsRelSatsUsdPattern::new(client.clone(), _m(&acc, "supply_in_loss")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct OutputsRealizedSupplyUnrealizedPattern {
pub outputs: UtxoPattern,
pub realized: CapLossMvrvNuplPriceProfitSoprPattern,
pub supply: HalvedTotalPattern,
pub supply: HalvedInTotalPattern,
pub unrealized: LossProfitPattern2,
}
@@ -2365,8 +2371,8 @@ impl OutputsRealizedSupplyUnrealizedPattern {
Self {
outputs: UtxoPattern::new(client.clone(), _m(&acc, "utxo_count")),
realized: CapLossMvrvNuplPriceProfitSoprPattern::new(client.clone(), acc.clone()),
supply: HalvedTotalPattern::new(client.clone(), _m(&acc, "supply")),
unrealized: LossProfitPattern2::new(client.clone(), acc.clone()),
supply: HalvedInTotalPattern::new(client.clone(), _m(&acc, "supply")),
unrealized: LossProfitPattern2::new(client.clone(), _m(&acc, "unrealized")),
}
}
}
@@ -2591,18 +2597,36 @@ impl GreedNetPainPattern {
/// Pattern struct for repeated tree structure.
pub struct LossNetProfitPattern {
pub loss: NegativeRawSumSupplyPattern,
pub loss: NegativeRawSumPattern,
pub net_pnl: CentsUsdPattern,
pub profit: RawSumSupplyPattern,
pub profit: RawSumPattern,
}
impl LossNetProfitPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
loss: NegativeRawSumSupplyPattern::new(client.clone(), acc.clone()),
loss: NegativeRawSumPattern::new(client.clone(), acc.clone()),
net_pnl: CentsUsdPattern::new(client.clone(), _m(&acc, "net_unrealized_pnl")),
profit: RawSumSupplyPattern::new(client.clone(), acc.clone()),
profit: RawSumPattern::new(client.clone(), _m(&acc, "unrealized_profit")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct NegativeRawSumPattern {
pub negative: MetricPattern1<Dollars>,
pub raw: CentsUsdPattern,
pub sum: _24hPattern,
}
impl NegativeRawSumPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
negative: MetricPattern1::new(client.clone(), _m(&acc, "neg_unrealized_loss")),
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_loss")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_loss_24h")),
}
}
}
@@ -2679,42 +2703,6 @@ impl RawSellSumPattern {
}
}
/// Pattern struct for repeated tree structure.
pub struct RawSumSupplyPattern {
pub raw: CentsUsdPattern,
pub sum: _24hPattern,
pub supply: BtcCentsRelSatsUsdPattern,
}
impl RawSumSupplyPattern {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_profit")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_profit_24h")),
supply: BtcCentsRelSatsUsdPattern::new(client.clone(), _m(&acc, "supply_in_profit")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct RawSumSupplyPattern2 {
pub raw: CentsUsdPattern,
pub sum: _24hPattern,
pub supply: BtcCentsSatsUsdPattern,
}
impl RawSumSupplyPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
raw: CentsUsdPattern::new(client.clone(), _m(&acc, "unrealized_profit")),
sum: _24hPattern::new(client.clone(), _m(&acc, "unrealized_profit_24h")),
supply: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "supply_in_profit")),
}
}
}
/// Pattern struct for repeated tree structure.
pub struct _6bBlockTxindexPattern<T> {
pub _6b: AverageMaxMedianMinPct10Pct25Pct75Pct90Pattern<T>,
@@ -2993,16 +2981,16 @@ impl InPattern3 {
/// Pattern struct for repeated tree structure.
pub struct LossProfitPattern2 {
pub loss: RawSumSupplyPattern2,
pub profit: RawSumSupplyPattern2,
pub loss: RawSumPattern,
pub profit: RawSumPattern,
}
impl LossProfitPattern2 {
/// Create a new pattern node with accumulated metric name.
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
Self {
loss: RawSumSupplyPattern2::new(client.clone(), acc.clone()),
profit: RawSumSupplyPattern2::new(client.clone(), acc.clone()),
loss: RawSumPattern::new(client.clone(), _m(&acc, "loss")),
profit: RawSumPattern::new(client.clone(), _m(&acc, "profit")),
}
}
}
@@ -4972,6 +4960,7 @@ pub struct MetricsTree_Indicators {
pub nvt: BpsRatioPattern,
pub gini: BpsPercentRatioPattern,
pub rhodl_ratio: BpsRatioPattern,
pub thermocap_multiple: BpsRatioPattern,
}
impl MetricsTree_Indicators {
@@ -4981,6 +4970,7 @@ impl MetricsTree_Indicators {
nvt: BpsRatioPattern::new(client.clone(), "nvt".to_string()),
gini: BpsPercentRatioPattern::new(client.clone(), "gini".to_string()),
rhodl_ratio: BpsRatioPattern::new(client.clone(), "rhodl_ratio".to_string()),
thermocap_multiple: BpsRatioPattern::new(client.clone(), "thermocap_multiple".to_string()),
}
}
}
@@ -6844,6 +6834,8 @@ impl MetricsTree_Distribution_UtxoCohorts_All {
/// Metrics tree node.
pub struct MetricsTree_Distribution_UtxoCohorts_All_Supply {
pub delta: ChangeRatePattern2,
pub in_profit: BtcCentsRelSatsUsdPattern2,
pub in_loss: BtcCentsRelSatsUsdPattern2,
pub total: BtcCentsSatsUsdPattern,
pub halved: BtcCentsSatsUsdPattern,
}
@@ -6852,6 +6844,8 @@ impl MetricsTree_Distribution_UtxoCohorts_All_Supply {
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
Self {
delta: ChangeRatePattern2::new(client.clone(), "supply_delta".to_string()),
in_profit: BtcCentsRelSatsUsdPattern2::new(client.clone(), "supply_in_profit".to_string()),
in_loss: BtcCentsRelSatsUsdPattern2::new(client.clone(), "supply_in_loss".to_string()),
total: BtcCentsSatsUsdPattern::new(client.clone(), "supply".to_string()),
halved: BtcCentsSatsUsdPattern::new(client.clone(), "supply_halved".to_string()),
}
@@ -6888,7 +6882,6 @@ pub struct MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Loss {
pub negative: MetricPattern1<Dollars>,
pub raw: CentsUsdPattern,
pub sum: _24hPattern,
pub supply: BtcCentsRelSatsUsdPattern2,
pub rel_to_market_cap: BpsPercentRatioPattern,
pub rel_to_own_gross_pnl: BpsPercentRatioPattern,
}
@@ -6899,7 +6892,6 @@ impl MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Loss {
negative: MetricPattern1::new(client.clone(), "neg_unrealized_loss".to_string()),
raw: CentsUsdPattern::new(client.clone(), "unrealized_loss".to_string()),
sum: _24hPattern::new(client.clone(), "unrealized_loss_24h".to_string()),
supply: BtcCentsRelSatsUsdPattern2::new(client.clone(), "supply_in_loss".to_string()),
rel_to_market_cap: BpsPercentRatioPattern::new(client.clone(), "unrealized_loss_rel_to_market_cap".to_string()),
rel_to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), "unrealized_loss_rel_to_own_gross_pnl".to_string()),
}
@@ -6927,7 +6919,6 @@ impl MetricsTree_Distribution_UtxoCohorts_All_Unrealized_NetPnl {
pub struct MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Profit {
pub raw: CentsUsdPattern,
pub sum: _24hPattern,
pub supply: BtcCentsRelSatsUsdPattern2,
pub rel_to_market_cap: BpsPercentRatioPattern,
pub rel_to_own_gross_pnl: BpsPercentRatioPattern,
}
@@ -6937,7 +6928,6 @@ impl MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Profit {
Self {
raw: CentsUsdPattern::new(client.clone(), "unrealized_profit".to_string()),
sum: _24hPattern::new(client.clone(), "unrealized_profit_24h".to_string()),
supply: BtcCentsRelSatsUsdPattern2::new(client.clone(), "supply_in_profit".to_string()),
rel_to_market_cap: BpsPercentRatioPattern::new(client.clone(), "unrealized_profit_rel_to_market_cap".to_string()),
rel_to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), "unrealized_profit_rel_to_own_gross_pnl".to_string()),
}
@@ -6947,7 +6937,7 @@ impl MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Profit {
/// Metrics tree node.
pub struct MetricsTree_Distribution_UtxoCohorts_Sth {
pub realized: CapGrossInvestorLossMvrvNetNuplPeakPriceProfitSentSoprPattern,
pub supply: DeltaHalvedRelTotalPattern2,
pub supply: DeltaHalvedInRelTotalPattern2,
pub outputs: UtxoPattern3,
pub activity: CoindaysCoinyearsDormancySentVelocityPattern,
pub cost_basis: InvestedMaxMinPercentilesPattern,
@@ -6958,7 +6948,7 @@ impl MetricsTree_Distribution_UtxoCohorts_Sth {
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
Self {
realized: CapGrossInvestorLossMvrvNetNuplPeakPriceProfitSentSoprPattern::new(client.clone(), "sth".to_string()),
supply: DeltaHalvedRelTotalPattern2::new(client.clone(), "sth_supply".to_string()),
supply: DeltaHalvedInRelTotalPattern2::new(client.clone(), "sth_supply".to_string()),
outputs: UtxoPattern3::new(client.clone(), "sth_utxo_count".to_string()),
activity: CoindaysCoinyearsDormancySentVelocityPattern::new(client.clone(), "sth".to_string()),
cost_basis: InvestedMaxMinPercentilesPattern::new(client.clone(), "sth".to_string()),
@@ -6969,7 +6959,7 @@ impl MetricsTree_Distribution_UtxoCohorts_Sth {
/// Metrics tree node.
pub struct MetricsTree_Distribution_UtxoCohorts_Lth {
pub supply: DeltaHalvedRelTotalPattern2,
pub supply: DeltaHalvedInRelTotalPattern2,
pub outputs: UtxoPattern3,
pub activity: CoindaysCoinyearsDormancySentVelocityPattern,
pub realized: MetricsTree_Distribution_UtxoCohorts_Lth_Realized,
@@ -6980,7 +6970,7 @@ pub struct MetricsTree_Distribution_UtxoCohorts_Lth {
impl MetricsTree_Distribution_UtxoCohorts_Lth {
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
Self {
supply: DeltaHalvedRelTotalPattern2::new(client.clone(), "lth_supply".to_string()),
supply: DeltaHalvedInRelTotalPattern2::new(client.clone(), "lth_supply".to_string()),
outputs: UtxoPattern3::new(client.clone(), "lth_utxo_count".to_string()),
activity: CoindaysCoinyearsDormancySentVelocityPattern::new(client.clone(), "lth".to_string()),
realized: MetricsTree_Distribution_UtxoCohorts_Lth_Realized::new(client.clone(), format!("{base_path}_realized")),
@@ -55,6 +55,9 @@ impl DynCohortVecs for UTXOCohortVecs<CoreCohortMetrics> {
self.metrics
.unrealized
.truncate_push(height, &unrealized_state)?;
self.metrics
.supply
.truncate_push_profitability(height, &unrealized_state)?;
}
Ok(())
}
@@ -54,6 +54,9 @@ impl DynCohortVecs for UTXOCohortVecs<TypeCohortMetrics> {
self.metrics
.unrealized
.truncate_push(height, &unrealized_state)?;
self.metrics
.supply
.truncate_push_profitability(height, &unrealized_state)?;
}
Ok(())
}
@@ -29,8 +29,6 @@ pub struct ActivityFull<M: StorageMode = Rw> {
pub dormancy: ComputedPerBlock<StoredF32, M>,
pub velocity: ComputedPerBlock<StoredF32, M>,
pub coindays_destroyed_supply_adjusted: ComputedPerBlock<StoredF32, M>,
pub coinyears_destroyed_supply_adjusted: ComputedPerBlock<StoredF32, M>,
}
impl ActivityFull {
@@ -54,8 +52,6 @@ impl ActivityFull {
coinyears_destroyed,
dormancy: cfg.import("dormancy", v1)?,
velocity: cfg.import("velocity", v1)?,
coindays_destroyed_supply_adjusted: cfg.import("coindays_destroyed_supply_adjusted", v1)?,
coinyears_destroyed_supply_adjusted: cfg.import("coinyears_destroyed_supply_adjusted", v1)?,
})
}
@@ -75,8 +71,6 @@ impl ActivityFull {
let mut vecs = self.inner.collect_vecs_mut();
vecs.push(&mut self.dormancy.height);
vecs.push(&mut self.velocity.height);
vecs.push(&mut self.coindays_destroyed_supply_adjusted.height);
vecs.push(&mut self.coinyears_destroyed_supply_adjusted.height);
vecs
}
@@ -161,38 +155,6 @@ impl ActivityFull {
exit,
)?;
// Supply-Adjusted CDD = sum_24h(CDD) / circulating_supply
self.coindays_destroyed_supply_adjusted.height.compute_transform2(
starting_indexes.height,
&self.inner.coindays_destroyed.sum._24h.height,
supply_total_sats,
|(i, cdd_24h, supply_sats, ..)| {
let supply = f64::from(Bitcoin::from(supply_sats));
if supply == 0.0 {
(i, StoredF32::from(0.0f32))
} else {
(i, StoredF32::from((f64::from(cdd_24h) / supply) as f32))
}
},
exit,
)?;
// Supply-Adjusted CYD = CYD / circulating_supply (CYD = 1y rolling sum of CDD)
self.coinyears_destroyed_supply_adjusted.height.compute_transform2(
starting_indexes.height,
&self.coinyears_destroyed.height,
supply_total_sats,
|(i, cdd_1y, supply_sats, ..)| {
let supply = f64::from(Bitcoin::from(supply_sats));
if supply == 0.0 {
(i, StoredF32::from(0.0f32))
} else {
(i, StoredF32::from((f64::from(cdd_1y) / supply) as f32))
}
},
exit,
)?;
Ok(())
}
}
@@ -139,8 +139,8 @@ impl AllCohortMetrics {
self.relative.compute(
starting_indexes.height,
&self.supply.core,
&self.unrealized,
&self.supply.total.sats.height,
height_to_market_cap,
exit,
)?;
@@ -81,9 +81,7 @@ impl BasicCohortMetrics {
self.relative.compute(
starting_indexes.height,
&self.unrealized.supply_in_profit.sats.height,
&self.unrealized.supply_in_loss.sats.height,
&self.supply.total.sats.height,
&self.supply.core,
all_supply_sats,
exit,
)?;
@@ -118,7 +118,7 @@ impl CoreCohortMetrics {
self.realized
.compute_rest_part1(blocks, starting_indexes, exit)?;
self.unrealized.compute_rest(blocks, prices, starting_indexes, exit)?;
self.unrealized.compute_rest(blocks, starting_indexes, exit)?;
Ok(())
}
@@ -141,9 +141,7 @@ impl CoreCohortMetrics {
self.relative.compute(
starting_indexes.height,
&self.unrealized.supply_in_profit.sats.height,
&self.unrealized.supply_in_loss.sats.height,
&self.supply.total.sats.height,
&self.supply.core,
all_supply_sats,
exit,
)?;
@@ -115,8 +115,8 @@ impl ExtendedCohortMetrics {
self.relative.compute(
starting_indexes.height,
&self.supply.core,
&self.unrealized,
&self.supply.total.sats.height,
height_to_market_cap,
all_supply_sats,
&self.supply.total.usd.height,
@@ -7,17 +7,17 @@ use vecdb::{AnyStoredVec, Exit, Rw, StorageMode};
use crate::{blocks, prices};
use crate::distribution::metrics::{
ImportConfig, OutputsBase, RealizedMinimal, SupplyBase, UnrealizedBasic,
ImportConfig, OutputsBase, RealizedMinimal, SupplyCore, UnrealizedBasic,
};
/// TypeCohortMetrics: supply(base), outputs(base), realized(minimal), unrealized(basic).
/// TypeCohortMetrics: supply(core), outputs(base), realized(minimal), unrealized(basic).
///
/// Used for type_ cohorts (p2pkh, p2sh, etc.).
#[derive(Traversable)]
pub struct TypeCohortMetrics<M: StorageMode = Rw> {
#[traversable(skip)]
pub filter: Filter,
pub supply: Box<SupplyBase<M>>,
pub supply: Box<SupplyCore<M>>,
pub outputs: Box<OutputsBase<M>>,
pub realized: Box<RealizedMinimal<M>>,
pub unrealized: Box<UnrealizedBasic<M>>,
@@ -27,7 +27,7 @@ impl TypeCohortMetrics {
pub(crate) fn forced_import(cfg: &ImportConfig) -> Result<Self> {
Ok(Self {
filter: cfg.filter.clone(),
supply: Box::new(SupplyBase::forced_import(cfg)?),
supply: Box::new(SupplyCore::forced_import(cfg)?),
outputs: Box::new(OutputsBase::forced_import(cfg)?),
realized: Box::new(RealizedMinimal::forced_import(cfg)?),
unrealized: Box::new(UnrealizedBasic::forced_import(cfg)?),
@@ -62,7 +62,7 @@ impl TypeCohortMetrics {
self.realized
.compute_rest_part1(blocks, starting_indexes, exit)?;
self.unrealized
.compute_rest(blocks, prices, starting_indexes.height, exit)?;
.compute_rest(blocks, starting_indexes.height, exit)?;
Ok(())
}
@@ -58,7 +58,7 @@ pub use realized::{
pub use relative::{
RelativeForAll, RelativeToAll, RelativeWithExtended,
};
pub use supply::{SupplyBase, SupplyFull};
pub use supply::{SupplyBase, SupplyCore, SupplyFull};
pub use unrealized::{UnrealizedBase, UnrealizedBasic, UnrealizedCore, UnrealizedFull, UnrealizedLike};
use brk_cohort::Filter;
@@ -148,6 +148,8 @@ pub trait CohortMetricsBase: CohortMetricsState<Realized = RealizedState, CostBa
let unrealized_state = state.compute_unrealized_state(height_price);
self.unrealized_mut()
.truncate_push(height, &unrealized_state)?;
self.supply_mut()
.truncate_push_profitability(height, &unrealized_state)?;
Ok(())
}
@@ -1,10 +1,10 @@
use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{Dollars, Height, Sats};
use brk_types::{Dollars, Height};
use derive_more::{Deref, DerefMut};
use vecdb::{Exit, ReadableVec, Rw, StorageMode};
use crate::distribution::metrics::{ImportConfig, UnrealizedFull};
use crate::distribution::metrics::{ImportConfig, SupplyCore, UnrealizedFull};
use super::{RelativeFull, RelativeExtendedOwnPnl};
@@ -30,15 +30,15 @@ impl RelativeForAll {
pub(crate) fn compute(
&mut self,
max_from: Height,
supply: &SupplyCore,
unrealized: &UnrealizedFull,
supply_total_sats: &impl ReadableVec<Height, Sats>,
market_cap: &impl ReadableVec<Height, Dollars>,
exit: &Exit,
) -> Result<()> {
self.base.compute(
max_from,
&unrealized.inner.core,
supply_total_sats,
supply,
&unrealized.inner.core.basic,
market_cap,
exit,
)?;
@@ -4,16 +4,16 @@ use brk_types::{BasisPoints16, Dollars, Height, Sats, Version};
use vecdb::{Exit, ReadableVec, Rw, StorageMode};
use crate::{
distribution::metrics::{ImportConfig, UnrealizedCore},
distribution::metrics::{ImportConfig, SupplyCore, UnrealizedBasic},
internal::{PercentPerBlock, RatioDollarsBp16, RatioSatsBp16},
};
/// Full relative metrics (sth/lth/all tier).
#[derive(Traversable)]
pub struct RelativeFull<M: StorageMode = Rw> {
#[traversable(wrap = "unrealized/profit/supply", rename = "rel_to_own_supply")]
#[traversable(wrap = "supply/in_profit", rename = "rel_to_own_supply")]
pub supply_in_profit_rel_to_own_supply: PercentPerBlock<BasisPoints16, M>,
#[traversable(wrap = "unrealized/loss/supply", rename = "rel_to_own_supply")]
#[traversable(wrap = "supply/in_loss", rename = "rel_to_own_supply")]
pub supply_in_loss_rel_to_own_supply: PercentPerBlock<BasisPoints16, M>,
#[traversable(wrap = "unrealized/profit", rename = "rel_to_market_cap")]
@@ -41,23 +41,23 @@ impl RelativeFull {
pub(crate) fn compute(
&mut self,
max_from: Height,
unrealized: &UnrealizedCore,
supply_total_sats: &impl ReadableVec<Height, Sats>,
supply: &SupplyCore,
unrealized: &UnrealizedBasic,
market_cap: &impl ReadableVec<Height, Dollars>,
exit: &Exit,
) -> Result<()> {
self.supply_in_profit_rel_to_own_supply
.compute_binary::<Sats, Sats, RatioSatsBp16>(
max_from,
&unrealized.supply_in_profit.sats.height,
supply_total_sats,
&supply.in_profit.sats.height,
&supply.total.sats.height,
exit,
)?;
self.supply_in_loss_rel_to_own_supply
.compute_binary::<Sats, Sats, RatioSatsBp16>(
max_from,
&unrealized.supply_in_loss.sats.height,
supply_total_sats,
&supply.in_loss.sats.height,
&supply.total.sats.height,
exit,
)?;
@@ -5,16 +5,16 @@ use vecdb::{Exit, ReadableVec, Rw, StorageMode};
use crate::internal::{PercentPerBlock, RatioSatsBp16};
use crate::distribution::metrics::ImportConfig;
use crate::distribution::metrics::{ImportConfig, SupplyCore};
/// Relative-to-all metrics (not present for the "all" cohort itself).
#[derive(Traversable)]
pub struct RelativeToAll<M: StorageMode = Rw> {
#[traversable(wrap = "supply", rename = "rel_to_circulating_supply")]
pub supply_rel_to_circulating_supply: PercentPerBlock<BasisPoints16, M>,
#[traversable(wrap = "unrealized/profit/supply", rename = "rel_to_circulating_supply")]
#[traversable(wrap = "supply/in_profit", rename = "rel_to_circulating_supply")]
pub supply_in_profit_rel_to_circulating_supply: PercentPerBlock<BasisPoints16, M>,
#[traversable(wrap = "unrealized/loss/supply", rename = "rel_to_circulating_supply")]
#[traversable(wrap = "supply/in_loss", rename = "rel_to_circulating_supply")]
pub supply_in_loss_rel_to_circulating_supply: PercentPerBlock<BasisPoints16, M>,
}
@@ -33,30 +33,28 @@ impl RelativeToAll {
pub(crate) fn compute(
&mut self,
max_from: Height,
supply_in_profit_sats: &impl ReadableVec<Height, Sats>,
supply_in_loss_sats: &impl ReadableVec<Height, Sats>,
supply_total_sats: &impl ReadableVec<Height, Sats>,
supply: &SupplyCore,
all_supply_sats: &impl ReadableVec<Height, Sats>,
exit: &Exit,
) -> Result<()> {
self.supply_rel_to_circulating_supply
.compute_binary::<Sats, Sats, RatioSatsBp16>(
max_from,
supply_total_sats,
&supply.total.sats.height,
all_supply_sats,
exit,
)?;
self.supply_in_profit_rel_to_circulating_supply
.compute_binary::<Sats, Sats, RatioSatsBp16>(
max_from,
supply_in_profit_sats,
&supply.in_profit.sats.height,
all_supply_sats,
exit,
)?;
self.supply_in_loss_rel_to_circulating_supply
.compute_binary::<Sats, Sats, RatioSatsBp16>(
max_from,
supply_in_loss_sats,
&supply.in_loss.sats.height,
all_supply_sats,
exit,
)?;
@@ -4,7 +4,7 @@ use brk_types::{Dollars, Height, Sats};
use derive_more::{Deref, DerefMut};
use vecdb::{Exit, ReadableVec, Rw, StorageMode};
use crate::distribution::metrics::{ImportConfig, UnrealizedFull};
use crate::distribution::metrics::{ImportConfig, SupplyCore, UnrealizedFull};
use super::{RelativeFull, RelativeExtendedOwnMarketCap, RelativeExtendedOwnPnl, RelativeToAll};
@@ -38,8 +38,8 @@ impl RelativeWithExtended {
pub(crate) fn compute(
&mut self,
max_from: Height,
supply: &SupplyCore,
unrealized: &UnrealizedFull,
supply_total_sats: &impl ReadableVec<Height, Sats>,
market_cap: &impl ReadableVec<Height, Dollars>,
all_supply_sats: &impl ReadableVec<Height, Sats>,
own_market_cap: &impl ReadableVec<Height, Dollars>,
@@ -47,16 +47,14 @@ impl RelativeWithExtended {
) -> Result<()> {
self.base.compute(
max_from,
&unrealized.inner.core,
supply_total_sats,
supply,
&unrealized.inner.core.basic,
market_cap,
exit,
)?;
self.rel_to_all.compute(
max_from,
&unrealized.supply_in_profit.sats.height,
&unrealized.supply_in_loss.sats.height,
supply_total_sats,
supply,
all_supply_sats,
exit,
)?;
@@ -8,29 +8,29 @@ use crate::{blocks, internal::RollingDelta1m};
use crate::distribution::metrics::ImportConfig;
use super::SupplyBase;
use super::SupplyCore;
/// Full supply metrics: total + delta (4 stored vecs).
/// Full supply metrics: total + in_profit/in_loss + delta (6 stored vecs).
#[derive(Deref, DerefMut, Traversable)]
pub struct SupplyFull<M: StorageMode = Rw> {
#[deref]
#[deref_mut]
#[traversable(flatten)]
pub base: SupplyBase<M>,
pub core: SupplyCore<M>,
pub delta: RollingDelta1m<Sats, SatsSigned, M>,
}
impl SupplyFull {
pub(crate) fn forced_import(cfg: &ImportConfig) -> Result<Self> {
let base = SupplyBase::forced_import(cfg)?;
let core = SupplyCore::forced_import(cfg)?;
let delta = cfg.import("supply_delta", Version::ONE)?;
Ok(Self { base, delta })
Ok(Self { core, delta })
}
pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> {
self.base.collect_vecs_mut()
self.core.collect_vecs_mut()
}
pub(crate) fn validate_computed_versions(&mut self, _base_version: Version) -> Result<()> {
@@ -43,8 +43,9 @@ impl SupplyFull {
others: &[&Self],
exit: &Exit,
) -> Result<()> {
let base_refs: Vec<&SupplyBase> = others.iter().map(|o| &o.base).collect();
self.base.compute_from_stateful(starting_indexes, &base_refs, exit)
let core_refs: Vec<&SupplyCore> = others.iter().map(|o| &o.core).collect();
self.core
.compute_from_stateful(starting_indexes, &core_refs, exit)
}
pub(crate) fn compute_rest_part1(
@@ -56,7 +57,7 @@ impl SupplyFull {
self.delta.compute(
starting_indexes.height,
&blocks.lookback.height_1m_ago,
&self.base.total.sats.height,
&self.core.total.sats.height,
exit,
)
}
@@ -4,7 +4,7 @@ use brk_types::{CentsSats, CentsSquaredSats, Height, Indexes, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, BytesVec, Exit, ReadableVec, Rw, StorageMode, WritableVec};
use crate::{blocks, distribution::{metrics::ImportConfig, state::UnrealizedState}, prices};
use crate::{blocks, distribution::{metrics::ImportConfig, state::UnrealizedState}};
use super::UnrealizedCore;
@@ -166,11 +166,10 @@ impl UnrealizedBase {
pub(crate) fn compute_rest(
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
self.core.compute_rest(blocks, prices, starting_indexes, exit)?;
self.core.compute_rest(blocks, starting_indexes, exit)?;
Ok(())
}
}
@@ -1,26 +1,17 @@
use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{Cents, Height, Indexes, Version};
use derive_more::{Deref, DerefMut};
use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec};
use crate::{
blocks,
distribution::{metrics::ImportConfig, state::UnrealizedState},
internal::FiatPerBlockWithSum24h,
prices,
};
use super::UnrealizedMinimal;
/// Basic unrealized metrics: supply in profit/loss + unrealized profit/loss (fiat + 24h sums).
#[derive(Deref, DerefMut, Traversable)]
/// Basic unrealized metrics: unrealized profit/loss (fiat + 24h sums).
#[derive(Traversable)]
pub struct UnrealizedBasic<M: StorageMode = Rw> {
#[deref]
#[deref_mut]
#[traversable(flatten)]
pub minimal: UnrealizedMinimal<M>,
pub profit: FiatPerBlockWithSum24h<Cents, M>,
pub loss: FiatPerBlockWithSum24h<Cents, M>,
}
@@ -28,24 +19,23 @@ pub struct UnrealizedBasic<M: StorageMode = Rw> {
impl UnrealizedBasic {
pub(crate) fn forced_import(cfg: &ImportConfig) -> Result<Self> {
let v1 = Version::ONE;
let minimal = UnrealizedMinimal::forced_import(cfg)?;
Ok(Self {
minimal,
profit: cfg.import("unrealized_profit", v1)?,
loss: cfg.import("unrealized_loss", v1)?,
})
}
pub(crate) fn min_stateful_height_len(&self) -> usize {
self.minimal
.min_stateful_height_len()
.min(self.profit.raw.cents.height.len())
self.profit
.raw
.cents
.height
.len()
.min(self.loss.raw.cents.height.len())
}
pub(crate) fn truncate_push(&mut self, height: Height, state: &UnrealizedState) -> Result<()> {
self.minimal.truncate_push(height, state)?;
self.profit
.raw
.cents
@@ -60,10 +50,10 @@ impl UnrealizedBasic {
}
pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> {
let mut vecs = self.minimal.collect_vecs_mut();
vecs.push(&mut self.profit.raw.cents.height as &mut dyn AnyStoredVec);
vecs.push(&mut self.loss.raw.cents.height);
vecs
vec![
&mut self.profit.raw.cents.height as &mut dyn AnyStoredVec,
&mut self.loss.raw.cents.height,
]
}
pub(crate) fn compute_from_sources(
@@ -72,9 +62,6 @@ impl UnrealizedBasic {
others: &[&Self],
exit: &Exit,
) -> Result<()> {
let minimal_refs: Vec<&UnrealizedMinimal> = others.iter().map(|o| &o.minimal).collect();
self.minimal
.compute_from_sources(starting_indexes, &minimal_refs, exit)?;
sum_others!(self, starting_indexes, others, exit; profit.raw.cents.height);
sum_others!(self, starting_indexes, others, exit; loss.raw.cents.height);
Ok(())
@@ -83,12 +70,9 @@ impl UnrealizedBasic {
pub(crate) fn compute_rest(
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
max_from: Height,
exit: &Exit,
) -> Result<()> {
self.minimal.compute_rest(prices, max_from, exit)?;
self.profit.sum.compute_rolling_sum(
max_from,
&blocks.lookback.height_24h_ago,
@@ -11,7 +11,6 @@ use crate::{
state::UnrealizedState,
},
internal::{CentsSubtractToCentsSigned, FiatPerBlock, LazyPerBlock, NegCentsUnsignedToDollars},
prices,
};
use brk_types::Dollars;
@@ -83,12 +82,11 @@ impl UnrealizedCore {
pub(crate) fn compute_rest(
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
self.basic
.compute_rest(blocks, prices, starting_indexes.height, exit)?;
.compute_rest(blocks, starting_indexes.height, exit)?;
self.net_pnl
.cents
@@ -93,7 +93,7 @@ impl UnrealizedFull {
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
self.inner.compute_rest(blocks, prices, starting_indexes, exit)?;
self.inner.compute_rest(blocks, starting_indexes, exit)?;
self.gross_pnl.cents.height.compute_add(
starting_indexes.height,
@@ -1,80 +0,0 @@
use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{Height, Indexes, Version};
use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec};
use crate::prices;
use crate::internal::AmountPerBlock;
use crate::distribution::{metrics::ImportConfig, state::UnrealizedState};
/// Minimal unrealized metrics: supply in profit/loss only.
#[derive(Traversable)]
pub struct UnrealizedMinimal<M: StorageMode = Rw> {
#[traversable(wrap = "profit", rename = "supply")]
pub supply_in_profit: AmountPerBlock<M>,
#[traversable(wrap = "loss", rename = "supply")]
pub supply_in_loss: AmountPerBlock<M>,
}
impl UnrealizedMinimal {
pub(crate) fn forced_import(cfg: &ImportConfig) -> Result<Self> {
let v0 = Version::ZERO;
Ok(Self {
supply_in_profit: cfg.import("supply_in_profit", v0)?,
supply_in_loss: cfg.import("supply_in_loss", v0)?,
})
}
pub(crate) fn min_stateful_height_len(&self) -> usize {
self.supply_in_profit
.sats
.height
.len()
.min(self.supply_in_loss.sats.height.len())
}
pub(crate) fn truncate_push(&mut self, height: Height, state: &UnrealizedState) -> Result<()> {
self.supply_in_profit
.sats
.height
.truncate_push(height, state.supply_in_profit)?;
self.supply_in_loss
.sats
.height
.truncate_push(height, state.supply_in_loss)?;
Ok(())
}
pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> {
vec![
&mut self.supply_in_profit.sats.height as &mut dyn AnyStoredVec,
&mut self.supply_in_profit.cents.height,
&mut self.supply_in_loss.sats.height,
&mut self.supply_in_loss.cents.height,
]
}
pub(crate) fn compute_from_sources(
&mut self,
starting_indexes: &Indexes,
others: &[&Self],
exit: &Exit,
) -> Result<()> {
sum_others!(self, starting_indexes, others, exit; supply_in_profit.sats.height);
sum_others!(self, starting_indexes, others, exit; supply_in_loss.sats.height);
Ok(())
}
pub(crate) fn compute_rest(
&mut self,
prices: &prices::Vecs,
max_from: Height,
exit: &Exit,
) -> Result<()> {
self.supply_in_profit.compute(prices, max_from, exit)?;
self.supply_in_loss.compute(prices, max_from, exit)?;
Ok(())
}
}
@@ -2,13 +2,11 @@ mod base;
mod basic;
mod core;
mod full;
mod minimal;
pub use self::core::UnrealizedCore;
pub use base::UnrealizedBase;
pub use basic::UnrealizedBasic;
pub use full::UnrealizedFull;
pub use minimal::UnrealizedMinimal;
use brk_error::Result;
use brk_types::{Height, Indexes};
@@ -51,11 +49,11 @@ impl UnrealizedLike for UnrealizedBase {
fn compute_rest(
&mut self,
blocks: &blocks::Vecs,
prices: &prices::Vecs,
_prices: &prices::Vecs,
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
self.compute_rest(blocks, prices, starting_indexes, exit)
self.compute_rest(blocks, starting_indexes, exit)
}
fn compute_net_sentiment_height(
&mut self,
+76 -1
View File
@@ -1,5 +1,5 @@
use brk_error::Result;
use brk_types::{Dollars, Indexes};
use brk_types::{Bitcoin, Dollars, Indexes, StoredF32};
use vecdb::Exit;
use super::{gini, Vecs};
@@ -71,6 +71,81 @@ impl Vecs {
exit,
)?;
// Thermocap Multiple: market_cap / thermo_cap
// thermo_cap = cumulative subsidy in USD
self.thermocap_multiple
.bps
.compute_binary::<Dollars, Dollars, RatioDollarsBp32>(
starting_indexes.height,
market_cap,
&mining.rewards.subsidy.cumulative.usd.height,
exit,
)?;
let all_activity = &distribution.utxo_cohorts.all.metrics.activity;
let supply_total_sats = &distribution
.utxo_cohorts
.all
.metrics
.supply
.total
.sats
.height;
// Supply-Adjusted CDD = sum_24h(CDD) / circulating_supply_btc
self.coindays_destroyed_supply_adjusted
.height
.compute_transform2(
starting_indexes.height,
&all_activity.coindays_destroyed.sum._24h.height,
supply_total_sats,
|(i, cdd_24h, supply_sats, ..)| {
let supply = f64::from(Bitcoin::from(supply_sats));
if supply == 0.0 {
(i, StoredF32::from(0.0f32))
} else {
(i, StoredF32::from((f64::from(cdd_24h) / supply) as f32))
}
},
exit,
)?;
// Supply-Adjusted CYD = CYD / circulating_supply_btc (CYD = 1y rolling sum of CDD)
self.coinyears_destroyed_supply_adjusted
.height
.compute_transform2(
starting_indexes.height,
&all_activity.coinyears_destroyed.height,
supply_total_sats,
|(i, cyd, supply_sats, ..)| {
let supply = f64::from(Bitcoin::from(supply_sats));
if supply == 0.0 {
(i, StoredF32::from(0.0f32))
} else {
(i, StoredF32::from((f64::from(cyd) / supply) as f32))
}
},
exit,
)?;
// Supply-Adjusted Dormancy = dormancy / circulating_supply_btc
self.dormancy_supply_adjusted
.height
.compute_transform2(
starting_indexes.height,
&all_activity.dormancy.height,
supply_total_sats,
|(i, dormancy, supply_sats, ..)| {
let supply = f64::from(Bitcoin::from(supply_sats));
if supply == 0.0 {
(i, StoredF32::from(0.0f32))
} else {
(i, StoredF32::from((f64::from(dormancy) / supply) as f32))
}
},
exit,
)?;
let _lock = exit.lock();
self.db.compact()?;
Ok(())
+13 -1
View File
@@ -6,7 +6,7 @@ use brk_types::Version;
use super::Vecs;
use crate::{
indexes,
internal::{finalize_db, open_db, PercentPerBlock, RatioPerBlock},
internal::{finalize_db, open_db, ComputedPerBlock, PercentPerBlock, RatioPerBlock},
};
const VERSION: Version = Version::new(1);
@@ -24,6 +24,14 @@ impl Vecs {
let nvt = RatioPerBlock::forced_import_raw(&db, "nvt", v, indexes)?;
let gini = PercentPerBlock::forced_import(&db, "gini", v, indexes)?;
let rhodl_ratio = RatioPerBlock::forced_import_raw(&db, "rhodl_ratio", v, indexes)?;
let thermocap_multiple =
RatioPerBlock::forced_import_raw(&db, "thermocap_multiple", v, indexes)?;
let coindays_destroyed_supply_adjusted =
ComputedPerBlock::forced_import(&db, "coindays_destroyed_supply_adjusted", v, indexes)?;
let coinyears_destroyed_supply_adjusted =
ComputedPerBlock::forced_import(&db, "coinyears_destroyed_supply_adjusted", v, indexes)?;
let dormancy_supply_adjusted =
ComputedPerBlock::forced_import(&db, "dormancy_supply_adjusted", v, indexes)?;
let this = Self {
db,
@@ -31,6 +39,10 @@ impl Vecs {
nvt,
gini,
rhodl_ratio,
thermocap_multiple,
coindays_destroyed_supply_adjusted,
coinyears_destroyed_supply_adjusted,
dormancy_supply_adjusted,
};
finalize_db(&this.db, &this)?;
Ok(this)
+6 -2
View File
@@ -1,8 +1,8 @@
use brk_traversable::Traversable;
use brk_types::{BasisPoints16, BasisPoints32};
use brk_types::{BasisPoints16, BasisPoints32, StoredF32};
use vecdb::{Database, Rw, StorageMode};
use crate::internal::{PercentPerBlock, RatioPerBlock};
use crate::internal::{ComputedPerBlock, PercentPerBlock, RatioPerBlock};
#[derive(Traversable)]
pub struct Vecs<M: StorageMode = Rw> {
@@ -12,4 +12,8 @@ pub struct Vecs<M: StorageMode = Rw> {
pub nvt: RatioPerBlock<BasisPoints32, M>,
pub gini: PercentPerBlock<BasisPoints16, M>,
pub rhodl_ratio: RatioPerBlock<BasisPoints32, M>,
pub thermocap_multiple: RatioPerBlock<BasisPoints32, M>,
pub coindays_destroyed_supply_adjusted: ComputedPerBlock<StoredF32, M>,
pub coinyears_destroyed_supply_adjusted: ComputedPerBlock<StoredF32, M>,
pub dormancy_supply_adjusted: ComputedPerBlock<StoredF32, M>,
}
+183 -196
View File
@@ -2185,6 +2185,37 @@ function createCapitulationCumulativeNegativeRawRelSumValuePattern(client, acc)
};
}
/**
* @typedef {Object} CoindaysCoinyearsDormancySentVelocityPattern
* @property {CumulativeRawSumPattern<StoredF64>} coindaysDestroyed
* @property {MetricPattern1<StoredF32>} coindaysDestroyedSupplyAdjusted
* @property {MetricPattern1<StoredF64>} coinyearsDestroyed
* @property {MetricPattern1<StoredF32>} coinyearsDestroyedSupplyAdjusted
* @property {MetricPattern1<StoredF32>} dormancy
* @property {MetricPattern1<StoredF32>} dormancySupplyAdjusted
* @property {RawSumPattern3<Sats>} sent
* @property {MetricPattern1<StoredF32>} velocity
*/
/**
* Create a CoindaysCoinyearsDormancySentVelocityPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {CoindaysCoinyearsDormancySentVelocityPattern}
*/
function createCoindaysCoinyearsDormancySentVelocityPattern(client, acc) {
return {
coindaysDestroyed: createCumulativeRawSumPattern(client, _m(acc, 'coindays_destroyed')),
coindaysDestroyedSupplyAdjusted: createMetricPattern1(client, _m(acc, 'coindays_destroyed_supply_adjusted')),
coinyearsDestroyed: createMetricPattern1(client, _m(acc, 'coinyears_destroyed')),
coinyearsDestroyedSupplyAdjusted: createMetricPattern1(client, _m(acc, 'coinyears_destroyed_supply_adjusted')),
dormancy: createMetricPattern1(client, _m(acc, 'dormancy')),
dormancySupplyAdjusted: createMetricPattern1(client, _m(acc, 'dormancy_supply_adjusted')),
sent: createRawSumPattern3(client, _m(acc, 'sent')),
velocity: createMetricPattern1(client, _m(acc, 'velocity')),
};
}
/**
* @typedef {Object} Pct1Pct2Pct5Pct95Pct98Pct99SmaPattern
* @property {BpsPriceRatioPattern} pct1
@@ -2307,35 +2338,6 @@ function create_1m1w1y24hBpsPercentRatioPattern(client, acc) {
};
}
/**
* @typedef {Object} CoindaysCoinyearsDormancySentVelocityPattern
* @property {CumulativeRawSumPattern<StoredF64>} coindaysDestroyed
* @property {MetricPattern1<StoredF32>} coindaysDestroyedSupplyAdjusted
* @property {MetricPattern1<StoredF64>} coinyearsDestroyed
* @property {MetricPattern1<StoredF32>} coinyearsDestroyedSupplyAdjusted
* @property {MetricPattern1<StoredF32>} dormancy
* @property {RawSumPattern3<Sats>} sent
* @property {MetricPattern1<StoredF32>} velocity
*/
/**
* Create a CoindaysCoinyearsDormancySentVelocityPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {CoindaysCoinyearsDormancySentVelocityPattern}
*/
function createCoindaysCoinyearsDormancySentVelocityPattern(client, acc) {
return {
coindaysDestroyed: createCumulativeRawSumPattern(client, _m(acc, 'coindays_destroyed')),
coindaysDestroyedSupplyAdjusted: createMetricPattern1(client, _m(acc, 'coindays_destroyed_supply_adjusted')),
coinyearsDestroyed: createMetricPattern1(client, _m(acc, 'coinyears_destroyed')),
coinyearsDestroyedSupplyAdjusted: createMetricPattern1(client, _m(acc, 'coinyears_destroyed_supply_adjusted')),
dormancy: createMetricPattern1(client, _m(acc, 'dormancy')),
sent: createRawSumPattern3(client, _m(acc, 'sent')),
velocity: createMetricPattern1(client, _m(acc, 'velocity')),
};
}
/**
* @typedef {Object} CumulativeDistributionRawRelSumValuePattern
* @property {MetricPattern1<Cents>} cumulative
@@ -2370,9 +2372,9 @@ function createCumulativeDistributionRawRelSumValuePattern(client, acc) {
* @property {CentsUsdPattern} grossPnl
* @property {InPattern4} investedCapital
* @property {InPattern2} investorCap
* @property {NegativeRawRelSumSupplyPattern2} loss
* @property {NegativeRawRelSumPattern2} loss
* @property {CentsRelUsdPattern2} netPnl
* @property {RawRelSumSupplyPattern2} profit
* @property {RawRelSumPattern2} profit
* @property {GreedNetPainPattern} sentiment
*/
@@ -2387,42 +2389,13 @@ function createGrossInvestedInvestorLossNetProfitSentimentPattern2(client, acc)
grossPnl: createCentsUsdPattern(client, _m(acc, 'unrealized_gross_pnl')),
investedCapital: createInPattern4(client, _m(acc, 'invested_capital_in')),
investorCap: createInPattern2(client, _m(acc, 'investor_cap_in')),
loss: createNegativeRawRelSumSupplyPattern2(client, acc),
loss: createNegativeRawRelSumPattern2(client, acc),
netPnl: createCentsRelUsdPattern2(client, _m(acc, 'net_unrealized_pnl')),
profit: createRawRelSumSupplyPattern2(client, acc),
profit: createRawRelSumPattern2(client, _m(acc, 'unrealized_profit')),
sentiment: createGreedNetPainPattern(client, acc),
};
}
/**
* @typedef {Object} NegativeRawRelSumSupplyPattern2
* @property {MetricPattern1<Dollars>} negative
* @property {CentsUsdPattern} raw
* @property {BpsPercentRatioPattern} relToMarketCap
* @property {BpsPercentRatioPattern} relToOwnGrossPnl
* @property {BpsPercentRatioPattern} relToOwnMarketCap
* @property {_24hPattern} sum
* @property {BtcCentsRelSatsUsdPattern3} supply
*/
/**
* Create a NegativeRawRelSumSupplyPattern2 pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {NegativeRawRelSumSupplyPattern2}
*/
function createNegativeRawRelSumSupplyPattern2(client, acc) {
return {
negative: createMetricPattern1(client, _m(acc, 'neg_unrealized_loss')),
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_loss')),
relToMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_market_cap')),
relToOwnGrossPnl: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_gross_pnl')),
relToOwnMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_market_cap')),
sum: create_24hPattern(client, _m(acc, 'unrealized_loss_24h')),
supply: createBtcCentsRelSatsUsdPattern3(client, _m(acc, 'supply_in_loss')),
};
}
/**
* @typedef {Object} BtcCentsRelSatsUsdPattern3
* @property {MetricPattern1<Bitcoin>} btc
@@ -2505,29 +2478,83 @@ function createChangeCumulativeDeltaRawRelSumPattern(client, acc) {
}
/**
* @typedef {Object} RawRelSumSupplyPattern2
* @typedef {Object} DeltaHalvedInRelTotalPattern
* @property {ChangeRatePattern} delta
* @property {BtcCentsSatsUsdPattern} halved
* @property {BtcCentsRelSatsUsdPattern} inLoss
* @property {BtcCentsRelSatsUsdPattern} inProfit
* @property {BpsPercentRatioPattern} relToCirculatingSupply
* @property {BtcCentsSatsUsdPattern} total
*/
/**
* Create a DeltaHalvedInRelTotalPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {DeltaHalvedInRelTotalPattern}
*/
function createDeltaHalvedInRelTotalPattern(client, acc) {
return {
delta: createChangeRatePattern(client, _m(acc, 'delta')),
halved: createBtcCentsSatsUsdPattern(client, _m(acc, 'halved')),
inLoss: createBtcCentsRelSatsUsdPattern(client, _m(acc, 'in_loss')),
inProfit: createBtcCentsRelSatsUsdPattern(client, _m(acc, 'in_profit')),
relToCirculatingSupply: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply')),
total: createBtcCentsSatsUsdPattern(client, acc),
};
}
/**
* @typedef {Object} DeltaHalvedInRelTotalPattern2
* @property {ChangeRatePattern2} delta
* @property {BtcCentsSatsUsdPattern} halved
* @property {BtcCentsRelSatsUsdPattern3} inLoss
* @property {BtcCentsRelSatsUsdPattern3} inProfit
* @property {BpsPercentRatioPattern} relToCirculatingSupply
* @property {BtcCentsSatsUsdPattern} total
*/
/**
* Create a DeltaHalvedInRelTotalPattern2 pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {DeltaHalvedInRelTotalPattern2}
*/
function createDeltaHalvedInRelTotalPattern2(client, acc) {
return {
delta: createChangeRatePattern2(client, _m(acc, 'delta')),
halved: createBtcCentsSatsUsdPattern(client, _m(acc, 'halved')),
inLoss: createBtcCentsRelSatsUsdPattern3(client, _m(acc, 'in_loss')),
inProfit: createBtcCentsRelSatsUsdPattern3(client, _m(acc, 'in_profit')),
relToCirculatingSupply: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply')),
total: createBtcCentsSatsUsdPattern(client, acc),
};
}
/**
* @typedef {Object} NegativeRawRelSumPattern2
* @property {MetricPattern1<Dollars>} negative
* @property {CentsUsdPattern} raw
* @property {BpsPercentRatioPattern} relToMarketCap
* @property {BpsPercentRatioPattern} relToOwnGrossPnl
* @property {BpsPercentRatioPattern} relToOwnMarketCap
* @property {_24hPattern} sum
* @property {BtcCentsRelSatsUsdPattern3} supply
*/
/**
* Create a RawRelSumSupplyPattern2 pattern node
* Create a NegativeRawRelSumPattern2 pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {RawRelSumSupplyPattern2}
* @returns {NegativeRawRelSumPattern2}
*/
function createRawRelSumSupplyPattern2(client, acc) {
function createNegativeRawRelSumPattern2(client, acc) {
return {
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_profit')),
relToMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_profit_rel_to_market_cap')),
relToOwnGrossPnl: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_profit_rel_to_own_gross_pnl')),
relToOwnMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_profit_rel_to_own_market_cap')),
sum: create_24hPattern(client, _m(acc, 'unrealized_profit_24h')),
supply: createBtcCentsRelSatsUsdPattern3(client, _m(acc, 'supply_in_profit')),
negative: createMetricPattern1(client, _m(acc, 'neg_unrealized_loss')),
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_loss')),
relToMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_market_cap')),
relToOwnGrossPnl: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_gross_pnl')),
relToOwnMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_market_cap')),
sum: create_24hPattern(client, _m(acc, 'unrealized_loss_24h')),
};
}
@@ -2536,7 +2563,7 @@ function createRawRelSumSupplyPattern2(client, acc) {
* @property {CoindaysSentPattern} activity
* @property {UtxoPattern2} outputs
* @property {CapLossMvrvNetNuplPriceProfitSentSoprPattern} realized
* @property {DeltaHalvedRelTotalPattern} supply
* @property {DeltaHalvedInRelTotalPattern} supply
* @property {InvestedInvestorLossNetProfitPattern} unrealized
*/
@@ -2551,7 +2578,7 @@ function createActivityOutputsRealizedSupplyUnrealizedPattern(client, acc) {
activity: createCoindaysSentPattern(client, acc),
outputs: createUtxoPattern2(client, _m(acc, 'utxo_count')),
realized: createCapLossMvrvNetNuplPriceProfitSentSoprPattern(client, acc),
supply: createDeltaHalvedRelTotalPattern(client, _m(acc, 'supply')),
supply: createDeltaHalvedInRelTotalPattern(client, _m(acc, 'supply')),
unrealized: createInvestedInvestorLossNetProfitPattern(client, acc),
};
}
@@ -2561,7 +2588,7 @@ function createActivityOutputsRealizedSupplyUnrealizedPattern(client, acc) {
* @property {CoindaysSentPattern} activity
* @property {UtxoPattern2} outputs
* @property {CapLossMvrvNetNuplPriceProfitSentSoprPattern} realized
* @property {DeltaHalvedRelTotalPattern} supply
* @property {DeltaHalvedInRelTotalPattern} supply
* @property {LossNetProfitPattern} unrealized
*/
@@ -2576,7 +2603,7 @@ function createActivityOutputsRealizedSupplyUnrealizedPattern2(client, acc) {
activity: createCoindaysSentPattern(client, acc),
outputs: createUtxoPattern2(client, _m(acc, 'utxo_count')),
realized: createCapLossMvrvNetNuplPriceProfitSentSoprPattern(client, acc),
supply: createDeltaHalvedRelTotalPattern(client, _m(acc, 'supply')),
supply: createDeltaHalvedInRelTotalPattern(client, _m(acc, 'supply')),
unrealized: createLossNetProfitPattern(client, acc),
};
}
@@ -2710,9 +2737,9 @@ function createEmaHistogramLineSignalPattern(client, acc) {
* @typedef {Object} InvestedInvestorLossNetProfitPattern
* @property {InPattern2} investedCapital
* @property {InPattern2} investorCap
* @property {NegativeRawSumSupplyPattern} loss
* @property {NegativeRawSumPattern} loss
* @property {CentsUsdPattern} netPnl
* @property {RawSumSupplyPattern} profit
* @property {RawSumPattern} profit
*/
/**
@@ -2725,9 +2752,9 @@ function createInvestedInvestorLossNetProfitPattern(client, acc) {
return {
investedCapital: createInPattern2(client, _m(acc, 'invested_capital_in')),
investorCap: createInPattern2(client, _m(acc, 'investor_cap_in')),
loss: createNegativeRawSumSupplyPattern(client, acc),
loss: createNegativeRawSumPattern(client, acc),
netPnl: createCentsUsdPattern(client, _m(acc, 'net_unrealized_pnl')),
profit: createRawSumSupplyPattern(client, acc),
profit: createRawSumPattern(client, _m(acc, 'unrealized_profit')),
};
}
@@ -2756,6 +2783,31 @@ function createPhsReboundThsPattern(client, acc) {
};
}
/**
* @typedef {Object} RawRelSumPattern2
* @property {CentsUsdPattern} raw
* @property {BpsPercentRatioPattern} relToMarketCap
* @property {BpsPercentRatioPattern} relToOwnGrossPnl
* @property {BpsPercentRatioPattern} relToOwnMarketCap
* @property {_24hPattern} sum
*/
/**
* Create a RawRelSumPattern2 pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {RawRelSumPattern2}
*/
function createRawRelSumPattern2(client, acc) {
return {
raw: createCentsUsdPattern(client, acc),
relToMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_market_cap')),
relToOwnGrossPnl: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_own_gross_pnl')),
relToOwnMarketCap: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_own_market_cap')),
sum: create_24hPattern(client, _m(acc, '24h')),
};
}
/**
* @template T
* @typedef {Object} _1m1w1y24hHeightPattern
@@ -3083,47 +3135,24 @@ function createCumulativeNegativeRawSumPattern(client, acc) {
}
/**
* @typedef {Object} DeltaHalvedRelTotalPattern
* @property {ChangeRatePattern} delta
* @typedef {Object} HalvedInTotalPattern
* @property {BtcCentsSatsUsdPattern} halved
* @property {BpsPercentRatioPattern} relToCirculatingSupply
* @property {BtcCentsSatsUsdPattern} inLoss
* @property {BtcCentsSatsUsdPattern} inProfit
* @property {BtcCentsSatsUsdPattern} total
*/
/**
* Create a DeltaHalvedRelTotalPattern pattern node
* Create a HalvedInTotalPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {DeltaHalvedRelTotalPattern}
* @returns {HalvedInTotalPattern}
*/
function createDeltaHalvedRelTotalPattern(client, acc) {
function createHalvedInTotalPattern(client, acc) {
return {
delta: createChangeRatePattern(client, _m(acc, 'delta')),
halved: createBtcCentsSatsUsdPattern(client, _m(acc, 'halved')),
relToCirculatingSupply: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply')),
total: createBtcCentsSatsUsdPattern(client, acc),
};
}
/**
* @typedef {Object} DeltaHalvedRelTotalPattern2
* @property {ChangeRatePattern2} delta
* @property {BtcCentsSatsUsdPattern} halved
* @property {BpsPercentRatioPattern} relToCirculatingSupply
* @property {BtcCentsSatsUsdPattern} total
*/
/**
* Create a DeltaHalvedRelTotalPattern2 pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {DeltaHalvedRelTotalPattern2}
*/
function createDeltaHalvedRelTotalPattern2(client, acc) {
return {
delta: createChangeRatePattern2(client, _m(acc, 'delta')),
halved: createBtcCentsSatsUsdPattern(client, _m(acc, 'halved')),
relToCirculatingSupply: createBpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply')),
inLoss: createBtcCentsSatsUsdPattern(client, _m(acc, 'in_loss')),
inProfit: createBtcCentsSatsUsdPattern(client, _m(acc, 'in_profit')),
total: createBtcCentsSatsUsdPattern(client, acc),
};
}
@@ -3151,34 +3180,11 @@ function createInvestedMaxMinPercentilesPattern(client, acc) {
};
}
/**
* @typedef {Object} NegativeRawSumSupplyPattern
* @property {MetricPattern1<Dollars>} negative
* @property {CentsUsdPattern} raw
* @property {_24hPattern} sum
* @property {BtcCentsRelSatsUsdPattern} supply
*/
/**
* Create a NegativeRawSumSupplyPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {NegativeRawSumSupplyPattern}
*/
function createNegativeRawSumSupplyPattern(client, acc) {
return {
negative: createMetricPattern1(client, _m(acc, 'neg_unrealized_loss')),
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_loss')),
sum: create_24hPattern(client, _m(acc, 'unrealized_loss_24h')),
supply: createBtcCentsRelSatsUsdPattern(client, _m(acc, 'supply_in_loss')),
};
}
/**
* @typedef {Object} OutputsRealizedSupplyUnrealizedPattern
* @property {UtxoPattern} outputs
* @property {CapLossMvrvNuplPriceProfitSoprPattern} realized
* @property {HalvedTotalPattern} supply
* @property {HalvedInTotalPattern} supply
* @property {LossProfitPattern2} unrealized
*/
@@ -3192,8 +3198,8 @@ function createOutputsRealizedSupplyUnrealizedPattern(client, acc) {
return {
outputs: createUtxoPattern(client, _m(acc, 'utxo_count')),
realized: createCapLossMvrvNuplPriceProfitSoprPattern(client, acc),
supply: createHalvedTotalPattern(client, _m(acc, 'supply')),
unrealized: createLossProfitPattern2(client, acc),
supply: createHalvedInTotalPattern(client, _m(acc, 'supply')),
unrealized: createLossProfitPattern2(client, _m(acc, 'unrealized')),
};
}
@@ -3455,9 +3461,9 @@ function createGreedNetPainPattern(client, acc) {
/**
* @typedef {Object} LossNetProfitPattern
* @property {NegativeRawSumSupplyPattern} loss
* @property {NegativeRawSumPattern} loss
* @property {CentsUsdPattern} netPnl
* @property {RawSumSupplyPattern} profit
* @property {RawSumPattern} profit
*/
/**
@@ -3468,9 +3474,30 @@ function createGreedNetPainPattern(client, acc) {
*/
function createLossNetProfitPattern(client, acc) {
return {
loss: createNegativeRawSumSupplyPattern(client, acc),
loss: createNegativeRawSumPattern(client, acc),
netPnl: createCentsUsdPattern(client, _m(acc, 'net_unrealized_pnl')),
profit: createRawSumSupplyPattern(client, acc),
profit: createRawSumPattern(client, _m(acc, 'unrealized_profit')),
};
}
/**
* @typedef {Object} NegativeRawSumPattern
* @property {MetricPattern1<Dollars>} negative
* @property {CentsUsdPattern} raw
* @property {_24hPattern} sum
*/
/**
* Create a NegativeRawSumPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {NegativeRawSumPattern}
*/
function createNegativeRawSumPattern(client, acc) {
return {
negative: createMetricPattern1(client, _m(acc, 'neg_unrealized_loss')),
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_loss')),
sum: create_24hPattern(client, _m(acc, 'unrealized_loss_24h')),
};
}
@@ -3558,48 +3585,6 @@ function createRawSellSumPattern(client, acc) {
};
}
/**
* @typedef {Object} RawSumSupplyPattern
* @property {CentsUsdPattern} raw
* @property {_24hPattern} sum
* @property {BtcCentsRelSatsUsdPattern} supply
*/
/**
* Create a RawSumSupplyPattern pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {RawSumSupplyPattern}
*/
function createRawSumSupplyPattern(client, acc) {
return {
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_profit')),
sum: create_24hPattern(client, _m(acc, 'unrealized_profit_24h')),
supply: createBtcCentsRelSatsUsdPattern(client, _m(acc, 'supply_in_profit')),
};
}
/**
* @typedef {Object} RawSumSupplyPattern2
* @property {CentsUsdPattern} raw
* @property {_24hPattern} sum
* @property {BtcCentsSatsUsdPattern} supply
*/
/**
* Create a RawSumSupplyPattern2 pattern node
* @param {BrkClientBase} client
* @param {string} acc - Accumulated metric name
* @returns {RawSumSupplyPattern2}
*/
function createRawSumSupplyPattern2(client, acc) {
return {
raw: createCentsUsdPattern(client, _m(acc, 'unrealized_profit')),
sum: create_24hPattern(client, _m(acc, 'unrealized_profit_24h')),
supply: createBtcCentsSatsUsdPattern(client, _m(acc, 'supply_in_profit')),
};
}
/**
* @template T
* @typedef {Object} _6bBlockTxindexPattern
@@ -3933,8 +3918,8 @@ function createInPattern3(client, acc) {
/**
* @typedef {Object} LossProfitPattern2
* @property {RawSumSupplyPattern2} loss
* @property {RawSumSupplyPattern2} profit
* @property {RawSumPattern} loss
* @property {RawSumPattern} profit
*/
/**
@@ -3945,8 +3930,8 @@ function createInPattern3(client, acc) {
*/
function createLossProfitPattern2(client, acc) {
return {
loss: createRawSumSupplyPattern2(client, acc),
profit: createRawSumSupplyPattern2(client, acc),
loss: createRawSumPattern(client, _m(acc, 'loss')),
profit: createRawSumPattern(client, _m(acc, 'profit')),
};
}
@@ -5059,6 +5044,7 @@ function createRawPattern(client, acc) {
* @property {BpsRatioPattern} nvt
* @property {BpsPercentRatioPattern} gini
* @property {BpsRatioPattern} rhodlRatio
* @property {BpsRatioPattern} thermocapMultiple
*/
/**
@@ -5884,6 +5870,8 @@ function createRawPattern(client, acc) {
/**
* @typedef {Object} MetricsTree_Distribution_UtxoCohorts_All_Supply
* @property {ChangeRatePattern2} delta
* @property {BtcCentsRelSatsUsdPattern2} inProfit
* @property {BtcCentsRelSatsUsdPattern2} inLoss
* @property {BtcCentsSatsUsdPattern} total
* @property {BtcCentsSatsUsdPattern} halved
*/
@@ -5904,7 +5892,6 @@ function createRawPattern(client, acc) {
* @property {MetricPattern1<Dollars>} negative
* @property {CentsUsdPattern} raw
* @property {_24hPattern} sum
* @property {BtcCentsRelSatsUsdPattern2} supply
* @property {BpsPercentRatioPattern} relToMarketCap
* @property {BpsPercentRatioPattern} relToOwnGrossPnl
*/
@@ -5920,7 +5907,6 @@ function createRawPattern(client, acc) {
* @typedef {Object} MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Profit
* @property {CentsUsdPattern} raw
* @property {_24hPattern} sum
* @property {BtcCentsRelSatsUsdPattern2} supply
* @property {BpsPercentRatioPattern} relToMarketCap
* @property {BpsPercentRatioPattern} relToOwnGrossPnl
*/
@@ -5928,7 +5914,7 @@ function createRawPattern(client, acc) {
/**
* @typedef {Object} MetricsTree_Distribution_UtxoCohorts_Sth
* @property {CapGrossInvestorLossMvrvNetNuplPeakPriceProfitSentSoprPattern} realized
* @property {DeltaHalvedRelTotalPattern2} supply
* @property {DeltaHalvedInRelTotalPattern2} supply
* @property {UtxoPattern3} outputs
* @property {CoindaysCoinyearsDormancySentVelocityPattern} activity
* @property {InvestedMaxMinPercentilesPattern} costBasis
@@ -5937,7 +5923,7 @@ function createRawPattern(client, acc) {
/**
* @typedef {Object} MetricsTree_Distribution_UtxoCohorts_Lth
* @property {DeltaHalvedRelTotalPattern2} supply
* @property {DeltaHalvedInRelTotalPattern2} supply
* @property {UtxoPattern3} outputs
* @property {CoindaysCoinyearsDormancySentVelocityPattern} activity
* @property {MetricsTree_Distribution_UtxoCohorts_Lth_Realized} realized
@@ -7792,6 +7778,7 @@ class BrkClient extends BrkClientBase {
nvt: createBpsRatioPattern(this, 'nvt'),
gini: createBpsPercentRatioPattern(this, 'gini'),
rhodlRatio: createBpsRatioPattern(this, 'rhodl_ratio'),
thermocapMultiple: createBpsRatioPattern(this, 'thermocap_multiple'),
},
market: {
ath: {
@@ -8371,6 +8358,8 @@ class BrkClient extends BrkClientBase {
all: {
supply: {
delta: createChangeRatePattern2(this, 'supply_delta'),
inProfit: createBtcCentsRelSatsUsdPattern2(this, 'supply_in_profit'),
inLoss: createBtcCentsRelSatsUsdPattern2(this, 'supply_in_loss'),
total: createBtcCentsSatsUsdPattern(this, 'supply'),
halved: createBtcCentsSatsUsdPattern(this, 'supply_halved'),
},
@@ -8387,7 +8376,6 @@ class BrkClient extends BrkClientBase {
negative: createMetricPattern1(this, 'neg_unrealized_loss'),
raw: createCentsUsdPattern(this, 'unrealized_loss'),
sum: create_24hPattern(this, 'unrealized_loss_24h'),
supply: createBtcCentsRelSatsUsdPattern2(this, 'supply_in_loss'),
relToMarketCap: createBpsPercentRatioPattern(this, 'unrealized_loss_rel_to_market_cap'),
relToOwnGrossPnl: createBpsPercentRatioPattern(this, 'unrealized_loss_rel_to_own_gross_pnl'),
},
@@ -8399,7 +8387,6 @@ class BrkClient extends BrkClientBase {
profit: {
raw: createCentsUsdPattern(this, 'unrealized_profit'),
sum: create_24hPattern(this, 'unrealized_profit_24h'),
supply: createBtcCentsRelSatsUsdPattern2(this, 'supply_in_profit'),
relToMarketCap: createBpsPercentRatioPattern(this, 'unrealized_profit_rel_to_market_cap'),
relToOwnGrossPnl: createBpsPercentRatioPattern(this, 'unrealized_profit_rel_to_own_gross_pnl'),
},
@@ -8407,14 +8394,14 @@ class BrkClient extends BrkClientBase {
},
sth: {
realized: createCapGrossInvestorLossMvrvNetNuplPeakPriceProfitSentSoprPattern(this, 'sth'),
supply: createDeltaHalvedRelTotalPattern2(this, 'sth_supply'),
supply: createDeltaHalvedInRelTotalPattern2(this, 'sth_supply'),
outputs: createUtxoPattern3(this, 'sth_utxo_count'),
activity: createCoindaysCoinyearsDormancySentVelocityPattern(this, 'sth'),
costBasis: createInvestedMaxMinPercentilesPattern(this, 'sth'),
unrealized: createGrossInvestedInvestorLossNetProfitSentimentPattern2(this, 'sth'),
},
lth: {
supply: createDeltaHalvedRelTotalPattern2(this, 'lth_supply'),
supply: createDeltaHalvedInRelTotalPattern2(this, 'lth_supply'),
outputs: createUtxoPattern3(this, 'lth_utxo_count'),
activity: createCoindaysCoinyearsDormancySentVelocityPattern(this, 'lth'),
realized: {
+85 -90
View File
@@ -2369,6 +2369,20 @@ class CapitulationCumulativeNegativeRawRelSumValuePattern:
self.value_created: BaseSumPattern = BaseSumPattern(client, _m(acc, 'loss_value_created'))
self.value_destroyed: BaseSumPattern = BaseSumPattern(client, _m(acc, 'loss_value_destroyed'))
class CoindaysCoinyearsDormancySentVelocityPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.coindays_destroyed: CumulativeRawSumPattern[StoredF64] = CumulativeRawSumPattern(client, _m(acc, 'coindays_destroyed'))
self.coindays_destroyed_supply_adjusted: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'coindays_destroyed_supply_adjusted'))
self.coinyears_destroyed: MetricPattern1[StoredF64] = MetricPattern1(client, _m(acc, 'coinyears_destroyed'))
self.coinyears_destroyed_supply_adjusted: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'coinyears_destroyed_supply_adjusted'))
self.dormancy: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'dormancy'))
self.dormancy_supply_adjusted: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'dormancy_supply_adjusted'))
self.sent: RawSumPattern3[Sats] = RawSumPattern3(client, _m(acc, 'sent'))
self.velocity: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'velocity'))
class Pct1Pct2Pct5Pct95Pct98Pct99SmaPattern:
"""Pattern struct for repeated tree structure."""
@@ -2423,19 +2437,6 @@ class _1m1w1y24hBpsPercentRatioPattern:
self.percent: MetricPattern1[StoredF32] = MetricPattern1(client, acc)
self.ratio: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'ratio'))
class CoindaysCoinyearsDormancySentVelocityPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.coindays_destroyed: CumulativeRawSumPattern[StoredF64] = CumulativeRawSumPattern(client, _m(acc, 'coindays_destroyed'))
self.coindays_destroyed_supply_adjusted: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'coindays_destroyed_supply_adjusted'))
self.coinyears_destroyed: MetricPattern1[StoredF64] = MetricPattern1(client, _m(acc, 'coinyears_destroyed'))
self.coinyears_destroyed_supply_adjusted: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'coinyears_destroyed_supply_adjusted'))
self.dormancy: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'dormancy'))
self.sent: RawSumPattern3[Sats] = RawSumPattern3(client, _m(acc, 'sent'))
self.velocity: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'velocity'))
class CumulativeDistributionRawRelSumValuePattern:
"""Pattern struct for repeated tree structure."""
@@ -2457,24 +2458,11 @@ class GrossInvestedInvestorLossNetProfitSentimentPattern2:
self.gross_pnl: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_gross_pnl'))
self.invested_capital: InPattern4 = InPattern4(client, _m(acc, 'invested_capital_in'))
self.investor_cap: InPattern2 = InPattern2(client, _m(acc, 'investor_cap_in'))
self.loss: NegativeRawRelSumSupplyPattern2 = NegativeRawRelSumSupplyPattern2(client, acc)
self.loss: NegativeRawRelSumPattern2 = NegativeRawRelSumPattern2(client, acc)
self.net_pnl: CentsRelUsdPattern2 = CentsRelUsdPattern2(client, _m(acc, 'net_unrealized_pnl'))
self.profit: RawRelSumSupplyPattern2 = RawRelSumSupplyPattern2(client, acc)
self.profit: RawRelSumPattern2 = RawRelSumPattern2(client, _m(acc, 'unrealized_profit'))
self.sentiment: GreedNetPainPattern = GreedNetPainPattern(client, acc)
class NegativeRawRelSumSupplyPattern2:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.negative: MetricPattern1[Dollars] = MetricPattern1(client, _m(acc, 'neg_unrealized_loss'))
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_loss'))
self.rel_to_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_market_cap'))
self.rel_to_own_gross_pnl: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_gross_pnl'))
self.rel_to_own_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_market_cap'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_loss_24h'))
self.supply: BtcCentsRelSatsUsdPattern3 = BtcCentsRelSatsUsdPattern3(client, _m(acc, 'supply_in_loss'))
class BtcCentsRelSatsUsdPattern3:
"""Pattern struct for repeated tree structure."""
@@ -2511,17 +2499,41 @@ class ChangeCumulativeDeltaRawRelSumPattern:
self.rel_to_rcap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'realized_pnl_rel_to_realized_cap'))
self.sum: _1m1w1y24hPattern[CentsSigned] = _1m1w1y24hPattern(client, _m(acc, 'realized_pnl'))
class RawRelSumSupplyPattern2:
class DeltaHalvedInRelTotalPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_profit'))
self.rel_to_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_profit_rel_to_market_cap'))
self.rel_to_own_gross_pnl: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_profit_rel_to_own_gross_pnl'))
self.rel_to_own_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_profit_rel_to_own_market_cap'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_profit_24h'))
self.supply: BtcCentsRelSatsUsdPattern3 = BtcCentsRelSatsUsdPattern3(client, _m(acc, 'supply_in_profit'))
self.delta: ChangeRatePattern = ChangeRatePattern(client, _m(acc, 'delta'))
self.halved: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'halved'))
self.in_loss: BtcCentsRelSatsUsdPattern = BtcCentsRelSatsUsdPattern(client, _m(acc, 'in_loss'))
self.in_profit: BtcCentsRelSatsUsdPattern = BtcCentsRelSatsUsdPattern(client, _m(acc, 'in_profit'))
self.rel_to_circulating_supply: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply'))
self.total: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, acc)
class DeltaHalvedInRelTotalPattern2:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.delta: ChangeRatePattern2 = ChangeRatePattern2(client, _m(acc, 'delta'))
self.halved: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'halved'))
self.in_loss: BtcCentsRelSatsUsdPattern3 = BtcCentsRelSatsUsdPattern3(client, _m(acc, 'in_loss'))
self.in_profit: BtcCentsRelSatsUsdPattern3 = BtcCentsRelSatsUsdPattern3(client, _m(acc, 'in_profit'))
self.rel_to_circulating_supply: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply'))
self.total: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, acc)
class NegativeRawRelSumPattern2:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.negative: MetricPattern1[Dollars] = MetricPattern1(client, _m(acc, 'neg_unrealized_loss'))
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_loss'))
self.rel_to_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_market_cap'))
self.rel_to_own_gross_pnl: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_gross_pnl'))
self.rel_to_own_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'unrealized_loss_rel_to_own_market_cap'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_loss_24h'))
class ActivityOutputsRealizedSupplyUnrealizedPattern:
"""Pattern struct for repeated tree structure."""
@@ -2531,7 +2543,7 @@ class ActivityOutputsRealizedSupplyUnrealizedPattern:
self.activity: CoindaysSentPattern = CoindaysSentPattern(client, acc)
self.outputs: UtxoPattern2 = UtxoPattern2(client, _m(acc, 'utxo_count'))
self.realized: CapLossMvrvNetNuplPriceProfitSentSoprPattern = CapLossMvrvNetNuplPriceProfitSentSoprPattern(client, acc)
self.supply: DeltaHalvedRelTotalPattern = DeltaHalvedRelTotalPattern(client, _m(acc, 'supply'))
self.supply: DeltaHalvedInRelTotalPattern = DeltaHalvedInRelTotalPattern(client, _m(acc, 'supply'))
self.unrealized: InvestedInvestorLossNetProfitPattern = InvestedInvestorLossNetProfitPattern(client, acc)
class ActivityOutputsRealizedSupplyUnrealizedPattern2:
@@ -2542,7 +2554,7 @@ class ActivityOutputsRealizedSupplyUnrealizedPattern2:
self.activity: CoindaysSentPattern = CoindaysSentPattern(client, acc)
self.outputs: UtxoPattern2 = UtxoPattern2(client, _m(acc, 'utxo_count'))
self.realized: CapLossMvrvNetNuplPriceProfitSentSoprPattern = CapLossMvrvNetNuplPriceProfitSentSoprPattern(client, acc)
self.supply: DeltaHalvedRelTotalPattern = DeltaHalvedRelTotalPattern(client, _m(acc, 'supply'))
self.supply: DeltaHalvedInRelTotalPattern = DeltaHalvedInRelTotalPattern(client, _m(acc, 'supply'))
self.unrealized: LossNetProfitPattern = LossNetProfitPattern(client, acc)
class AddrOutputsRealizedSupplyPattern:
@@ -2607,9 +2619,9 @@ class InvestedInvestorLossNetProfitPattern:
"""Create pattern node with accumulated metric name."""
self.invested_capital: InPattern2 = InPattern2(client, _m(acc, 'invested_capital_in'))
self.investor_cap: InPattern2 = InPattern2(client, _m(acc, 'investor_cap_in'))
self.loss: NegativeRawSumSupplyPattern = NegativeRawSumSupplyPattern(client, acc)
self.loss: NegativeRawSumPattern = NegativeRawSumPattern(client, acc)
self.net_pnl: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'net_unrealized_pnl'))
self.profit: RawSumSupplyPattern = RawSumSupplyPattern(client, acc)
self.profit: RawSumPattern = RawSumPattern(client, _m(acc, 'unrealized_profit'))
class PhsReboundThsPattern:
"""Pattern struct for repeated tree structure."""
@@ -2622,6 +2634,17 @@ class PhsReboundThsPattern:
self.ths: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'ths'))
self.ths_min: MetricPattern1[StoredF32] = MetricPattern1(client, _m(acc, 'ths_min'))
class RawRelSumPattern2:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.raw: CentsUsdPattern = CentsUsdPattern(client, acc)
self.rel_to_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_market_cap'))
self.rel_to_own_gross_pnl: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_own_gross_pnl'))
self.rel_to_own_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_own_market_cap'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, '24h'))
class _1m1w1y24hHeightPattern(Generic[T]):
"""Pattern struct for repeated tree structure."""
@@ -2763,24 +2786,14 @@ class CumulativeNegativeRawSumPattern:
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'realized_loss'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'realized_loss_24h'))
class DeltaHalvedRelTotalPattern:
class HalvedInTotalPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.delta: ChangeRatePattern = ChangeRatePattern(client, _m(acc, 'delta'))
self.halved: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'halved'))
self.rel_to_circulating_supply: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply'))
self.total: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, acc)
class DeltaHalvedRelTotalPattern2:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.delta: ChangeRatePattern2 = ChangeRatePattern2(client, _m(acc, 'delta'))
self.halved: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'halved'))
self.rel_to_circulating_supply: BpsPercentRatioPattern = BpsPercentRatioPattern(client, _m(acc, 'rel_to_circulating_supply'))
self.in_loss: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'in_loss'))
self.in_profit: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'in_profit'))
self.total: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, acc)
class InvestedMaxMinPercentilesPattern:
@@ -2793,16 +2806,6 @@ class InvestedMaxMinPercentilesPattern:
self.min: CentsSatsUsdPattern = CentsSatsUsdPattern(client, _m(acc, 'cost_basis_min'))
self.percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, _m(acc, 'cost_basis'))
class NegativeRawSumSupplyPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.negative: MetricPattern1[Dollars] = MetricPattern1(client, _m(acc, 'neg_unrealized_loss'))
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_loss'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_loss_24h'))
self.supply: BtcCentsRelSatsUsdPattern = BtcCentsRelSatsUsdPattern(client, _m(acc, 'supply_in_loss'))
class OutputsRealizedSupplyUnrealizedPattern:
"""Pattern struct for repeated tree structure."""
@@ -2810,8 +2813,8 @@ class OutputsRealizedSupplyUnrealizedPattern:
"""Create pattern node with accumulated metric name."""
self.outputs: UtxoPattern = UtxoPattern(client, _m(acc, 'utxo_count'))
self.realized: CapLossMvrvNuplPriceProfitSoprPattern = CapLossMvrvNuplPriceProfitSoprPattern(client, acc)
self.supply: HalvedTotalPattern = HalvedTotalPattern(client, _m(acc, 'supply'))
self.unrealized: LossProfitPattern2 = LossProfitPattern2(client, acc)
self.supply: HalvedInTotalPattern = HalvedInTotalPattern(client, _m(acc, 'supply'))
self.unrealized: LossProfitPattern2 = LossProfitPattern2(client, _m(acc, 'unrealized'))
class _1m1w1y24hPattern(Generic[T]):
"""Pattern struct for repeated tree structure."""
@@ -2927,9 +2930,18 @@ class LossNetProfitPattern:
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.loss: NegativeRawSumSupplyPattern = NegativeRawSumSupplyPattern(client, acc)
self.loss: NegativeRawSumPattern = NegativeRawSumPattern(client, acc)
self.net_pnl: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'net_unrealized_pnl'))
self.profit: RawSumSupplyPattern = RawSumSupplyPattern(client, acc)
self.profit: RawSumPattern = RawSumPattern(client, _m(acc, 'unrealized_profit'))
class NegativeRawSumPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.negative: MetricPattern1[Dollars] = MetricPattern1(client, _m(acc, 'neg_unrealized_loss'))
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_loss'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_loss_24h'))
class OutputsRealizedSupplyPattern:
"""Pattern struct for repeated tree structure."""
@@ -2967,24 +2979,6 @@ class RawSellSumPattern:
self.sell_side_risk_ratio: _1m1w1y24hPattern2 = _1m1w1y24hPattern2(client, _m(acc, 'sell_side_risk_ratio'))
self.sum: _1m1w1y24hPattern[Cents] = _1m1w1y24hPattern(client, _m(acc, 'gross_pnl_sum'))
class RawSumSupplyPattern:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_profit'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_profit_24h'))
self.supply: BtcCentsRelSatsUsdPattern = BtcCentsRelSatsUsdPattern(client, _m(acc, 'supply_in_profit'))
class RawSumSupplyPattern2:
"""Pattern struct for repeated tree structure."""
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.raw: CentsUsdPattern = CentsUsdPattern(client, _m(acc, 'unrealized_profit'))
self.sum: _24hPattern = _24hPattern(client, _m(acc, 'unrealized_profit_24h'))
self.supply: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, _m(acc, 'supply_in_profit'))
class _6bBlockTxindexPattern(Generic[T]):
"""Pattern struct for repeated tree structure."""
@@ -3128,8 +3122,8 @@ class LossProfitPattern2:
def __init__(self, client: BrkClientBase, acc: str):
"""Create pattern node with accumulated metric name."""
self.loss: RawSumSupplyPattern2 = RawSumSupplyPattern2(client, acc)
self.profit: RawSumSupplyPattern2 = RawSumSupplyPattern2(client, acc)
self.loss: RawSumPattern = RawSumPattern(client, _m(acc, 'loss'))
self.profit: RawSumPattern = RawSumPattern(client, _m(acc, 'profit'))
class PriceValuePattern:
"""Pattern struct for repeated tree structure."""
@@ -4060,6 +4054,7 @@ class MetricsTree_Indicators:
self.nvt: BpsRatioPattern = BpsRatioPattern(client, 'nvt')
self.gini: BpsPercentRatioPattern = BpsPercentRatioPattern(client, 'gini')
self.rhodl_ratio: BpsRatioPattern = BpsRatioPattern(client, 'rhodl_ratio')
self.thermocap_multiple: BpsRatioPattern = BpsRatioPattern(client, 'thermocap_multiple')
class MetricsTree_Market_Ath:
"""Metrics tree node."""
@@ -4909,6 +4904,8 @@ class MetricsTree_Distribution_UtxoCohorts_All_Supply:
def __init__(self, client: BrkClientBase, base_path: str = ''):
self.delta: ChangeRatePattern2 = ChangeRatePattern2(client, 'supply_delta')
self.in_profit: BtcCentsRelSatsUsdPattern2 = BtcCentsRelSatsUsdPattern2(client, 'supply_in_profit')
self.in_loss: BtcCentsRelSatsUsdPattern2 = BtcCentsRelSatsUsdPattern2(client, 'supply_in_loss')
self.total: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, 'supply')
self.halved: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, 'supply_halved')
@@ -4919,7 +4916,6 @@ class MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Loss:
self.negative: MetricPattern1[Dollars] = MetricPattern1(client, 'neg_unrealized_loss')
self.raw: CentsUsdPattern = CentsUsdPattern(client, 'unrealized_loss')
self.sum: _24hPattern = _24hPattern(client, 'unrealized_loss_24h')
self.supply: BtcCentsRelSatsUsdPattern2 = BtcCentsRelSatsUsdPattern2(client, 'supply_in_loss')
self.rel_to_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, 'unrealized_loss_rel_to_market_cap')
self.rel_to_own_gross_pnl: BpsPercentRatioPattern = BpsPercentRatioPattern(client, 'unrealized_loss_rel_to_own_gross_pnl')
@@ -4937,7 +4933,6 @@ class MetricsTree_Distribution_UtxoCohorts_All_Unrealized_Profit:
def __init__(self, client: BrkClientBase, base_path: str = ''):
self.raw: CentsUsdPattern = CentsUsdPattern(client, 'unrealized_profit')
self.sum: _24hPattern = _24hPattern(client, 'unrealized_profit_24h')
self.supply: BtcCentsRelSatsUsdPattern2 = BtcCentsRelSatsUsdPattern2(client, 'supply_in_profit')
self.rel_to_market_cap: BpsPercentRatioPattern = BpsPercentRatioPattern(client, 'unrealized_profit_rel_to_market_cap')
self.rel_to_own_gross_pnl: BpsPercentRatioPattern = BpsPercentRatioPattern(client, 'unrealized_profit_rel_to_own_gross_pnl')
@@ -4969,7 +4964,7 @@ class MetricsTree_Distribution_UtxoCohorts_Sth:
def __init__(self, client: BrkClientBase, base_path: str = ''):
self.realized: CapGrossInvestorLossMvrvNetNuplPeakPriceProfitSentSoprPattern = CapGrossInvestorLossMvrvNetNuplPeakPriceProfitSentSoprPattern(client, 'sth')
self.supply: DeltaHalvedRelTotalPattern2 = DeltaHalvedRelTotalPattern2(client, 'sth_supply')
self.supply: DeltaHalvedInRelTotalPattern2 = DeltaHalvedInRelTotalPattern2(client, 'sth_supply')
self.outputs: UtxoPattern3 = UtxoPattern3(client, 'sth_utxo_count')
self.activity: CoindaysCoinyearsDormancySentVelocityPattern = CoindaysCoinyearsDormancySentVelocityPattern(client, 'sth')
self.cost_basis: InvestedMaxMinPercentilesPattern = InvestedMaxMinPercentilesPattern(client, 'sth')
@@ -5020,7 +5015,7 @@ class MetricsTree_Distribution_UtxoCohorts_Lth:
"""Metrics tree node."""
def __init__(self, client: BrkClientBase, base_path: str = ''):
self.supply: DeltaHalvedRelTotalPattern2 = DeltaHalvedRelTotalPattern2(client, 'lth_supply')
self.supply: DeltaHalvedInRelTotalPattern2 = DeltaHalvedInRelTotalPattern2(client, 'lth_supply')
self.outputs: UtxoPattern3 = UtxoPattern3(client, 'lth_utxo_count')
self.activity: CoindaysCoinyearsDormancySentVelocityPattern = CoindaysCoinyearsDormancySentVelocityPattern(client, 'lth')
self.realized: MetricsTree_Distribution_UtxoCohorts_Lth_Realized = MetricsTree_Distribution_UtxoCohorts_Lth_Realized(client)