From aa576406a6860e2af2fec9cb2cc6618c3bce39d7 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Thu, 10 Oct 2024 12:39:21 +0200 Subject: [PATCH] update sorting algorithm --- src/routes/options-flow/+page.svelte | 208 ++++++++++++--------------- 1 file changed, 88 insertions(+), 120 deletions(-) diff --git a/src/routes/options-flow/+page.svelte b/src/routes/options-flow/+page.svelte index a3bb41ec..1789b936 100644 --- a/src/routes/options-flow/+page.svelte +++ b/src/routes/options-flow/+page.svelte @@ -836,133 +836,101 @@ let sortOrders = { // Generalized sorting function function sortData(key) { - // Reset all other keys to 'none' except the current key - for (const k in sortOrders) { - if (k !== key) { - sortOrders[k] = 'none'; - } - } - - // Cycle through 'none', 'asc', 'desc' for the clicked key - if (key === 'time') { - // Only cycle between 'asc' and 'desc' for the 'time' key - if (sortOrders[key] === 'asc') { - sortOrders[key] = 'desc'; - } else { - sortOrders[key] = 'asc'; - } - } else { - // Cycle through 'none', 'asc', 'desc' for other keys - if (sortOrders[key] === 'none') { - sortOrders[key] = 'asc'; - } else if (sortOrders[key] === 'asc') { - sortOrders[key] = 'desc'; - } else { - sortOrders[key] = 'none'; + // Reset all other keys to 'none' except the current key + for (const k in sortOrders) { + if (k !== key) { + sortOrders[k] = 'none'; } } + // Cycle through 'none', 'asc', 'desc' for the clicked key + const orderCycle = ['none', 'asc', 'desc']; + const currentOrderIndex = orderCycle.indexOf(sortOrders[key]); + sortOrders[key] = orderCycle[(currentOrderIndex + 1) % orderCycle.length]; - const sortOrder = sortOrders[key]; - const originalData = filteredData?.length !==0 ? [...filteredData] : [...rawData]; - if (sortOrder === 'none') { - // Reset to original data when 'none' - displayedData = originalData; - } else { - displayedData = [...originalData]?.sort((a, b) => { - if (key === 'time') { - // Handle time comparison - const timeA = new Date('1970-01-01T' + a.time).getTime(); - const timeB = new Date('1970-01-01T' + b.time).getTime(); - return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; - } else if (key === 'ticker') { - // Handle alphabetical comparison for symbol - const tickerA = a.ticker.toUpperCase(); - const tickerB = b.ticker.toUpperCase(); - if (sortOrder === 'asc') { - return tickerA > tickerB ? 1 : -1; - } else { - return tickerA < tickerB ? 1 : -1; - } - } else if (key === 'expiry' || key==='dte') { - // Handle alphabetical comparison for symbol - const timeA = new Date (a?.date_expiration); - const timeB = new Date (b?.date_expiration); - return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; - } else if (key === 'strike') { - // Handle numeric comparison for strike - const strikeA = parseFloat(a.strike_price); // Convert to float for comparison - const strikeB = parseFloat(b.strike_price); - return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; - - } else if (key === 'spot') { - // Handle numeric comparison for strike - const strikeA = parseFloat(a.underlying_price); // Convert to float for comparison - const strikeB = parseFloat(b.underlying_price); - return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; - } else if (key === 'price') { - // Handle numeric comparison for strike - const strikeA = parseFloat(a?.price); // Convert to float for comparison - const strikeB = parseFloat(b?.price); - return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; - } else if (key === 'premium') { - // Handle numeric comparison for strike - const strikeA = parseFloat(a.cost_basis); // Convert to float for comparison - const strikeB = parseFloat(b.cost_basis); - return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; - } else if (key === 'vol') { - // Handle numeric comparison for strike - const strikeA = parseFloat(a.volume); // Convert to float for comparison - const strikeB = parseFloat(b.volume); - return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; - } else if (key === 'oi') { - // Handle numeric comparison for strike - const strikeA = parseFloat(a.open_interest); // Convert to float for comparison - const strikeB = parseFloat(b.open_interest); - return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; - } else if (key === 'callPut') { - // Handle Call/Put sorting - const callPutA = a?.put_call?.toUpperCase(); // Normalize to uppercase - const callPutB = b?.put_call?.toUpperCase(); - if (sortOrder === 'asc') { - return callPutA > callPutB ? 1 : -1; - } else { - return callPutA < callPutB ? 1 : -1; - } - } else if (key === 'sentiment') { - // Handle sentiment sorting - const sentimentOrder = { - 'BULLISH': 1, - 'NEUTRAL': 2, - 'BEARISH': 3, - }; - const sentimentA = sentimentOrder[a.sentiment?.toUpperCase()] || 4; // Fallback for undefined values - const sentimentB = sentimentOrder[b.sentiment?.toUpperCase()] || 4; + const sortOrder = sortOrders[key]; + const originalData = filteredData?.length !== 0 ? [...filteredData] : [...rawData]; - if (sortOrder === 'asc') { - return sentimentA - sentimentB; // Ascending order - } else { - return sentimentB - sentimentA; // Descending order - } - } else if (key === 'type') { - // Handle sentiment sorting - const sentimentOrder = { - 'SWEEP': 1, - 'TRADE': 2, - }; - const sentimentA = sentimentOrder[a?.option_activity_type?.toUpperCase()] || 3; // Fallback for undefined values - const sentimentB = sentimentOrder[b?.option_activity_type?.toUpperCase()] || 3; - - if (sortOrder === 'asc') { - return sentimentA - sentimentB; // Ascending order - } else { - return sentimentB - sentimentA; // Descending order - } - } - }); - } + // Reset to original data when 'none' + if (sortOrder === 'none') { + displayedData = originalData; + return; } + const compareFunctions = { + time: (a, b) => { + const timeA = new Date('1970-01-01T' + a.time).getTime(); + const timeB = new Date('1970-01-01T' + b.time).getTime(); + return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; + }, + ticker: (a, b) => { + const tickerA = a.ticker.toUpperCase(); + const tickerB = b.ticker.toUpperCase(); + return sortOrder === 'asc' ? tickerA.localeCompare(tickerB) : tickerB.localeCompare(tickerA); + }, + expiry: (a, b) => { + const timeA = new Date(a.date_expiration); + const timeB = new Date(b.date_expiration); + return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; + }, + dte: (a, b) => { + const timeA = new Date(a.date_expiration); + const timeB = new Date(b.date_expiration); + return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; + }, + strike: (a, b) => { + const strikeA = parseFloat(a.strike_price); + const strikeB = parseFloat(b.strike_price); + return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; + }, + spot: (a, b) => { + const spotA = parseFloat(a.underlying_price); + const spotB = parseFloat(b.underlying_price); + return sortOrder === 'asc' ? spotA - spotB : spotB - spotA; + }, + price: (a, b) => { + const priceA = parseFloat(a.price); + const priceB = parseFloat(b.price); + return sortOrder === 'asc' ? priceA - priceB : priceB - priceA; + }, + premium: (a, b) => { + const premiumA = parseFloat(a.cost_basis); + const premiumB = parseFloat(b.cost_basis); + return sortOrder === 'asc' ? premiumA - premiumB : premiumB - premiumA; + }, + vol: (a, b) => { + const volA = parseFloat(a.volume); + const volB = parseFloat(b.volume); + return sortOrder === 'asc' ? volA - volB : volB - volA; + }, + oi: (a, b) => { + const oiA = parseFloat(a.open_interest); + const oiB = parseFloat(b.open_interest); + return sortOrder === 'asc' ? oiA - oiB : oiB - oiA; + }, + callPut: (a, b) => { + const callPutA = a.put_call?.toUpperCase(); + const callPutB = b.put_call?.toUpperCase(); + return sortOrder === 'asc' ? callPutA.localeCompare(callPutB) : callPutB.localeCompare(callPutA); + }, + sentiment: (a, b) => { + const sentimentOrder = { 'BULLISH': 1, 'NEUTRAL': 2, 'BEARISH': 3 }; + const sentimentA = sentimentOrder[a.sentiment?.toUpperCase()] || 4; + const sentimentB = sentimentOrder[b.sentiment?.toUpperCase()] || 4; + return sortOrder === 'asc' ? sentimentA - sentimentB : sentimentB - sentimentA; + }, + type: (a, b) => { + const typeOrder = { 'SWEEP': 1, 'TRADE': 2 }; + const typeA = typeOrder[a.option_activity_type?.toUpperCase()] || 3; + const typeB = typeOrder[b.option_activity_type?.toUpperCase()] || 3; + return sortOrder === 'asc' ? typeA - typeB : typeB - typeA; + }, + }; + + // Sort using the appropriate comparison function + displayedData = originalData.sort(compareFunctions[key]); +} +