update screener

This commit is contained in:
MuslemRahimi 2024-08-31 23:40:52 +02:00
parent 424c93977a
commit 283709f05e
2 changed files with 107 additions and 282 deletions

View File

@ -356,11 +356,11 @@ else {
</td>
<td class="text-white text-end text-sm sm:text-[1rem] font-medium whitespace-nowrap">
{abbreviateNumber(item?.avgWeeklyTradeCount)}
{abbreviateNumber(Math.floor(item?.avgWeeklyTradeCount))}
</td>
<td class="text-white text-end text-sm sm:text-[1rem] font-medium whitespace-nowrap">
{abbreviateNumber(item?.avgWeeklyShareQuantity)}
{abbreviateNumber(Math.floor(item?.avgWeeklyShareQuantity))}
</td>
<td class="text-white text-end text-sm sm:text-[1rem] font-medium whitespace-nowrap">

View File

@ -105,7 +105,6 @@ const getStockScreenerData = async (rules) => {
growthOperatingExpenses: (ruleOfList?.find(item => item.name === "growthOperatingExpense") || { condition: 'above' }).condition,
operatingIncome: (ruleOfList?.find(item => item.name === "operatingIncome") || { condition: 'above' }).condition,
growthOperatingIncome: (ruleOfList?.find(item => item.name === "growthOperatingIncome") || { condition: 'above' }).condition,
esgScore: (ruleOfList?.find(item => item.name === "esgScore") || { condition: 'above' }).condition,
marketCap: (ruleOfList?.find(item => item.name === "marketCap") || { condition: 'above' }).condition,
var: (ruleOfList?.find(item => item.name === "var") || { condition: 'above' }).condition,
trendAnalysis: (ruleOfList?.find(item => item.name === "trendAnalysis") || { condition: 'above' }).condition,
@ -174,14 +173,13 @@ const getStockScreenerData = async (rules) => {
{ rule: 'beta', label: 'Beta', category: 'fund'},
{ rule: 'ebitda', label: 'Earnings Before Interests, Taxes, Depreciation & Amortisation (EBITDA)', category: 'fund'},
{ rule: 'growthEBITDA', label: 'EBITDA Growth [%]', category: 'fund'},
{ rule: 'esgScore', label: 'ESG Score', category: 'fund' },
{ rule: 'var', label: 'Value at Risk (VaR)', category: 'fund' },
{ rule: 'trendAnalysis', label: 'AI Trend Analysis (Bullish)', category: 'ai' },
{ rule: 'fundamentalAnalysis', label: 'AI Fundamental Analysis (Bullish)', category: 'ai' },
{ rule: 'ratingRecommendation', label: 'Analyst Rating', category: 'fund'},
{ rule: 'currentRatio', label: 'Current Ratio',category: 'fund' },
{ rule: 'quickRatio', label: 'Quick Ratio',category: 'fund' },
{ rule: 'debtEquityRatio', label: 'Debt Equity Ratio',category: 'fund' },
{ rule: 'debtEquityRatio', label: 'Debt / Equity',category: 'fund' },
{ rule: 'debtRatio', label: 'Debt Ratio',category: 'fund' },
{ rule: 'returnOnAssets', label: 'Return on Assets',category: 'fund' },
{ rule: 'returnOnEquity', label: 'Return on Equity',category: 'fund' },
@ -258,7 +256,6 @@ const getStockScreenerData = async (rules) => {
let valuePriceToBookRatio = (ruleOfList?.find(item => item.name === "priceToBookRatio") || { value: 5 }).value;
let valuePriceToSalesRatio = (ruleOfList?.find(item => item.name === "priceToSalesRatio") || { value: 10 }).value;
let valueBeta = (ruleOfList?.find(item => item.name === "beta") || { value: 1 }).value;
let valueESGScore = (ruleOfList?.find(item => item.name === "esgScore") || { value: 60 }).value;
let valueMarketCap = (ruleOfList?.find(item => item.name === "marketCap") || { value: 50 }).value;
let valueAnalyst = (ruleOfList?.find(item => item.name === "ratingRecommendation") || { value: 1 }).value;
let valueRSI = (ruleOfList?.find(item => item.name === "rsi") || { value: 40 }).value;
@ -339,7 +336,6 @@ const valueMappings = {
beta: valueBeta,
ebitda: valueEBITDA,
growthEBITDA: valueGrowthEBITDA,
esgScore: valueESGScore,
marketCap: valueMarketCap,
rsi: valueRSI,
stochRSI: valueStochRSI,
@ -397,7 +393,6 @@ const conditions = {
beta: ruleCondition.beta,
ebitda: ruleCondition.ebitda,
growthEBITDA: ruleCondition.growthEBITDA,
esgScore: ruleCondition.esgScore,
marketCap: ruleCondition.marketCap,
rsi: ruleCondition.rsi,
stochRSI: ruleCondition.stochRSI,
@ -608,228 +603,83 @@ async function handleUpdateRule(rule) {
}
/*
$: {
if (ruleOfList) {
const ruleToUpdate = ruleOfList?.find(rule => rule.name === ruleName);
const ruleToUpdate = ruleOfList.find(rule => rule.name === ruleName);
if (ruleToUpdate) {
const valueMap = {
payoutRatio: valuePayoutRatio,
dividendGrowth: valueDividendGrowth,
dividendYield: valueDividendYield,
annualDividend: valueAnnualDividend,
eps: valueEPS,
growthEPS: valueGrowthEPS,
marketCap: valueMarketCap,
beta: valueBeta,
pe: valuePE,
forwardPE: valueForwardPE,
priceToBookRatio: valuePriceToBookRatio,
priceToSalesRatio: valuePriceToSalesRatio,
interestIncome: valueInterestIncome,
ratingRecommendation: valueAnalyst,
revenue: valueRevenue,
growthRevenue: valueGrowthRevenue,
ebitda: valueEBITDA,
growthEBITDA: valueGrowthEBITDA,
operatingExpenses: valueOperatingExpenses,
growthOperatingExpenses: valueGrowthOperatingExpenses,
costOfRevenue: valueCostOfRevenue,
growthCostOfRevenue: valueGrowthCostOfRevenue,
costAndExpenses: valueCostAndExpenses,
growthCostAndExpenses: valueGrowthCostAndExpenses,
netIncome: valueNetIncome,
growthNetIncome: valueGrowthNetIncome,
grossProfit: valueGrossProfit,
growthGrossProfit: valueGrowthGrossProfit,
researchAndDevelopmentExpenses: valueResearchAndDevelopmentExpenses,
growthResearchAndDevelopmentExpenses: valueGrowthResearchAndDevelopmentExpenses,
interestExpense: valueInterestExpenses,
growthInterestExpense: valueGrowthInterestExpenses,
operatingIncome: valueOperatingIncome,
growthOperatingIncome: valueGrowthOperatingIncome,
rsi: valueRSI,
stochRSI: valueStochRSI,
mfi: valueMFI,
cci: valueCCI,
atr: valueATR,
sma50: valueSMA50,
sma200: valueSMA200,
ema50: valueEMA50,
ema200: valueEMA200,
change1W: valueChange1W,
change1M: valueChange1M,
change3M: valueChange3M,
change6M: valueChange6M,
change1Y: valueChange1Y,
change3Y: valueChange3Y,
avgVolume: valueAvgVolume,
var: valueVaR,
trendAnalysis: valueTrendAnalysis,
fundamentalAnalysis: valueFundamentalAnalysis,
currentRatio: valueCurrentRatio,
quickRatio: valueQuickRatio,
debtEquityRatio: valueDebtEquityRatio,
debtRatio: valueDebtRatio,
returnOnAssets: valueReturnOnAssets,
returnOnEquity: valueReturnOnEquity,
};
// Check if the rule exists and if the name is in the valueMappings
if (ruleToUpdate && valueMappings?.hasOwnProperty(ruleToUpdate.name)) {
// Update the rule's value from the mappings
ruleToUpdate.value = valueMappings[ruleToUpdate.name];
ruleToUpdate.value = valueMap[ruleToUpdate.name] ?? ruleToUpdate.value;
ruleToUpdate.condition = ruleCondition[ruleToUpdate.name];
// Trigger Svelte's reactivity by reassigning the array.
ruleOfList = [...ruleOfList];
}
filteredData = filterStockScreenerData();
if (ruleOfList?.some(item => item?.name === 'ratingRecommendation')) {
filteredData = filteredData?.filter(item => item?.ratingRecommendation === valueAnalyst);
}
}
*/
$: {
if (ruleOfList) {
const ruleToUpdate = ruleOfList?.find(rule => rule.name === ruleName);
if (ruleToUpdate) {
switch (ruleToUpdate.name) {
case 'payoutRatio':
ruleToUpdate.value = valuePayoutRatio;
break;
case 'dividendGrowth':
ruleToUpdate.value = valueDividendGrowth;
break;
case 'dividendYield':
ruleToUpdate.value = valueDividendYield;
break;
case 'annualDividend':
ruleToUpdate.value = valueAnnualDividend;
break;
case 'eps':
ruleToUpdate.value = valueEPS;
break;
case 'growthEPS':
ruleToUpdate.value = valueGrowthEPS;
break;
case 'marketCap':
ruleToUpdate.value = valueMarketCap;
break;
case 'beta':
ruleToUpdate.value = valueBeta;
break;
case 'pe':
ruleToUpdate.value = valuePE;
break;
case 'forwardPE':
ruleToUpdate.value = valueForwardPE;
break;
case 'priceToBookRatio':
ruleToUpdate.value = valuePriceToBookRatio;
break;
case 'priceToSalesRatio':
ruleToUpdate.value = valuePriceToSalesRatio;
break;
case 'interestIncome':
ruleToUpdate.value = valueInterestIncome;
break;
case 'esgScore':
ruleToUpdate.value = valueESGScore;
break;
case 'ratingRecommendation':
ruleToUpdate.value = valueAnalyst //ruleTrend[ruleName];
break;
case 'revenue':
ruleToUpdate.value = valueRevenue;
break;
case 'growthRevenue':
ruleToUpdate.value = valueGrowthRevenue;
break;
case 'ebitda':
ruleToUpdate.value = valueEBITDA;
break;
case 'growthEBITDA':
ruleToUpdate.value = valueGrowthEBITDA;
break;
case 'operatingExpenses':
ruleToUpdate.value = valueOperatingExpenses;
break;
case 'growthOperatingExpenses':
ruleToUpdate.value = valueGrowthOperatingExpenses;
break;
case 'costOfRevenue':
ruleToUpdate.value = valueCostOfRevenue;
break;
case 'growthCostOfRevenue':
ruleToUpdate.value = valueGrowthCostOfRevenue;
break;
case 'costAndExpenses':
ruleToUpdate.value = valueCostAndExpenses;
break;
case 'growthCostAndExpenses':
ruleToUpdate.value = valueGrowthCostAndExpenses;
break;
case 'netIncome':
ruleToUpdate.value = valueNetIncome;
break;
case 'growthNetIncome':
ruleToUpdate.value = valueGrowthNetIncome;
break;
case 'grossProfit':
ruleToUpdate.value = valueGrossProfit;
break;
case 'growthGrossProfit':
ruleToUpdate.value = valueGrowthGrossProfit;
break;
case 'researchAndDevelopmentExpenses':
ruleToUpdate.value = valueResearchAndDevelopmentExpenses;
break;
case 'growthResearchAndDevelopmentExpenses':
ruleToUpdate.value = valueGrowthResearchAndDevelopmentExpenses;
break;
case 'interestExpense':
ruleToUpdate.value = valueInterestExpenses;
break;
case 'growthInterestExpense':
ruleToUpdate.value = valueGrowthInterestExpenses;
break;
case 'operatingIncome':
ruleToUpdate.value = valueOperatingIncome;
break;
case 'growthOperatingIncome':
ruleToUpdate.value = valueGrowthOperatingIncome;
break;
case 'rsi':
ruleToUpdate.value = valueRSI;
break;
case 'stochRSI':
ruleToUpdate.value = valueStochRSI;
break;
case 'mfi':
ruleToUpdate.value = valueMFI;
break;
case 'cci':
ruleToUpdate.value = valueCCI;
break;
case 'atr':
ruleToUpdate.value = valueATR;
break;
case 'sma50':
ruleToUpdate.value = valueSMA50;
break;
case 'sma200':
ruleToUpdate.value = valueSMA200;
break;
case 'ema50':
ruleToUpdate.value = valueEMA50;
break;
case 'ema200':
ruleToUpdate.value = valueEMA200;
break;
case 'change1W':
ruleToUpdate.value = valueChange1W;
break;
case 'change1M':
ruleToUpdate.value = valueChange1M;
break;
case 'change3M':
ruleToUpdate.value = valueChange3M;
break;
case 'change6M':
ruleToUpdate.value = valueChange6M;
break;
case 'change1Y':
ruleToUpdate.value = valueChange1Y;
break;
case 'change3Y':
ruleToUpdate.value = valueChange3Y;
case 'avgVolume':
ruleToUpdate.value = valueAvgVolume;
break;
case 'var':
ruleToUpdate.value = valueVaR;
break;
case 'trendAnalysis':
ruleToUpdate.value = valueTrendAnalysis;
break;
case 'fundamentalAnalysis':
ruleToUpdate.value = valueFundamentalAnalysis;
break;
case 'currentRatio':
ruleToUpdate.value = valueCurrentRatio;
break;
case 'quickRatio':
ruleToUpdate.value = valueQuickRatio;
break;
case 'debtEquityRatio':
ruleToUpdate.value = valueDebtEquityRatio;
break;
case 'debtRatio':
ruleToUpdate.value = valueDebtRatio;
break;
case 'returnOnAssets':
ruleToUpdate.value = valueReturnOnAssets;
break;
case 'returnOnEquity':
ruleToUpdate.value = valueReturnOnEquity;
break;
default:
// Handle any case not explicitly mentioned
break;
}
ruleToUpdate.condition = ruleCondition[ruleToUpdate.name];
ruleOfList = [...ruleOfList]; // This is common for all cases, so it's moved out of the switch.
}
filteredData = filterStockScreenerData();
if(ruleOfList?.some(item => item.name === 'ratingRecommendation')) {
filteredData = filteredData?.filter(item => item?.ratingRecommendation === valueAnalyst)
}
}
}
@ -2149,31 +1999,7 @@ $: charNumber = $screenWidth < 640 ? 20 : 40;
<!--Start ESGScore Rule-->
{#if ruleName === 'esgScore'}
<div class="w-full max-w-xl text-white font-medium text-sm sm:text-[1rem] flex flex-row justify-center items-center">
ESG Score {ruleCondition[ruleName]} {valueESGScore}
<label on:click={() => changeRuleCondition('below')} class="ml-5 cursor-pointer flex flex-row mr-2 justify-center items-center">
<input type="radio" class="radio checked:bg-purple-600 bg-[#09090B] border border-slate-800 mr-2" checked={ruleCondition[ruleName] === 'below'} />
<span class="label-text text-white">Below</span>
</label>
<label on:click={() => changeRuleCondition('above')} class="cursor-pointer flex flex-row ml-2 justify-center items-center">
<input type="radio" class="radio checked:bg-purple-600 bg-[#09090B] border border-slate-800 mr-2" checked={ruleCondition[ruleName] === 'above'} />
<span class="label-text text-white">Above</span>
</label>
</div>
<div class="w-full pt-5">
<input type="range" min="10" max="100" step="10" bind:value={valueESGScore} class="range range-secondary" />
</div>
{/if}
<!--End ESGScore Rule-->
<!--Start RSI Rule-->
{#if ruleName === 'rsi'}
@ -2505,7 +2331,6 @@ $: charNumber = $screenWidth < 640 ? 20 : 40;
<!--End Adding Rules-->
<!--Start Rules Preview -->