|
|
|
@ -80,7 +80,7 @@ export async function setPullOptionContractsState(
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function getPullOptionContractAggregatesState(ticker: string) {
|
|
|
|
|
export async function getPullAggregatesState(ticker: string) {
|
|
|
|
|
const state = await sqliteDb.get(
|
|
|
|
|
`
|
|
|
|
|
SELECT
|
|
|
|
@ -102,7 +102,7 @@ const enum OptionContractAggregatesSyncStatus {
|
|
|
|
|
type OptionContractAggregatesSyncState = {
|
|
|
|
|
status: OptionContractAggregatesSyncStatus;
|
|
|
|
|
};
|
|
|
|
|
export async function setPullOptionContractAggregatesState(
|
|
|
|
|
export async function setPullAggregatesState(
|
|
|
|
|
ticker: string,
|
|
|
|
|
state: OptionContractAggregatesSyncState
|
|
|
|
|
) {
|
|
|
|
@ -154,10 +154,10 @@ export async function pullOptionContractAggregates(
|
|
|
|
|
const ticker = Polygon.optionContractToTicker(optionContract);
|
|
|
|
|
// check if sync was completed:
|
|
|
|
|
if (
|
|
|
|
|
(await getPullOptionContractAggregatesState(ticker))?.status !==
|
|
|
|
|
(await getPullAggregatesState(ticker))?.status !==
|
|
|
|
|
OptionContractAggregatesSyncStatus.COMPLETED
|
|
|
|
|
) {
|
|
|
|
|
await setPullOptionContractAggregatesState(ticker, {
|
|
|
|
|
await setPullAggregatesState(ticker, {
|
|
|
|
|
status: OptionContractAggregatesSyncStatus.STARTED,
|
|
|
|
|
});
|
|
|
|
|
const { firstDate } = await getOptionContractDateRange(optionContract);
|
|
|
|
@ -186,12 +186,72 @@ export async function pullOptionContractAggregates(
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
await setPullOptionContractAggregatesState(ticker, {
|
|
|
|
|
await setPullAggregatesState(ticker, {
|
|
|
|
|
status: OptionContractAggregatesSyncStatus.COMPLETED,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function pullStockAggregates(
|
|
|
|
|
symbol: string,
|
|
|
|
|
firstDate: string,
|
|
|
|
|
lastDate: string
|
|
|
|
|
) {
|
|
|
|
|
// check if sync was completed:
|
|
|
|
|
if (
|
|
|
|
|
(await getPullAggregatesState(symbol))?.status !==
|
|
|
|
|
OptionContractAggregatesSyncStatus.COMPLETED
|
|
|
|
|
) {
|
|
|
|
|
await setPullAggregatesState(symbol, {
|
|
|
|
|
status: OptionContractAggregatesSyncStatus.STARTED,
|
|
|
|
|
});
|
|
|
|
|
for await (const batch of Polygon.makeGetStockAggregatesIterator({
|
|
|
|
|
symbol,
|
|
|
|
|
firstDate,
|
|
|
|
|
lastDate,
|
|
|
|
|
})) {
|
|
|
|
|
if (batch.length > 0) {
|
|
|
|
|
console.log(
|
|
|
|
|
symbol,
|
|
|
|
|
new Date(batch[0].tsStart * 1000),
|
|
|
|
|
new Date(batch[batch.length - 1].tsStart * 1000)
|
|
|
|
|
);
|
|
|
|
|
await clickhouse.insert({
|
|
|
|
|
table: "stock_aggregates",
|
|
|
|
|
values: batch,
|
|
|
|
|
format: "JSONEachRow",
|
|
|
|
|
});
|
|
|
|
|
// await pRetry(
|
|
|
|
|
// async () => {
|
|
|
|
|
// console.log(`inserting ${batch.length} rows`);
|
|
|
|
|
// await clickhouse.insert({
|
|
|
|
|
// table: "stock_aggregates",
|
|
|
|
|
// values: batch,
|
|
|
|
|
// format: "JSONEachRow",
|
|
|
|
|
// });
|
|
|
|
|
// console.log("inserted");
|
|
|
|
|
// },
|
|
|
|
|
// { forever: true, factor: 2, maxTimeout: 120000 }
|
|
|
|
|
// );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
await setPullAggregatesState(symbol, {
|
|
|
|
|
status: OptionContractAggregatesSyncStatus.COMPLETED,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function pullAllStockAggregates(firstDate, lastDate) {
|
|
|
|
|
const symbols = (
|
|
|
|
|
await query(
|
|
|
|
|
`SELECT DISTINCT(symbol) as symbol FROM option_contract_existences WHERE asOfDate >= '${firstDate}' AND asOfDate <= '${lastDate}'`
|
|
|
|
|
)
|
|
|
|
|
).map(({ symbol }) => symbol);
|
|
|
|
|
for (const symbol of symbols) {
|
|
|
|
|
await pullStockAggregates(symbol, firstDate, lastDate);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function* makeGetOptionContractsIterator(
|
|
|
|
|
symbol: string,
|
|
|
|
|
asOfDate: string
|
|
|
|
|