Yes, strong fundamentals are an excellent method for stacking the deck in your favor.
But more experienced traders should apply more in-depth analysis.
At first glance, these fundamentals look awful.
But for some stocks; the story turns out to be the same one we all lived after college.
The Analogy:
Student loans → high long‑term debt
First mortgage → negative operating margin
Credit card balances → red ROA/ROE
Pennies in checking → low quick ratio
On paper, we looked terrible.
But we had solid careers:
two incomes
cash flow covering everything
The debt wasn’t scary — because the cash engine was stronger than the liabilities.
Moral:
When cash flow is strong, the “bad” labels don’t define the balance sheet — the trajectory does.
For Years MaryDay’s Fundamentals and a few other studies sat in a “Homework Pane” beside my weekly charts.
This Fundamental Snippet is phase one of a three phase project. Now my standard Fundamental Pane:
I’m neither a seasoned Programmer or a Fundamental analyst, but I do have the “Monkey” (somewhere) and a Copilot .
Constructive comments welcomed and appreciated!
NOTE: For best performance use a 3YR Daily Pane no Chart, no Vol, Lower study only
Study Outputs:
PE (Rolling))
Dividend Yield
Payout Ratio
% off 52W High
CAGR (Rolling)
Profitability
Cash Flow
Balance Sheet
Returns/Efficiency
Growth
Fundamental Quality Score
Basic structure:
Metrics are grouped into category’s, Category’s evaluated / scored, Summed for a Quality range of 1 – 12.
A 7 or above good quality stock, 6 and below, not fundamental friendly (Deep Dive Time or you trade ignores Fundamentals) ….
I refer to the PE and CAGR as rolling, using bar counts as a workaround of TOS limits…. (PE trap for bad data from TOS forces a (N/A High) …)
While not technically/ numerically correct, the data is a close representation of real time dynamics.
# Assebled: ATCSAM, playing it Forward
# Credits
# usethinkscript Community
#Fundamental Data Labels _Mobius 4/26/20 (found on OneNote)
#
# @MerryDay revised 4/21:
# my interpretation of positive/negative values; should be modified to meet your strategy
# then calculated an overall weighted score based on:
#[email protected]
#This study is used for Ken Rose's Generating Income with Dividend Stocks webcast Monday's 7PM ET
# CAGR Total Chart Timeframe
# Source: Pensar, 03.06.2021
# Modified by golden.nonce, 02.14.2022
#========================================================
# Fundamental Quality Engine
#========================================================
declare lower;
#-----------------------------
# Global Colors
#-----------------------------
DefineGlobalColor("Strong", CreateColor(0, 165, 0)); # Full Green
DefineGlobalColor("Neutral", Color.LIGHT_GRAY); # Neutral
DefineGlobalColor("Weak", CreateColor(220, 180, 180)); # Soft Red/Pink
DefineGlobalColor("Bad", CreateColor(225, 0, 0)); # Red
DefineGlobalColor("Info", CreateColor(50, 200, 255)); # Cyan
DefineGlobalColor("Warn", CreateColor(200, 125, 0)); # Amber
DefineGlobalColor("Danger", CreateColor(255, 60, 60));
#-----------------------------
# Aggregation Helpers
#-----------------------------
def isDaily = GetAggregationPeriod() == AggregationPeriod.DAY;
def isWeekly = GetAggregationPeriod() == AggregationPeriod.WEEK;
def isMonthly = GetAggregationPeriod() == AggregationPeriod.MONTH;
#-----------------------------
# shared
# Actual earnings per event (TOS often returns N/A for CEFs, REITs, ETFs)
def AE = if IsNaN(GetActualEarnings()) then 0 else GetActualEarnings();
# Manual trailing earnings (TTM) based on bar type
def epsTTM_manual =
if isDaily then Sum(AE, 252)
else if isWeekly then Sum(AE, 52)
else if isMonthly then Sum(AE, 12)
else 0;
# Safe EPS (fallback to tiny positive number to avoid divide-by-zero)
def _epsTTM_manual = if IsNaN(epsTTM_manual) or epsTTM_manual == 0
then 0.0001
else epsTTM_manual;
#-----------------------------
# Dividend Yield & Payout
#-----------------------------
def divYieldPct = if IsNaN(GetYield()) then Double.NaN else Round(GetYield() * 100, 2);
rec DCont = if IsNaN(GetDividend()) then DCont[1] else GetDividend();
def divAnnual = if DCont <> 0 then DCont * 4 else Double.NaN;
def payoutRatio =
if !IsNaN(divAnnual) and epsTTM_manual != 0 and !IsNaN(epsTTM_manual)
then Round(divAnnual * 100 / epsTTM_manual, 2)
else Double.NaN;
#-----------------------------
# 52-Week High Context
#-----------------------------
def len52 =
if isDaily then 252
else if isWeekly then 52
else if isMonthly then 12
else Double.NaN;
def top52 = Highest(high, len52);
def pctOffHigh =
if top52 != 0 and !IsNaN(top52)
then (close / top52) - 1
else Double.NaN;
def newHigh = high == top52;
#-----------------------------
# Manual EPS / PE (AE-based)
#-----------------------------
# Actual earnings per event (TOS often returns N/A for CEFs, REITs, ETFs)
# Manual trailing earnings (TTM) based on bar type
# Raw PE calculation
def PE_raw = Round(close / _epsTTM_manual, 2);
# Trap missing/invalid EPS as extremely high PE
def PE = if IsNaN(PE_raw) or PE_raw < 0 then 999 else PE_raw;
def PE_safe = if IsNaN(PE) then 999 else PE;
# PE trap flag
def PE_isTrapped = PE >= 999;
#-----------------------------
# SAFE INPUTS
#-----------------------------
def _pctOffHigh = if IsNaN(pctOffHigh) then 0 else pctOffHigh;
def _divYieldPct = if IsNaN(divYieldPct) then 0 else divYieldPct;
# -----------------------------
# SAFE, CAGR
# -----------------------------
def agg = AggregationPeriod.YEAR;
def c = close(period = agg);
def yearbars = if c then yearbars[1] + 1 else yearbars[1];
def o = First(open(period = agg));
def CAGR = Power(c / o, 1 / yearbars) - 1;
def hasYears = yearbars >= 3 and !IsNaN(o) and o > 0 and !IsNaN(c);
def CAGR_safe = if hasYears then CAGR else Double.NaN;
#-----------------------------
# Core Fundamental Metrics
#-----------------------------
def gpMargin =
if IsNaN(GrossProfitMargin()) then gpMargin[1] else GrossProfitMargin();
def opMargin =
if IsNaN(OperatingProfitMargin()) then opMargin[1] else OperatingProfitMargin();
def netMargin =
if IsNaN(NetProfitMargin()) then netMargin[1] else NetProfitMargin();
def fcfPerShare =
if IsNaN(FreeCashFlowPerShare()) then fcfPerShare[1] else FreeCashFlowPerShare();
def epsTTM =
if IsNaN(EarningsPerShareTTM()) then epsTTM[1] else EarningsPerShareTTM();
def fixCov =
if IsNaN(FixedChargeCoverageRatio()) then fixCov[1] else FixedChargeCoverageRatio();
def curRatio =
if IsNaN(CurrentRatio()) then curRatio[1] else CurrentRatio();
def quickRatio =
if IsNaN(QuickRatio()) then quickRatio[1] else QuickRatio();
def ltdToCap =
if IsNaN(LongTermDebtToCapital()) then ltdToCap[1] else LongTermDebtToCapital();
def roa =
if IsNaN(ReturnOnAssets()) then roa[1] else ReturnOnAssets();
def roe =
if IsNaN(ReturnOnEquity()) then roe[1] else ReturnOnEquity();
def assetTurn =
if IsNaN(TotalAssetTurnover()) then assetTurn[1] else TotalAssetTurnover();
def salesPerShare =
if IsNaN(SalesPerShare()) then salesPerShare[1] else SalesPerShare();
#-----------------------------
# Category Scoring (0–3 each)
#-----------------------------
# Profitability
def scoreProfitability =
if gpMargin > 0 and opMargin > 0 and netMargin > 0 then 3
else if (gpMargin > 0 and (opMargin > 0 or netMargin > 0)) then 2
else if gpMargin > 0 or opMargin > 0 or netMargin > 0 then 1
else 0;
# Cash Flow
def scoreCashFlow =
if fcfPerShare > 0 and epsTTM > 0 and fixCov >= 1 then 3
else if (fcfPerShare > 0 and epsTTM > 0) or (fcfPerShare > 0 and fixCov >= 1) then 2
else if fcfPerShare > 0 or epsTTM > 0 or fixCov >= 1 then 1
else 0;
# Balance Sheet
def scoreBalance =
if quickRatio >= 1 and curRatio >= 1 and ltdToCap < 40 then 3
else if (quickRatio >= 1 and curRatio >= 1) or (curRatio >= 1 and ltdToCap < 60) then 2
else if quickRatio >= 1 or curRatio >= 1 then 1
else 0;
# Returns & Efficiency
def scoreReturns =
if roa >= 10 and roe >= 15 and assetTurn > 1 then 3
else if (roa >= 5 and roe >= 10) or (roe >= 15 and assetTurn > 0.8) then 2
else if roa > 0 or roe > 0 or assetTurn > 0.5 then 1
else 0;
# Growth
def scoreGrowth =
if CAGR > 0.08 and salesPerShare > 0 then 3
else if CAGR >= 0.03 and salesPerShare > 0 then 2
else if CAGR > 0 or salesPerShare > 0 then 1
else 0;
#-----------------------------
# Final Quality Score (0–12)
#-----------------------------
def rawTotal =
scoreProfitability +
scoreCashFlow +
scoreBalance +
scoreReturns +
scoreGrowth;
def qualityScore = Round(rawTotal * 12 / 15, 0);
#-----------------------------
# Fundamental Score Plot (Hidden)
#-----------------------------
#plot FundamentalScore = qualityScore;
#FundamentalScore.HideBubble();
#FundamentalScore.HideTitle();
#FundamentalScore.Hide();
#-------------------------
# Label Hierarchy
# ------------------
# PE (Rolling))
# Dividend Yield
# Payout Ratio
# % off 52W High
# CAGR (Rolling)
# Profitability
# Cash Flow
# Balance Sheet
# Returns/Efficiency
# Growth
# Fundamental Quality
#------------------------
AddLabel(
yes,
"P/E : " +
(if PE_isTrapped
then "N/A (High)"
else AsText(PE)),
if PE_isTrapped then GlobalColor("Danger")
else if PE < 20 then GlobalColor("Strong")
else if PE < 40 then GlobalColor("Warn")
else GlobalColor("Weak")
);
AddLabel(!IsNaN(divYieldPct),
"Dividend Yield: " + divYieldPct + "%",
if IsNaN(divYieldPct) then GlobalColor("Neutral")
else if divYieldPct < 2 then GlobalColor("Neutral")
else if divYieldPct <= 6 then GlobalColor("Strong")
else GlobalColor("Warn"));
AddLabel(!IsNaN(payoutRatio),
"Payout Ratio: " + payoutRatio + "%",
if IsNaN(payoutRatio) then GlobalColor("Neutral")
else if payoutRatio < 60 then GlobalColor("Strong")
else if payoutRatio <= 100 then GlobalColor("Warn")
else GlobalColor("Bad"));
AddLabel(!IsNaN(pctOffHigh) and !newHigh,
AsPercent(pctOffHigh) + " off 52 Wk High: ",
if pctOffHigh >= -0.10 then GlobalColor("Strong")
else if pctOffHigh >= -0.25 then GlobalColor("Warn")
else GlobalColor("Weak"));
AddLabel(newHigh,
"New 52-Week High TODAY",
GlobalColor("Info"));
AddLabel(1,
if hasYears
then "CAGR: " + AsPercent(CAGR_safe) + " " + (yearbars - 1) + "/Yrs"
else "CAGR: N/A (Insufficient Data)",
if hasYears and CAGR_safe > 0.08 then GlobalColor("Strong")
else if hasYears and CAGR_safe >= 0.03 then CreateColor(120, 200, 120)
else GlobalColor("Weak")
);
AddLabel(yes,
"Profitability: " +
(if scoreProfitability == 3 then "Strong"
else if scoreProfitability == 2 then "Moderate"
else if scoreProfitability == 1 then "Weak"
else "Bad"),
if scoreProfitability == 3 then GlobalColor("Strong")
else if scoreProfitability == 2 then GlobalColor("Neutral")
else if scoreProfitability == 1 then GlobalColor("Weak")
else GlobalColor("Bad"));
AddLabel(yes,
"Cash Flow: " +
(if scoreCashFlow == 3 then "Strong"
else if scoreCashFlow == 2 then "Moderate"
else if scoreCashFlow == 1 then "Weak"
else "Bad"),
if scoreCashFlow == 3 then GlobalColor("Strong")
else if scoreCashFlow == 2 then GlobalColor("Neutral")
else if scoreCashFlow == 1 then GlobalColor("Weak")
else GlobalColor("Bad"));
AddLabel(yes,
"Balance Sheet: " +
(if scoreBalance == 3 then "Strong"
else if scoreBalance == 2 then "Moderate"
else if scoreBalance == 1 then "Weak"
else "Bad"),
if scoreBalance == 3 then GlobalColor("Strong")
else if scoreBalance == 2 then GlobalColor("Neutral")
else if scoreBalance == 1 then GlobalColor("Weak")
else GlobalColor("Bad"));
AddLabel(yes,
"Returns/Efficiency: " +
(if scoreReturns == 3 then "Strong"
else if scoreReturns == 2 then "Moderate"
else if scoreReturns == 1 then "Weak"
else "Bad"),
if scoreReturns == 3 then GlobalColor("Strong")
else if scoreReturns == 2 then GlobalColor("Neutral")
else if scoreReturns == 1 then GlobalColor("Weak")
else GlobalColor("Bad"));
AddLabel(yes,
"Growth: " +
(if scoreGrowth == 3 then "Strong"
else if scoreGrowth == 2 then "Moderate"
else if scoreGrowth == 1 then "Weak"
else "Bad"),
if scoreGrowth == 3 then GlobalColor("Strong")
else if scoreGrowth == 2 then CreateColor(120, 200, 120)
else if scoreGrowth == 1 then GlobalColor("Weak")
else GlobalColor("Bad"));
AddLabel(yes,
"Fundamental Quality: " + qualityScore + " / 12",
if qualityScore >= 10 then GlobalColor("Strong")
else if qualityScore >= 7 then CreateColor(120, 200, 120)
else if qualityScore >= 4 then GlobalColor("Weak")
else GlobalColor("Bad"));
#
This is Phase I of a III phase Project
(In Work)
Phase II adds a Valuation Engine to the project.
Extended Narratives include:
1. Cheap but Extended
2. High Quality on Sale
3. Value Trap Risk (Yes, hard look on these)
4. Rich Valuation but Improving Fundamentals
5. Speculative Growth — Fundamentals Not Applicable
6. Cash-Flow Machine Trading at a Premium
7. Long-Term Candidate (Accumulate) (one of my favorites)
Phase III
Adds a Trade Sentiment Indicator
Score/ risk level
################################
Usage: AMD//NVDA all look good as expected.
Plug in INTC note Wild PE and Payout Ratio (Deep Dive Flag). Pros take a peek and say "Yea, Turnaround"
The curious/ uniformed (Me) need to dive deeper.
I used Greenshot to capture just the fundamental screen.
Dropped it into Copilot with one simple question “What’s going on here?”
Output was generally spot on. Just based on the fundamental pane no chart, homework getting easier…
Copilot output as of 2/8/26
############################################################
1. The P/E ratio is extremely high (123.39)
This doesn’t mean Intel is a crazy‑expensive stock.
It means earnings are very low right now, so even a normal stock price produces a huge P/E.
This happens when a company is in a turnaround phase.
2. Dividend Yield = 0% but Payout Ratio = 121.95%
This looks contradictory, but it’s actually simple:
Intel still pays a dividend
But earnings are so low that the payout ratio becomes mathematically huge
The yield rounds down to 0% at this chart resolution
So the dividend isn’t gone — the math is just distorted by weak earnings.
3. Profitability and Cash Flow are Strong
This tells you Intel’s core business still generates good margins and cash, even though net income is temporarily depressed.
This is typical for a company investing heavily in new manufacturing capacity.
4. Balance Sheet and Returns are Moderate
Intel has taken on more debt to fund new fabs, and returns (ROE/ROA/ROIC) are low because earnings are low.
This is normal during a multi‑year rebuild.
5. Growth is Strong
Revenue and forward expectations have been improving, so the growth metrics look good.
6. Fundamental Quality = 10/12
This score means:
The business itself is solid
Margins are good
Cash flow is strong
Growth is improving
The only real weaknesses are:
depressed earnings
distorted valuation metrics
Summary
Intel is a high‑quality company going through a low‑earnings period, which makes valuation numbers look weird. The fundamentals underneath are solid, but the earnings distortion creates:
a huge P/E
a huge payout ratio
a yield that rounds to zero
It’s a classic turnaround profile: strong business, weak earnings, mixed signals.
#############################################################
Once again, any feedback welcomed.
For Years MaryDay’s Fundamentals and a few other studies sat in a “Homework Pane” beside my weekly charts.
This Fundamental Snippet is phase one of a three phase project. Now my standard Fundamental Pane:
I’m neither a seasoned Programmer or a Fundamental analyst, but I do have the “Monkey” (somewhere) and a Copilot .
useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.
How do I get started?
We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.
If you are new, or just looking for guidance, here are some helpful links to get you started.
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.