41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import type {
|
|
TbankCandle,
|
|
TbankTimestamp,
|
|
} from '../../../../integrations/tbank/tbank.api';
|
|
|
|
import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_SECOND } from '../../../../common/time';
|
|
|
|
const MIN_TIMESTAMP_SECONDS_EXCLUSIVE = 0;
|
|
|
|
const MOSCOW_OFFSET_MS = 10_800_000;
|
|
export function timestamp(value?: TbankTimestamp): null | string {
|
|
const seconds = Number(value?.seconds);
|
|
return Number.isFinite(seconds) && seconds > MIN_TIMESTAMP_SECONDS_EXCLUSIVE
|
|
? new Date(seconds * MILLISECONDS_PER_SECOND).toISOString()
|
|
: null;
|
|
}
|
|
export function moscowDay(iso: string): string {
|
|
return new Date(Date.parse(iso) + MOSCOW_OFFSET_MS)
|
|
.toISOString()
|
|
.slice(ISO_DATE_START, ISO_DATE_LENGTH);
|
|
}
|
|
export function previousClose(
|
|
candles: TbankCandle[],
|
|
priceAt: string,
|
|
): null | TbankCandle {
|
|
return (
|
|
candles
|
|
.filter((candle) => {
|
|
const time = timestamp(candle.time);
|
|
return (
|
|
candle.isComplete &&
|
|
candle.close &&
|
|
time &&
|
|
time.slice(ISO_DATE_START, ISO_DATE_LENGTH) < moscowDay(priceAt)
|
|
);
|
|
})
|
|
.sort((a, b) => Number(b.time?.seconds) - Number(a.time?.seconds))[0] ??
|
|
null
|
|
);
|
|
}
|