diff --git a/src/routes/stock-screener/+page.svelte b/src/routes/stock-screener/+page.svelte index de8c6957..a2cd576e 100644 --- a/src/routes/stock-screener/+page.svelte +++ b/src/routes/stock-screener/+page.svelte @@ -184,6 +184,7 @@ const allRules = { piotroskiScore: { label: 'Piotroski F-Score', step: [9,8,7,6,5,4,3,2,1], category: 'fund', defaultCondition: 'over', defaultValue: 'any' }, analystRating: { label: 'Analyst Rating', step: ['Strong Buy', 'Buy', 'Hold', 'Sell', 'Strong Sell'], category: 'fund', defaultCondition: '', defaultValue: 'any' }, + halalStocks: { label: 'Halal Stocks', step: ['Compliant', 'Non-Compliant'], defaultCondition: '', defaultValue: 'any' }, score: { label: 'AI Score', step: ['Strong Buy', 'Buy', 'Hold', 'Sell', 'Strong Sell'], category: 'fund', defaultCondition: '', defaultValue: 'any' }, sector: { label: 'Sector', step: sectorList, category: 'fund', defaultCondition: '', defaultValue: 'any' }, industry: { label: 'Industry', step: industryList, category: 'fund', defaultCondition: '', defaultValue: 'any' }, @@ -299,7 +300,7 @@ async function handleDeleteStrategy() { await updateStockScreenerData(); checkedItems = new Map( ruleOfList - ?.filter(rule => ["analystRating", "sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules + ?.filter(rule => ["analystRating", "halalStocks", "sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules ?.map(rule => [rule.name, new Set(rule.value)]) // Create Map from filtered rules ); } @@ -391,7 +392,7 @@ async function switchStrategy(item) { await updateStockScreenerData(); checkedItems = new Map( ruleOfList - ?.filter(rule => ["analystRating", "sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules + ?.filter(rule => ["analystRating", "halalStocks","sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules ?.map(rule => [rule.name, new Set(rule.value)]) // Create Map from filtered rules ); @@ -443,6 +444,7 @@ function handleAddRule() { switch (ruleName) { case 'analystRating': + case 'halalStocks': case 'score': case 'sector': case 'industry': @@ -505,7 +507,7 @@ async function handleResetAll() { displayResults = []; checkedItems = new Map( ruleOfList - ?.filter(rule => ["analystRating", "sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules + ?.filter(rule => ["analystRating", "halalStocks","sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules ?.map(rule => [rule.name, new Set(rule.value)]) // Create Map from filtered rules ); Object.keys(allRules).forEach(ruleName => { @@ -718,7 +720,7 @@ function changeRuleCondition(name: string, state: string) { let checkedItems = new Map( ruleOfList - ?.filter(rule => ["analystRating", "sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules + ?.filter(rule => ["analystRating", "halalStocks","sector","country","score","industry","grahamNumber"]?.includes(rule.name)) // Only include specific rules ?.map(rule => [rule.name, new Set(rule.value)]) // Create Map from filtered rules ); @@ -741,7 +743,7 @@ async function handleChangeValue(value) { checkedItems.set(ruleName, new Set([value])); } - if (['sma20','sma50','sma100','sma200','ema20', 'ema50', 'ema100', 'ema200','grahamNumber','analystRating','score','sector','industry','country']?.includes(ruleName)) { + if (['sma20','sma50','sma100','sma200','ema20', 'ema50', 'ema100', 'ema200','grahamNumber','analystRating','halalStocks','score','sector','industry','country']?.includes(ruleName)) { // Ensure valueMappings[ruleName] is initialized as an array searchQuery = ''; if (!Array.isArray(valueMappings[ruleName])) { @@ -839,14 +841,11 @@ async function popularStrategy(state: string) { { condition: "over", name: "freeCashFlowMargin", value: '50%' } ] }, - halalStocks: { // New Strategy Added - name: 'Halal Stocks', + bestHalalStocks: { // New Strategy Added + name: 'Top Halal Stocks', rules: [ - { condition: "under", name: "shortTermDebtToCapitalization", value: "30%" }, - { condition: "under", name: "interestIncomeToCapitalization", value: "30%" }, - { condition: "under", name: "longTermDebtToCapitalization", value: "30%" }, - { condition: "under", name: "interestDebtPerShare", value: 1 }, - { condition: "under", name: "debtRatio", value: 0 } + { condition: "", name: "halalStocks", value: 'Compliant' }, + { condition: "over", name: "marketCap", value: '1B' }, ] } }; @@ -874,7 +873,7 @@ function handleInput(event) { if (searchQuery.length > 0) { - const rawList = ruleName === 'country' ? listOfRelevantCountries : ruleName === 'sector' ? sectorList : ruleName === 'industry' ? industryList : ruleName === 'analystRating' ? ['Strong Buy', 'Buy', 'Hold', 'Sell', 'Strong Sell'] : ['Strong Buy','Hold','Sell','Strong Sell']; + const rawList = ruleName === 'country' ? listOfRelevantCountries : ruleName === 'sector' ? sectorList : ruleName === 'industry' ? industryList : (ruleName === 'analystRating' || ruleName === 'score') ? ['Strong Buy', 'Buy', 'Hold', 'Sell', 'Strong Sell'] : ['Compliant', 'Non-Compliant']; testList = rawList?.filter(item => { const index = item?.toLowerCase(); // Check if country starts with searchQuery @@ -983,8 +982,8 @@ function handleInput(event) { popularStrategy('strongCashFlow')} class="cursor-pointer hover:bg-[#27272A]"> Strong Cash Flow - popularStrategy('halalStocks')} class="cursor-pointer hover:bg-[#27272A]"> - Halal Stocks + popularStrategy('bestHalalStocks')} class="cursor-pointer hover:bg-[#27272A]"> + Top Halal Stocks @@ -1162,7 +1161,7 @@ function handleInput(event) { - {#if !['sma20','sma50','sma100','sma200','ema20', 'ema50', 'ema100', 'ema200', 'grahamNumber','analystRating','score','sector','industry','country']?.includes(row?.rule)} + {#if !['sma20','sma50','sma100','sma200','ema20', 'ema50', 'ema100', 'ema200', 'grahamNumber','analystRating','halalStocks','score','sector','industry','country']?.includes(row?.rule)}
@@ -1185,14 +1184,14 @@ function handleInput(event) {
{/if} - {#if !['sma20','sma50','sma100','sma200','ema20', 'ema50', 'ema100', 'ema200', 'grahamNumber','analystRating','score','sector','industry','country']?.includes(row?.rule)} + {#if !['sma20','sma50','sma100','sma200','ema20', 'ema50', 'ema100', 'ema200', 'grahamNumber','analystRating','halalStocks','score','sector','industry','country']?.includes(row?.rule)} {#each row?.step as newValue} @@ -1213,7 +1212,7 @@ function handleInput(event) { {/each} {:else} - {#each (testList.length > 0 && searchQuery?.length > 0 ? testList : searchQuery?.length > 0 && testList?.length === 0 ? [] : (row?.rule === 'country' ? listOfRelevantCountries : row?.rule === 'sector' ? sectorList : row?.rule === 'industry' ? industryList : ruleName === 'analystRating' ? ['Strong Buy', 'Buy', 'Hold', 'Sell', 'Strong Sell'] : ['Strong Buy','Buy','Hold','Sell','Strong Sell'])) as item} + {#each (testList.length > 0 && searchQuery?.length > 0 ? testList : searchQuery?.length > 0 && testList?.length === 0 ? [] : (row?.rule === 'country' ? listOfRelevantCountries : row?.rule === 'sector' ? sectorList : row?.rule === 'industry' ? industryList : (ruleName === 'analystRating' || ruleName === 'score') ? ['Strong Buy', 'Buy', 'Hold', 'Sell', 'Strong Sell'] : ['Compliant', 'Non-Compliant'])) as item}
event.preventDefault()}>