Weeknights Guppy Trend Strength OscillatorBuilt a Guppy Oscillator which takes 22 different EMA's and uses an ATR to provide slope normalisation. The goal is to help the user determine strength of trend and see if momentum is slowing
On its own I doubt it will provide a full trading system but I believe it can help provide confluence to ones trading decisions
Left it open source
المؤشرات والاستراتيجيات
EMA Signals + HTF S/R + Diagonal (5-15m)Описание на русском
Скрипт строит две экспоненциальные скользящие средние (быструю и медленную EMA), а также SMA20 и SMA50, и использует их для генерации пошаговых сигналов входа. При пересечении EMA9 и EMA12 вверх выше SMA20 под свечой появляется зелёный круг, а когда после этого обе EMA оказываются выше SMA50, под ценой появляется плашка LONG; аналогично при пересечении вниз ниже SMA20 рисуется красный круг над свечой, и после ухода EMA под SMA50 формируется плашка SHORT.
Горизонтальные зоны поддержки и сопротивления вычисляются по пивотам старшего таймфрейма (по умолчанию 1 час) через request.security, каждая зона рисуется прямоугольником на графике и сопровождается подписью с ценой уровня и текущим количеством касаний ценой (Touches: N), которое считается на активном ТФ. Дополнительно скрипт строит одну диагональную линию поддержки: она протягивается от последнего ключевого минимума (pivot low с заданной «силой») к текущей цене и динамически обновляется при появлении нового важного минимума, рядом с линией отображается подпись Trend.
Description in English
This script combines EMA‑based signals, dynamic higher‑timeframe support/resistance zones, and a diagonal trendline from the latest key swing low. It plots two exponential moving averages (fast and slow EMA) along with SMA20 and SMA50, and uses them to create step‑by‑step entry signals: when EMA9 crosses above EMA12 while both are above SMA20, a green circle is shown below the bar, and once both EMAs move above SMA50 after that, a LONG label is printed below price; conversely, when EMA9 crosses below EMA12 while both are below SMA20, a red circle appears above the bar, and after both EMAs move below SMA50, a SHORT label is displayed above price.
Horizontal support and resistance zones are derived from pivot highs and lows on a higher timeframe (1‑hour by default) using request.security; each zone is drawn as a rectangle on the chart and annotated with the level price and the current number of touches by price (Touches: N), counted on the active timeframe. In addition, the script plots a single diagonal support line from the most recent key swing low (pivot low with configurable strength) towards the current price, updating it whenever a new important low appears, and shows a small “Trend” label near this line
SDFADE nuvolébasic script to signal mean reversions and alert fades when stretched to +/-2.5VWAP Standard Deviation
MACD Above Signal & Price Above VWAP IndicatorThis strategy provides a buy signal with a green arrow pointing up when three conditions are met. The MACD has to be above the signal line. The settings for MACD can be adjusted, but the default is the standard settings for MACD. The second condition is the price has to be above the VWAP line. The third condition is that the price of the current candle needs to be higher than the HIGH price of the previous candle.
自定义时间竖线(北京时间) Custom Time Vertical (Beijing Time)Custom Time Vertical (Beijing Time)
Just use it to find whatever time period you want. HF!
标注出想要的时间段,使对交易时间段敏感的trader复盘更轻松。
Probability Cone█ Overview:
Probability Cone is based on the Expected Move . While Expected Move only shows the historical value band on every bar, probability panel extend the period in the future and plot a cone or curve shape of the probable range. It plots the range from bar 1 all the way to bar 31.
In this model, we assume asset price follows a log-normal distribution and the log return follows a normal distribution.
Note: Normal distribution is just an assumption; it's not the real distribution of return.
The area of probability range is based on an inverse normal cumulative distribution function. The inverse cumulative distribution gives the range of price for given input probability. People can adjust the range by adjusting the standard deviation in the settings. The probability of the entered standard deviation will be shown at the edges of the probability cone.
The shown 68% and 95% probabilities correspond to the full range between the two blue lines of the cone (68%) and the two purple lines of the cone (95%). The probabilities suggest the % of outcomes or data that are expected to lie within this range. It does not suggest the probability of reaching those price levels.
Note: All these probabilities are based on the normal distribution assumption for returns. It's the estimated probability, not the actual probability.
█ Volatility Models :
Sample SD : traditional sample standard deviation, most commonly used, use (n-1) period to adjust the bias
Parkinson : Uses High/ Low to estimate volatility, assumes continuous no gap, zero mean no drift, 5 times more efficient than Close to Close
Garman Klass : Uses OHLC volatility, zero drift, no jumps, about 7 times more efficient
Yangzhang Garman Klass Extension : Added jump calculation in Garman Klass, has the same value as Garman Klass on markets with no gaps.
about 8 x efficient
Rogers : Uses OHLC, Assume non-zero mean volatility, handles drift, does not handle jump 8 x efficient.
EWMA : Exponentially Weighted Volatility. Weight recently volatility more, more reactive volatility better in taking account of volatility autocorrelation and cluster.
YangZhang : Uses OHLC, combines Rogers and Garmand Klass, handles both drift and jump, 14 times efficient, alpha is the constant to weight rogers volatility to minimize variance.
Median absolute deviation : It's a more direct way of measuring volatility. It measures volatility without using Standard deviation. The MAD used here is adjusted to be an unbiased estimator.
You can learn more about each of the volatility models in out Historical Volatility Estimators indicator.
█ How to use
Volatility Period is the sample size for variance estimation. A longer period makes the estimation range more stable less reactive to recent price. Distribution is more significant on larger sample size. A short period makes the range more responsive to recent price. Might be better for high volatility clusters.
People usually assume the mean of returns to be zero. To be more accurate, we can consider the drift in price from calculating the geometric mean of returns. Drift happens in the long run, so short lookback periods are not recommended.
The shape of the cone will be skewed and have a directional bias when the length of mean is short. It might be more adaptive to the current price or trend, but more accurate estimation should use a longer period for the mean.
Using a short look back for mean will make the cone having a directional bias.
When we are estimating the future range for time > 1, we typically assume constant volatility and the returns to be independent and identically distributed. We scale the volatility in term of time to get future range. However, when there's autocorrelation in returns( when returns are not independent), the assumption fails to take account of this effect. Volatility scaled with autocorrelation is required when returns are not iid. We use an AR(1) model to scale the first-order autocorrelation to adjust the effect. Returns typically don't have significant autocorrelation. Adjustment for autocorrelation is not usually needed. A long length is recommended in Autocorrelation calculation.
Note: The significance of autocorrelation can be checked on an ACF indicator.
ACF
Time back settings shift the estimation period back by the input number. It's the origin of when the probability cone start to estimation it's range.
E.g., When time back = 5, the probability cone start its prediction interval estimation from 5 bars ago. So for time back = 5 , it estimates the probability range from 5 bars ago to X number of bars in the future, specified by the Forecast Period (max 1000).
█ Warnings:
People should not blindly trust the probability. They should be aware of the risk evolves by using the normal distribution assumption. The real return has skewness and high kurtosis. While skewness is not very significant, the high kurtosis should be noticed. The Real returns have much fatter tails than the normal distribution, which also makes the peak higher. This property makes the tail ranges such as range more than 2SD highly underestimate the actual range and the body such as 1 SD slightly overestimate the actual range. For ranges more than 2SD, people shouldn't trust them. They should beware of extreme events in the tails.
The uncertainty in future bars makes the range wider. The overestimate effect of the body is partly neutralized when it's extended to future bars. We encourage people who use this indicator to further investigate the Historical Volatility Estimators , Fast Autocorrelation Estimator , Expected Move and especially the Linear Moments Indicator .
The probability is only for the closing price, not wicks. It only estimates the probability of the price closing at this level, not in between.
Position Size Tool [Riley]Automatically determine number of shares for an entry. Quantity based on a stop set at the low of day for long positions or a stop set at the high of the day for short positions. As well as inputs like account balance risk per trade. Also includes a user-defined maximum for percentage of daily dollar volume to consume with entry.
USD Liquidity / FX Swap + Money Market StressThis indicator shows, in a simple way, how tight or loose USD liquidity is. It combines two things: signs of stress in the FX market (Fed swap lines + dollar strength) and signs from the money market (the difference between repo rates like SOFR/TGCR and the Fed’s IORB rate). All of this is merged into a single blue line: when it rises, liquidity tends to be more abundant; when it falls, there is more stress and the dollar becomes “expensive” to obtain.
You read it like a traffic light:
If the background is red, the indicator is below the lower threshold → liquidity stress, an environment that is more prone to sell-offs and violent moves in risk assets (including crypto).
If the background is green, the indicator is above the upper threshold → more relaxed liquidity, a backdrop that is more favorable for risk rallies to be sustained.
No background color → neutral zone, neither very good nor very bad: you trade according to your usual system.
It is designed as a macro context filter, not as a buy/sell signal. In red, it makes sense to be more defensive with risk and leverage; in green, if your technical system gives a long signal, you have a somewhat more favorable tailwind. It should always be used together with other tools and strict risk management.
Easy Crypto Signal FREEAs you can see, the indicator is doing well, we'll see what happens next, I invite you to the discussion
VPOCS ZScoreAn indicator Showing Candle POC's.
Added a Zscore Filter to filter out the High volume candle's.
I like to use at Key Support and resistance Area's to see Absorbtion and Offside positions only on High volume Candles ( The high volume candle part is Key! ). Thoose candles Generally indicate forced participants opening or closing positions, or "Breakout traders entering" positions. When i see a Hi-Volume at S/R levels and price is rejecting ( trading away from the POC ) ill take that as a trigger for a trade.
- Dynamic Support and resistance.
- Show Offside and and Trapped traders
You can tweak the Zscore nominator for Less of more Frequent hits.
WSMR v3.9 — WhaleSplash → Mean Reversal
# WSMR v3.9 — WhaleSplash → Mean Reversal
*A Non-Repainting Impulse‑Reversal Engine for Systematic Futures Trading*
## Overview
WSMR v3.9 is a complete impulse → exhaustion → mean‑reversion framework designed for systematic intraday trading. It identifies high‑energy displacement events (“WhaleSplashes”), measures volatility structure, tracks VWAP deviation, and confirms reversals using RSI divergence, Z‑Score resets, SMA20 reclaim, and pivot-based structure.
All signals are non‑repainting and alerts fire on bar close.
---
## Core Components
### 1. WhaleSplash (Short Impulse Event)
Triggered when a candle meets displacement conditions:
- Large bar range vs ATR
- Minimum % move
- Volume expansion
- VWAP deviation (tick-based)
- Z‑Score oversold / RSI exhaustion
- Volatility-gated
### 2. Mean Reversal Long (MR)
Requires:
- RSI bullish divergence
- Z‑Score reset
- SMA20 reclaim
- Higher-low confirmation
### 3. First-Candle Confirmation (Optional)
- MR Confirm → first green after MR
- WS Confirm → first red after WS
- TTL window configurable
### 4. Asia Session Filter
Optional restriction to:
**23:00 → 09:00 UTC**
### 5. Volatility Monitor
Detects:
- Normal
- Wicky
- Spiky
- Extreme
### 6. WS Frequency Analytics
Rolling frequency calculation across:
- Bars / Days / Weeks / Months
---
## Status Panel (Top-Right)
Shows:
- Mode (Global / Asia-only)
- Timeframe + TTL
- WS frequency
- Volatility state
---
## Alerts
- WhaleSplash SHORT
- WhaleSplash LONG (MR)
- MR Confirm LONG
- WS Confirm SHORT
- Volatility Warning
---
## Notes
- Fully non‑repainting
- Stable bar-close logic
- Optimised for 1m–5m
- Works on futures, indices, metals, FX
Breakout Signal (Trend+ATR+ADX+Score)Breakout Signal – Trend + ATR + ADX + Strength Score
This indicator detects high-quality bullish breakout conditions using a multi-filter confirmation system designed to reduce false signals and highlight only strong momentum events.
A breakout signal triggers when all core conditions align:
📌 Breakout Conditions
1. Price Breakout
Breakout occurs when the current high exceeds the previous close by X%.
This avoids noisy open-based signals and focuses on genuine upward expansion.
2. Volume Spike
Current volume must be higher than the average volume × multiplier.
This ensures the breakout is supported by real trading activity.
3. Trend Filter (MA)
Price must be trading above a moving average.
This prevents counter-trend breakouts and focuses on momentum continuation.
4. ATR Rising
ATR must be rising relative to its own moving average.
A rising ATR confirms volatility expansion — a key ingredient of valid breakouts.
5. ADX Trend Strength
ADX must exceed a user-defined threshold (default: 20).
This confirms the market is in a strong trend environment, reducing false signals.
⭐ Breakout Strength Score (0–5)
Each of the 5 filters contributes 1 point:
Trend OK
Volume Spike
ATR Rising
ADX Strong
Price Breakout
A score label appears on valid breakouts:
5/5 → Very strong breakout
4/5 → Strong breakout
3/5 → Moderate breakout
0–2 → Weak / avoided signals
Moving Averages (10, 21, 50, 200)Moving Averages including 10, 21, 50 and 200 period. Intended mainly for use on a daily chart, but will work for any period.
50 EMA Rejection Strategy V4 (Correct Signal Logic)//@version=6
indicator("50 EMA Rejection Strategy V4 (Correct Signal Logic)", overlay=true, max_labels_count=500)
//================ INPUTS ================//
group50 = "EMA 50 Trio"
ema50HighLen = input.int(50,"EMA50 High",group=group50)
ema50CloseLen = input.int(50,"EMA50 Close",group=group50)
ema50LowLen = input.int(50,"EMA50 Low",group=group50)
groupBase = "Additional EMAs"
ema10Len = input.int(10,"EMA10")
ema200Len = input.int(200,"EMA200")
ema600Len = input.int(600,"EMA600")
ema2400Len = input.int(2400,"EMA2400")
useTrendFilter = input.bool(false,"Use Higher Time EMA Filter")
groupRR = "Risk Reward Settings"
RR1 = input.float(1.0,"TP1 RR",step=0.5)
RR2 = input.float(2.0,"TP2 RR",step=0.5)
//================ CALCULATIONS ================//
CharisTrend Indicatorthis trading indicator uses the following parameters EMA LOW (25 34 89 110 355 and 480) SMA(14 and 28) and Supertrend(14 3) for trading analysis and BUY/SELL Signals when the trade aligns.
TTP IFVG Signals With EMA /ICT Gold scalpingThis script uses original logic and alerting rules. in Japan
finding ICT IFVG and EMA conditions.
#IFVG, Forex, ICT, EMA, Scalping, Indicator
This indicator automatically finds IFVG (Imbalance / Fair Value Gap) zones and gives you a buy or sell signal when price comes back and breaks out through that gap.
It also draws a colored box over the gap so you can see the zone visually, and it raises alerts when a new signal appears.
High-level logic:
On every bar, the script looks back up to “IFVG_GapBars” bars.
For each offset i it checks a 3-candle pattern:
– If the low of the newer candle is above the high of the older candle: bullish FVG (price jumped up, leaving a gap).
– If the high of the newer candle is below the low of the older candle: bearish FVG (price jumped down, leaving a gap).
When a valid FVG is found:
– For a bullish FVG it looks for a later close that breaks down through that gap (sell signal).
– For a bearish FVG it looks for a later close that breaks up through that gap (buy signal).
– A moving-average trend filter must agree (downtrend for sells, uptrend for buys).
– It checks that price has not already “filled” the gap before the breakout.
If all conditions are satisfied, it:
– Sets signal_dir = 1 for a buy, or -1 for a sell.
– Draws a box from the original FVG bar to the bar just before the breakout (extended a bit to the right), between the gap high and gap low.
– Plots an ▲ label for buys or ▼ label for sells.
– Triggers the corresponding alert conditions.
Now the parameters:
PipSizeMultilier (PipSizeManual)
Multiplies the symbol’s minimum tick size (syminfo.mintick).
It is used when converting “MinFVG_Pips” into an actual price distance.
If you feel the indicator is too sensitive (too many small gaps), you can increase this multiplier to effectively require a larger price difference.
TickSize
Internal value = syminfo.mintick * PipSizeMultiplier.
This is the actual price step the script uses as a “pip” when checking minimum gap size.
FVG Search Lookback (IFVG_GapBars)
How many bars back from the current bar the script will scan for a 3-candle FVG pattern.
Larger value = it can find older FVGs, but loop cost is higher.
Min FVG Size (Pips/Points) (MinFVG_Pips)
Minimum allowed size of the gap, measured in “pips/points” using TickSize.
If the vertical distance between the gap high and gap low is smaller than this, the gap is ignored.
0.0 means “no size filter” (every FVG is allowed).
FVG Epsilon (Price Units) (FVG_EpsPoints)
Tolerance for the FVG detection.
It is subtracted/added in the condition that checks “low > old high” or “high < old low”.
0.0 means strict gap (no overlap at all). A small positive epsilon allows tiny overlaps to still count as a gap.
Show IFVG Zones (ShowZones)
If true, the script draws a box over the IFVG zone when a signal is confirmed.
If false, no boxes are drawn; you only see the ▲ / ▼ markers and alerts.
Buy Zone Color (ZoneColorBuy)
Fill color and border color for boxes created from bearish FVGs that later produce a buy signal.
Sell Zone Color (ZoneColorSell)
Fill color and border color for boxes created from bullish FVGs that later produce a sell signal.
Box Extension (Bars) (BoxExtension)
How many extra bars to extend the right side of the box beyond the breakout bar.
The internal right coordinate is “bar_index - 1 + BoxExtension”.
Increase this if you want the zone to visually extend further into the future.
MA Period (MA_Period)
Lookback length of the moving average used as a trend filter.
MA Type (MA_Kind)
Type of moving average: “SMA” or “EMA”.
If SMA is chosen, the script uses ta.sma; if EMA, it uses ta.ema.
Moving-average filter behavior:
For sell signals (from bullish FVG): MA must be sloping down (MA < MA ) and price must be below MA.
For buy signals (from bearish FVG): MA must be sloping up (MA > MA ) and price must be above MA.
If these conditions are not satisfied, the FVG is ignored even if the gap and breakout conditions are met.
Signals and alerts:
signal_dir = 1 → buy signal, ▲ label below the bar, “IFVG Buy Alert” / “IFVG Buy/Sell Alert” can fire.
signal_dir = -1 → sell signal, ▼ label above the bar, “IFVG Sell Alert” / “IFVG Buy/Sell Alert” can fire.
signal_dir = 0 → no new signal on this bar.
In short:
This indicator finds 3-candle IFVG gaps, filters them by size and trend, waits for a clean breakout through the gap, draws a box on the original gap zone, and gives you a clear buy or sell signal plus alerts.
RSI Cascade DivergencesRSI Cascade Divergences is a tool for detecting divergences between price and RSI with an extended cascade-based strength accumulation logic. A “cascade” represents a sequence of multiple divergences linked through RSI pivot points. The indicator records RSI pivots, checks whether a divergence is present, assigns a strength value to each structure, and displays only signals that meet your minimum strength thresholds.
How Divergence Logic Works
The indicator identifies local RSI extremes (pivots) based on Pivot Length and Pivot Confirm.
For every confirmed pivot it stores:
the RSI value at the pivot,
the corresponding value of the RSI Source price,
the pivot’s bar index.
How a Divergence Is Formed
A divergence is detected when two consecutive RSI pivots of the same type show opposite dynamics relative to the price source defined in RSI Source (default: close), not relative to chart highs/lows.
Bearish divergence: the price source value at the second pivot is higher, but RSI forms a lower high.
Bullish divergence: the price source value at the second pivot is lower, but RSI forms a higher low.
The indicator does not use price highs/lows — only the selected price source at the pivot points.
Cascade Strength Calculation
Each new pivot is compared only with the previous pivot of the same type.
A cascade grows in strength if:
divergence conditions are met,
the difference in RSI values exceeds Min. RSI Distance,
the previous structure already had some strength or the previous pivot was formed in the OB/OS zone.
If the divergence occurs as RSI exits OB/OS, strength is additionally increased by +1.
Behavior in Strong Trends
Divergences may appear repeatedly and even form cascades with high strength. However, if price does not react meaningfully, this indicates strong trend pressure.
In such cases, divergences stop functioning as reversal signals:
RSI attempts to counter-move, but the dominant trend continues.
The indicator accurately reflects this — cascades may form but fail to trigger any reversal, which itself suggests a powerful, persistent trend.
Filtering and Context Reset
To avoid retaining irrelevant pivots:
when RSI is above Overbought → low pivots are cleared;
when RSI is below Oversold → high pivots are cleared.
This prevents false cascades during extreme RSI conditions.
Input Parameters
RSI Source — price source used in RSI calculations (close, hl2, ohlc4, etc.).
RSI Length — RSI calculation period.
Overbought / Oversold — RSI threshold zones.
Pivot Length — number of bars to the left required for a pivot.
Pivot Confirm — bars to the right required to confirm the pivot.
Min. RSI Distance — minimum difference between two pivot RSI values for the divergence to be considered meaningful.
Min. Strength (Bull / Bear) — minimum accumulated strength for:
confirming the signal,
displaying the strength label,
triggering alerts.
Weaker signals below these thresholds appear as dashed guide structures.
Visual
Display settings for lines, markers, and colors.
These parameters do not affect the indicator logic.
Important
Divergences — including cascades — should not be used as a standalone trading signal.
Always combine them with broader market context, trend analysis, structure, volume, and risk management tools.
CCI TIME COUNT//@version=6
indicator("CCI Multi‑TF", overlay=true)
// === Inputs ===
// CCI Inputs
cciLength = input.int(20, "CCI Length", minval=1)
src = input.source(hlc3, "Source")
// Timeframes
timeframes = array.from("1", "3", "5", "10", "15", "30", "60", "1D", "1W")
labels = array.from("1m", "3m", "5m", "10m", "15m", "30m", "60m", "Daily", "Weekly")
// === Table Settings ===
tblPos = input.string('Top Right', 'Table Position', options = , group = 'Table Settings')
i_textSize = input.string('Small', 'Text Size', options = , group = 'Table Settings')
textSize = i_textSize == 'Small' ? size.small : i_textSize == 'Normal' ? size.normal : i_textSize == 'Large' ? size.large : size.tiny
textColor = color.white
// Resolve table position
var pos = switch tblPos
'Top Left' => position.top_left
'Top Right' => position.top_right
'Bottom Left' => position.bottom_left
'Bottom Right' => position.bottom_right
'Middle Left' => position.middle_left
'Middle Right' => position.middle_right
=> position.top_right
// === Custom CCI Function ===
customCCI(source, length) =>
sma = ta.sma(source, length)
dev = ta.dev(source, length)
(source - sma) / (0.015 * dev)
// === CCI Values for All Timeframes ===
var float cciVals = array.new_float(array.size(timeframes))
for i = 0 to array.size(timeframes) - 1
tf = array.get(timeframes, i)
cciVal = request.security(syminfo.tickerid, tf, customCCI(src, cciLength))
array.set(cciVals, i, cciVal)
// === Countdown Timers ===
var string countdowns = array.new_string(array.size(timeframes))
for i = 0 to array.size(timeframes) - 1
tf = array.get(timeframes, i)
closeTime = request.security(syminfo.tickerid, tf, time_close)
sec_left = barstate.isrealtime and not na(closeTime) ? math.max(0, (closeTime - timenow) / 1000) : na
min_left = sec_left >= 0 ? math.floor(sec_left / 60) : na
sec_mod = sec_left >= 0 ? math.floor(sec_left % 60) : na
timer_text = barstate.isrealtime and not na(sec_left) ? str.format("{0,number,00}:{1,number,00}", min_left, sec_mod) : "–"
array.set(countdowns, i, timer_text)
// === Build Table ===
if barstate.islast
rows = array.size(timeframes) + 1
var table t = table.new(pos, 3, rows, frame_color=color.rgb(252, 250, 250), border_color=color.rgb(243, 243, 243))
// Headers
table.cell(t, 0, 0, "Timeframe", text_color=textColor, bgcolor=color.rgb(238, 240, 242), text_size=textSize)
table.cell(t, 1, 0, "CCI (" + str.tostring(cciLength) + ")", text_color=textColor, bgcolor=color.rgb(239, 243, 246), text_size=textSize)
table.cell(t, 2, 0, "Time to Close", text_color=textColor, bgcolor=color.rgb(239, 244, 248), text_size=textSize)
// Data Rows
for i = 0 to array.size(timeframes) - 1
row = i + 1
label = array.get(labels, i)
cciVal = array.get(cciVals, i)
countdown = array.get(countdowns, i)
// Color CCI: Green if < -100, Red if > 100
cciColor = cciVal < -100 ? color.green : cciVal > 100 ? color.red : color.rgb(236, 237, 240)
// Background warning if <60 seconds to close
tf = array.get(timeframes, i)
closeTime = request.security(syminfo.tickerid, tf, time_close)
sec_left = barstate.isrealtime and not na(closeTime) ? math.max(0, (closeTime - timenow) / 1000) : na
countdownBg = sec_left < 60 ? color.rgb(255, 220, 220, 90) : na
// Table cells
table.cell(t, 0, row, label, text_color=color.rgb(239, 240, 244), text_size=textSize)
table.cell(t, 1, row, str.tostring(cciVal, "#.##"), text_color=cciColor, text_size=textSize)
table.cell(t, 2, row, countdown, text_color=color.rgb(232, 235, 243), bgcolor=countdownBg, text_size=textSize)






















