From db566b7021b5f5e0e3341492b898d9039cec2d6a Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Tue, 7 Jan 2025 23:12:28 +0100 Subject: [PATCH] update option page by including gex --- .../components/DarkPool/HottestTrades.svelte | 3 +- src/lib/components/Table/DarkPoolTable.svelte | 3 +- .../etf/[tickerID]/dark-pool/+page.server.ts | 6 +- .../etf/[tickerID]/dark-pool/+page.svelte | 37 +- .../stocks/[tickerID]/options/+layout.svelte | 22 + .../[tickerID]/options/gex/+page.server.ts | 49 ++ .../[tickerID]/options/gex/+page.svelte | 525 ++++++++++++++++++ 7 files changed, 622 insertions(+), 23 deletions(-) create mode 100644 src/routes/stocks/[tickerID]/options/gex/+page.server.ts create mode 100644 src/routes/stocks/[tickerID]/options/gex/+page.svelte diff --git a/src/lib/components/DarkPool/HottestTrades.svelte b/src/lib/components/DarkPool/HottestTrades.svelte index 58d1d43e..5072e4cd 100644 --- a/src/lib/components/DarkPool/HottestTrades.svelte +++ b/src/lib/components/DarkPool/HottestTrades.svelte @@ -31,6 +31,7 @@ const parts = formatter.formatToParts(date); const year = parts.find((p) => p.type === "year").value; + const month = parts.find((p) => p.type === "month").value; const day = parts.find((p) => p.type === "day").value; const hour = parts.find((p) => p.type === "hour").value.padStart(2, "0"); const minute = parts @@ -39,7 +40,7 @@ const ampm = parts.find((p) => p.type === "dayPeriod").value; // AM/PM - return `${day}/${year} ${hour}:${minute} ${ampm}`; + return `${month}/${day}/${year} ${hour}:${minute} ${ampm}`; } $: columns = [ diff --git a/src/lib/components/Table/DarkPoolTable.svelte b/src/lib/components/Table/DarkPoolTable.svelte index fa8b487f..eae7d459 100644 --- a/src/lib/components/Table/DarkPoolTable.svelte +++ b/src/lib/components/Table/DarkPoolTable.svelte @@ -30,6 +30,7 @@ const parts = formatter.formatToParts(date); const year = parts.find((p) => p.type === "year").value; + const month = parts.find((p) => p.type === "month").value; const day = parts.find((p) => p.type === "day").value; const hour = parts.find((p) => p.type === "hour").value.padStart(2, "0"); const minute = parts @@ -38,7 +39,7 @@ const ampm = parts.find((p) => p.type === "dayPeriod").value; // AM/PM - return `${day}/${year} ${hour}:${minute} ${ampm}`; + return `${month}/${day}/${year} ${hour}:${minute} ${ampm}`; } let sortOrders = { diff --git a/src/routes/etf/[tickerID]/dark-pool/+page.server.ts b/src/routes/etf/[tickerID]/dark-pool/+page.server.ts index eb017e42..8f28436c 100644 --- a/src/routes/etf/[tickerID]/dark-pool/+page.server.ts +++ b/src/routes/etf/[tickerID]/dark-pool/+page.server.ts @@ -4,7 +4,7 @@ import { loginUserSchema, registerUserSchema } from "$lib/schemas"; export const load = async ({ params, locals }) => { - const { apiURL, apiKey } = locals; + const { apiURL, apiKey, user } = locals; const postData = { ticker: params.tickerID, @@ -22,7 +22,9 @@ export const load = async ({ params, locals }) => { body: JSON.stringify(postData), }); - const output = await response.json(); + let output = await response.json(); + output.hottestTrades = user?.tier !== "Pro" ? output?.hottestTrades?.slice(0, 3) : output.hottestTrades; + return output; }; diff --git a/src/routes/etf/[tickerID]/dark-pool/+page.svelte b/src/routes/etf/[tickerID]/dark-pool/+page.svelte index ac15b6e7..c888c6a7 100644 --- a/src/routes/etf/[tickerID]/dark-pool/+page.svelte +++ b/src/routes/etf/[tickerID]/dark-pool/+page.svelte @@ -17,7 +17,6 @@ let priceLevel = data?.getPriceLevel?.priceLevel || []; let hottestTrades = data?.getPriceLevel?.hottestTrades || []; let isLoaded = false; - onMount(() => { isLoaded = true; }); @@ -66,24 +65,24 @@ >
-
- - -
{#if priceLevel?.length === 0 && hottestTrades?.length === 0 && historicalDarkPool?.length === 0} - {:else} + {:else if priceLevel?.length === 0 && hottestTrades?.length === 0}{:else} +
+ + +
@@ -96,11 +95,11 @@ metrics={data?.getPriceLevel?.metrics} /> {/if} + {#if hottestTrades?.length > 0} + + {/if} {#if data?.user?.tier === "Pro"} - {#if hottestTrades?.length > 0} - - {/if} - {#if historicalDarkPool?.length > 0} + {#if historicalDarkPool?.length > 10} {/if} {:else} diff --git a/src/routes/stocks/[tickerID]/options/+layout.svelte b/src/routes/stocks/[tickerID]/options/+layout.svelte index 6d1d9f61..90211153 100644 --- a/src/routes/stocks/[tickerID]/options/+layout.svelte +++ b/src/routes/stocks/[tickerID]/options/+layout.svelte @@ -11,6 +11,8 @@ const subSectionMap = { overview: "/options", "hottest-contracts": "/options/hottest-contracts", + GEX: "/options/gex", + DEX: "/options/dex", }; if (state !== "overview" && subSectionMap[state]) { @@ -28,6 +30,8 @@ const sectionMap = { overview: "overview", "hottest-contracts": "hottest-contracts", + gex: "gex", + dex: "dex", }; const foundSection = parts?.find((part) => @@ -73,6 +77,24 @@ > Hottest Contracts + changeSubSection("gex")} + class="p-2 px-5 cursor-pointer {displaySubSection === 'gex' + ? 'text-white bg-primary sm:hover:bg-opacity-[0.95]' + : 'text-gray-400 sm:hover:text-white sm:hover:bg-primary sm:hover:bg-opacity-[0.95]'}" + > + GEX + + changeSubSection("dex")} + class="p-2 px-5 cursor-pointer {displaySubSection === 'dex' + ? 'text-white bg-primary sm:hover:bg-opacity-[0.95]' + : 'text-gray-400 sm:hover:text-white sm:hover:bg-primary sm:hover:bg-opacity-[0.95]'}" + > + DEX +
diff --git a/src/routes/stocks/[tickerID]/options/gex/+page.server.ts b/src/routes/stocks/[tickerID]/options/gex/+page.server.ts new file mode 100644 index 00000000..c0196205 --- /dev/null +++ b/src/routes/stocks/[tickerID]/options/gex/+page.server.ts @@ -0,0 +1,49 @@ + + +export const load = async ({ locals, params }) => { + const { apiKey, apiURL, user } = locals; + + const getData = async () => { + const postData = { + ticker: params.tickerID, + }; + + const response = await fetch(apiURL + "/options-gex-dex", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-API-KEY": apiKey, + }, + body: JSON.stringify(postData), + }); + const output = await response.json(); + + return output; + }; + + + const getHistoricalPrice = async () => { + const postData = { ticker: params.tickerID, timePeriod: "one-year" }; + const response = await fetch(apiURL + "/historical-price", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-API-KEY": apiKey, + }, + body: JSON.stringify(postData), + }); + + const output = await response.json(); + return output; + }; + + + + // Make sure to return a promise + return { + getData: await getData(), + getHistoricalPrice: await getHistoricalPrice(), + }; +}; + + diff --git a/src/routes/stocks/[tickerID]/options/gex/+page.svelte b/src/routes/stocks/[tickerID]/options/gex/+page.svelte new file mode 100644 index 00000000..f3792d13 --- /dev/null +++ b/src/routes/stocks/[tickerID]/options/gex/+page.svelte @@ -0,0 +1,525 @@ + + + + + + + {$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ""} + {$displayCompanyName} ({$stockTicker}) Gamma Exposure · Stocknear + + + + + + + + + + + + + + + + +
+
+
+ {#if rawData?.length > 0} +
+

+ Daily Gamma Exposure +

+ +
+ {#if options !== null} +
+
+ {#each ["3M", "6M", "1Y"] as item} + + {/each} +
+ + +
+ {:else} +
+
+ +
+
+ {/if} +
+
+ + + + + + {#each displayList as item, index} + + + + + + + + + + {/each} + +
+ {formatDate(item?.date)} + + {@html abbreviateNumberWithColor( + item?.call_gamma, + false, + true, + )} + + {@html abbreviateNumberWithColor( + item?.put_gamma, + false, + true, + )} + + {@html abbreviateNumberWithColor( + item?.net_gamma, + false, + true, + )} + + {#if item?.put_call_ratio <= 1} + {item?.put_call_ratio?.toFixed(2)} + {:else} + {item?.put_call_ratio?.toFixed(2)} + {/if} +
+
+ + +
+ {:else} +
+

+ Hottest Contracts +

+
+ +
+
+ {/if} +
+
+
+ +