import type { HighLow, HighLowClose, HighLowCloseVolume, OpenHighLowClose, OpenHighLowCloseVolume } from './Candle.type.js'; import type { SignalThresholds } from './SignalThresholds.type.js'; type Nullable = Result | null; export declare const IndicatorInputShape: { readonly HIGH_LOW: 'high-low'; readonly HIGH_LOW_CLOSE: 'high-low-close'; readonly HIGH_LOW_CLOSE_VOLUME: 'high-low-close-volume'; readonly OPEN_HIGH_LOW_CLOSE: 'open-high-low-close'; readonly OPEN_HIGH_LOW_CLOSE_VOLUME: 'open-high-low-close-volume'; readonly PRICE: 'price'; readonly VOLUME: 'volume'; }; export type IndicatorInputShapes = (typeof IndicatorInputShape)[keyof typeof IndicatorInputShape]; export type InputShapeOf = unknown extends Input ? IndicatorInputShapes : Input extends number ? typeof IndicatorInputShape.PRICE | typeof IndicatorInputShape.VOLUME : Input extends OpenHighLowCloseVolume ? typeof IndicatorInputShape.OPEN_HIGH_LOW_CLOSE_VOLUME : Input extends HighLowCloseVolume ? typeof IndicatorInputShape.HIGH_LOW_CLOSE_VOLUME : Input extends OpenHighLowClose ? typeof IndicatorInputShape.OPEN_HIGH_LOW_CLOSE : Input extends HighLowClose ? typeof IndicatorInputShape.HIGH_LOW_CLOSE : Input extends HighLow ? typeof IndicatorInputShape.HIGH_LOW : never; export declare const INPUT_SHAPE_FIELDS: Record; interface Indicator { isStable: boolean; add(input: Input): Nullable; getRequiredInputs(): number; getResult(): Nullable; getResultOrThrow(): Result; replace(input: Input): Nullable; update(input: Input, replace: boolean): Nullable; updates(input: Input[], replace: boolean): Nullable[]; } export declare const TradingSignal: { readonly BEARISH: 'BEARISH'; readonly BULLISH: 'BULLISH'; readonly SIDEWAYS: 'SIDEWAYS'; readonly UNKNOWN: 'UNKNOWN'; }; export type TradingSignals = (typeof TradingSignal)[keyof typeof TradingSignal]; export declare abstract class TechnicalIndicator> implements Indicator { #private; protected result: Result | undefined; protected state: State; abstract readonly inputShape: InputShapeOf; abstract getRequiredInputs(): number; protected trackState(replace: boolean): void; getState(): State & { result: Result | undefined; }; getResult(): (Result & {}) | null; getResultOrThrow(): Result & ({} | null); get isStable(): boolean; add(input: Input): Result | null; replace(input: Input): Result | null; abstract update(input: Input, replace: boolean): Result | null; updates(inputs: readonly Input[], replace?: boolean): (Result | null)[]; } export declare abstract class IndicatorSeries> extends TechnicalIndicator { protected previousResult?: number; protected setResult(value: number, replace: boolean): number; protected rollbackLastResult(): void; } export declare abstract class TrendIndicatorSeries> extends IndicatorSeries { #private; protected abstract calculateSignalState(result?: number | null | undefined): SignalState; protected setResult(value: number, replace: boolean): number; protected rollbackLastResult(): void; getSignal(): { state: SignalState; hasChanged: boolean; }; } export declare abstract class TrendIndicator, SignalState = TradingSignals> extends TechnicalIndicator { #private; protected abstract calculateSignalState(result?: Result | null | undefined): SignalState; protected previousResult?: Result; protected setResult(value: Result, replace: boolean): Result; getSignal(): { state: SignalState; hasChanged: boolean; }; } export declare abstract class ZeroCrossSeries extends TrendIndicatorSeries { protected calculateSignalState(result: number | null | undefined): "BEARISH" | "BULLISH" | "SIDEWAYS" | "UNKNOWN"; } export declare abstract class ThresholdCrossSeries> extends TrendIndicatorSeries { #private; constructor({ overbought, oversold }: Required); protected calculateSignalState(result?: number | null | undefined): "BEARISH" | "BULLISH" | "SIDEWAYS" | "UNKNOWN"; } export {};