Skip to main content

wickra_core/
lib.rs

1//! `wickra-core`: streaming-first technical indicators.
2//!
3//! The core engine of Wickra. Every indicator is implemented as a state machine
4//! that consumes inputs one at a time via [`Indicator::update`] in constant time.
5//! Batch evaluation is provided as a blanket extension trait so the same code
6//! path serves both online (tick-by-tick) and offline (historical) workloads.
7//!
8//! # Design
9//!
10//! - **Streaming-first.** State is held by the indicator instance, so a new value
11//!   only re-computes deltas, not the whole series.
12//! - **Batch is free.** [`BatchExt::batch`] is a blanket implementation that
13//!   simply replays `update` over a slice. Writing one implementation gives both
14//!   APIs.
15//! - **Composable.** Indicators implement [`Indicator<Input = f64, Output = f64>`]
16//!   wherever they conceptually take a price, so they can be chained via
17//!   [`Chain`].
18//! - **No `unsafe`.** The crate forbids `unsafe_code` in the workspace lints.
19//!   Batch kernels that profit from AVX2 and FMA run through the small
20//!   `wickra-simd` crate, which holds the one `unsafe` runtime dispatch; the
21//!   kernels stay safe code here and return the same bits on every path.
22//!
23//! # Quick start
24//!
25//! ```
26//! use wickra_core::{BatchExt, Indicator, Sma};
27//!
28//! // Streaming:
29//! let mut sma = Sma::new(3).unwrap();
30//! assert_eq!(sma.update(1.0), None);
31//! assert_eq!(sma.update(2.0), None);
32//! assert_eq!(sma.update(3.0), Some(2.0));
33//!
34//! // Batch (replays `update` internally):
35//! let mut sma = Sma::new(3).unwrap();
36//! let out = sma.batch(&[1.0, 2.0, 3.0, 4.0]);
37//! assert_eq!(out, vec![None, None, Some(2.0), Some(3.0)]);
38//! ```
39
40#![cfg_attr(docsrs, feature(doc_cfg))]
41// The libtest harness collects every `#[test]` into a compiler-generated array
42// of test references. With 2000+ unit tests that array exceeds clippy's 16 KB
43// `large_stack_arrays` threshold; the diagnostic is spanless libtest scaffolding,
44// not our code, so it cannot be silenced at a call site. Suppress it only in test
45// builds — library code is still linted for genuinely large stack arrays.
46#![cfg_attr(test, allow(clippy::large_stack_arrays))]
47
48mod calendar;
49mod cross_section;
50mod derivatives;
51mod error;
52mod fast;
53mod microstructure;
54mod ohlcv;
55mod traits;
56
57pub mod indicators;
58
59pub use cross_section::{CrossSection, Member};
60pub use derivatives::DerivativesTick;
61pub use error::{Error, Result, MAX_PERIOD};
62pub use indicators::DollarBar;
63pub use indicators::ImbalanceBar;
64pub use indicators::LineBreakBar;
65pub use indicators::RangeBar;
66pub use indicators::RunBar;
67pub use indicators::TickBar;
68pub use indicators::VolumeBar;
69pub use indicators::{
70    AbandonedBaby, Abcd, AbsoluteBreadthIndex, AccelerationBands, AccelerationBandsOutput,
71    AcceleratorOscillator, AdOscillator, AdVolumeLine, AdaptiveCci, AdaptiveCycle,
72    AdaptiveLaguerreFilter, AdaptiveRsi, Adl, AdvanceBlock, AdvanceDecline, AdvanceDeclineRatio,
73    Adx, AdxOutput, Adxr, Alligator, AlligatorOutput, Alma, Alpha, AmihudIlliquidity, AnchoredRsi,
74    AnchoredVwap, AndrewsPitchfork, AndrewsPitchforkOutput, Apo, Aroon, AroonOscillator,
75    AroonOutput, Atr, AtrBands, AtrBandsOutput, AtrRatchet, AtrRatchetOutput, AtrTrailingStop,
76    AutoFib, AutoFibOutput, Autocorrelation, AutocorrelationPeriodogram, AverageDailyRange,
77    AverageDrawdown, AvgPrice, AwesomeOscillator, AwesomeOscillatorHistogram, BalanceOfPower,
78    BandpassFilter, Bat, BeltHold, Beta, BetaNeutralSpread, BetterVolume, BipowerVariation,
79    BodySizePct, BollingerBands, BollingerBandwidth, BollingerOutput, BomarBands, BomarBandsOutput,
80    BreadthThrust, Breakaway, BullishPercentIndex, BurkeRatio, Butterfly, CalendarSpread,
81    CalmarRatio, Camarilla, CamarillaPivotsOutput, CandleVolume, CandleVolumeOutput, Cci,
82    CenterOfGravity, CentralPivotRange, CentralPivotRangeOutput, Cfo, ChaikinMoneyFlow,
83    ChaikinOscillator, ChaikinVolatility, ChandeKrollStop, ChandeKrollStopOutput, ChandelierExit,
84    ChandelierExitOutput, ChoppinessIndex, ClassicPivots, ClassicPivotsOutput, CloseVsOpen,
85    ClosingMarubozu, Cmo, CoefficientOfVariation, Cointegration, CointegrationOutput,
86    CommonSenseRatio, CompositeProfile, CompositeProfileOutput, ConcealingBabySwallow,
87    ConditionalValueAtRisk, ConnorsRsi, Coppock, CorrelationTrendIndicator, Counterattack, Crab,
88    CumulativeVolumeDelta, CumulativeVolumeIndex, CupAndHandle, CyberneticCycle, Cypher,
89    DayOfWeekProfile, DayOfWeekProfileOutput, Decycler, DecyclerOscillator, Dema, DemandIndex,
90    DemarkPivots, DemarkPivotsOutput, DepthSlope, DerivativeOscillator, DetrendedStdDev,
91    DisparityIndex, DistanceSsd, Doji, DojiStar, DollarBars, Donchian, DonchianOutput,
92    DonchianStop, DonchianStopOutput, DoubleBollinger, DoubleBollingerOutput, DoubleTopBottom,
93    DownsideGapThreeMethods, Dpo, DragonflyDoji, DrawdownDuration, DumplingTop, Dx,
94    DynamicMomentumIndex, EaseOfMovement, EffectiveSpread, EhlersStochastic, Ehma, ElderImpulse,
95    ElderRay, ElderRayOutput, ElderSafeZone, ElderSafeZoneOutput, Ema, EmpiricalModeDecomposition,
96    Engulfing, Equivolume, EquivolumeOutput, EstimatedLeverageRatio, EvenBetterSinewave,
97    EveningDojiStar, Evwma, EwmaVolatility, Expectancy, FallingThreeMethods, Fama, FibArcs,
98    FibArcsOutput, FibChannel, FibChannelOutput, FibConfluence, FibConfluenceOutput, FibExtension,
99    FibExtensionOutput, FibFan, FibFanOutput, FibProjection, FibProjectionOutput, FibRetracement,
100    FibRetracementOutput, FibTimeZones, FibTimeZonesOutput, FibonacciPivots, FibonacciPivotsOutput,
101    FisherRsi, FisherTransform, FlagPennant, Footprint, FootprintOutput, ForceIndex,
102    FractalChaosBands, FractalChaosBandsOutput, Frama, FryPanBottom, FundingBasis,
103    FundingImpliedApr, FundingRate, FundingRateMean, FundingRateZScore, GainLossRatio,
104    GainToPainRatio, GapSideBySideWhite, Garch11, GarmanKlassVolatility, Gartley, GatorOscillator,
105    GatorOscillatorOutput, GeneralizedDema, GeometricMa, GoldenPocket, GoldenPocketOutput,
106    GrangerCausality, GravestoneDoji, Hammer, HangingMan, Harami, HaramiCross,
107    HasbrouckInformationShare, HeadAndShoulders, HeikinAshi, HeikinAshiOscillator,
108    HeikinAshiOutput, HiLoActivator, HighLowIndex, HighLowRange, HighLowVolumeNodes,
109    HighLowVolumeNodesOutput, HighWave, HighpassFilter, Hikkake, HikkakeModified,
110    HilbertDominantCycle, HistoricalVolatility, Hma, HoltWinters, HomingPigeon, HtDcPhase,
111    HtPhasor, HtPhasorOutput, HtTrendMode, HurstChannel, HurstChannelOutput, HurstExponent,
112    Ichimoku, IchimokuOutput, IdenticalThreeCrows, ImbalanceBars, InNeck, Inertia,
113    InformationRatio, InitialBalance, InitialBalanceOutput, InstantaneousTrendline,
114    IntradayIntensity, IntradayMomentumIndex, IntradayVolatilityProfile,
115    IntradayVolatilityProfileOutput, InverseFisherTransform, InvertedHammer, JarqueBera, Jma,
116    JumpIndicator, KRatio, KagiBars, KalmanHedgeRatio, KalmanHedgeRatioOutput, Kama, KaseDevStop,
117    KaseDevStopOutput, KasePermissionStochastic, KasePermissionStochasticOutput, KellyCriterion,
118    Keltner, KeltnerOutput, KendallTau, Kicking, KickingByLength, Kst, KstOutput, Kurtosis, Kvo,
119    KylesLambda, LadderBottom, LaguerreRsi, LeadLagCrossCorrelation, LeadLagCrossCorrelationOutput,
120    LinRegAngle, LinRegChannel, LinRegChannelOutput, LinRegIntercept, LinRegSlope,
121    LinearRegression, LiquidationFeatures, LiquidationFeaturesOutput, LogReturn, LongLeggedDoji,
122    LongLine, LongShortRatio, M2Measure, MaEnvelope, MaEnvelopeOutput, MacdExt, MacdFix,
123    MacdHistogram, MacdIndicator, MacdOutput, Mama, MamaOutput, MarketFacilitationIndex,
124    MartinRatio, Marubozu, MassIndex, MatHold, MatchingLow, MaxDrawdown, McClellanOscillator,
125    McClellanSummationIndex, McGinleyDynamic, MedianAbsoluteDeviation, MedianChannel,
126    MedianChannelOutput, MedianMa, MedianPrice, Mfi, Microprice, MidPoint, MidPrice, MinusDi,
127    MinusDm, ModifiedMaStop, ModifiedMaStopOutput, Mom, MorningDojiStar, MorningEveningStar,
128    MurreyMathLines, MurreyMathLinesOutput, NakedPoc, Natr, NewHighsNewLows, NewPriceLines, Nrtr,
129    NrtrOutput, Nvi, OIPriceDivergence, OIWeighted, Obv, OiToVolumeRatio, OmegaRatio, OnNeck,
130    OpenInterestDelta, OpenInterestMomentum, OpeningMarubozu, OpeningRange, OpeningRangeOutput,
131    OrderBookImbalanceFull, OrderBookImbalanceTop1, OrderBookImbalanceTopN, OrderFlowImbalance,
132    OuHalfLife, OvernightGap, OvernightIntradayReturn, OvernightIntradayReturnOutput, PainIndex,
133    PairSpreadZScore, PairwiseBeta, ParkinsonVolatility, PearsonCorrelation, PercentAboveMa,
134    PercentB, PercentageTrailingStop, PerpetualPremiumIndex, Pgo, PiercingDarkCloud, Pin,
135    PivotReversal, PlusDi, PlusDm, Pmo, PointAndFigureBars, PolarizedFractalEfficiency, Ppo,
136    PpoHistogram, ProfileShape, ProfitFactor, ProjectionBands, ProjectionBandsOutput,
137    ProjectionOscillator, Psar, Pvi, Qqe, QqeOutput, Qstick, QuartileBands, QuartileBandsOutput,
138    QuotedSpread, RSquared, RangeBars, RealizedSpread, RealizedVolatility, RecoveryFactor,
139    RectangleRange, Reflex, RegimeLabel, RelativeStrengthAB, RelativeStrengthOutput, RenkoBars,
140    RenkoTrailingStop, RickshawMan, RisingThreeMethods, Rmi, Roc, Rocp, Rocr, Rocr100,
141    RogersSatchellVolatility, RollMeasure, RollingCorrelation, RollingCovariance, RollingIqr,
142    RollingMinMaxScaler, RollingPercentileRank, RollingQuantile, RollingVwap, RoofingFilter, Rsi,
143    Rsx, RunBars, RunningDrawdown, Rvi, RviVolatility, Rwi, RwiOutput, SampleEntropy, SarExt,
144    SeasonalZScore, SeparatingLines, SessionHighLow, SessionHighLowOutput, SessionRange,
145    SessionRangeOutput, SessionVwap, ShannonEntropy, Shark, SharpeRatio, ShootingStar, ShortLine,
146    SignedVolume, SineWave, SineWeightedMa, SinglePrints, Skewness, Sma, Smi, Smma,
147    SmoothedHeikinAshi, SmoothedHeikinAshiOutput, SortinoRatio, SpearmanCorrelation, SpinningTop,
148    SpreadAr1Coefficient, SpreadBollingerBands, SpreadBollingerBandsOutput, SpreadHurst,
149    StalledPattern, StandardError, StandardErrorBands, StandardErrorBandsOutput, StarcBands,
150    StarcBandsOutput, Stc, StdDev, StepTrailingStop, SterlingRatio, StickSandwich, StochRsi,
151    Stochastic, StochasticCci, StochasticOutput, SuperSmoother, SuperTrend, SuperTrendOutput,
152    TailRatio, TakerBuySellRatio, Takuri, TasukiGap, TdCamouflage, TdClop, TdClopwin, TdCombo,
153    TdCountdown, TdDWave, TdDeMarker, TdDifferential, TdLines, TdLinesOutput, TdMovingAverage,
154    TdMovingAverageOutput, TdOpen, TdPressure, TdPropulsion, TdRangeProjection,
155    TdRangeProjectionOutput, TdRei, TdRiskLevel, TdRiskLevelOutput, TdSequential,
156    TdSequentialOutput, TdSetup, TdTrap, Tema, TermStructureBasis, ThreeDrives, ThreeInside,
157    ThreeLineBreak, ThreeLineBreakBars, ThreeLineStrike, ThreeOutside, ThreeSoldiersOrCrows,
158    ThreeStarsInSouth, Thrusting, TickBars, TickIndex, Tii, TimeBasedStop, TimeOfDayReturnProfile,
159    TimeOfDayReturnProfileOutput, TowerTopBottom, TpoProfile, TpoProfileOutput, TradeImbalance,
160    TradeSignAutocorrelation, TradeVolumeIndex, TrendLabel, TrendStrengthIndex, Trendflex,
161    TreynorRatio, Triangle, Trima, Trin, TripleTopBottom, Tristar, Trix, TrueRange, Tsf,
162    TsfOscillator, Tsi, Tsv, TtmSqueeze, TtmSqueezeOutput, TtmTrend, TurnOfMonth, Tweezer,
163    TwiggsMoneyFlow, TwoCrows, TypicalPrice, UlcerIndex, UltimateOscillator, UniqueThreeRiver,
164    UniversalOscillator, UpDownVolumeRatio, UpsideGapThreeMethods, UpsideGapTwoCrows,
165    UpsidePotentialRatio, ValueArea, ValueAreaOutput, ValueAtRisk, Variance, VarianceRatio,
166    VerticalHorizontalFilter, Vidya, VolatilityCone, VolatilityConeOutput, VolatilityOfVolatility,
167    VolatilityRatio, VoltyStop, VolumeBars, VolumeByTimeProfile, VolumeByTimeProfileOutput,
168    VolumeOscillator, VolumePriceTrend, VolumeProfile, VolumeProfileOutput, VolumeRsi,
169    VolumeWeightedMacd, VolumeWeightedMacdOutput, VolumeWeightedSr, VolumeWeightedSrOutput, Vortex,
170    VortexOutput, Vpin, Vwap, VwapStdDevBands, VwapStdDevBandsOutput, Vwma, Vzo, Wad, WavePm,
171    WaveTrend, WaveTrendOutput, Wedge, WeightedClose, WickRatio, WilliamsFractals,
172    WilliamsFractalsOutput, WilliamsR, WinRate, Wma, WoodiePivots, WoodiePivotsOutput,
173    YangZhangVolatility, YoyoExit, ZScore, ZeroLagMacd, ZeroLagMacdOutput, ZigZag, ZigZagOutput,
174    Zlema, FAMILIES, T3,
175};
176// `FootprintLevel` is a row element of `FootprintOutput`, re-exported on its own
177// line so the indicator-count tooling (which scans the braced block above and
178// strips only `*Output` companions) does not count it as a separate indicator.
179pub use indicators::FootprintLevel;
180// `MaType` is a moving-average selector enum used by `MacdExt`, re-exported on
181// its own line so the indicator-count tooling does not count it as an indicator.
182pub use indicators::MaType;
183// Bar element types for the alt-chart builders, re-exported on their own lines so
184// the indicator-count tooling (which scans only the braced block above) does not
185// count them as separate indicators.
186pub use indicators::KagiBar;
187pub use indicators::PnfColumn;
188pub use indicators::RenkoBrick;
189pub use microstructure::{Level, OrderBook, Side, Trade, TradeQuote};
190pub use ohlcv::{Candle, Tick};
191pub use traits::{BarBuilder, BatchExt, BatchNanExt, Chain, Indicator};