From ead2e5bd1baa5ca76bede64fb7d18ec768931901 Mon Sep 17 00:00:00 2001 From: Avraham Sakal Date: Mon, 11 Mar 2024 22:19:22 -0400 Subject: [PATCH] refactor calendar optimizer page --- .../src/pages/CalendarOptimizer/index.tsx | 190 ++++++++++-------- server/src/index.ts | 2 +- 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/frontend/src/pages/CalendarOptimizer/index.tsx b/frontend/src/pages/CalendarOptimizer/index.tsx index dd24b4b..0f526d1 100644 --- a/frontend/src/pages/CalendarOptimizer/index.tsx +++ b/frontend/src/pages/CalendarOptimizer/index.tsx @@ -1,6 +1,6 @@ import { signal } from "@preact/signals"; import { useCallback, useEffect } from "preact/hooks"; -import {trpc} from '../../trpc.js'; +import { trpc } from "../../trpc.js"; const availableUnderlyings = signal([]); const chosenUnderlying = signal(null); @@ -17,55 +17,87 @@ const chosenStrike = signal(null); const optionContractUplotData = signal([]); const underlyingUplotData = signal([]); -export function CalendarOptimizer(){ - const handleInit = useCallback(()=>{ +function chooseUnderlying(underlying: string) { + chosenUnderlying.value = underlying; + trpc.getAvailableAsOfDates + .query({ underlying: underlying }) + .then((getAvailableAsOfDatesResponse) => { + availableAsOfDates.value = getAvailableAsOfDatesResponse; + chooseAsOfDate(getAvailableAsOfDatesResponse[0]); + }); + trpc.getOpensForUnderlying + .query({ underlying: underlying }) + .then((getOpensForUnderlyingResponse) => { + underlyingUplotData.value = getOpensForUnderlyingResponse; + }); +} + +function chooseAsOfDate(asOfDate: string) { + chosenAsOfDate.value = asOfDate; + trpc.getExpirationsForUnderlying + .query({ + underlying: chosenUnderlying.value, + asOfDate: chosenAsOfDate.value, + }) + .then((getExpirationsForUnderlyingResponse) => { + availableExpirations.value = getExpirationsForUnderlyingResponse; + chooseExpiration(getExpirationsForUnderlyingResponse[0]); + }); +} + +function chooseExpiration(expiration: string) { + chosenExpiration.value = expiration; + trpc.getStrikesForUnderlying + .query({ + underlying: chosenUnderlying.value, + asOfDate: chosenAsOfDate.value, + expirationDate: expiration, + }) + .then((getStrikesForUnderlyingResponse) => { + availableStrikes.value = getStrikesForUnderlyingResponse; + chooseStrike(getStrikesForUnderlyingResponse[0]); + }); +} + +function chooseStrike(strike: string) { + chosenStrike.value = strike; + trpc.getOpensForOptionContract + .query({ + underlying: chosenUnderlying.value, + expirationDate: chosenExpiration.value, + strike: parseFloat(strike), + }) + .then((getOpensForOptionContractResponse) => { + optionContractUplotData.value = getOpensForOptionContractResponse; + }); +} + +export function CalendarOptimizer() { + const handleInit = useCallback(() => { trpc.getAvailableUnderlyings .query() - .then((availableUnderlyingsResponse)=>{ + .then((availableUnderlyingsResponse) => { availableUnderlyings.value = availableUnderlyingsResponse; + // load first underlying in list: + chooseUnderlying(availableUnderlyingsResponse[0]); }); - },[]); - const handleUnderlyingChange = useCallback((e)=>{ + }, []); + const handleUnderlyingChange = useCallback((e) => { console.log(`Chose Underlying: ${e.target.value}`); - chosenUnderlying.value = e.target.value; - trpc.getAvailableAsOfDates - .query({underlying:e.target.value}) - .then((getAvailableAsOfDatesResponse)=>{ - availableAsOfDates.value = getAvailableAsOfDatesResponse; - }); - trpc.getOpensForUnderlying - .query({underlying:e.target.value}) - .then((getOpensForUnderlyingResponse)=>{ - underlyingUplotData.value = getOpensForUnderlyingResponse; - }); - },[]); - const handleAsOfDateChange = useCallback((e)=>{ + chooseUnderlying(e.target.value); + }, []); + const handleAsOfDateChange = useCallback((e) => { console.log(`Chose Date: ${e.target.value}`); - chosenAsOfDate.value = e.target.value; - trpc.getExpirationsForUnderlying - .query({underlying:chosenUnderlying.value, asOfDate:chosenAsOfDate.value}) - .then((getExpirationsForUnderlyingResponse)=>{ - availableExpirations.value = getExpirationsForUnderlyingResponse; - }); - },[]); - const handleExpirationChange = useCallback((e)=>{ + chooseAsOfDate(e.target.value); + }, []); + const handleExpirationChange = useCallback((e) => { console.log(`Chose Expiration: ${e.target.value}`); - chosenExpiration.value = e.target.value; - trpc.getStrikesForUnderlying - .query({underlying:chosenUnderlying.value, asOfDate:chosenAsOfDate.value, expirationDate: e.target.value}) - .then((getStrikesForUnderlyingResponse)=>{ - availableStrikes.value = getStrikesForUnderlyingResponse; - }); - },[]); - const handleStrikeChange = useCallback((e)=>{ + chooseExpiration(e.target.value); + }, []); + const handleStrikeChange = useCallback((e) => { console.log(`Chose Strike: ${e.target.value}`); - chosenStrike.value = e.target.value; - trpc.getOpensForOptionContract - .query({underlying:chosenUnderlying.value, expirationDate:chosenExpiration.value, strike:parseFloat(e.target.value)}) - .then((getOpensForOptionContractResponse)=>{ - optionContractUplotData.value = getOpensForOptionContractResponse; - }); - },[]); + chooseStrike(e.target.value); + }, []); useEffect(handleInit, []); @@ -73,51 +105,51 @@ export function CalendarOptimizer(){
- { - availableUnderlyings.value.length === 0 - ? "Loading..." - : - } + {availableUnderlyings.value.length === 0 ? ( + "Loading..." + ) : ( + + )}
- { - availableAsOfDates.value.length === 0 - ? "Loading..." - : - } + {availableAsOfDates.value.length === 0 ? ( + "Loading..." + ) : ( + + )}
- { - availableExpirations.value.length === 0 - ? "Loading..." - : - } + {availableExpirations.value.length === 0 ? ( + "Loading..." + ) : ( + + )}
- { - availableStrikes.value.length === 0 - ? "Loading..." - : - } + {availableStrikes.value.length === 0 ? ( + "Loading..." + ) : ( + + )}
{/* {chosenUnderlying.value!==null && underlyingUplotData.value.length>0 ? @@ -127,4 +159,4 @@ export function CalendarOptimizer(){ : <>} */}
); -} \ No newline at end of file +} diff --git a/server/src/index.ts b/server/src/index.ts index f368a1a..534718e 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -149,7 +149,7 @@ const appRouter = router({ WHERE symbol = '${underlying}' AND expirationDate = '${expirationDate}' AND strike = ${strike} - AND optionType = 'call' + AND type = 'call' ORDER BY tsStart ASC `, "JSONCompactEachRow"