add dev envs; add lookbackPeriod
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
VITE_SERVER_BASE_URL=http://127.0.0.1:3005
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
"@preact/signals": "^1.2.2",
|
"@preact/signals": "^1.2.2",
|
||||||
"@trpc/client": "^10.45.0",
|
"@trpc/client": "^10.45.0",
|
||||||
"chart.js": "^4.4.1",
|
"chart.js": "^4.4.1",
|
||||||
|
"dotenv": "^16.4.1",
|
||||||
"preact": "^10.13.1",
|
"preact": "^10.13.1",
|
||||||
"preact-iso": "^2.3.2",
|
"preact-iso": "^2.3.2",
|
||||||
"preact-render-to-string": "^6.3.1",
|
"preact-render-to-string": "^6.3.1",
|
||||||
|
|||||||
Generated
+8
@@ -14,6 +14,9 @@ dependencies:
|
|||||||
chart.js:
|
chart.js:
|
||||||
specifier: ^4.4.1
|
specifier: ^4.4.1
|
||||||
version: 4.4.1
|
version: 4.4.1
|
||||||
|
dotenv:
|
||||||
|
specifier: ^16.4.1
|
||||||
|
version: 16.4.1
|
||||||
preact:
|
preact:
|
||||||
specifier: ^10.13.1
|
specifier: ^10.13.1
|
||||||
version: 10.19.3
|
version: 10.19.3
|
||||||
@@ -724,6 +727,11 @@ packages:
|
|||||||
domhandler: 5.0.3
|
domhandler: 5.0.3
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/dotenv@16.4.1:
|
||||||
|
resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/electron-to-chromium@1.4.623:
|
/electron-to-chromium@1.4.623:
|
||||||
resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==}
|
resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import dotenv from 'dotenv';
|
||||||
|
|
||||||
|
if(process.env.NODE_DEV==="development"){
|
||||||
|
dotenv.config({ path:"../.env.development" });
|
||||||
|
}
|
||||||
|
|
||||||
|
export default null;
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import _ from './env';
|
||||||
import { render } from 'preact';
|
import { render } from 'preact';
|
||||||
import { LocationProvider, Router, Route } from 'preact-iso';
|
import { LocationProvider, Router, Route } from 'preact-iso';
|
||||||
|
|
||||||
|
|||||||
@@ -32,12 +32,17 @@ const historicalCalendarQuoteChartData = signal([]);
|
|||||||
|
|
||||||
const historicalCalendarExitQuoteChartData = signal([]);
|
const historicalCalendarExitQuoteChartData = signal([]);
|
||||||
|
|
||||||
|
const chosenLookbackPeriodStart = signal("2022-01-01");
|
||||||
|
const chosenLookbackPeriodEnd = signal("2024-01-01");
|
||||||
|
|
||||||
|
|
||||||
export function HistoricalCalendarPrices(){
|
export function HistoricalCalendarPrices(){
|
||||||
const refreshHistoricalStockQuoteChartData = useCallback(()=>{
|
const refreshHistoricalStockQuoteChartData = useCallback(()=>{
|
||||||
trpc.getHistoricalStockQuoteChartData
|
trpc.getHistoricalStockQuoteChartData
|
||||||
.query({
|
.query({
|
||||||
underlying:chosenUnderlying.value,
|
underlying:chosenUnderlying.value,
|
||||||
|
lookbackPeriodStart:chosenLookbackPeriodStart.value,
|
||||||
|
lookbackPeriodEnd:chosenLookbackPeriodEnd.value,
|
||||||
})
|
})
|
||||||
.then((getHistoricalStockQuoteChartDataResponse)=>{
|
.then((getHistoricalStockQuoteChartDataResponse)=>{
|
||||||
historicalStockQuoteChartData.value = getHistoricalStockQuoteChartDataResponse;
|
historicalStockQuoteChartData.value = getHistoricalStockQuoteChartDataResponse;
|
||||||
@@ -51,6 +56,8 @@ export function HistoricalCalendarPrices(){
|
|||||||
daysBetweenFrontAndBackExpiration:chosenDaysBetweenFrontAndBackExpiration.value,
|
daysBetweenFrontAndBackExpiration:chosenDaysBetweenFrontAndBackExpiration.value,
|
||||||
strikePercentageFromUnderlyingPriceRangeMin:chosenStrikePercentageFromUnderlyingPrice.value - chosenStrikePercentageFromUnderlyingPriceRadius.value,
|
strikePercentageFromUnderlyingPriceRangeMin:chosenStrikePercentageFromUnderlyingPrice.value - chosenStrikePercentageFromUnderlyingPriceRadius.value,
|
||||||
strikePercentageFromUnderlyingPriceRangeMax:chosenStrikePercentageFromUnderlyingPrice.value + chosenStrikePercentageFromUnderlyingPriceRadius.value,
|
strikePercentageFromUnderlyingPriceRangeMax:chosenStrikePercentageFromUnderlyingPrice.value + chosenStrikePercentageFromUnderlyingPriceRadius.value,
|
||||||
|
lookbackPeriodStart:chosenLookbackPeriodStart.value,
|
||||||
|
lookbackPeriodEnd:chosenLookbackPeriodEnd.value,
|
||||||
})
|
})
|
||||||
.then((getHistoricalCalendarQuoteChartDataResponse)=>{
|
.then((getHistoricalCalendarQuoteChartDataResponse)=>{
|
||||||
historicalCalendarQuoteChartData.value = getHistoricalCalendarQuoteChartDataResponse;
|
historicalCalendarQuoteChartData.value = getHistoricalCalendarQuoteChartDataResponse;
|
||||||
@@ -62,6 +69,8 @@ export function HistoricalCalendarPrices(){
|
|||||||
underlying:chosenUnderlying.value,
|
underlying:chosenUnderlying.value,
|
||||||
daysToFrontExpiration:chosenExitToFrontExpiration.value,
|
daysToFrontExpiration:chosenExitToFrontExpiration.value,
|
||||||
daysBetweenFrontAndBackExpiration:chosenDaysBetweenFrontAndBackExpiration.value,
|
daysBetweenFrontAndBackExpiration:chosenDaysBetweenFrontAndBackExpiration.value,
|
||||||
|
lookbackPeriodStart:chosenLookbackPeriodStart.value,
|
||||||
|
lookbackPeriodEnd:chosenLookbackPeriodEnd.value,
|
||||||
})
|
})
|
||||||
.then((getHistoricalCalendarExitQuoteChartDataResponse)=>{
|
.then((getHistoricalCalendarExitQuoteChartDataResponse)=>{
|
||||||
historicalCalendarExitQuoteChartData.value = getHistoricalCalendarExitQuoteChartDataResponse;
|
historicalCalendarExitQuoteChartData.value = getHistoricalCalendarExitQuoteChartDataResponse;
|
||||||
@@ -106,6 +115,19 @@ export function HistoricalCalendarPrices(){
|
|||||||
refreshHistoricalCalendarExitQuoteChartData();
|
refreshHistoricalCalendarExitQuoteChartData();
|
||||||
},[]);
|
},[]);
|
||||||
|
|
||||||
|
const handleLookbackPeriodStartChange = useCallback((e)=>{
|
||||||
|
chosenLookbackPeriodStart.value = e.target.value;
|
||||||
|
refreshHistoricalStockQuoteChartData();
|
||||||
|
refreshHistoricalCalendarQuoteChartData();
|
||||||
|
refreshHistoricalCalendarExitQuoteChartData();
|
||||||
|
},[]);
|
||||||
|
const handleLookbackPeriodEndChange = useCallback((e)=>{
|
||||||
|
chosenLookbackPeriodEnd.value = e.target.value;
|
||||||
|
refreshHistoricalStockQuoteChartData();
|
||||||
|
refreshHistoricalCalendarQuoteChartData();
|
||||||
|
refreshHistoricalCalendarExitQuoteChartData();
|
||||||
|
},[]);
|
||||||
|
|
||||||
useEffect(handleInit, []);
|
useEffect(handleInit, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -145,6 +167,12 @@ export function HistoricalCalendarPrices(){
|
|||||||
<input type="text" onChange={handleExitToFrontExpirationChange} value={chosenExitToFrontExpiration.value} />
|
<input type="text" onChange={handleExitToFrontExpirationChange} value={chosenExitToFrontExpiration.value} />
|
||||||
Days
|
Days
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<label>Lookback Period</label>
|
||||||
|
<input type="text" onChange={handleLookbackPeriodStartChange} value={chosenLookbackPeriodStart.value} />
|
||||||
|
-
|
||||||
|
<input type="text" onChange={handleLookbackPeriodEndChange} value={chosenLookbackPeriodEnd.value} />
|
||||||
|
</div>
|
||||||
<div className="chart-container">
|
<div className="chart-container">
|
||||||
{chosenUnderlying.value!==null && historicalStockQuoteChartData.value.length>0
|
{chosenUnderlying.value!==null && historicalStockQuoteChartData.value.length>0
|
||||||
? <div className="chart">
|
? <div className="chart">
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
CLICKHOUSE_HOST=http://localhost:8123
|
||||||
|
LISTEN_PORT=3005
|
||||||
+2
-1
@@ -12,7 +12,8 @@
|
|||||||
"@clickhouse/client": "^0.2.7",
|
"@clickhouse/client": "^0.2.7",
|
||||||
"@sinclair/typebox": "^0.32.5",
|
"@sinclair/typebox": "^0.32.5",
|
||||||
"@trpc/server": "^10.45.0",
|
"@trpc/server": "^10.45.0",
|
||||||
"cors": "^2.8.5"
|
"cors": "^2.8.5",
|
||||||
|
"dotenv": "^16.4.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cors": "^2.8.17",
|
"@types/cors": "^2.8.17",
|
||||||
|
|||||||
Generated
+8
@@ -17,6 +17,9 @@ dependencies:
|
|||||||
cors:
|
cors:
|
||||||
specifier: ^2.8.5
|
specifier: ^2.8.5
|
||||||
version: 2.8.5
|
version: 2.8.5
|
||||||
|
dotenv:
|
||||||
|
specifier: ^16.4.1
|
||||||
|
version: 16.4.1
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@types/cors':
|
'@types/cors':
|
||||||
@@ -386,6 +389,11 @@ packages:
|
|||||||
object-keys: 1.1.1
|
object-keys: 1.1.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/dotenv@16.4.1:
|
||||||
|
resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/error-ex@1.3.2:
|
/error-ex@1.3.2:
|
||||||
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
|
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import dotenv from 'dotenv';
|
||||||
|
|
||||||
|
if(process.env.NODE_DEV==="development"){
|
||||||
|
dotenv.config({ path:"../.env.development" });
|
||||||
|
}
|
||||||
|
|
||||||
|
export default null;
|
||||||
+17
-4
@@ -1,6 +1,7 @@
|
|||||||
|
import _ from './env';
|
||||||
import { publicProcedure, router } from './trpc.js';
|
import { publicProcedure, router } from './trpc.js';
|
||||||
import { query } from './clickhouse.js';
|
import { query } from './clickhouse.js';
|
||||||
import { createHTTPHandler, createHTTPServer } from '@trpc/server/adapters/standalone';
|
import { createHTTPHandler } from '@trpc/server/adapters/standalone';
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
import { Object as ObjectT, String as StringT, TSchema, Number as NumberT } from '@sinclair/typebox';
|
import { Object as ObjectT, String as StringT, TSchema, Number as NumberT } from '@sinclair/typebox';
|
||||||
import { TypeCompiler } from '@sinclair/typebox/compiler';
|
import { TypeCompiler } from '@sinclair/typebox/compiler';
|
||||||
@@ -140,15 +141,19 @@ const appRouter = router({
|
|||||||
getHistoricalStockQuoteChartData: publicProcedure
|
getHistoricalStockQuoteChartData: publicProcedure
|
||||||
.input(RpcType(ObjectT({
|
.input(RpcType(ObjectT({
|
||||||
underlying:StringT(),
|
underlying:StringT(),
|
||||||
|
lookbackPeriodStart:StringT(),
|
||||||
|
lookbackPeriodEnd:StringT(),
|
||||||
})))
|
})))
|
||||||
.query(async (opts)=>{
|
.query(async (opts)=>{
|
||||||
const {underlying, } = opts.input;
|
const { underlying, lookbackPeriodStart, lookbackPeriodEnd } = opts.input;
|
||||||
return (await query<[number,number]>(`
|
return (await query<[number,number]>(`
|
||||||
SELECT
|
SELECT
|
||||||
toUnixTimestamp(tsStart) as x,
|
toUnixTimestamp(tsStart) as x,
|
||||||
open as y
|
open as y
|
||||||
FROM stock_aggregates
|
FROM stock_aggregates
|
||||||
WHERE symbol = '${underlying}'
|
WHERE symbol = '${underlying}'
|
||||||
|
AND tsStart >= '${lookbackPeriodStart} 00:00:00'
|
||||||
|
AND tsStart <= '${lookbackPeriodEnd} 00:00:00'
|
||||||
ORDER BY x ASC
|
ORDER BY x ASC
|
||||||
`,'JSONEachRow'));
|
`,'JSONEachRow'));
|
||||||
}),
|
}),
|
||||||
@@ -159,9 +164,11 @@ const appRouter = router({
|
|||||||
daysBetweenFrontAndBackExpiration:NumberT(),
|
daysBetweenFrontAndBackExpiration:NumberT(),
|
||||||
strikePercentageFromUnderlyingPriceRangeMin:NumberT(),
|
strikePercentageFromUnderlyingPriceRangeMin:NumberT(),
|
||||||
strikePercentageFromUnderlyingPriceRangeMax:NumberT(),
|
strikePercentageFromUnderlyingPriceRangeMax:NumberT(),
|
||||||
|
lookbackPeriodStart:StringT(),
|
||||||
|
lookbackPeriodEnd:StringT(),
|
||||||
})))
|
})))
|
||||||
.query(async (opts)=>{
|
.query(async (opts)=>{
|
||||||
const {underlying, daysToFrontExpiration, daysBetweenFrontAndBackExpiration, strikePercentageFromUnderlyingPriceRangeMin, strikePercentageFromUnderlyingPriceRangeMax, } = opts.input;
|
const {underlying, daysToFrontExpiration, daysBetweenFrontAndBackExpiration, strikePercentageFromUnderlyingPriceRangeMin, strikePercentageFromUnderlyingPriceRangeMax, lookbackPeriodStart, lookbackPeriodEnd, } = opts.input;
|
||||||
return (await query<[number,number]>(`
|
return (await query<[number,number]>(`
|
||||||
SELECT
|
SELECT
|
||||||
toUnixTimestamp(tsStart) as x,
|
toUnixTimestamp(tsStart) as x,
|
||||||
@@ -172,6 +179,8 @@ const appRouter = router({
|
|||||||
AND strikePercentageFromUnderlyingPrice >= ${strikePercentageFromUnderlyingPriceRangeMin}
|
AND strikePercentageFromUnderlyingPrice >= ${strikePercentageFromUnderlyingPriceRangeMin}
|
||||||
AND strikePercentageFromUnderlyingPrice <= ${strikePercentageFromUnderlyingPriceRangeMax}
|
AND strikePercentageFromUnderlyingPrice <= ${strikePercentageFromUnderlyingPriceRangeMax}
|
||||||
AND daysBetweenFrontAndBackExpiration = ${daysBetweenFrontAndBackExpiration}
|
AND daysBetweenFrontAndBackExpiration = ${daysBetweenFrontAndBackExpiration}
|
||||||
|
AND tsStart >= '${lookbackPeriodStart} 00:00:00'
|
||||||
|
AND tsStart <= '${lookbackPeriodEnd} 00:00:00'
|
||||||
`,'JSONEachRow'));
|
`,'JSONEachRow'));
|
||||||
}),
|
}),
|
||||||
getHistoricalCalendarExitQuoteChartData: publicProcedure
|
getHistoricalCalendarExitQuoteChartData: publicProcedure
|
||||||
@@ -179,9 +188,11 @@ const appRouter = router({
|
|||||||
underlying:StringT(),
|
underlying:StringT(),
|
||||||
daysToFrontExpiration:NumberT(),
|
daysToFrontExpiration:NumberT(),
|
||||||
daysBetweenFrontAndBackExpiration:NumberT(),
|
daysBetweenFrontAndBackExpiration:NumberT(),
|
||||||
|
lookbackPeriodStart:StringT(),
|
||||||
|
lookbackPeriodEnd:StringT(),
|
||||||
})))
|
})))
|
||||||
.query(async (opts)=>{
|
.query(async (opts)=>{
|
||||||
const {underlying, daysToFrontExpiration, daysBetweenFrontAndBackExpiration, } = opts.input;
|
const {underlying, daysToFrontExpiration, daysBetweenFrontAndBackExpiration, lookbackPeriodStart, lookbackPeriodEnd, } = opts.input;
|
||||||
return (await query<[number,number]>(`
|
return (await query<[number,number]>(`
|
||||||
SELECT
|
SELECT
|
||||||
FLOOR(strikePercentageFromUnderlyingPrice, 1) as x,
|
FLOOR(strikePercentageFromUnderlyingPrice, 1) as x,
|
||||||
@@ -192,6 +203,8 @@ const appRouter = router({
|
|||||||
AND strikePercentageFromUnderlyingPrice >= -5.0
|
AND strikePercentageFromUnderlyingPrice >= -5.0
|
||||||
AND strikePercentageFromUnderlyingPrice <= 5.0
|
AND strikePercentageFromUnderlyingPrice <= 5.0
|
||||||
AND daysBetweenFrontAndBackExpiration = ${daysBetweenFrontAndBackExpiration}
|
AND daysBetweenFrontAndBackExpiration = ${daysBetweenFrontAndBackExpiration}
|
||||||
|
AND tsStart >= '${lookbackPeriodStart} 00:00:00'
|
||||||
|
AND tsStart <= '${lookbackPeriodEnd} 00:00:00'
|
||||||
ORDER BY x ASC
|
ORDER BY x ASC
|
||||||
`,'JSONEachRow'));
|
`,'JSONEachRow'));
|
||||||
}),
|
}),
|
||||||
|
|||||||
Reference in New Issue
Block a user