From 74e784b39e596b25943ac1a941cbb9fd24dcce02 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Sat, 4 Jan 2025 22:00:33 +0100 Subject: [PATCH] update hottest contract page --- .../options/hottest-contracts/+page.svelte | 272 +++++++++++++++++- 1 file changed, 260 insertions(+), 12 deletions(-) diff --git a/src/routes/stocks/[tickerID]/options/hottest-contracts/+page.svelte b/src/routes/stocks/[tickerID]/options/hottest-contracts/+page.svelte index d3c95f6e..775140f8 100644 --- a/src/routes/stocks/[tickerID]/options/hottest-contracts/+page.svelte +++ b/src/routes/stocks/[tickerID]/options/hottest-contracts/+page.svelte @@ -21,14 +21,18 @@ return daysLeft + "D"; } - let rawData = data?.getData?.map((item) => ({ + let rawDataVolume = data?.getData?.volume?.map((item) => ({ ...item, dte: daysLeft(item?.date_expiration), })); - let openInterestList = rawData?.sort( - (a, b) => b?.open_interest - a?.open_interest, - ); + let rawDataOI = data?.getData?.openInterest?.map((item) => ({ + ...item, + dte: daysLeft(item?.date_expiration), + })); + + let volumeList = rawDataVolume; + let openInterestList = rawDataOI; $: columns = [ { key: "strike_price", label: "Chain", align: "left" }, @@ -64,7 +68,7 @@ // Cycle through 'none', 'asc', 'desc' for the clicked key const orderCycle = ["none", "asc", "desc"]; - let originalData = rawData?.sort( + let originalData = rawDataVolume?.sort( (a, b) => b?.open_interest - a?.open_interest, ); const currentOrderIndex = orderCycle.indexOf(sortOrders[key].order); @@ -74,8 +78,67 @@ // Reset to original data when 'none' and stop further sorting if (sortOrder === "none") { - originalData = [...rawData]; // Reset originalData to rawData - openInterestList = originalData; + originalData = [...rawDataVolume]; // Reset originalData to rawDataVolume + volumeList = originalData; + return; + } + + // Define a generic comparison function + const compareValues = (a, b) => { + const { type } = sortOrders[key]; + let valueA, valueB; + + switch (type) { + case "date": + valueA = new Date(a[key]); + valueB = new Date(b[key]); + break; + case "string": + valueA = a[key].toUpperCase(); + valueB = b[key].toUpperCase(); + return sortOrder === "asc" + ? valueA.localeCompare(valueB) + : valueB.localeCompare(valueA); + case "number": + default: + valueA = parseFloat(a[key]); + valueB = parseFloat(b[key]); + break; + } + + if (sortOrder === "asc") { + return valueA < valueB ? -1 : valueA > valueB ? 1 : 0; + } else { + return valueA > valueB ? -1 : valueA < valueB ? 1 : 0; + } + }; + + // Sort using the generic comparison function + volumeList = [...originalData].sort(compareValues); + }; + + const sortDataOI = (key) => { + // Reset all other keys to 'none' except the current key + for (const k in sortOrders) { + if (k !== key) { + sortOrders[k].order = "none"; + } + } + + // Cycle through 'none', 'asc', 'desc' for the clicked key + const orderCycle = ["none", "asc", "desc"]; + let originalData = rawDataOI?.sort( + (a, b) => b?.open_interest - a?.open_interest, + ); + const currentOrderIndex = orderCycle.indexOf(sortOrders[key].order); + sortOrders[key].order = + orderCycle[(currentOrderIndex + 1) % orderCycle.length]; + const sortOrder = sortOrders[key].order; + + // Reset to original data when 'none' and stop further sorting + if (sortOrder === "none") { + originalData = [...rawDataOI]; // Reset originalData to rawDataOI + volumeList = originalData; return; } @@ -121,12 +184,12 @@
- {#if rawData?.length > 0} + {#if rawDataVolume?.length > 0}

- Hottest Contracts (Highest OI) + Hottest Contracts (Highest Volume)

+ + {#each volumeList as item, index} + + + + + + + + + + + + {/each} + +
+ + {item?.option_type === "C" ? "Call" : "Put"} + + + + {item?.dte} + + {item?.last_price} + + {item?.low_price}-{item?.high_price} + + {item?.volume?.toLocaleString("en-US")} + + {item?.open_interest?.toLocaleString("en-US")} + + {#if item?.open_interest_change >= 0} + +{item?.open_interest_change?.toLocaleString( + "en-US", + )} + {:else} + {item?.open_interest_change?.toLocaleString( + "en-US", + )} + {/if} + + + +
+ +
+ +
+ + +
+ + +
+
+
+
+ +
+
+
+ Bid Vol: {@html abbreviateNumberWithColor( + item?.bid_volume, + false, + true, + )} +
+
+ Mid Vol: {@html abbreviateNumberWithColor( + item?.mid_volume, + false, + true, + )} +
+
+ Ask Vol: {@html abbreviateNumberWithColor( + item?.ask_volume, + false, + true, + )} +
+
+
+
+
+
+ {@html abbreviateNumberWithColor( + item?.total_premium, + false, + true, + )} +
+
+ +

+ Highest OI Contracts +

+
+ + + + {#each openInterestList as item, index}
- {item?.strike_price} {item?.option_type === "C" ? "Call" : "Put"} - {" " + item?.date_expiration} +