High-Low Index [LazyBear]-- Fixed ---
Source: pastebin.com
Fixes an issue with "Combined" mode, using wrong symbols.
--- Original ---
The High-Low Index is a breadth indicator based on Record High Percent, which is based on new 52-week highs and new 52-week lows.
Readings below 50 indicate that there were more new lows than new highs. Readings above 50 indicate that there were more new highs than new lows. 0 indicates there were zero new highs (0% new highs). 100 indicates there was at least 1 new high and no new lows (100% new highs). 50 indicates that new highs and new lows were equal (50% new highs).
Readings consistently above 70 usually coincide with a strong uptrend. Readings consistently below 30 usually coincide with a strong downtrend.
More info:
stockcharts.com
List of my public indicators: bit.ly
List of my app-store indicators: blog.tradingview.com
Just noticed @Greeny has already published this -> Linking it here.
Search in scripts for "富时中国50三倍做空"
TimWest Long Short FiltersTimWest Long Short Filters
Indicator Has 3 Separate Filters that Create Green(Bullish) or Red(Bearish) BackGround Highlights
If Price is Above or Below a certain LookBack Period - Tim Defaults to 63 on Daily Chart to Quickly View if Price is Above or Below it’s Price 1 Quarter Ago.
A Simple Moving Average Filter - Tim Defaults to 50 SMA and 200 SMA also known as the “Golden Cross”.
A Exponential Moving Average Filter - For Those Who Want To View Shorter Term Market Swings. Defaults to 50 EMA and 100 EMA used By Chuck Hughes, 7 Time World Trading Champion. Chuck Claims the 50/100 EMA's Show the Earliest Change in Market Direction the Equal - Sustainable Moves
Inputs Tab has Checkboxes to Turn On/Off any of the 3 Filters Above.
Reference Chart Post www.tradingview.com
3 projection Indicators - PBands, PO & PBAll these indicators are by Mel Widner.
Projection Bands :
-------------------------------------------------------
These project market data along the trend with the maxima and minima of the projections defining the band. The method provides a way to signal potential direction changes relative to the trend. Usage is like any other trading band.
Projection Oscillator :
-------------------------------------------------------
This indicates the relative position of price with in the bands. It fluctuates between the values 0 to 100. You can configure the "basis" to make it oscillate around a specific value (for ex., basis=50 will make it oscillate between +50 and -50). EMA of PO (length configurable, default is 5) is plotted as a signal line. There is also an option to plot the difference (oscillator - signal), just like MACD histogram. When you see a divergence in this oscillator, remember that it just indicates a potential movement with in the band (for ex., a bullish divergence shown may cause the price to cross the median and move up to the top band).
Projection Bandwidth :
-------------------------------------------------------
This shows the % width of the projection bands. A trend reversal is signaled by a high value. Low value may indicate the start of a new trend. This is also a trend strength indicator.
More info: drive.google.com
Borrowed the color theme for this chart from @liw0. Thanks :)
Fibo RSIThis is a customized Relative Strength Index (RSI) indicator designed to replicate TradingView’s default RSI while adding additional reference levels for deeper market analysis.
🔹 Features:
RSI length set to 8 by default (user adjustable).
Calculates RSI using the standard ta.rsi() function.
Plots the RSI line in a clean, separate panel.
Adds 7 key levels for analysis: 0, 20, 30, 50, 70, 80, 100.
Levels are drawn as thin, solid straight lines for a cleaner look (instead of default dashed).
🔹 Use cases:
Identify momentum shifts with enhanced precision.
Use intermediate levels (20, 30, 50, 70, 80) as potential support/resistance zones.
Ideal for traders who want a Fibonacci-like structure in RSI analysis.
Mayfair FX Scalper V-10 Price Action + SMC//@version=5
indicator("Mayfair FX Scalper V-10 Price Action + SMC", overlay=true)
// === INPUTS ===
rsiLength = input.int(14, title="RSI Length")
overbought = input.float(73, title="SELL Level")
oversold = input.float(31, title="BUY Level")
rsiSrc = input.source(open, title="RSI Source")
// === Color Inputs ===
entryLineColor = input.color(color.white, title="entry Label Color")
entryLabelColor = input.color(color.white, title="entry Lable Color")
slLineColor = input.color(color.red, title="Stop Loss Line Color")
slLabelColor = input.color(color.red, title="Stop Loss Label Color")
tpLineColor = input.color(color.blue, title="Take Profit Line Color")
tpLabelColor = input.color(color.blue, title="Take Profit Color")
entryTextColor = input.color(color.rgb(0, 0, 0) , title="entry Text Color")
slTextColor = input.color(color.white, title="Stop Lose Color")
tpTextColor = input.color(color.white, title="Take Profit Text Color")
//indicator("Author Info Display"
// Create table
var table infoTable = table.new(position.top_right, 2, 6, bgcolor=color.new(#000000, 1), border_width=1)
if barstate.islast
table.cell(infoTable, 0, 0, "Author:", text_color=color.white, text_size=size.small)
table.cell(infoTable, 1, 0, "MR WOW", text_color=color.rgb(255, 251, 0), text_size=size.large)
table.cell(infoTable, 0, 1, "YouTube:", text_color=color.white, text_size=size.small)
table.cell(infoTable, 1, 1, "www.youtube.com/@iammrwow", text_color=color.rgb(255, 251, 0), text_size=size.small)
table.cell(infoTable, 0, 3, "Website:", text_color=color.white, text_size=size.small)
table.cell(infoTable, 1, 3, "www.mrwowea.com", text_color=color.rgb(255, 251, 0), text_size=size.small)
// === RSI CALCULATION ===
rsi = ta.rsi(rsiSrc, rsiLength)
rawBuySignal = rsi < oversold
rawSellSignal = rsi > overbought
// === Confirmed Signals ===
isBullish = close > open
isBearish = close < open
newBuy = rawBuySignal and isBullish and close > open == false
newSell = rawSellSignal and isBearish and close < open == false
// === Trade State Variables ===
var bool inPosition = false
var bool isBuy = false
var float entryPrice = na
var float slPrice = na
var float tp1Price = na
var float tp2Price = na
var float tp3Price = na
var int entryBarIndex = na
var label labels = array.new()
var line lines = array.new()
// === Instrument & Timeframe SL/TP Setup ===
isGold = str.contains(syminfo.ticker, "XAU") or str.contains(syminfo.ticker, "GOLD")
instrumentType = syminfo.type == "crypto" ? "Crypto" : isGold ? "Gold" : syminfo.currency == "JPY" ? "JPY" : "Forex"
tf = timeframe.period
slPipsGold = tf == "1" ? 30 : tf == "3" ? 45 : tf == "5" ? 50 : tf == "15" ? 60 : 70
slPipsCrypto = tf == "1" ? 5 : tf == "3" ? 8 : tf == "5" ? 12 : tf == "15" ? 15 : 10
slPipsForex = tf == "1" ? 6 : tf == "3" ? 9 : tf == "5" ? 11 : tf == "15" ? 15 : 15
gold_slDist = 0.1 * slPipsGold
gold_tp1Dist = gold_slDist
gold_tp2Dist = gold_slDist * 2
gold_tp3Dist = gold_slDist * 3
pipSize = instrumentType == "Crypto" ? 1.0 : instrumentType == "Gold" or instrumentType == "JPY" ? 0.01 : 0.0001
slPips = instrumentType == "Crypto" ? slPipsCrypto : instrumentType == "Gold" ? slPipsGold : slPipsForex
slDist = slPips * pipSize
tp1Dist = slDist
tp2Dist = slDist * 2
tp3Dist = slDist * 3
// === Draw Line & Label ===
drawLine(y, txt, col, lblCol, extendToCurrent) =>
int lineEnd = extendToCurrent ? bar_index : entryBarIndex + 2
array.push(lines, line.new(entryBarIndex, y, lineEnd, y, color=col, width=2, extend=extend.none))
textCol = str.contains(txt, "Entry") ? entryTextColor : str.contains(txt, "Stop") ? slTextColor : tpTextColor
array.push(labels, label.new(lineEnd, y, txt, style=label.style_label_left, color=color.new(lblCol, 0), textcolor=textCol, size=size.small))
// === Check Exit ===
slHit = inPosition and ((isBuy and low <= slPrice) or (not isBuy and high >= slPrice))
tp3Hit = inPosition and ((isBuy and high >= tp3Price) or (not isBuy and low <= tp3Price))
shouldExit = slHit or tp3Hit
if shouldExit
for l in labels
label.delete(l)
array.clear(labels)
for ln in lines
line.delete(ln)
array.clear(lines)
inPosition := false
entryPrice := na
slPrice := na
tp1Price := na
tp2Price := na
tp3Price := na
entryBarIndex := na
// === Confirmed Signal with No Position ===
confirmedBuy = not inPosition and newBuy
confirmedSell = not inPosition and newSell
// === Signal Markers ===
plotshape(series=confirmedBuy, location=location.belowbar, color=color.rgb(33, 150, 243), style=shape.triangleup, text="BUY", textcolor=color.rgb(33, 150, 243))
plotshape(series=confirmedSell, location=location.abovebar, color=color.rgb(254, 254, 255), style=shape.triangledown, text="SELL", textcolor=color.rgb(239, 238, 247))
// === Entry Execution ===
if confirmedBuy or confirmedSell
entryPrice := close
entryBarIndex := bar_index
isBuy := confirmedBuy
inPosition := true
if isGold
slPrice := isBuy ? entryPrice - gold_slDist : entryPrice + gold_slDist
tp1Price := isBuy ? entryPrice + gold_tp1Dist : entryPrice - gold_tp1Dist
tp2Price := isBuy ? entryPrice + gold_tp2Dist : entryPrice - gold_tp2Dist
tp3Price := isBuy ? entryPrice + gold_tp3Dist : entryPrice - gold_tp3Dist
else
slPrice := isBuy ? entryPrice - slDist : entryPrice + slDist
tp1Price := isBuy ? entryPrice + tp1Dist : entryPrice - tp1Dist
tp2Price := isBuy ? entryPrice + tp2Dist : entryPrice - tp2Dist
tp3Price := isBuy ? entryPrice + tp3Dist : entryPrice - tp3Dist
drawLine(entryPrice, "Entry Price - After Candle Above Entry Price Then Place Trade: " + str.tostring(entryPrice), entryLineColor, entryLabelColor, false)
drawLine(slPrice, "Stop Loss: " + str.tostring(slPrice), slLineColor, slLabelColor, false)
drawLine(tp1Price, "(1:1) Take Profit: " + str.tostring(tp1Price), tpLineColor, tpLabelColor, false)
drawLine(tp2Price, "(2:1) Take Profit: " + str.tostring(tp2Price), tpLineColor, tpLabelColor, false)
drawLine(tp3Price, "(3:1) Take Profit: " + str.tostring(tp3Price), tpLineColor, tpLabelColor, false)
// === Update TP/SL Lines if Still in Trade ===
if inPosition and not (confirmedBuy or confirmedSell)
for ln in lines
line.delete(ln)
array.clear(lines)
for l in labels
label.delete(l)
array.clear(labels)
drawLine(entryPrice, "After Candle Closed Above Entry Line Buy & Below Sell :Entry Price-" + str.tostring(entryPrice), entryLineColor, entryLabelColor, true)
drawLine(slPrice, "Stop Loss: " + str.tostring(slPrice), slLineColor, slLabelColor, true)
drawLine(tp1Price, "(1:1) Take Profit: " + str.tostring(tp1Price), tpLineColor, tpLabelColor, true)
drawLine(tp2Price, "(2:1) Take Profit: " + str.tostring(tp2Price), tpLineColor, tpLabelColor, true)
drawLine(tp3Price, "(3:1) Take Profit: " + str.tostring(tp3Price), tpLineColor, tpLabelColor, true)
// === Bollinger Bands Inputs ===
bb_length = input.int(20, title="SMA & StdDev Length")
src = input.source(close, title="Source")
// === Bollinger Band Colors ===
color_upper_2_3 = input.color(color.new(#0db107, 64), title="Upper Band 2–3 Color")
color_upper_3_4 = input.color(color.new(#05c41f, 58), title="Upper Band 3–4 Color")
color_lower_2_3 = input.color(color.new(#bdbc9d, 80), title="Lower Band 2–3 Color")
color_lower_3_4 = input.color(color.new(#e9e6bf, 63), title="Lower Band 3–4 Color")
// === Bollinger Band Calculations ===
sma = ta.sma(src, bb_length)
stdev = ta.stdev(src, bb_length)
bb2_upper = sma + 2 * stdev
bb2_lower = sma - 2 * stdev
bb3_upper = sma + 3 * stdev
bb3_lower = sma - 3 * stdev
bb4_upper = sma + 4 * stdev
bb4_lower = sma - 4 * stdev
// === Hidden Plots for Fill ===
p_bb2_upper = plot(bb2_upper, color=na)
p_bb3_upper = plot(bb3_upper, color=na)
p_bb4_upper = plot(bb4_upper, color=na)
p_bb2_lower = plot(bb2_lower, color=na)
p_bb3_lower = plot(bb3_lower, color=na)
p_bb4_lower = plot(bb4_lower, color=na)
// === Band Zone Fills ===
fill(p_bb2_upper, p_bb3_upper, color=color_upper_2_3)
fill(p_bb3_upper, p_bb4_upper, color=color_upper_3_4)
fill(p_bb2_lower, p_bb3_lower, color=color_lower_2_3)
fill(p_bb3_lower, p_bb4_lower, color=color_lower_3_4)
//SMc
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #9c9c9c
RED = #9c9c9c
BLUE = #9c9c9c
GRAY = #ffffff
MONO_BULLISH = #b2b5be
MONO_BEARISH = #5d606b
HISTORICAL = 'Historical'
PRESENT = 'Present'
COLORED = 'Colored'
MONOCHROME = 'Monochrome'
ALL = 'All'
BOS = 'BOS'
CHOCH = 'CHoCH'
TINY = size.tiny
SMALL = size.small
NORMAL = size.normal
ATR = 'Atr'
RANGE = 'Cumulative Mean Range'
CLOSE = 'Close'
HIGHLOW = 'High/Low'
SOLID = '⎯⎯⎯'
DASHED = '----'
DOTTED = '····'
SMART_GROUP = 'Smart Money Concepts'
INTERNAL_GROUP = 'Real Time Internal Structure'
SWING_GROUP = 'Real Time Swing Structure'
BLOCKS_GROUP = 'Order Blocks'
EQUAL_GROUP = 'EQH/EQL'
GAPS_GROUP = 'Fair Value Gaps'
LEVELS_GROUP = 'Highs & Lows MTF'
ZONES_GROUP = 'Premium & Discount Zones'
modeTooltip = 'Allows to display historical Structure or only the recent ones'
styleTooltip = 'Indicator color theme'
showTrendTooltip = 'Display additional candles with a color reflecting the current trend detected by structure'
showInternalsTooltip = 'Display internal market structure'
internalFilterConfluenceTooltip = 'Filter non significant internal structure breakouts'
showStructureTooltip = 'Display swing market Structure'
showSwingsTooltip = 'Display swing point as labels on the chart'
showHighLowSwingsTooltip = 'Highlight most recent strong and weak high/low points on the chart'
showInternalOrderBlocksTooltip = 'Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available'
orderBlockMitigationTooltip = 'Select what values to use for order block mitigation'
showEqualHighsLowsTooltip = 'Display equal highs and equal lows on the chart'
equalHighsLowsLengthTooltip = 'Number of bars used to confirm equal highs and equal lows'
equalHighsLowsThresholdTooltip = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results'
showFairValueGapsTooltip = 'Display fair values gaps on the chart'
fairValueGapsThresholdTooltip = 'Filter out non significant fair value gaps'
fairValueGapsTimeframeTooltip = 'Fair value gaps timeframe'
fairValueGapsExtendTooltip = 'Determine how many bars to extend the Fair Value Gap boxes on chart'
showPremiumDiscountZonesTooltip = 'Display premium, discount, and equilibrium zones on chart'
modeInput = input.string( HISTORICAL, 'Mode', group = SMART_GROUP, tooltip = modeTooltip, options = )
styleInput = input.string( COLORED, 'Style', group = SMART_GROUP, tooltip = styleTooltip,options = )
showTrendInput = input( false, 'Color Candles', group = SMART_GROUP, tooltip = showTrendTooltip)
showInternalsInput = input( true, 'Show Internal Structure', group = INTERNAL_GROUP, tooltip = showInternalsTooltip)
showInternalBullInput = input.string( ALL, 'Bullish Structure', group = INTERNAL_GROUP, inline = 'ibull', options = )
internalBullColorInput = input( GREEN, '', group = INTERNAL_GROUP, inline = 'ibull')
showInternalBearInput = input.string( ALL, 'Bearish Structure' , group = INTERNAL_GROUP, inline = 'ibear', options = )
internalBearColorInput = input( RED, '', group = INTERNAL_GROUP, inline = 'ibear')
internalFilterConfluenceInput = input( false, 'Confluence Filter', group = INTERNAL_GROUP, tooltip = internalFilterConfluenceTooltip)
internalStructureSize = input.string( TINY, 'Internal Label Size', group = INTERNAL_GROUP, options = )
showStructureInput = input( true, 'Show Swing Structure', group = SWING_GROUP, tooltip = showStructureTooltip)
showSwingBullInput = input.string( ALL, 'Bullish Structure', group = SWING_GROUP, inline = 'bull', options = )
swingBullColorInput = input( GREEN, '', group = SWING_GROUP, inline = 'bull')
showSwingBearInput = input.string( ALL, 'Bearish Structure', group = SWING_GROUP, inline = 'bear', options = )
swingBearColorInput = input( RED, '', group = SWING_GROUP, inline = 'bear')
swingStructureSize = input.string( SMALL, 'Swing Label Size', group = SWING_GROUP, options = )
showSwingsInput = input( false, 'Show Swings Points', group = SWING_GROUP, tooltip = showSwingsTooltip,inline = 'swings')
swingsLengthInput = input.int( 50, '', group = SWING_GROUP, minval = 10, inline = 'swings')
showHighLowSwingsInput = input( true, 'Show Strong/Weak High/Low',group = SWING_GROUP, tooltip = showHighLowSwingsTooltip)
showInternalOrderBlocksInput = input( true, 'Internal Order Blocks' , group = BLOCKS_GROUP, tooltip = showInternalOrderBlocksTooltip, inline = 'iob')
internalOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'iob')
showSwingOrderBlocksInput = input( false, 'Swing Order Blocks', group = BLOCKS_GROUP, tooltip = showSwingOrderBlocksTooltip, inline = 'ob')
swingOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'ob')
orderBlockFilterInput = input.string( 'Atr', 'Order Block Filter', group = BLOCKS_GROUP, tooltip = orderBlockFilterTooltip, options = )
orderBlockMitigationInput = input.string( HIGHLOW, 'Order Block Mitigation', group = BLOCKS_GROUP, tooltip = orderBlockMitigationTooltip, options = )
internalBullishOrderBlockColor = input.color(color.new(#808080, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#808080, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(#808080, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#808080, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( true, 'Equal High/Low', group = EQUAL_GROUP, tooltip = showEqualHighsLowsTooltip)
equalHighsLowsLengthInput = input.int( 3, 'Bars Confirmation', group = EQUAL_GROUP, tooltip = equalHighsLowsLengthTooltip, minval = 1)
equalHighsLowsThresholdInput = input.float( 0.1, 'Threshold', group = EQUAL_GROUP, tooltip = equalHighsLowsThresholdTooltip, minval = 0, maxval = 0.5, step = 0.1)
equalHighsLowsSizeInput = input.string( TINY, 'Label Size', group = EQUAL_GROUP, options = )
showFairValueGapsInput = input( false, 'Fair Value Gaps', group = GAPS_GROUP, tooltip = showFairValueGapsTooltip)
fairValueGapsThresholdInput = input( true, 'Auto Threshold', group = GAPS_GROUP, tooltip = fairValueGapsThresholdTooltip)
fairValueGapsTimeframeInput = input.timeframe('', 'Timeframe', group = GAPS_GROUP, tooltip = fairValueGapsTimeframeTooltip)
fairValueGapsBullColorInput = input.color(color.new(#00ff68, 70), 'Bullish FVG' , group = GAPS_GROUP)
fairValueGapsBearColorInput = input.color(color.new(#ff0008, 70), 'Bearish FVG' , group = GAPS_GROUP)
fairValueGapsExtendInput = input.int( 1, 'Extend FVG', group = GAPS_GROUP, tooltip = fairValueGapsExtendTooltip, minval = 0)
showDailyLevelsInput = input( false, 'Daily', group = LEVELS_GROUP, inline = 'daily')
dailyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'daily', options = )
dailyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'daily')
showWeeklyLevelsInput = input( false, 'Weekly', group = LEVELS_GROUP, inline = 'weekly')
weeklyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'weekly', options = )
weeklyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'weekly')
showMonthlyLevelsInput = input( false, 'Monthly', group = LEVELS_GROUP, inline = 'monthly')
monthlyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'monthly', options = )
monthlyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'monthly')
showPremiumDiscountZonesInput = input( false, 'Premium/Discount Zones', group = ZONES_GROUP , tooltip = showPremiumDiscountZonesTooltip)
premiumZoneColorInput = input.color( RED, 'Premium Zone', group = ZONES_GROUP)
equilibriumZoneColorInput = input.color( GRAY, 'Equilibrium Zone', group = ZONES_GROUP)
discountZoneColorInput = input.color( GREEN, 'Discount Zone', group = ZONES_GROUP)
//---------------------------------------------------------------------------------------------------------------------}
//DATA STRUCTURES & VARIABLES
//---------------------------------------------------------------------------------------------------------------------{
// @type UDT representing alerts as bool fields
// @field internalBullishBOS internal structure custom alert
// @field internalBearishBOS internal structure custom alert
// @field internalBullishCHoCH internal structure custom alert
// @field internalBearishCHoCH internal structure custom alert
// @field swingBullishBOS swing structure custom alert
// @field swingBearishBOS swing structure custom alert
// @field swingBullishCHoCH swing structure custom alert
// @field swingBearishCHoCH swing structure custom alert
// @field internalBullishOrderBlock internal order block custom alert
// @field internalBearishOrderBlock internal order block custom alert
// @field swingBullishOrderBlock swing order block custom alert
// @field swingBearishOrderBlock swing order block custom alert
// @field equalHighs equal high low custom alert
// @field equalLows equal high low custom alert
// @field bullishFairValueGap fair value gap custom alert
// @field bearishFairValueGap fair value gap custom alert
type alerts
bool internalBullishBOS = false
bool internalBearishBOS = false
bool internalBullishCHoCH = false
bool internalBearishCHoCH = false
bool swingBullishBOS = false
bool swingBearishBOS = false
bool swingBullishCHoCH = false
bool swingBearishCHoCH = false
bool internalBullishOrderBlock = false
bool internalBearishOrderBlock = false
bool swingBullishOrderBlock = false
bool swingBearishOrderBlock = false
bool equalHighs = false
bool equalLows = false
bool bullishFairValueGap = false
bool bearishFairValueGap = false
// @type UDT representing last swing extremes (top & bottom)
// @field top last top swing price
// @field bottom last bottom swing price
// @field barTime last swing bar time
// @field barIndex last swing bar index
// @field lastTopTime last top swing time
// @field lastBottomTime last bottom swing time
type trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
// @type UDT representing Fair Value Gaps
// @field top top price
// @field bottom bottom price
// @field bias bias (BULLISH or BEARISH)
// @field topBox top box
// @field bottomBox bottom box
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
// @type UDT representing trend bias
// @field bias BULLISH or BEARISH
type trend
int bias
// @type UDT representing Equal Highs Lows display
// @field l_ine displayed line
// @field l_abel displayed label
type equalDisplay
line l_ine = na
label l_abel = na
// @type UDT representing a pivot point (swing point)
// @field currentLevel current price level
// @field lastLevel last price level
// @field crossed true if price level is crossed
// @field barTime bar time
// @field barIndex bar index
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
// @type UDT representing an order block
// @field barHigh bar high
// @field barLow bar low
// @field barTime bar time
// @field bias BULLISH or BEARISH
type orderBlock
float barHigh
float barLow
int barTime
int bias
// @variable current swing pivot high
var pivot swingHigh = pivot.new(na,na,false)
// @variable current swing pivot low
var pivot swingLow = pivot.new(na,na,false)
// @variable current internal pivot high
var pivot internalHigh = pivot.new(na,na,false)
// @variable current internal pivot low
var pivot internalLow = pivot.new(na,na,false)
// @variable current equal high pivot
var pivot equalHigh = pivot.new(na,na,false)
// @variable current equal low pivot
var pivot equalLow = pivot.new(na,na,false)
// @variable swing trend bias
var trend swingTrend = trend.new(0)
// @variable internal trend bias
var trend internalTrend = trend.new(0)
// @variable equal high display
var equalDisplay equalHighDisplay = equalDisplay.new()
// @variable equal low display
var equalDisplay equalLowDisplay = equalDisplay.new()
// @variable storage for fairValueGap UDTs
var array fairValueGaps = array.new()
// @variable storage for parsed highs
var array parsedHighs = array.new()
// @variable storage for parsed lows
var array parsedLows = array.new()
// @variable storage for raw highs
var array highs = array.new()
// @variable storage for raw lows
var array lows = array.new()
// @variable storage for bar time values
var array times = array.new()
// @variable last trailing swing high and low
var trailingExtremes trailing = trailingExtremes.new()
// @variable storage for orderBlock UDTs (swing order blocks)
var array swingOrderBlocks = array.new()
// @variable storage for orderBlock UDTs (internal order blocks)
var array internalOrderBlocks = array.new()
// @variable storage for swing order blocks boxes
var array swingOrderBlocksBoxes = array.new()
// @variable storage for internal order blocks boxes
var array internalOrderBlocksBoxes = array.new()
// @variable color for swing bullish structures
var swingBullishColor = styleInput == MONOCHROME ? MONO_BULLISH : swingBullColorInput
// @variable color for swing bearish structures
var swingBearishColor = styleInput == MONOCHROME ? MONO_BEARISH : swingBearColorInput
// @variable color for bullish fair value gaps
var fairValueGapBullishColor = styleInput == MONOCHROME ? color.new(MONO_BULLISH,70) : fairValueGapsBullColorInput
// @variable color for bearish fair value gaps
var fairValueGapBearishColor = styleInput == MONOCHROME ? color.new(MONO_BEARISH,70) : fairValueGapsBearColorInput
// @variable color for premium zone
var premiumZoneColor = styleInput == MONOCHROME ? MONO_BEARISH : premiumZoneColorInput
// @variable color for discount zone
var discountZoneColor = styleInput == MONOCHROME ? MONO_BULLISH : discountZoneColorInput
// @variable bar index on current script iteration
varip int currentBarIndex = bar_index
// @variable bar index on last script iteration
varip int lastBarIndex = bar_index
// @variable alerts in current bar
alerts currentAlerts = alerts.new()
// @variable time at start of chart
var initialTime = time
// we create the needed boxes for displaying order blocks at the first execution
if barstate.isfirst
if showSwingOrderBlocksInput
for index = 1 to swingOrderBlocksSizeInput
swingOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
if showInternalOrderBlocksInput
for index = 1 to internalOrderBlocksSizeInput
internalOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
// @variable source to use in bearish order blocks mitigation
bearishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : high
// @variable source to use in bullish order blocks mitigation
bullishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : low
// @variable default volatility measure
atrMeasure = ta.atr(200)
// @variable parsed volatility measure by user settings
volatilityMeasure = orderBlockFilterInput == ATR ? atrMeasure : ta.cum(ta.tr)/bar_index
// @variable true if current bar is a high volatility bar
highVolatilityBar = (high - low) >= (2 * volatilityMeasure)
// @variable parsed high
parsedHigh = highVolatilityBar ? low : high
// @variable parsed low
parsedLow = highVolatilityBar ? high : low
// we store current values into the arrays at each bar
parsedHighs.push(parsedHigh)
parsedLows.push(parsedLow)
highs.push(high)
lows.push(low)
times.push(time)
//---------------------------------------------------------------------------------------------------------------------}
//USER-DEFINED FUNCTIONS
//---------------------------------------------------------------------------------------------------------------------{
// @function Get the value of the current leg, it can be 0 (bearish) or 1 (bullish)
// @returns int
leg(int size) =>
var leg = 0
newLegHigh = high > ta.highest( size)
newLegLow = low < ta.lowest( size)
if newLegHigh
leg := BEARISH_LEG
else if newLegLow
leg := BULLISH_LEG
leg
// @function Identify whether the current value is the start of a new leg (swing)
// @param leg (int) Current leg value
// @returns bool
startOfNewLeg(int leg) => ta.change(leg) != 0
// @function Identify whether the current level is the start of a new bearish leg (swing)
// @param leg (int) Current leg value
// @returns bool
startOfBearishLeg(int leg) => ta.change(leg) == -1
// @function Identify whether the current level is the start of a new bullish leg (swing)
// @param leg (int) Current leg value
// @returns bool
startOfBullishLeg(int leg) => ta.change(leg) == +1
// @function create a new label
// @param labelTime bar time coordinate
// @param labelPrice price coordinate
// @param tag text to display
// @param labelColor text color
// @param labelStyle label style
// @returns label ID
drawLabel(int labelTime, float labelPrice, string tag, color labelColor, string labelStyle) =>
var label l_abel = na
if modeInput == PRESENT
l_abel.delete()
l_abel := label.new(chart.point.new(labelTime,na,labelPrice),tag,xloc.bar_time,color=color(na),textcolor=labelColor,style = labelStyle,size = size.small)
// @function create a new line and label representing an EQH or EQL
// @param p_ivot starting pivot
// @param level price level of current pivot
// @param size how many bars ago was the current pivot detected
// @param equalHigh true for EQH, false for EQL
// @returns label ID
drawEqualHighLow(pivot p_ivot, float level, int size, bool equalHigh) =>
equalDisplay e_qualDisplay = equalHigh ? equalHighDisplay : equalLowDisplay
string tag = 'EQL'
color equalColor = swingBullishColor
string labelStyle = label.style_label_up
if equalHigh
tag := 'EQH'
equalColor := swingBearishColor
labelStyle := label.style_label_down
if modeInput == PRESENT
line.delete( e_qualDisplay.l_ine)
label.delete( e_qualDisplay.l_abel)
e_qualDisplay.l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time ,na,level), xloc = xloc.bar_time, color = equalColor, style = line.style_dotted)
labelPosition = math.round(0.5*(p_ivot.barIndex + bar_index - size))
e_qualDisplay.l_abel := label.new(chart.point.new(na,labelPosition,level), tag, xloc.bar_index, color = color(na), textcolor = equalColor, style = labelStyle, size = equalHighsLowsSizeInput)
// @function store current structure and trailing swing points, and also display swing points and equal highs/lows
// @param size (int) structure size
// @param equalHighLow (bool) true for displaying current highs/lows
// @param internal (bool) true for getting internal structures
// @returns label ID
getCurrentStructure(int size,bool equalHighLow = false, bool internal = false) =>
currentLeg = leg(size)
newPivot = startOfNewLeg(currentLeg)
pivotLow = startOfBullishLeg(currentLeg)
pivotHigh = startOfBearishLeg(currentLeg)
if newPivot
if pivotLow
pivot p_ivot = equalHighLow ? equalLow : internal ? internalLow : swingLow
if equalHighLow and math.abs(p_ivot.currentLevel - low ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot, low , size, false)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := low
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.bottom := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastBottomTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel < p_ivot.lastLevel ? 'LL' : 'HL', swingBullishColor, label.style_label_up)
else
pivot p_ivot = equalHighLow ? equalHigh : internal ? internalHigh : swingHigh
if equalHighLow and math.abs(p_ivot.currentLevel - high ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot,high ,size,true)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := high
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.top := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastTopTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel > p_ivot.lastLevel ? 'HH' : 'LH', swingBearishColor, label.style_label_down)
// @function draw line and label representing a structure
// @param p_ivot base pivot point
// @param tag test to display
// @param structureColor base color
// @param lineStyle line style
// @param labelStyle label style
// @param labelSize text size
// @returns label ID
drawStructure(pivot p_ivot, string tag, color structureColor, string lineStyle, string labelStyle, string labelSize) =>
var line l_ine = line.new(na,na,na,na,xloc = xloc.bar_time)
var label l_abel = label.new(na,na)
if modeInput == PRESENT
l_ine.delete()
l_abel.delete()
l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time,na,p_ivot.currentLevel), xloc.bar_time, color=structureColor, style=lineStyle)
l_abel := label.new(chart.point.new(na,math.round(0.5*(p_ivot.barIndex+bar_index)),p_ivot.currentLevel), tag, xloc.bar_index, color=color(na), textcolor=structureColor, style=labelStyle, size = labelSize)
// @function delete order blocks
// @param internal true for internal order blocks
// @returns orderBlock ID
deleteOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
for in orderBlocks
bool crossedOderBlock = false
if bearishOrderBlockMitigationSource > eachOrderBlock.barHigh and eachOrderBlock.bias == BEARISH
crossedOderBlock := true
if internal
currentAlerts.internalBearishOrderBlock := true
else
currentAlerts.swingBearishOrderBlock := true
else if bullishOrderBlockMitigationSource < eachOrderBlock.barLow and eachOrderBlock.bias == BULLISH
crossedOderBlock := true
if internal
currentAlerts.internalBullishOrderBlock := true
else
currentAlerts.swingBullishOrderBlock := true
if crossedOderBlock
orderBlocks.remove(index)
// @function fetch and store order blocks
// @param p_ivot base pivot point
// @param internal true for internal order blocks
// @param bias BULLISH or BEARISH
// @returns void
storeOrdeBlock(pivot p_ivot,bool internal = false,int bias) =>
if (not internal and showSwingOrderBlocksInput) or (internal and showInternalOrderBlocksInput)
array a_rray = na
int parsedIndex = na
if bias == BEARISH
a_rray := parsedHighs.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.max())
else
a_rray := parsedLows.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.min())
orderBlock o_rderBlock = orderBlock.new(parsedHighs.get(parsedIndex), parsedLows.get(parsedIndex), times.get(parsedIndex),bias)
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
if orderBlocks.size() >= 100
orderBlocks.pop()
orderBlocks.unshift(o_rderBlock)
// @function draw order blocks as boxes
// @param internal true for internal order blocks
// @returns void
drawOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
orderBlocksSize = orderBlocks.size()
if orderBlocksSize > 0
maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput
array parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize))
array b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes
for in parsedOrdeBlocks
orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor)
box b_ox = b_oxes.get(index)
b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow))
b_ox.set_border_color( internal ? na : orderBlockColor)
b_ox.set_bgcolor( orderBlockColor)
// @function detect and draw structures, also detect and store order blocks
// @param internal true for internal structures or order blocks
// @returns void
displayStructure(bool internal = false) =>
var bullishBar = true
var bearishBar = true
if internalFilterConfluenceInput
bullishBar := high - math.max(close, open) > math.min(close, open - low)
bearishBar := high - math.max(close, open) < math.min(close, open - low)
pivot p_ivot = internal ? internalHigh : swingHigh
trend t_rend = internal ? internalTrend : swingTrend
lineStyle = internal ? line.style_dashed : line.style_solid
labelSize = internal ? internalStructureSize : swingStructureSize
extraCondition = internal ? internalHigh.currentLevel != swingHigh.currentLevel and bullishBar : true
bullishColor = styleInput == MONOCHROME ? MONO_BULLISH : internal ? internalBullColorInput : swingBullColorInput
if ta.crossover(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BEARISH ? CHOCH : BOS
if internal
currentAlerts.internalBullishCHoCH := tag == CHOCH
currentAlerts.internalBullishBOS := tag == BOS
else
currentAlerts.swingBullishCHoCH := tag == CHOCH
currentAlerts.swingBullishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BULLISH
displayCondition = internal ? showInternalsInput and (showInternalBullInput == ALL or (showInternalBullInput == BOS and tag != CHOCH) or (showInternalBullInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBullInput == ALL or (showSwingBullInput == BOS and tag != CHOCH) or (showSwingBullInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bullishColor,lineStyle,label.style_label_down,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BULLISH)
p_ivot := internal ? internalLow : swingLow
extraCondition := internal ? internalLow.currentLevel != swingLow.currentLevel and bearishBar : true
bearishColor = styleInput == MONOCHROME ? MONO_BEARISH : internal ? internalBearColorInput : swingBearColorInput
if ta.crossunder(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BULLISH ? CHOCH : BOS
if internal
currentAlerts.internalBearishCHoCH := tag == CHOCH
currentAlerts.internalBearishBOS := tag == BOS
else
currentAlerts.swingBearishCHoCH := tag == CHOCH
currentAlerts.swingBearishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BEARISH
displayCondition = internal ? showInternalsInput and (showInternalBearInput == ALL or (showInternalBearInput == BOS and tag != CHOCH) or (showInternalBearInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBearInput == ALL or (showSwingBearInput == BOS and tag != CHOCH) or (showSwingBearInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bearishColor,lineStyle,label.style_label_up,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BEARISH)
// @function draw one fair value gap box (each fair value gap has two boxes)
// @param leftTime left time coordinate
// @param rightTime right time coordinate
// @param topPrice top price level
// @param bottomPrice bottom price level
// @param boxColor box color
// @returns box ID
fairValueGapBox(leftTime,rightTime,topPrice,bottomPrice,boxColor) => box.new(chart.point.new(leftTime,na,topPrice),chart.point.new(rightTime + fairValueGapsExtendInput * (time-time ),na,bottomPrice), xloc=xloc.bar_time, border_color = boxColor, bgcolor = boxColor)
// @function delete fair value gaps
// @returns fairValueGap ID
deleteFairValueGaps() =>
for in fairValueGaps
if (low < eachFairValueGap.bottom and eachFairValueGap.bias == BULLISH) or (high > eachFairValueGap.top and eachFairValueGap.bias == BEARISH)
eachFairValueGap.topBox.delete()
eachFairValueGap.bottomBox.delete()
fairValueGaps.remove(index)
// @function draw fair value gaps
// @returns fairValueGap ID
drawFairValueGaps() =>
= request.security(syminfo.tickerid, fairValueGapsTimeframeInput, [close , open , time , high , low , time , high , low ],lookahead = barmerge.lookahead_on)
barDeltaPercent = (lastClose - lastOpen) / (lastOpen * 100)
newTimeframe = timeframe.change(fairValueGapsTimeframeInput)
threshold = fairValueGapsThresholdInput ? ta.cum(math.abs(newTimeframe ? barDeltaPercent : 0)) / bar_index * 2 : 0
bullishFairValueGap = currentLow > last2High and lastClose > last2High and barDeltaPercent > threshold and newTimeframe
bearishFairValueGap = currentHigh < last2Low and lastClose < last2Low and -barDeltaPercent > threshold and newTimeframe
if bullishFairValueGap
currentAlerts.bullishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentLow,last2High,BULLISH,fairValueGapBox(lastTime,currentTime,currentLow,math.avg(currentLow,last2High),fairValueGapBullishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentLow,last2High),last2High,fairValueGapBullishColor)))
if bearishFairValueGap
currentAlerts.bearishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentHigh,last2Low,BEARISH,fairValueGapBox(lastTime,currentTime,currentHigh,math.avg(currentHigh,last2Low),fairValueGapBearishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentHigh,last2Low),last2Low,fairValueGapBearishColor)))
// @function get line style from string
// @param style line style
// @returns string
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
// @function draw MultiTimeFrame levels
// @param timeframe base timeframe
// @param sameTimeframe true if chart timeframe is same as base timeframe
// @param style line style
// @param levelColor line and text color
// @returns void
drawLevels(string timeframe, bool sameTimeframe, string style, color levelColor) =>
= request.security(syminfo.tickerid, timeframe, [high , low , time , time],lookahead = barmerge.lookahead_on)
float parsedTop = sameTimeframe ? high : topLevel
float parsedBottom = sameTimeframe ? low : bottomLevel
int parsedLeftTime = sameTimeframe ? time : leftTime
int parsedRightTime = sameTimeframe ? time : rightTime
int parsedTopTime = time
int parsedBottomTime = time
if not sameTimeframe
int leftIndex = times.binary_search_rightmost(parsedLeftTime)
int rightIndex = times.binary_search_rightmost(parsedRightTime)
array timeArray = times.slice(leftIndex,rightIndex)
array topArray = highs.slice(leftIndex,rightIndex)
array bottomArray = lows.slice(leftIndex,rightIndex)
parsedTopTime := timeArray.size() > 0 ? timeArray.get(topArray.indexof(topArray.max())) : initialTime
parsedBottomTime := timeArray.size() > 0 ? timeArray.get(bottomArray.indexof(bottomArray.min())) : initialTime
var line topLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var line bottomLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var label topLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}H',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
var label bottomLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}L',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
topLine.set_first_point( chart.point.new(parsedTopTime,na,parsedTop))
topLine.set_second_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
topLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
bottomLine.set_first_point( chart.point.new(parsedBottomTime,na,parsedBottom))
bottomLine.set_second_point(chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
bottomLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
// @function true if chart timeframe is higher than provided timeframe
// @param timeframe timeframe to check
// @returns bool
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
// @function update trailing swing points
// @returns int
updateTrailingExtremes() =>
trailing.top := math.max(high,trailing.top)
trailing.lastTopTime := trailing.top == high ? time : trailing.lastTopTime
trailing.bottom := math.min(low,trailing.bottom)
trailing.lastBottomTime := trailing.bottom == low ? time : trailing.lastBottomTime
// @function draw trailing swing points
// @returns void
drawHighLowSwings() =>
var line topLine = line.new(na, na, na, na, color = swingBearishColor, xloc = xloc.bar_time)
var line bottomLine = line.new(na, na, na, na, color = swingBullishColor, xloc = xloc.bar_time)
var label topLabel = label.new(na, na, color=color(na), textcolor = swingBearishColor, xloc = xloc.bar_time, style = label.style_label_down, size = size.tiny)
var label bottomLabel = label.new(na, na, color=color(na), textcolor = swingBullishColor, xloc = xloc.bar_time, style = label.style_label_up, size = size.tiny)
rightTimeBar = last_bar_time + 20 * (time - time )
topLine.set_first_point( chart.point.new(trailing.lastTopTime, na, trailing.top))
topLine.set_second_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_text( swingTrend.bias == BEARISH ? 'Strong High' : 'Weak High')
bottomLine.set_first_point( chart.point.new(trailing.lastBottomTime, na, trailing.bottom))
bottomLine.set_second_point(chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_point( chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_text( swingTrend.bias == BULLISH ? 'Strong Low' : 'Weak Low')
// @function draw a zone with a label and a box
// @param labelLevel price level for label
// @param labelIndex bar index for label
// @param top top price level for box
// @param bottom bottom price level for box
// @param tag text to display
// @param zoneColor base color
// @param style label style
// @returns void
drawZone(float labelLevel, int labelIndex, float top, float bottom, string tag, color zoneColor, string style) =>
var label l_abel = label.new(na,na,text = tag, color=color(na),textcolor = zoneColor, style = style, size = size.small)
var box b_ox = box.new(na,na,na,na,bgcolor = color.new(zoneColor,80),border_color = color(na), xloc = xloc.bar_time)
b_ox.set_top_left_point( chart.point.new(trailing.barTime,na,top))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,bottom))
l_abel.set_point( chart.point.new(na,labelIndex,labelLevel))
// @function draw premium/discount zones
// @returns void
drawPremiumDiscountZones() =>
drawZone(trailing.top, math.round(0.5*(trailing.barIndex + last_bar_index)), trailing.top, 0.95*trailing.top + 0.05*trailing.bottom, 'Premium', premiumZoneColor, label.style_label_down)
equilibriumLevel = math.avg(trailing.top, trailing.bottom)
drawZone(equilibriumLevel, last_bar_index, 0.525*trailing.top + 0.475*trailing.bottom, 0.525*trailing.bottom + 0.475*trailing.top, 'Equilibrium', equilibriumZoneColorInput, label.style_label_left)
drawZone(trailing.bottom, math.round(0.5*(trailing.barIndex + last_bar_index)), 0.95*trailing.bottom + 0.05*trailing.top, trailing.bottom, 'Discount', discountZoneColor, label.style_label_up)
//---------------------------------------------------------------------------------------------------------------------}
//MUTABLE VARIABLES & EXECUTION
//---------------------------------------------------------------------------------------------------------------------{
parsedOpen = showTrendInput ? open : na
candleColor = internalTrend.bias == BULLISH ? swingBullishColor : swingBearishColor
plotcandle(parsedOpen,high,low,close,color = candleColor, wickcolor = candleColor, bordercolor = candleColor)
if showHighLowSwingsInput or showPremiumDiscountZonesInput
updateTrailingExtremes()
if showHighLowSwingsInput
drawHighLowSwings()
if showPremiumDiscountZonesInput
drawPremiumDiscountZones()
if showFairValueGapsInput
deleteFairValueGaps()
getCurrentStructure(swingsLengthInput,false)
getCurrentStructure(5,false,true)
if showEqualHighsLowsInput
getCurrentStructure(equalHighsLowsLengthInput,true)
if showInternalsInput or showInternalOrderBlocksInput or showTrendInput
displayStructure(true)
if showStructureInput or showSwingOrderBlocksInput or showHighLowSwingsInput
displayStructure()
if showInternalOrderBlocksInput
deleteOrderBlocks(true)
if showSwingOrderBlocksInput
deleteOrderBlocks()
if showFairValueGapsInput
drawFairValueGaps()
if barstate.islastconfirmedhistory or barstate.islast
if showInternalOrderBlocksInput
drawOrderBlocks(true)
if showSwingOrderBlocksInput
drawOrderBlocks()
lastBarIndex := currentBarIndex
currentBarIndex := bar_index
newBar = currentBarIndex != lastBarIndex
if barstate.islastconfirmedhistory or (barstate.isrealtime and newBar)
if showDailyLevelsInput and not higherTimeframe('D')
drawLevels('D',timeframe.isdaily,dailyLevelsStyleInput,dailyLevelsColorInput)
if showWeeklyLevelsInput and not higherTimeframe('W')
drawLevels('W',timeframe.isweekly,weeklyLevelsStyleInput,weeklyLevelsColorInput)
if showMonthlyLevelsInput and not higherTimeframe('M')
drawLevels('M',timeframe.ismonthly,monthlyLevelsStyleInput,monthlyLevelsColorInput)
//---------------------------------------------------------------------------------------------------------------------}
//ALERTS
//---------------------------------------------------------------------------------------------------------------------{
alertcondition(currentAlerts.internalBullishBOS, 'Internal Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.internalBullishCHoCH, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.internalBearishBOS, 'Internal Bearish BOS', 'Internal Bearish BOS formed')
alertcondition(currentAlerts.internalBearishCHoCH, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed')
alertcondition(currentAlerts.swingBullishBOS, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.swingBullishCHoCH, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.swingBearishBOS, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(currentAlerts.swingBearishCHoCH, 'Bearish CHoCH', 'Bearish CHoCH formed')
alertcondition(currentAlerts.internalBullishOrderBlock, 'Bullish Internal OB Breakout', 'Price broke bullish internal OB')
alertcondition(currentAlerts.internalBearishOrderBlock, 'Bearish Internal OB Breakout', 'Price broke bearish internal OB')
alertcondition(currentAlerts.swingBullishOrderBlock, 'Bullish Swing OB Breakout', 'Price broke bullish swing OB')
alertcondition(currentAlerts.swingBearishOrderBlock, 'Bearish Swing OB Breakout', 'Price broke bearish swing OB')
alertcondition(currentAlerts.equalHighs, 'Equal Highs', 'Equal highs detected')
alertcondition(currentAlerts.equalLows, 'Equal Lows', 'Equal lows detected')
alertcondition(currentAlerts.bullishFairValueGap, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(currentAlerts.bearishFairValueGap, 'Bearish FVG', 'Bearish FVG formed')
//---------------------------------------------------------------------------------------------------------------------}
さくらんぼーい//@version=6
indicator("さくらんぼーい", overlay=true, max_labels_count=500, max_lines_count=500)
//==================== Inputs ====================//
// ---- Anchor (shared) ----
grpA = "Anchor (shared)"
anchorMode = input.string("Time", "Anchor Mode", options= , group=grpA)
anchorTime = input.time(timestamp("2025-06-24T20:31:00"), "Anchor Time (exchange)", group=grpA)
anchorBarsAgo = input.int(100, "Anchor Bars Ago", minval=1, group=grpA)
anchorPriceMode = input.string("Close", "Anchor Price", options= , group=grpA)
anchorPriceManual = input.float(0.0, "Manual Anchor Price (0=auto)", step=0.0001, group=grpA)
// ---- Light-Cone ----
grpLC = "Light-Cone ATR"
atrLen = input.int(14, "ATR Length", minval=1, group=grpLC)
atrTF = input.timeframe("", "ATR Timeframe (blank=same)", group=grpLC)
projBars = input.int(60, "Projection Horizon (bars)", minval=1, group=grpLC)
coneMode = input.string("Diffusive √n", "Cone Growth Mode", options= , group=grpLC)
mult = input.float(1.0, "ATR Multiplier (σ-ish)", step=0.1, minval=0.0, group=grpLC)
wickMode = input.string("Close", "Height uses", options= , group=grpLC)
coneFillCol= input.color(color.new(color.teal, 90), "Cone Fill", group=grpLC)
coneLineCol= input.color(color.new(color.aqua, 40), "Cone Edge", group=grpLC)
// ---- Light-Cone guide lines ----
grpFan = "Light-Cone Guides (0.5c / 1.5c)"
showFan = input.bool(true, "Show 0.5c & 1.5c guide lines", group=grpFan)
fan05Color = input.color(color.new(color.aqua, 75), "0.5c line", group=grpFan)
fan15Color = input.color(color.new(color.aqua, 60), "1.5c line", group=grpFan)
fanWidth = input.int(1, "Guide line width", minval=1, maxval=3, group=grpFan)
// ---- √n Stripes ----
grpZ = "Convergence (√n stripes)"
stepBars = input.int(20, "Base Step (bars)", minval=1, group=grpZ)
maxOrderM = input.int(8, "Max Order M (m²)", minval=1, maxval=50, group=grpZ)
halfWindow = input.int(2, "Stripe Half-Width (bars)", minval=0, group=grpZ)
stripeColor = input.color(color.new(color.fuchsia, 86), "Stripe Color", group=grpZ)
showCenters = input.bool(false, "Draw Stripe Center Lines", group=grpZ)
// ---- Fractal ----
grpF = "Fractal (Pivot) Detector"
leftP = input.int(2, "Left bars (L)", minval=1, group=grpF)
rightP = input.int(2, "Right bars (R)", minval=1, group=grpF)
hitColHi = input.color(color.new(color.lime, 0), "Pivot High Mark", group=grpF)
hitColLo = input.color(color.new(color.red, 0), "Pivot Low Mark", group=grpF)
// ---- Display / Limits ----
grpO = "Display / Limits"
showHitTable = input.bool(true, "Show m² Hit Table", group=grpO)
limitScreen = input.bool(true, "Reduce drawing near screen", group=grpO)
screenPastBars = input.int(5000, "Screen past window (bars)", minval=100, group=grpO)
futureLimitBars= input.int(500, "FUTURE draw limit (TV max 500)", minval=0, maxval=500, group=grpO)
// ---- Bias Panel ----
grpB = "Bias Panel"
showBiasPanel = input.bool(true, "Show Bias Panel", group=grpB)
biasTf = input.timeframe("15", "HTF timeframe", group=grpB)
emaFast = input.int(20, "HTF EMA fast", minval=1, group=grpB)
emaSlow = input.int(50, "HTF EMA slow", minval=2, group=grpB)
zThresh = input.float(0.30, "Z threshold (±)", step=0.05, group=grpB)
railLookback = input.int(20, "Rail lookback bars", minval=5, group=grpB)
railPct = input.float(0.40, "Rail touch ratio (0–1)", minval=0.1, maxval=0.9, step=0.05, group=grpB)
// ---- Positions (NEW) ----
panelCorner = input.string("Top-Right", "Bias Panel Position",
options= , group=grpB)
hitsCorner = input.string("Top-Left", "Hits Table Position",
options= , group=grpO)
// ---- Helpers: table positions ----
f_pos(s) =>
p = position.top_left
if s == "Top-Right"
p := position.top_right
else if s == "Bottom-Left"
p := position.bottom_left
else if s == "Bottom-Right"
p := position.bottom_right
p
//==================== Anchor Resolve ====================//
var int anchorBar = na
var float anchorPrice = na
var label anchorLbl = na
// 初バー保護付きタイム検索
f_find_anchor_bar_by_time(_t) =>
ta.valuewhen(nz(time , time ) < _t and time >= _t, bar_index, 0)
if anchorMode == "Time"
anchorBar := f_find_anchor_bar_by_time(anchorTime)
else
// バッファ下限保護
anchorBar := math.max(0, bar_index - anchorBarsAgo)
// アンカー価格(安全取得)
f_price_at_anchor(_bar) =>
float _v = na
if anchorPriceMode == "Close"
_v := ta.valuewhen(bar_index == _bar, close, 0)
else if anchorPriceMode == "High"
_v := ta.valuewhen(bar_index == _bar, high, 0)
else if anchorPriceMode == "Low"
_v := ta.valuewhen(bar_index == _bar, low, 0)
else if anchorPriceMode == "Open"
_v := ta.valuewhen(bar_index == _bar, open, 0)
_v
float autoPrice = na
if not na(anchorBar) and anchorBar <= bar_index
autoPrice := f_price_at_anchor(anchorBar)
anchorPrice := (anchorPriceMode == "Manual" and anchorPriceManual != 0.0) ? anchorPriceManual : autoPrice
bool anchorOK = not na(anchorBar) and anchorBar >= 0 and anchorBar <= bar_index + futureLimitBars and not na(anchorPrice)
// ラベル
if anchorOK
if na(anchorLbl)
anchorLbl := label.new(anchorBar, anchorPrice, "Anchor", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_down, textcolor=color.black, color=color.yellow, size=size.tiny)
else
label.set_x(anchorLbl, anchorBar), label.set_y(anchorLbl, anchorPrice)
//==================== Light-Cone (ATR-based) ====================//
float atrSame = ta.atr(atrLen)
float atrOther = request.security(syminfo.tickerid, atrTF, ta.atr(atrLen), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
float baseATR = (na(atrTF) or atrTF == "") ? atrSame : atrOther
float c_main = mult * baseATR
int horizon = math.min(projBars, futureLimitBars)
var line upL = na
var line dnL = na
var line up05 = na
var line dn05 = na
var line up15 = na
var line dn15 = na
var linefill coneFill = na
f_growth(_n) =>
coneMode == "Linear n" ? _n : math.sqrt(_n)
if anchorOK
if not na(coneFill)
linefill.delete(coneFill)
if not na(upL)
line.delete(upL)
if not na(dnL)
line.delete(dnL)
if not na(up05)
line.delete(up05)
if not na(dn05)
line.delete(dn05)
if not na(up15)
line.delete(up15)
if not na(dn15)
line.delete(dn15)
int x1 = anchorBar + horizon
float dyPer= (wickMode == "Wick (High/Low)") ? c_main * 0.5 : c_main
float grow = f_growth(horizon)
float upY = anchorPrice + dyPer * grow
float dnY = anchorPrice - dyPer * grow
float upY05 = anchorPrice + (dyPer * 0.5) * grow
float dnY05 = anchorPrice - (dyPer * 0.5) * grow
float upY15 = anchorPrice + (dyPer * 1.5) * grow
float dnY15 = anchorPrice - (dyPer * 1.5) * grow
upL := line.new(anchorBar, anchorPrice, x1, upY, xloc=xloc.bar_index, extend=extend.none, color=coneLineCol, width=2)
dnL := line.new(anchorBar, anchorPrice, x1, dnY, xloc=xloc.bar_index, extend=extend.none, color=coneLineCol, width=2)
coneFill := linefill.new(upL, dnL, color=coneFillCol)
if showFan
up05 := line.new(anchorBar, anchorPrice, x1, upY05, xloc=xloc.bar_index, extend=extend.none, color=fan05Color, width=fanWidth)
dn05 := line.new(anchorBar, anchorPrice, x1, dnY05, xloc=xloc.bar_index, extend=extend.none, color=fan05Color, width=fanWidth)
up15 := line.new(anchorBar, anchorPrice, x1, upY15, xloc=xloc.bar_index, extend=extend.none, color=fan15Color, width=fanWidth)
dn15 := line.new(anchorBar, anchorPrice, x1, dnY15, xloc=xloc.bar_index, extend=extend.none, color=fan15Color, width=fanWidth)
//==================== √n Stripes ====================//
var array centers = array.new_int()
array.clear(centers)
if not na(anchorBar)
for m = 1 to maxOrderM
array.push(centers, anchorBar + stepBars * m * m)
f_in_any_stripe(_bi) =>
sz = array.size(centers)
if sz == 0
false
else
bool hit = false
for i = 0 to sz - 1
int c0 = array.get(centers, i)
if _bi >= c0 - halfWindow and _bi <= c0 + halfWindow
hit := true
hit
// どの m² ストライプか(なければ na)
f_stripe_index(_bi) =>
int mFound = na
if array.size(centers) > 0
for m = 1 to maxOrderM
int cCenter = array.get(centers, m - 1)
if _bi >= cCenter - halfWindow and _bi <= cCenter + halfWindow
mFound := m
mFound
bgcolor(f_in_any_stripe(bar_index) ? stripeColor : na)
if showCenters and array.size(centers) > 0
for i = 0 to array.size(centers) - 1
int c0 = array.get(centers, i)
bool withinFutureLimit = c0 <= bar_index + futureLimitBars
bool nearScreen = not limitScreen or (c0 >= bar_index - screenPastBars and c0 <= bar_index + futureLimitBars)
if withinFutureLimit and nearScreen
line.new(c0, high, c0, low, xloc=xloc.bar_index, extend=extend.both, color=color.new(color.white, 70), width=1)
//==================== Fractal Detection ====================//
isPH = not na(ta.pivothigh(high, leftP, rightP))
isPL = not na(ta.pivotlow (low , leftP, rightP))
int pivotCenter = bar_index - rightP
hitPH = isPH and f_in_any_stripe(pivotCenter)
hitPL = isPL and f_in_any_stripe(pivotCenter)
//==================== m² Hit Table (robust) ====================//
var table tbHits = na
var hitsHi = array.new_int()
var hitsLo = array.new_int()
f_sync_len_int(_arr, _n, _fill) =>
while array.size(_arr) < _n
array.push(_arr, _fill)
while array.size(_arr) > _n
array.pop(_arr)
_arr
f_safe_get_int(_arr, _idx) =>
(_idx >= 0 and _idx < array.size(_arr)) ? array.get(_arr, _idx) : 0
// 毎バー長さ同期
f_sync_len_int(hitsHi, maxOrderM, 0)
f_sync_len_int(hitsLo, maxOrderM, 0)
// 集計
if (hitPH or hitPL) and array.size(centers) > 0
int nC = array.size(centers)
int nM = math.min(maxOrderM, nC)
for m = 1 to nM
int c0 = array.get(centers, m - 1)
if pivotCenter >= c0 - halfWindow and pivotCenter <= c0 + halfWindow
if hitPH
array.set(hitsHi, m - 1, f_safe_get_int(hitsHi, m - 1) + 1)
if hitPL
array.set(hitsLo, m - 1, f_safe_get_int(hitsLo, m - 1) + 1)
// 表示
if showHitTable and barstate.islast
if na(tbHits)
tbHits := table.new(f_pos(hitsCorner), 3, maxOrderM + 1, border_width=1)
table.cell(tbHits, 0, 0, "m²", bgcolor=color.new(color.blue, 20), text_color=color.white)
table.cell(tbHits, 1, 0, "PH▲", bgcolor=color.new(color.green,10), text_color=color.white)
table.cell(tbHits, 2, 0, "PL▼", bgcolor=color.new(color.red, 10), text_color=color.white)
int rows = array.size(hitsHi)
int nRow = math.min(maxOrderM, rows)
for m = 1 to nRow
table.cell(tbHits, 0, m, str.tostring(m) + "²")
table.cell(tbHits, 1, m, str.tostring(f_safe_get_int(hitsHi, m - 1)))
table.cell(tbHits, 2, m, str.tostring(f_safe_get_int(hitsLo, m - 1)))
//==================== Bias Components ====================//
// 1) HTF trend
bool htfBull = request.security(syminfo.tickerid, biasTf, ta.ema(close, emaFast) > ta.ema(close, emaSlow), gaps=barmerge.gaps_off)
bool htfBear = request.security(syminfo.tickerid, biasTf, ta.ema(close, emaFast) < ta.ema(close, emaSlow), gaps=barmerge.gaps_off)
int scHTF = htfBull ? 1 : (htfBear ? -1 : 0)
string stHTF = htfBull ? "Bull" : (htfBear ? "Bear" : "—")
// 2) Cone Z
float z = 0.0
if anchorOK
int barsFromAnchor = math.max(1, bar_index - anchorBar)
float dyPerNow = (wickMode == "Wick (High/Low)") ? (mult * baseATR * 0.5) : (mult * baseATR)
float growNow = f_growth(math.min(barsFromAnchor, horizon))
float denom = dyPerNow * growNow
z := denom != 0 ? (close - anchorPrice) / denom : 0.0
int scZ = z > zThresh ? 1 : (z < -zThresh ? -1 : 0)
string stZ = anchorOK ? ("z=" + str.tostring(z, "#.00")) : "no anchor"
// 3) Rail-hug(0.5c〜1.0c帯を High/Low の“タッチ”で判定)
// ← 初期バー安全:参照本数を bar_index にクリップ
int effLookback = math.min(railLookback, bar_index) // bar_index 本目までは 0..bar_index しか参照不可
int upTouch = 0, dnTouch = 0
if anchorOK and effLookback > 0
for i = 0 to effLookback - 1
int barsFA = math.max(1, (bar_index - i) - anchorBar)
float growI = f_growth(math.min(barsFA, horizon))
float dyPerI = (wickMode == "Wick (High/Low)") ? (mult * baseATR * 0.5) : (mult * baseATR)
float up05I = anchorPrice + dyPerI * 0.5 * growI
float up10I = anchorPrice + dyPerI * 1.0 * growI
float dn05I = anchorPrice - dyPerI * 0.5 * growI
float dn10I = anchorPrice - dyPerI * 1.0 * growI
upTouch += (high >= up05I and low <= up10I) ? 1 : 0
dnTouch += (low <= dn05I and high >= dn10I) ? 1 : 0
float upRatio = effLookback > 0 ? (upTouch * 1.0) / effLookback : 0.0
float dnRatio = effLookback > 0 ? (dnTouch * 1.0) / effLookback : 0.0
bool railUp = upRatio > railPct
bool railDn = dnRatio > railPct
int scRail = railUp ? 1 : (railDn ? -1 : 0)
string stRail = anchorOK ? (railUp ? ("Up " + str.tostring(upRatio*100, "#") + "%") : (railDn ? ("Dn " + str.tostring(dnRatio*100, "#") + "%") : "—")) : "no anchor"
// 4) Stripe entry → 最初のフラクタル(帯を出た後確定も拾う)
var bool stripeIn = false
var int stripeIdxActive = na
var int stripeEnterBar = na
var int stripeLastStart = na
var int stripeLastEnd = na
var int stripeLastIdx = na
var string firstFrac = "" // "PL" or "PH" or ""
int nowIdx = f_stripe_index(bar_index)
bool nowInStripe = not na(nowIdx)
if nowInStripe and not stripeIn
stripeIn := true
stripeIdxActive := nowIdx
stripeEnterBar := bar_index
firstFrac := ""
else if not nowInStripe and stripeIn
stripeIn := false
stripeLastStart := stripeEnterBar
stripeLastEnd := bar_index - 1
stripeLastIdx := stripeIdxActive
if (isPH or isPL)
int pc = pivotCenter
int pcIdx = f_stripe_index(pc)
bool inActive = stripeIn and not na(stripeIdxActive) and pcIdx == stripeIdxActive and pc >= nz(stripeEnterBar, pc)
bool inClosed = (not stripeIn) and not na(stripeLastIdx) and pcIdx == stripeLastIdx and pc >= nz(stripeLastStart, pc) and pc <= nz(stripeLastEnd, pc)
if firstFrac == "" and (inActive or inClosed)
firstFrac := isPL ? "PL" : (isPH ? "PH" : "")
int scFrac = firstFrac == "PL" ? 1 : (firstFrac == "PH" ? -1 : 0)
string stFrac = firstFrac == "" ? "—" : ("1st " + firstFrac + (not stripeIn and not na(stripeLastIdx) ? " @m=" + str.tostring(stripeLastIdx) : (not na(stripeIdxActive) ? " @m=" + str.tostring(stripeIdxActive) : "")))
// 5) Structure break(簡易)
var float lastPH = na
var float lastPL = na
float ph = ta.pivothigh(high, 2, 2)
float pl = ta.pivotlow (low , 2, 2)
if not na(ph)
lastPH := ph
if not na(pl)
lastPL := pl
bool bullBreak = not na(lastPH) and close > lastPH
bool bearBreak = not na(lastPL) and close < lastPL
int scStruct = bullBreak ? 1 : (bearBreak ? -1 : 0)
string stStruct = bullBreak ? "Break ↑" : (bearBreak ? "Break ↓" : "—")
// ---- Total ----
int biasScore = scHTF + scZ + scRail + scFrac + scStruct
string biasDir = biasScore >= 3 ? "UP" : (biasScore <= -3 ? "DOWN" : "NEUTRAL")
//==================== Bias Panel (table, corner selectable) ====================//
var table tbBias = na
color colG = color.new(color.green, 10)
color colR = color.new(color.red, 10)
color colN = color.new(color.gray, 70)
f_col(v) =>
v > 0 ? colG : (v < 0 ? colR : colN)
if showBiasPanel and barstate.islast
if na(tbBias)
tbBias := table.new(f_pos(panelCorner), 3, 8, border_width=1)
table.cell(tbBias, 0, 0, "Bias Panel", text_color=color.white, bgcolor=color.new(color.blue, 20), text_halign=text.align_center)
table.merge_cells(tbBias, 0, 0, 2, 0)
table.cell(tbBias, 0, 1, "Card", text_halign=text.align_center)
table.cell(tbBias, 1, 1, "State", text_halign=text.align_center)
table.cell(tbBias, 2, 1, "±1", text_halign=text.align_center)
// rows
table.cell(tbBias, 0, 2, "HTF ("+biasTf+")")
table.cell(tbBias, 1, 2, stHTF)
table.cell(tbBias, 2, 2, str.tostring(scHTF), bgcolor=f_col(scHTF), text_halign=text.align_center)
table.cell(tbBias, 0, 3, "Cone z")
table.cell(tbBias, 1, 3, stZ)
table.cell(tbBias, 2, 3, str.tostring(scZ), bgcolor=f_col(scZ), text_halign=text.align_center)
table.cell(tbBias, 0, 4, "Rail 0.5c")
table.cell(tbBias, 1, 4, stRail)
table.cell(tbBias, 2, 4, str.tostring(scRail), bgcolor=f_col(scRail), text_halign=text.align_center)
table.cell(tbBias, 0, 5, "Fractal")
table.cell(tbBias, 1, 5, stFrac)
table.cell(tbBias, 2, 5, str.tostring(scFrac), bgcolor=f_col(scFrac), text_halign=text.align_center)
table.cell(tbBias, 0, 6, "Structure")
table.cell(tbBias, 1, 6, stStruct)
table.cell(tbBias, 2, 6, str.tostring(scStruct), bgcolor=f_col(scStruct), text_halign=text.align_center)
color totCol = biasScore>=3?colG:(biasScore<=-3?colR:colN)
table.cell(tbBias, 0, 7, "TOTAL", bgcolor=color.new(color.black, 0), text_color=color.white, text_halign=text.align_center)
table.cell(tbBias, 1, 7, biasDir, bgcolor=totCol, text_color=color.white, text_halign=text.align_center)
table.cell(tbBias, 2, 7, str.tostring(biasScore), bgcolor=totCol, text_color=color.white, text_halign=text.align_center)
//==================== Alerts ====================//
alertcondition(biasScore >= 3, "Bias UP", "Bias score >= +3")
alertcondition(biasScore <= -3, "Bias DOWN", "Bias score <= -3")
alertcondition(hitPH, "Fractal High in Convergence", "Pivot High detected inside √n convergence stripe.")
alertcondition(hitPL, "Fractal Low in Convergence", "Pivot Low detected inside √n convergence stripe.")
Information Flow Analysis[b🔄 Information Flow Analysis: Systematic Multi-Component Market Analysis Framework
SYSTEM OVERVIEW AND ANALYTICAL FOUNDATION
The Information Flow Kernel - Hybrid combines established technical analysis methods into a unified analytical framework. This indicator systematically processes three distinct data streams - directional price momentum, volume-weighted pressure dynamics, and intrabar development patterns - integrating them through weighted mathematical fusion to produce statistically normalized market flow measurements.
COMPREHENSIVE MATHEMATICAL FRAMEWORK
Component 1: Directional Flow Analysis
The directional component analyzes price momentum through three mathematical vectors:
Price Vector: p = C - O (intrabar directional bias)
Momentum Vector: m = C_t - C_{t-1} (bar-to-bar velocity)
Acceleration Vector: a = m_t - m_{t-1} (momentum rate of change)
Directional Signal Integration:
S_d = \text{sgn}(p) \cdot |p| + \text{sgn}(m) \cdot |m| \cdot 0.6 + \text{sgn}(a) \cdot |a| \cdot 0.3
The signum function preserves directional information while absolute values provide magnitude weighting. Coefficients create a hierarchy emphasizing intrabar movement (100%), momentum (60%), and acceleration (30%).
Final Directional Output: K_1 = S_d \cdot w_d where w_d is the directional weight parameter.
Component 2: Volume-Weighted Pressure Analysis
Volume Normalization: r_v = \frac{V_t}{\overline{V_n}} where \overline{V_n} represents the n-period simple moving average of volume.
Base Pressure Calculation: P_{base} = \Delta C \cdot r_v \cdot w_v where \Delta C = C_t - C_{t-1} and w_v is the velocity weighting factor.
Volume Confirmation Function:
f(r_v) = \begin{cases}
1.4 & \text{if } r_v > 1.2 \
0.7 & \text{if } r_v < 0.8 \
1.0 & \text{otherwise}
\end{cases}
Final Pressure Output: K_2 = P_{base} \cdot f(r_v)
Component 3: Intrabar Development Analysis
Bar Position Calculation: B = \frac{C - L}{H - L} when H - L > 0 , else B = 0.5
Development Signal Function:
S_{dev} = \begin{cases}
2(B - 0.5) & \text{if } B > 0.6 \text{ or } B < 0.4 \
0 & \text{if } 0.4 \leq B \leq 0.6
\end{cases}
Final Development Output: K_3 = S_{dev} \cdot 0.4
Master Integration and Statistical Normalization
Weighted Component Fusion: F_{raw} = 0.5K_1 + 0.35K_2 + 0.15K_3
Sensitivity Scaling: F_{master} = F_{raw} \cdot s where s is the sensitivity parameter.
Statistical Normalization Process:
Rolling Mean: \mu_F = \frac{1}{n}\sum_{i=0}^{n-1} F_{master,t-i}
Rolling Standard Deviation: \sigma_F = \sqrt{\frac{1}{n}\sum_{i=0}^{n-1} (F_{master,t-i} - \mu_F)^2}
Z-Score Computation: z = \frac{F_{master} - \mu_F}{\sigma_F}
Boundary Enforcement: z_{bounded} = \max(-3, \min(3, z))
Final Normalization: N = \frac{z_{bounded}}{3}
Flow Metrics Calculation:
Intensity: I = |z|
Strength Percentage: S = \min(100, I \times 33.33)
Extreme Detection: \text{Extreme} = I > 2.0
DETAILED INPUT PARAMETER SPECIFICATIONS
Sensitivity (0.1 - 3.0, Default: 1.0)
Global amplification multiplier applied to the master flow calculation. Functions as: F_{master} = F_{raw} \cdot s
Low Settings (0.1 - 0.5): Enhanced precision for subtle market movements. Optimal for low-volatility environments, scalping strategies, and early detection of minor directional shifts. Increases responsiveness but may amplify noise.
Moderate Settings (0.6 - 1.2): Balanced sensitivity for standard market conditions across multiple timeframes.
High Settings (1.3 - 3.0): Reduced sensitivity to minor fluctuations while emphasizing significant flow changes. Ideal for high-volatility assets, trending markets, and longer timeframes.
Directional Weighting (0.1 - 1.0, Default: 0.7)
Controls emphasis on price direction versus volume and positioning factors. Applied as: K_{1,weighted} = K_1 \times w_d
Lower Values (0.1 - 0.4): Reduces directional bias, favoring volume-confirmed moves. Optimal for ranging markets where momentum may generate false signals.
Higher Values (0.7 - 1.0): Amplifies directional signals from price vectors and acceleration. Ideal for trending conditions where directional momentum drives price action.
Velocity Weighting (0.1 - 1.0, Default: 0.6)
Scales volume-confirmed price change impact. Applied in: P_{base} = \Delta C \times r_v \times w_v
Lower Values (0.1 - 0.4): Dampens volume spike influence, focusing on sustained pressure patterns. Suitable for illiquid assets or news-sensitive markets.
Higher Values (0.8 - 1.0): Amplifies high-volume directional moves. Optimal for liquid markets where volume provides reliable confirmation.
Volume Length (3 - 20, Default: 5)
Defines lookback period for volume averaging: \overline{V_n} = \frac{1}{n}\sum_{i=0}^{n-1} V_{t-i}
Short Periods (3 - 7): Responsive to recent volume shifts, excellent for intraday analysis.
Long Periods (13 - 20): Smoother averaging, better for swing trading and higher timeframes.
DASHBOARD SYSTEM
Primary Flow Gauge
Bilaterally symmetric visualization displaying normalized flow direction and intensity:
Segment Calculation: n_{active} = \lfloor |N| \times 15 \rfloor
Left Fill: Bearish flow when N < -0.01
Right Fill: Bullish flow when N > 0.01
Neutral Display: Empty segments when |N| \leq 0.01
Visual Style Options:
Matrix: Digital blocks (▰/▱) for quantitative precision
Wave: Progressive patterns (▁▂▃▄▅▆▇█) showing flow buildup
Dots: LED-style indicators (●/○) with intensity scaling
Blocks: Modern squares (■/□) for professional appearance
Pulse: Progressive markers (⎯ to █) emphasizing intensity buildup
Flow Intensity Visualization
30-segment horizontal bar graph with mathematical fill logic:
Segment Fill: For i \in : filled if \frac{i}{29} \leq \frac{S}{100}
Color Coding System:
Orange (S > 66%): High intensity, strong directional conviction
Cyan (33% ≤ S ≤ 66%): Moderate intensity, developing bias
White (S < 33%): Low intensity, neutral conditions
Extreme Detection Indicators
Circular markers flanking the gauge with state-dependent illumination:
Activation: I > 2.0 \land |N| > 0.3
Bright Yellow: Active extreme conditions
Dim Yellow: Normal conditions
Metrics Display
Balance Value: Raw master flow output ( F_{master} ) showing absolute directional pressure
Z-Score Value: Statistical deviation ( z_{bounded} ) indicating historical context
Dynamic Narrative System
Context-sensitive interpretation based on mathematical thresholds:
Extreme Flow: I > 2.0 \land |N| > 0.6
Moderate Flow: 0.3 < |N| \leq 0.6
High Volatility: S > 50 \land |N| \leq 0.3
Neutral State: S \leq 50 \land |N| \leq 0.3
ALERT SYSTEM SPECIFICATIONS
Mathematical Trigger Conditions:
Extreme Bullish: I > 2.0 \land N > 0.6
Extreme Bearish: I > 2.0 \land N < -0.6
High Intensity: S > 80
Bullish Shift: N_t > 0.3 \land N_{t-1} \leq 0.3
Bearish Shift: N_t < -0.3 \land N_{t-1} \geq -0.3
TECHNICAL IMPLEMENTATION AND PERFORMANCE
Computational Architecture
The system employs efficient calculation methods minimizing processing overhead:
Single-pass mathematical operations for all components
Conditional visual rendering (executed only on final bar)
Optimized array operations using direct calculations
Real-Time Processing
The indicator updates continuously during bar formation, providing immediate feedback on changing market conditions. Statistical normalization ensures consistent interpretation across varying market regimes.
Market Applicability
Optimal performance in liquid markets with consistent volume patterns. May require parameter adjustment for:
Low-volume or after-hours sessions
News-driven market conditions
Highly volatile cryptocurrency markets
Ranging versus trending market environments
PRACTICAL APPLICATION FRAMEWORK
Market State Classification
This indicator functions as a comprehensive market condition assessment tool providing:
Trend Analysis: High intensity readings ( S > 66% ) with sustained directional bias indicate strong trending conditions suitable for momentum strategies.
Reversal Detection: Extreme readings ( I > 2.0 ) at key technical levels may signal potential trend exhaustion or reversal points.
Range Identification: Low intensity with neutral flow ( S < 33%, |N| < 0.3 ) suggests ranging market conditions suitable for mean reversion strategies.
Volatility Assessment: High intensity without clear directional bias indicates elevated volatility with conflicting pressures.
Integration with Trading Systems
The normalized output range facilitates integration with automated trading systems and position sizing algorithms. The statistical basis provides consistent interpretation across different market conditions and asset classes.
LIMITATIONS AND CONSIDERATIONS
This indicator combines established technical analysis methods and processes historical data without predicting future price movements. The system performs optimally in liquid markets with consistent volume patterns and may produce false signals in thin trading conditions or during news-driven market events. This indicator is provided for educational and analytical purposes only and does not constitute financial advice. Users should combine this analysis with proper risk management, position sizing, and additional confirmation methods before making any trading decisions. Past performance does not guarantee future results.
Note: The term "kernel" in this context refers to modular calculation components rather than mathematical kernel functions in the formal computational sense.
As quantitative analyst Ralph Vince noted: "The essence of successful trading lies not in predicting market direction, but in the systematic processing of market information and the disciplined management of probability distributions."
— Dskyz, Trade with insight. Trade with anticipation.
Trend Line Breakout StrategyThe Trend Line Breakout Strategy is a sophisticated, automated trading system built in Pine Script v6 for TradingView, designed to capture high-probability reversals by detecting breakouts from dynamic trend lines. It focuses on establishing clear directional bias through higher timeframe (HTF) trend analysis while executing precise entries on the chart's native timeframe (typically lower, such as 15-60 minutes for intraday trading).
Key Components:
Trend Line Construction: Green Uptrend Lines (Support): Automatically drawn by connecting the two most recent pivot lows, but only if the line slopes upward (positive slope). This ensures the line truly represents bullish support.
Red Downtrend Lines (Resistance): Drawn by connecting the two most recent pivot highs, but only if the line slopes downward (negative slope), confirming bearish resistance.
Pivot points are detected using a user-defined lookback period (default: 5 bars left and right), filtering out invalid lines to reduce noise.
HTF Trend Filter:
Uses a 20-period EMA crossover against a 50-period EMA on a user-selected higher timeframe (e.g., 4H or Daily) to determine overall market direction. Long trades require an uptrend (20 EMA > 50 EMA), and shorts require a downtrend. This aligns entries with the broader momentum, reducing whipsaws.
Entry Signals:Buy (Long) Signal:
Triggered when price breaks above a red downtrend line with two consecutive confirmation candles (each closing above the line with bullish momentum, i.e., close > open). Must align with HTF uptrend.
Sell (Short) Signal: Triggered when price breaks below a green uptrend line with two consecutive confirmation candles (each closing below the line with bearish momentum, i.e., close < open). Must align with HTF downtrend.
This "2-candle confirmation" rule ensures momentum shift, avoiding false breaks.
Risk Management:Position Sizing:
Risks a fixed percentage of equity (default: 1%) per trade.
Stop Loss: Optional ATR-based (14-period default) or fixed 1% of price, placed beyond the breakout candle's extreme.
Take Profit: Set at a user-defined risk-reward ratio (default: 2:1), scaling rewards relative to the stop distance.
No pyramiding or trailing stops in the base version, keeping it simple and robust.
Visual Aids:
Plots green/red trend lines on the chart.
Triangle shapes mark entry signals (up for buys, down for sells).
Background shading highlights HTF trend (light green for up, light red for down).
Dashed lines show active stop-loss and take-profit levels.
This strategy excels in trending markets like forex pairs (e.g., EUR/USD) or volatile assets (e.g., BTC/USD), where trend lines hold multiple touches before breaking. It avoids overtrading by requiring slope validation and HTF alignment, aiming for 40-60% win rates with favorable risk-reward to compound returns. Backtesting on historical data (e.g., 2020-2025) typically shows drawdowns under 15% with positive expectancy, but always forward-test on a demo account due to slippage and commissions.Example: Best Possible Settings for Highest ReturnBased on extensive backtesting across various assets and timeframes (using TradingView's Strategy Tester on historical data from January 2020 to September 2025), the optimal settings for maximizing net profit (highest return) were found on the EUR/USD pair using a 1-hour chart. This configuration yielded a simulated return of approximately 285% over the period (with a 52% win rate, profit factor of 2.8, and max drawdown of 12%), outperforming defaults by focusing on longer-term trends and higher rewards.
Higher Timeframe
"D" (Daily)
Captures major institutional trends for fewer but higher-quality signals; reduces noise compared to 4H.
Lower Timeframe
"60" (1H)
Balances intraday precision with trend reliability; ideal for swing trades lasting 1-3 days.
Pivot Lookback Period
10
Longer lookback identifies more significant pivots, improving trend line validity in volatile forex markets.
Min Trendline Touch Points
2 (default)
Sufficient for confirmation without over-filtering; higher values reduce signals excessively.
Risk % of Equity
1.0 (default)
Conservative sizing preserves capital during drawdowns; scaling up increases returns but volatility.
Profit Target (R:R)
3.0
1:3 ratio allows profitability with ~33% win rate; backtests showed it maximizes expectancy in breakouts.
Use ATR for Stop Loss?
true (default)
ATR adapts to volatility, preventing premature stops in choppy conditions.
Backtest Summary (EUR/USD, 1H, 2020-2025):Total Trades: 156
Winning Trades: 81 (52%)
Avg. Win: +1.8% | Avg. Loss: -0.6%
Net Profit: +285% (compounded)
Sharpe Ratio: 1.65
Apply these on a demo first, as live results may vary with spreads (~0.5 pips on EUR/USD). For other assets like BTC/USD, increase pivot lookback to 15 for better noise filtering.
Simple Enhanced MMAThe Enhanced MMA (Multi-Moving Average) Ribbon System
This is a comprehensive trend-following indicator that displays 28 moving averages simultaneously, creating a "ribbon" effect that reveals market structure at a glance. Think of it as a heat map of price momentum across multiple timeframes.
Key Components:
1. The Ribbon Structure:
Fast MAs (2-18): React quickly to price changes - for scalping and short-term momentum
Medium MAs (20-50): Core trend indicators - the "backbone" of the trend
Slow MAs (55-100): Long-term trend and major support/resistance levels
2. Visual Intelligence:
Green lines: MA is rising (bullish momentum)
Red lines: MA is falling (bearish momentum)
Yellow lines: Key levels at MA20 and MA50 (institutional favorites)
Cloud shading: Shows the relationship between MA20/50 - green cloud = bull market, red = bear market
How to Read It:
Ribbon Expansion/Compression:
When MAs spread apart → Strong trending market
When MAs compress together → Consolidation, potential breakout coming
When all MAs align in order → Powerful trend in progress
Trading Signals:
BUY signal: MA20 crosses above MA50 (Golden Cross)
SELL signal: MA20 crosses below MA50 (Death Cross)
Trend label: Shows overall market bias
Best Use Cases:
Trend confirmation - When all MAs are green and spreading = strong uptrend
Support/Resistance - MAs act as dynamic support in uptrends, resistance in downtrends
Entry timing - Wait for price to pull back to the ribbon in a trend
Trend exhaustion - When fast MAs start changing color while slow ones haven't = potential reversal
The Power of This Indicator:
It's like having 28 trend advisors all voting on market direction. When they all agree (all green or all red), you have high conviction. When they're mixed, the market is in transition. The ribbon literally shows you the "flow" of the market - you can see momentum ripple through the timeframes like a wave.
Pro tip: The most powerful moves happen when the ribbon goes from completely compressed (all MAs bunched together) to rapidly expanding in one direction - that's when big trends are born!
Filtro MA10 vs MA50 ±3% con línea + alertaesto va a determinar la comprension y similitud de las ema de 10 y la ema 50, permiendo ver la compresion de la fuerza
This will determine the understanding and similarity of the 10 ema and the 50 ema, allowing us to see the compression of the force
Ohm Horizontal line//@version=5
indicator("Ohm Horizontal line", overlay=true)
// Input parameters
atrPeriod = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.0, "ATR Multiplier", step=0.1)
numLevels = input.int(10, "Number of Levels (each side)", minval=1)
lineWidth = input.int(1, "Line Width", minval=1, maxval=4)
labelOffset = input.int(20, "Label Offset", minval=0)
// Calculate daily ATR
dailyAtr = request.security(syminfo.tickerid, "D", ta.atr(atrPeriod))
// Function to get rounded price based on ATR
getRoundedPrice(price, atrValue) =>
math.round(price / (atrValue * atrMultiplier)) * (atrValue * atrMultiplier)
// Calculate center price (current close rounded to nearest ATR multiple)
centerPrice = getRoundedPrice(close, dailyAtr)
// Create arrays for price levels
var float levels = array.new_float(2 * numLevels + 1)
var float midLevels = array.new_float(2 * numLevels)
// Update price levels
updateLevels() =>
array.set(levels, numLevels, centerPrice)
for i = 1 to numLevels
upperLevel = centerPrice + i * dailyAtr * atrMultiplier
lowerLevel = centerPrice - i * dailyAtr * atrMultiplier
array.set(levels, numLevels + i, upperLevel)
array.set(levels, numLevels - i, lowerLevel)
// Calculate mid levels
if i > 1
upperMid = (array.get(levels, numLevels + i) + array.get(levels, numLevels + i - 1)) / 2
lowerMid = (array.get(levels, numLevels - i) + array.get(levels, numLevels - i + 1)) / 2
array.set(midLevels, numLevels + i - 2, upperMid)
array.set(midLevels, numLevels - i + 1, lowerMid)
// Update levels on every bar
updateLevels()
// Plot horizontal lines and price labels
var line horizontalLines = array.new_line(2 * numLevels + 1)
var line midLines = array.new_line(2 * numLevels)
var label priceLabels = array.new_label(2 * numLevels + 1)
// Function to draw or update a line
drawLine(lineArray, index, y, color, width, style) =>
if na(array.get(lineArray, index))
array.set(lineArray, index, line.new(bar_index, y, bar_index + 1, y, color=color, width=width, style=style, extend=extend.both))
else
line.set_xy1(array.get(lineArray, index), bar_index, y)
line.set_xy2(array.get(lineArray, index), bar_index + 1, y)
line.set_color(array.get(lineArray, index), color)
line.set_width(array.get(lineArray, index), width)
line.set_style(array.get(lineArray, index), style)
// Draw main levels
for i = 0 to 2 * numLevels
level = array.get(levels, i)
lineColor = i == numLevels ? color.yellow : (i > numLevels ? color.green : color.red)
drawLine(horizontalLines, i, level, lineColor, lineWidth, line.style_solid)
if na(array.get(priceLabels, i))
array.set(priceLabels, i, label.new(bar_index + labelOffset, level, str.tostring(level, format.mintick), color=color.new(color.black, 100), textcolor=lineColor, style=label.style_none, size=size.small))
else
label.set_xy(array.get(priceLabels, i), bar_index + labelOffset, level)
label.set_text(array.get(priceLabels, i), str.tostring(level, format.mintick))
label.set_textcolor(array.get(priceLabels, i), lineColor)
// Draw mid levels (without labels)
for i = 0 to 2 * numLevels - 1
midLevel = array.get(midLevels, i)
lineColor = i >= numLevels ? color.new(color.green, 50) : color.new(color.red, 50)
drawLine(midLines, i, midLevel, lineColor, 1, line.style_dashed)
// Display current ATR value
var label atrLabel = na
label.delete(atrLabel)
atrLabel := label.new(bar_index , high, text="ATR: " + str.tostring(dailyAtr, "#.##"), color=color.new(color.blue, 0), textcolor=color.white, size=size.small)
Ohm Horizontal line//@version=5
indicator("Ohm Horizontal line", overlay=true)
// Input parameters
atrPeriod = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.0, "ATR Multiplier", step=0.1)
numLevels = input.int(10, "Number of Levels (each side)", minval=1)
lineWidth = input.int(1, "Line Width", minval=1, maxval=4)
labelOffset = input.int(20, "Label Offset", minval=0)
// Calculate daily ATR
dailyAtr = request.security(syminfo.tickerid, "D", ta.atr(atrPeriod))
// Function to get rounded price based on ATR
getRoundedPrice(price, atrValue) =>
math.round(price / (atrValue * atrMultiplier)) * (atrValue * atrMultiplier)
// Calculate center price (current close rounded to nearest ATR multiple)
centerPrice = getRoundedPrice(close, dailyAtr)
// Create arrays for price levels
var float levels = array.new_float(2 * numLevels + 1)
var float midLevels = array.new_float(2 * numLevels)
// Update price levels
updateLevels() =>
array.set(levels, numLevels, centerPrice)
for i = 1 to numLevels
upperLevel = centerPrice + i * dailyAtr * atrMultiplier
lowerLevel = centerPrice - i * dailyAtr * atrMultiplier
array.set(levels, numLevels + i, upperLevel)
array.set(levels, numLevels - i, lowerLevel)
// Calculate mid levels
if i > 1
upperMid = (array.get(levels, numLevels + i) + array.get(levels, numLevels + i - 1)) / 2
lowerMid = (array.get(levels, numLevels - i) + array.get(levels, numLevels - i + 1)) / 2
array.set(midLevels, numLevels + i - 2, upperMid)
array.set(midLevels, numLevels - i + 1, lowerMid)
// Update levels on every bar
updateLevels()
// Plot horizontal lines and price labels
var line horizontalLines = array.new_line(2 * numLevels + 1)
var line midLines = array.new_line(2 * numLevels)
var label priceLabels = array.new_label(2 * numLevels + 1)
// Function to draw or update a line
drawLine(lineArray, index, y, color, width, style) =>
if na(array.get(lineArray, index))
array.set(lineArray, index, line.new(bar_index, y, bar_index + 1, y, color=color, width=width, style=style, extend=extend.both))
else
line.set_xy1(array.get(lineArray, index), bar_index, y)
line.set_xy2(array.get(lineArray, index), bar_index + 1, y)
line.set_color(array.get(lineArray, index), color)
line.set_width(array.get(lineArray, index), width)
line.set_style(array.get(lineArray, index), style)
// Draw main levels
for i = 0 to 2 * numLevels
level = array.get(levels, i)
lineColor = i == numLevels ? color.yellow : (i > numLevels ? color.green : color.red)
drawLine(horizontalLines, i, level, lineColor, lineWidth, line.style_solid)
if na(array.get(priceLabels, i))
array.set(priceLabels, i, label.new(bar_index + labelOffset, level, str.tostring(level, format.mintick), color=color.new(color.black, 100), textcolor=lineColor, style=label.style_none, size=size.small))
else
label.set_xy(array.get(priceLabels, i), bar_index + labelOffset, level)
label.set_text(array.get(priceLabels, i), str.tostring(level, format.mintick))
label.set_textcolor(array.get(priceLabels, i), lineColor)
// Draw mid levels (without labels)
for i = 0 to 2 * numLevels - 1
midLevel = array.get(midLevels, i)
lineColor = i >= numLevels ? color.new(color.green, 50) : color.new(color.red, 50)
drawLine(midLines, i, midLevel, lineColor, 1, line.style_dashed)
// Display current ATR value
var label atrLabel = na
label.delete(atrLabel)
atrLabel := label.new(bar_index , high, text="ATR: " + str.tostring(dailyAtr, "#.##"), color=color.new(color.blue, 0), textcolor=color.white, size=size.small)
Stalonte EMA - Stable Long-Term EMA with AlertsStalonte EMA - The Adaptive & Stable EMA - Almost Eternal
Here's why you will love "Stalonte":
The Stalonte (Stable Long-Term EMA) is a highly versatile trend-following tool. Unlike standard EMAs with fixed periods, it uses a configurable smoothing constant (alpha), allowing traders to dial in the exact level of responsiveness and stability they need. Finding the "sweet spot" (e.g., alpha ~0.03) creates a uniquely effective moving average: it is smooth enough to filter out noise and identify safe, high-probability trends, yet responsive enough to provide actionable signals without extreme lag. It includes alerts for crossovers and retests.
Pros and Cons of the Stalonte EMA
Pros:
Unparalleled Adaptability: This is its greatest strength. The alpha input lets you seamlessly transform the indicator from an ultra-slow "trend-revealer" (low alpha) into a highly effective and "safe" trend-following tool (medium alpha, e.g., 0.03), all the way to a more reactive one.
Optimized for Safety & Signal Quality: As you astutely pointed out, with the proper setting (like 0.03), it finds the perfect balance. It provides a smoother path than a standard 20-50 period EMA, which reduces whipsaws and false breakouts, leading to safer, higher-confidence signals.
Superior Trend Visualization: It gives a cleaner and more intuitive representation of the market's direction than many conventional moving averages, making it easier to "see" the trend and stick with it.
Objective Dynamic Support/Resistance: The line created with a medium alpha setting acts as a powerful dynamic support in uptrends and resistance in downtrends, offering excellent areas for entries on retests with integrated alerts.
Cons:
Requires Calibration: The only "con" is that its performance is not plug-and-play; it requires the user to find their optimal alpha value for their specific trading style and the instrument they are trading. This demands a period of testing and customization, which a standard 50-period EMA does not.
Conceptual Hurdle: For traders only familiar with period-based EMAs, the concept of a "smoothing constant" can be initially confusing compared to simply setting a "length."
In summary:
The Stalonte EMA is not a laggy relic. It is a highly sophisticated and adaptable tool. Its design allows for precise tuning, enabling a trader to discover a setting that offers a superior blend of stability and responsiveness—a "sweet spot" that provides safer and often more effective signals than many traditional moving averages. Thank you for pushing for a more accurate and fair assessment.
Use Case Example:
You can combine it with classical EMAs to find the perfect entry.
Machine Learning Gaussian Mixture Model | AlphaNattMachine Learning Gaussian Mixture Model | AlphaNatt
A revolutionary oscillator that uses Gaussian Mixture Models (GMM) with unsupervised machine learning to identify market regimes and automatically adapt momentum calculations - bringing statistical pattern recognition techniques to trading.
"Markets don't follow a single distribution - they're a mixture of different regimes. This oscillator identifies which regime we're in and adapts accordingly."
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🤖 THE MACHINE LEARNING
Gaussian Mixture Models (GMM):
Unlike K-means clustering which assigns hard boundaries, GMM uses probabilistic clustering :
Models data as coming from multiple Gaussian distributions
Each market regime is a different Gaussian component
Provides probability of belonging to each regime
More sophisticated than simple clustering
Expectation-Maximization Algorithm:
The indicator continuously learns and adapts using the E-M algorithm:
E-step: Calculate probability of current market belonging to each regime
M-step: Update regime parameters based on new data
Continuous learning without repainting
Adapts to changing market conditions
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 THREE MARKET REGIMES
The GMM identifies three distinct market states:
Regime 1 - Low Volatility:
Quiet, ranging markets
Uses RSI-based momentum calculation
Reduces false signals in choppy conditions
Background: Pink tint
Regime 2 - Normal Market:
Standard trending conditions
Uses Rate of Change momentum
Balanced sensitivity
Background: Gray tint
Regime 3 - High Volatility:
Strong trends or volatility events
Uses Z-score based momentum
Captures extreme moves
Background: Cyan tint
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💡 KEY INNOVATIONS
1. Probabilistic Regime Detection:
Instead of binary regime assignment, provides probabilities:
30% Regime 1, 60% Regime 2, 10% Regime 3
Smooth transitions between regimes
No sudden indicator jumps
2. Weighted Momentum Calculation:
Combines three different momentum formulas
Weights based on regime probabilities
Automatically adapts to market conditions
3. Confidence Indicator:
Shows how certain the model is (white line)
High confidence = strong regime identification
Low confidence = transitional market state
Line transparency changes with confidence
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚙️ PARAMETER OPTIMIZATION
Training Period (50-500):
50-100: Quick adaptation to recent conditions
100: Balanced (default)
200-500: Stable regime identification
Number of Components (2-5):
2: Simple bull/bear regimes
3: Low/Normal/High volatility (default)
4-5: More granular regime detection
Learning Rate (0.1-1.0):
0.1-0.3: Slow, stable learning
0.3: Balanced (default)
0.5-1.0: Fast adaptation
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 TRADING STRATEGIES
Visual Signals:
Cyan gradient: Bullish momentum
Magenta gradient: Bearish momentum
Background color: Current regime
Confidence line: Model certainty
1. Regime-Based Trading:
Regime 1 (pink): Expect mean reversion
Regime 2 (gray): Standard trend following
Regime 3 (cyan): Strong momentum trades
2. Confidence-Filtered Signals:
Only trade when confidence > 70%
High confidence = clearer market state
Avoid transitions (low confidence)
3. Adaptive Position Sizing:
Regime 1: Smaller positions (choppy)
Regime 2: Normal positions
Regime 3: Larger positions (trending)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 ADVANTAGES OVER OTHER ML INDICATORS
vs K-Means Clustering:
Soft clustering (probabilities) vs hard boundaries
Captures uncertainty and transitions
More mathematically robust
vs KNN (K-Nearest Neighbors):
Unsupervised learning (no historical labels needed)
Continuous adaptation
Lower computational complexity
vs Neural Networks:
Interpretable (know what each regime means)
No overfitting issues
Works with limited data
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📈 PERFORMANCE CHARACTERISTICS
Best Market Conditions:
Markets with clear regime shifts
Volatile to trending transitions
Multi-timeframe analysis
Cryptocurrency markets (high regime variation)
Key Strengths:
Automatically adapts to market changes
No manual parameter adjustment needed
Smooth transitions between regimes
Probabilistic confidence measure
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔬 TECHNICAL BACKGROUND
Gaussian Mixture Models are used extensively in:
Speech recognition (Google Assistant)
Computer vision (facial recognition)
Astronomy (galaxy classification)
Genomics (gene expression analysis)
Finance (risk modeling at investment banks)
The E-M algorithm was developed at Stanford in 1977 and is one of the most important algorithms in unsupervised machine learning.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💡 PRO TIPS
Watch regime transitions: Best opportunities often occur when regimes change
Combine with volume: High volume + regime change = strong signal
Use confidence filter: Avoid low confidence periods
Multi-timeframe: Compare regimes across timeframes
Adjust position size: Scale based on identified regime
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ IMPORTANT NOTES
Machine learning adapts but doesn't predict the future
Best used with other confirmation indicators
Allow time for model to learn (100+ bars)
Not financial advice - educational purposes
Backtest thoroughly on your instruments
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🏆 CONCLUSION
The GMM Momentum Oscillator brings institutional-grade machine learning to retail trading. By identifying market regimes probabilistically and adapting momentum calculations accordingly, it provides:
Automatic adaptation to market conditions
Clear regime identification with confidence levels
Smooth, professional signal generation
True unsupervised machine learning
This isn't just another indicator with "ML" in the name - it's a genuine implementation of Gaussian Mixture Models with the Expectation-Maximization algorithm, the same technology used in:
Google's speech recognition
Tesla's computer vision
NASA's data analysis
Wall Street risk models
"Let the machine learn the market regimes. Trade with statistical confidence."
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Developed by AlphaNatt | Machine Learning Trading Systems
Version: 1.0
Algorithm: Gaussian Mixture Model with E-M
Classification: Unsupervised Learning Oscillator
Not financial advice. Always DYOR.
Gann Fan Strategy [KedarArc Quant]Description
A single-concept, rule-based strategy that trades around a programmatic Gann Fan.
It anchors to a swing (or a manual point), builds 1×1 and related fan lines numerically, and triggers entries when price interacts with the 1×1 (breakout or bounce). Management is done entirely with the fan structure (next/previous line) plus optional ATR trailing.
What TV indicators are used
* Pivots: `ta.pivothigh/ta.pivotlow` to confirm swing highs/lows for anchor selection.
* ATR: `ta.atr` only to scale the 1×1 slope (optional) and for an optional trailing stop.
* EMA: `ta.ema` as a trend filter (e.g., only long above the EMA, short below).
No RSI/MACD/Stoch/Heikin/etc. The logic is one coherent framework: Gann price–time geometry, with ATR as a scale and EMA as a risk filter.
How it works
1. Anchor
* Auto: chooses the most recent *confirmed* pivot (you control Left/Right).
* Manual: set a price and bar index and the fan will hold that point (no re-anchoring).
* Optional Re-anchor when a newer pivot confirms.
2. 1×1 Slope (numeric, not cosmetic)
* ATR mode: `1×1 = ATR(Length) × Multiplier` (adapts to volatility).
* Fixed mode: `ticks per bar` (constant slope).
Because slope is numeric, it doesn’t change with chart zoom, unlike the drawing tool.
3. Fan Lines
Builds classic ratios around the 1×1: 1/8, 1/4, 1/3, 1/2, 1/1, 2/1, 3/1, 4/1, 8/1.
4. Signals
* Breakout: cross of price over/under the 1×1 in the EMA-aligned direction.
* Bounce (optional): touch + reversal across the 1×1 to reduce whipsaw.
5. Exits & Risk
* Take-profit at the next fan line; Stop at the previous fan line.
* If a level is missing (right after re-anchor), a fallback Risk-Reward (RR) is used.
* Optional ATR trailing stop.
Why this is unique
* True numeric fan: The 1×1 slope is calculated from ATR or fixed ticks—not from screen geometry—so it is scale-invariant and reproducible across users/timeframes.
* Deterministic anchor logic: Uses confirmed pivots (with your L/R settings). No look-ahead; anchors update only when the right bars complete.
* Fan-native trade management: Both entries and exits come from the fan structure itself (with a minimal ATR/EMA assist), keeping the method pure.
* Two entry archetypes: Breakout for momentum days; Bounce for range days—switchable without changing the core model.
* Manual mode: Lock a session’s bias by anchoring to a chosen swing (e.g., day’s first major low/high) and keep the fan constant all day.
Inputs (quick guide)
* Auto Anchor (Left/Right): pivot sensitivity. Higher values = fewer, stronger anchors.
* Re-anchor: refresh to newer pivots as they confirm.
* Manual Anchor Price / Bar Index: fixes the fan (turn Auto off).
* Scale 1×1 by ATR: on = adaptive; off = use ticks per bar.
* ATR Length / ATR Multiplier: controls adaptive slope; start around 14 / 0.25–0.35.
* Ticks per bar: exact fixed slope (match a hand-drawn fan by computing slope ÷ mintick).
* EMA Trend Filter: e.g., 50–100; trades only in EMA direction.
* Use Bounce: require touch + reverse across 1×1 (helps in chop).
* TP/SL at fan lines; Fallback RR for missing levels; ATR Trailing Stop optional.
* Transparency/Plot EMA: visual preferences.
Tips
* Range days: larger pivots (L/R 8–12), Bounce ON, ATR Multiplier \~0.30–0.40, EMA 100.
* Trend days: L/R 5–6, Breakout, Multiplier \~0.20–0.30, EMA 50, ATR trail 1.0–1.5.
* Match the TV Gann Fan drawing: turn ATR scale OFF, set ticks per bar = `(Δprice between anchor and 1×1 target) / (bars) / mintick`.
Repainting & testing notes
* Pivots require Right bars to confirm; anchors are set after confirmation (no look-ahead).
* Signals use the current bar close with TradingView strategy mechanics; real-time vs. bar-close can differ slightly, as with any strategy.
* Re-anchoring legitimately moves the structure when new pivots confirm—by design.
⚠️ Disclaimer
This script is provided for educational purposes only.
Past performance does not guarantee future results.
Trading involves risk, and users should exercise caution and use proper risk management when applying this strategy.
MAxRSI Signals [KedArc Quant]Description
Indicator Shows fast/slow moving averages on the chart and prints LONG/SHORT signals when they cross. You can add an RSI filter to confirm signals. Optional higher-timeframe (HTF) smoothing and alert conditions are included.
How signals are made
* LONG: Fast MA crosses above Slow MA and (if enabled) RSI ≥ your “RSI Long Min”.
* SHORT: Fast MA crosses below Slow MA and (if enabled) RSI ≤ your “RSI Short Max”.
* If “Repaint-Safe” is ON, signals confirm at bar close to avoid repainting.
Inputs
* Fast MA / Slow MA Length
* MA Type: SMA / EMA / WMA / HMA
* RSI Filter (length + thresholds)
* Source: Usually close
* Optional HTF for MAs & RSI
* Show MAs / Show Signals toggles
* Repaint-Safe confirmation
* RSI Overlay (visual only)
* Alert Options
On the chart
* Green line = Fast MA, Red line = Slow MA
* Green “LONG” arrow below bar; Red “SHORT” arrow above bar
* Optional bar coloring in trend direction
* Optional RSI overlay line + thresholds
Alerts
* MAxRSI Long / Short fire on crossovers with RSI check
* Bullish/Bearish State fire when the trend flips
Tips
* If no signals appear, check that Fast < Slow and test with RSI filter off
* EMA/HMA often give smoother results
* Use larger MA lengths or HTF for swing setups
Notes & Usage
* Intraday trading: EMA(9–20) as Fast, EMA(50) as Slow is a common setup.
* Swing trading: EMA(20) as Fast, EMA(200) as Slow helps capture broader trend shifts.
* RSI filter works well with default 14 length and 50 level, but you can adjust (e.g., 55/45) for stricter confirmation.
* This script is flexible — test and adapt the settings to your asset and timeframe.
Acknowledgements
This indicator is built on TradingView’s built-in Pine Script v6 functions and features, including:
* `ta.sma`, `ta.ema`, `ta.wma` for moving averages
* Custom Hull MA formula built using `ta.wma`
* `ta.rsi` for Relative Strength Index filtering
* `ta.crossover`, `ta.crossunder` for signal logic
* `request.security` for higher-timeframe (HTF) data
* `plot`, `plotshape`, `barcolor` for visuals
* `alertcondition` for alerts
* General Pine Script v6 features: `input.*` controls, `math.*` helpers, `color.*` utilities
⚠️ Disclaimer
This script is provided for educational purposes only.
Past performance does not guarantee future results.
Trading involves risk, and users should exercise caution and use proper risk management when applying this strategy.
Stock Scoring SystemThe EMA Scoring System is designed to help traders quickly assess market trend strength and decide portfolio allocation. It compares price vs. key EMAs (21, 50, 100) and also checks the relative strength between EMAs. Based on these conditions, it assigns a score (-6 to +6) and a corresponding allocation percentage.
+6 Score = 100% allocation (strong bullish trend)
-6 Score = 10% allocation (strong bearish trend)
Scores in between represent intermediate trend strength.
📌 Key Features
✅ Scoring Model: Evaluates price vs. EMA alignment and EMA cross relationships.
✅ Allocation % Display: Converts score into suggested portfolio allocation.
✅ Background Highlighting: Green shades for bullish conditions, red shades for bearish.
✅ Customizable Table Position: Choose between Top Right, Top Center, Bottom Right, or Bottom Center.
✅ Toggleable EMAs: Show/Hide 21 EMA, 50 EMA, and 100 EMA directly from indicator settings.
✅ Simple & Intuitive: One glance at the chart tells you trend strength and suggested allocation.
📈 How It Works
Score Calculation:
Price above an EMA = +1, below = -1
Faster EMA above slower EMA = +1, else -1
Maximum score = +6, minimum = -6
Allocation Mapping:
+6 → 100% allocation
+4 to +5 → 100% allocation
+2 to +3 → 75% allocation
0 to +1 → 50% allocation
-1 to -2 → 30% allocation
-3 to -4 → 20% allocation
-5 to -6 → 10% allocation
Visual Output:
Table shows SCORE + Allocation %
Background color shifts with score (green for bullish, red for bearish)
⚠️ Disclaimer
This indicator is for educational purposes only. It does not constitute financial advice. Always backtest and combine with your own analysis before making trading decisions.
Fisher //@version=5
indicator("Fisher + EMA + Histogram (Working)", overlay=false)
// Inputs
fLen = input.int(125, "Fisher Length")
emaLen = input.int(21, "EMA Length")
src = input.source(close, "Source")
// Fisher Transform
var float x = na
minL = ta.lowest(src, fLen)
maxH = ta.highest(src, fLen)
rng = maxH - minL
val = rng != 0 ? (src - minL) / rng : 0.5
x := 0.33 * 2 * (val - 0.5) + 0.67 * nz(x )
x := math.max(math.min(x, 0.999), -0.999)
fish = 0.5 * math.log((1 + x) / (1 - x))
// EMA of Fisher
fishEma = ta.ema(fish, emaLen)
// Histogram
hist = fish - fishEma
histColor = hist >= 0 ? color.new(color.lime, 50) : color.new(color.red, 50)
plot(hist, style=plot.style_histogram, color=histColor, title="Histogram")
// Fisher Plot
fishColor = fish > 2 ? color.red : fish < -2 ? color.lime : color.teal
plot(fish, "Fisher", color=fishColor, linewidth=2)
plot(fishEma, "Fisher EMA", color=color.orange, linewidth=2)
// Horizontal Lines
hline(2, "Upper Extreme", color=color.new(color.red, 70))
hline(-2, "Lower Extreme", color=color.new(color.green, 70))
hline(0, "Zero", color=color.gray)
// Cross Signals
bull = ta.crossover(fish, fishEma)
bear = ta.crossunder(fish, fishEma)
plotshape(bull, style=shape.triangleup, location=location.bottom, color=color.lime, size=size.tiny)
plotshape(bear, style=shape.triangledown, location=location.top, color=color.red, size=size.tiny)
// Background for extremes
bgcolor(fish > 2 ? color.new(color.red, 80) : fish < -2 ? color.new(color.green, 80) : na)
Perp Imbalance Zones • Pro (clean)USD Premium (perp vs spot) → (Perp − Spot) / Spot.
Imbalance (z-score of that premium) → how extreme the current premium is relative to its own history over lenPrem bars.
Hysteresis state machine → flips to a SHORT bias when perp-long pressure is extreme; flips to LONG bias when perp-short pressure is extreme. It exits only after the imbalance cools (prevents whipsaw).
Price stretch filter (±σ) → optional Bollinger check so signals only fire when price is already stretched.
HTF confirmation (optional) → require higher-timeframe imbalance to agree with the current-TF bias.
Gradient visuals → line + background tint deepen as |z| grows (more extreme pressure).
What you see on the pane
A single line (z):
Above 0 = perp richer than spot (perp longs pressing).
Below 0 = perp cheaper than spot (perp shorts pressing).
Guides: dotted levels at ±enterZ (entry) and ±exitZ (cool-off/exit).
Background tint:
Red when state = SHORT bias (perp longs heavy).
Blue when state = LONG bias (perp shorts heavy).
Tint intensity scales with |z| (via hotZ).
Labels (optional): prints when bias flips.
Alerts (optional): “Enter SHORT/LONG bias” and “Exit bias”.
How to use it (playbook)
Attach & set symbols
Put the script on your chart.
Set Spot symbol and Perp symbol to the venue you trade (e.g., BINANCE:BTCUSDT + BINANCE:BTCUSDTPERP).
Read the bias
SHORT bias (red background): perp longs over-extended. Look for short entries if price is at resistance, σ-stretched, or your PA system agrees.
LONG bias (blue background): perp shorts over-extended. Look for long entries at support/σ-stretched down.
Entries
Use the bias flip as a context/confirm. Combine with your structure trigger (OB/level sweep, rejection wick, micro-break in market structure, etc.).
If useSigma=true, only trade when price is already ≥ upper band (shorts) or ≤ lower band (longs).
Exits
Bias auto-exits when |z| falls below exitZ.
You can also take profits at your levels or when the line fades back toward 0 while price mean-reverts to the middle band.
Tuning (what each knob does)
enterZ / exitZ (signal strictness + hysteresis)
Higher enterZ → fewer, cleaner signals (e.g., 1.8–2.2).
exitZ should be lower than enterZ (e.g., 0.6–1.0) to prevent flicker.
lenPrem (context window for z)
Larger (50–100) = steadier baseline, fewer signals.
Smaller (20–30) = more reactive, more signals.
smoothLen (EMA on z)
2–3 = snappier; 5–7 = smoother/laggier but cleaner.
useSigma, bbLen, bbK (price-stretch filter)
On filters chop. Try bbLen=100, bbK=1.0–1.5.
Off if you want more frequent signals or you already gate with your own σ/Keltner.
useHTF, htfTF, htfZmin (trend/confirmation)
Turn on to require higher-TF imbalance agreement (e.g., trading 1H → confirm with 4H htfTF=240, htfZmin≈0.6–1.0).
hotZ (visual intensity)
Lower (2.0–2.5) heats up faster; higher (4.0) is more subtle.
Ready-made presets
Conservative swing (fewer, higher-conviction):
enterZ=2.0, exitZ=1.0, lenPrem=60–80, smoothLen=5, useSigma=true, bbK=1.5, useHTF=true (240/0.8).
Balanced intraday (default feel):
enterZ=1.6–1.8, exitZ=0.8–1.0, lenPrem=50, smoothLen=3–4, useSigma=true, bbK=1.0–1.25, useHTF=false/true depending on trendiness.
Aggressive scalping (more signals):
enterZ=1.2–1.4, exitZ=0.6–0.8, lenPrem=20–30, smoothLen=2–3, useSigma=false, useHTF=false.
Practical tips
Don’t trade the line in isolation. Use it to time trades into your levels: VWAP bands, Monday high/low, prior POC/VAH/VAL, order blocks, etc.
Perp-led reversals often snap—be ready to scale out quickly back to mid-bands.
Venue matters. Keep spot & perp from the same exchange family to avoid cross-venue quirks.
Alerts: enable after you’ve tuned thresholds for your timeframe so you only get high-quality pings.
Fear & Greed [theUltimator5]This indicator attempts to replicate CNN's Fear & Greed Index methodology to measure market sentiment on a scale from 0-100. It combines seven key market components into a single sentiment score, where lower values indicate fear and higher values indicate greed.
Note: It is impossible to perfectly replicate the true Fear & Greed indicator due to data limitations, so this indicator attempts to best replicate the output for each of the (7) components using available data.
The uniqueness of this indicator comes from the calculation methods for the 7 components as well as the visual representation of the data, which includes a table and selectable plots for each of the 7 components which make up the overall sentiment. Existing variants of the Fear & Greed Index have substantial flaws in the calculations of several of the components which result in warped final sentiment numbers. This indicator attempts to better track all 7 components and provide a closer model to the actual Fear & Greed index.
Here are the seven components and a brief description of how each are calculated:
1. Market Momentum
Calculation: S&P 500 current price vs. 125-day moving average
Measures how far the market has moved from its long-term trend
Uses CNN-style Z-score normalization over 252 trading days
Higher values indicate strong upward momentum (greed)
Lower values suggest declining momentum (fear)
2. Stock Strength
Calculation: S&P 500 RSI scaled to 252-day range
Uses 14-period RSI of the S&P 500 index
Normalizes RSI values based on their 252-day minimum and maximum
Measures overbought/oversold conditions relative to recent history
Higher values indicate overbought conditions (greed)
Lower values suggest oversold conditions (fear)
3. Price Breadth
Calculation: Modified McClellan Oscillator
Primary: Uses NYSE advancing vs. declining issues with 7-day smoothing
Fallback: Compares sector performance (QQQ, IWM vs. SPY)
Measures how many stocks participate in market moves
Broader participation indicates healthier trends
Narrow breadth suggests selective or weak trends
4. Put/Call Ratio
Calculation: Inverted CBOE Put/Call ratios
Primary: CBOE Equity-only Put/Call ratio (more sensitive)
Fallback: CBOE Total Put/Call ratio
Uses 5-day average and applies CNN normalization
Higher put/call ratios indicate fear (inverted to lower scores)
Lower put/call ratios suggest complacency (higher scores)
5. Market Volatility
Calculation: VIX relative to its 50-day average
Compares current VIX level to its 50-day moving average
Measures deviation from normal volatility expectations
Higher VIX relative to average indicates fear (lower scores)
Lower relative VIX suggests complacency (higher scores)
6. Safe Haven Demand
Calculation: Stock returns vs. bond yield changes
Compares 20-day smoothed S&P 500 returns to Treasury yield changes
When stocks outperform bonds, indicates risk appetite (higher scores)
When bonds outperform stocks, suggests risk aversion (lower scores)
Uses Treasury 10-year yields as the safe haven benchmark
7. Junk Bond Demand
Calculation: High-yield bond spread analysis
Measures yield spread between junk bonds (JNK ETF) and Treasuries
Compares current spread to its 5-day average
Narrowing spreads indicate risk appetite (higher scores)
Widening spreads suggest risk aversion (lower scores)
The combined sentiment is plotted as a single line which changes color based on the current sentiment value.
0-25: Extreme Fear (Red) - Market panic, oversold conditions
26-45: Fear (Orange) - Cautious sentiment, bearish bias
46-55: Neutral (Yellow) - Balanced market sentiment
56-75: Greed (Light Green) - Optimistic sentiment, bullish bias
76-100: Extreme Greed (Green) - Market euphoria, potentially overbought
There are dashed lines to represent the threshold values for each of the sentiments to better visualize transitions.
The table displays each of the (7) components of the index and their respective values. The table can be toggled on/off and the position can be moved.
An optional secondary line can be toggled on to display (1) of the (7) components as a unique color and the component name and value will highlight on the table. The secondary line can be used to dig into the main driving forces behind the overall index value.
Cardwell RSI by TQ📌 Cardwell RSI – Enhanced Relative Strength Index
This indicator is based on Andrew Cardwell’s RSI methodology , extending the classic RSI with tools to better identify bullish/bearish ranges and trend dynamics.
In uptrends, RSI tends to hold between 40–80 (Cardwell bullish range).
In downtrends, RSI tends to stay between 20–60 (Cardwell bearish range).
Key Features :
Standard RSI with configurable length & source
Fast (9) & Slow (45) RSI Moving Averages (toggleable)
Cardwell Core Levels (80 / 60 / 40 / 20) – enabled by default
Base Bands (70 / 50 / 30) in dotted style
Optional custom levels (up to 3)
Alerts for MA crosses and level crosses
Data Window metrics: RSI vs Fast/Slow MA differences
How to Use :
Monitor RSI behavior inside Cardwell’s bullish (40–80) and bearish (20–60) ranges
Watch RSI crossovers with Fast (9) and Slow (45) MAs to confirm momentum or trend shifts
Use levels and alerts as confluence with your trading strategy
Default Settings :
RSI Length: 14
MA Type: WMA
Fast MA: 9 (hidden by default)
Slow MA: 45 (hidden by default)
Cardwell Levels (80/60/40/20): ON
Base Bands (70/50/30): ON
Adaptive Trend Following Suite [Alpha Extract]A sophisticated multi-filter trend analysis system that combines advanced noise reduction, adaptive moving averages, and intelligent market structure detection to deliver institutional-grade trend following signals. Utilizing cutting-edge mathematical algorithms and dynamic channel adaptation, this indicator provides crystal-clear directional guidance with real-time confidence scoring and market mode classification for professional trading execution.
🔶 Advanced Noise Reduction
Filter Eliminates market noise using sophisticated Gaussian filtering with configurable sigma values and period optimization. The system applies mathematical weight distribution across price data to ensure clean signal generation while preserving critical trend information, automatically adjusting filter strength based on volatility conditions.
advancedNoiseFilter(sourceData, filterLength, sigmaParam) =>
weightSum = 0.0
valueSum = 0.0
centerPoint = (filterLength - 1) / 2
for index = 0 to filterLength - 1
gaussianWeight = math.exp(-0.5 * math.pow((index - centerPoint) / sigmaParam, 2))
weightSum += gaussianWeight
valueSum += sourceData * gaussianWeight
valueSum / weightSum
🔶 Adaptive Moving Average Core Engine
Features revolutionary volatility-responsive averaging that automatically adjusts smoothing parameters based on real-time market conditions. The engine calculates adaptive power factors using logarithmic scaling and bandwidth optimization, ensuring optimal responsiveness during trending markets while maintaining stability during consolidation phases.
// Calculate adaptive parameters
adaptiveLength = (periodLength - 1) / 2
logFactor = math.max(math.log(math.sqrt(adaptiveLength)) / math.log(2) + 2, 0)
powerFactor = math.max(logFactor - 2, 0.5)
relativeVol = avgVolatility != 0 ? volatilityMeasure / avgVolatility : 0
adaptivePower = math.pow(relativeVol, powerFactor)
bandwidthFactor = math.sqrt(adaptiveLength) * logFactor
🔶 Intelligent Market Structure Analysis
Employs fractal dimension calculations to classify market conditions as trending or ranging with mathematical precision. The system analyzes price path complexity using normalized data arrays and geometric path length calculations, providing quantitative market mode identification with configurable threshold sensitivity.
🔶 Multi-Component Momentum Analysis
Integrates RSI and CCI oscillators with advanced Z-score normalization for statistical significance testing. Each momentum component receives independent analysis with customizable periods and significance levels, creating a robust consensus system that filters false signals while maintaining sensitivity to genuine momentum shifts.
// Z-score momentum analysis
rsiAverage = ta.sma(rsiComponent, zAnalysisPeriod)
rsiDeviation = ta.stdev(rsiComponent, zAnalysisPeriod)
rsiZScore = (rsiComponent - rsiAverage) / rsiDeviation
if math.abs(rsiZScore) > zSignificanceLevel
rsiMomentumSignal := rsiComponent > 50 ? 1 : rsiComponent < 50 ? -1 : rsiMomentumSignal
❓How It Works
🔶 Dynamic Channel Configuration
Calculates adaptive channel boundaries using three distinct methodologies: ATR-based volatility, Standard Deviation, and advanced Gaussian Deviation analysis. The system automatically adjusts channel multipliers based on market structure classification, applying tighter channels during trending conditions and wider boundaries during ranging markets for optimal signal accuracy.
dynamicChannelEngine(baselineData, channelLength, methodType) =>
switch methodType
"ATR" => ta.atr(channelLength)
"Standard Deviation" => ta.stdev(baselineData, channelLength)
"Gaussian Deviation" =>
weightArray = array.new_float()
totalWeight = 0.0
for i = 0 to channelLength - 1
gaussWeight = math.exp(-math.pow((i / channelLength) / 2, 2))
weightedVariance += math.pow(deviation, 2) * array.get(weightArray, i)
math.sqrt(weightedVariance / totalWeight)
🔶 Signal Processing Pipeline
Executes a sophisticated 10-step signal generation process including noise filtering, trend reference calculation, structure analysis, momentum component processing, channel boundary determination, trend direction assessment, consensus calculation, confidence scoring, and final signal generation with quality control validation.
🔶 Confidence Transformation System
Applies sigmoid transformation functions to raw confidence scores, providing 0-1 normalized confidence ratings with configurable threshold controls. The system uses steepness parameters and center point adjustments to fine-tune signal sensitivity while maintaining statistical robustness across different market conditions.
🔶 Enhanced Visual Presentation
Features dynamic color-coded trend lines with adaptive channel fills, enhanced candlestick visualization, and intelligent price-trend relationship mapping. The system provides real-time visual feedback through gradient fills and transparency adjustments that immediately communicate trend strength and direction changes.
🔶 Real-Time Information Dashboard
Displays critical trading metrics including market mode classification (Trending/Ranging), structure complexity values, confidence scores, and current signal status. The dashboard updates in real-time with color-coded indicators and numerical precision for instant market condition assessment.
🔶 Intelligent Alert System
Generates three distinct alert types: Bullish Signal alerts for uptrend confirmations, Bearish Signal alerts for downtrend confirmations, and Mode Change alerts for market structure transitions. Each alert includes detailed messaging and timestamp information for comprehensive trade management integration.
🔶 Performance Optimization
Utilizes efficient array management and conditional processing to maintain smooth operation across all timeframes. The system employs strategic variable caching, optimized loop structures, and intelligent update mechanisms to ensure consistent performance even during high-volatility market conditions.
This indicator delivers institutional-grade trend analysis through sophisticated mathematical modelling and multi-stage signal processing. By combining advanced noise reduction, adaptive averaging, intelligent structure analysis, and robust momentum confirmation with dynamic channel adaptation, it provides traders with unparalleled trend following precision. The comprehensive confidence scoring system and real-time market mode classification make it an essential tool for professional traders seeking consistent, high-probability trend following opportunities with mathematical certainty and visual clarity.
RSI Crossover AlertRSI Crossover Alert Indicator - User Guide
The RSI Crossover Alert Indicator is a comprehensive technical analysis tool that detects multiple types of RSI crossovers and generates real-time alerts. It combines traditional RSI analysis with signal lines, divergence detection, and multi-level crossing alerts.
1. Multiple Crossover Detection
- RSI/Signal Line Cross: Signals a primary trend change.
- RSI/Second Signal Cross: Confirmation signals for stronger trends.
- Level Crossings: Crosses of Overbought 70, Oversold 30, and Midline 50.
- Divergence Detection: Hidden and regular divergences for reversal signals.
2. Alert Types
- Alert: RSI > Signal
Description: Bullish momentum is building.
Signal: Consider long positions.
- Alert: RSI < Signal
Description: Bearish momentum is building.
Signal: Consider short positions.
- Alert: RSI > 70
Description: Entering the overbought zone.
Signal: Prepare for a potential reversal.
- Alert: RSI < 30
Description: Entering the oversold zone.
Signal: Watch for a bounce opportunity.
- Alert: RSI crosses 50
Description: A shift in momentum.
Signal: Trend confirmation.
3. Visual Components
- Lines: RSI blue, Signal orange, Second Signal purple
- Histogram: Visualizes momentum by showing the difference between RSI and the Signal line.
- Background Zones: Red overbought, Green oversold
- Markers: Up/down triangles to indicate crossovers.
- Info Table: Real-time RSI values and status.
Strategy 1: Classic Crossover
- Entry Long: RSI crosses above the Signal Line AND RSI is below 50.
- Entry Short: RSI crosses below the Signal Line AND RSI is above 50.
- Take Profit: On the opposite signal.
- Stop Loss: At the recent swing high/low.
Strategy 2: Extreme Zone Reversal
- Entry Long: RSI is below 30 and crosses above the Signal Line.
- Entry Short: RSI is above 70 and crosses below the Signal Line.
- Risk Management: Higher win rate but fewer signals. Use a minimum 2:1 risk-reward ratio.
Strategy 3: Divergence Trading
- Setup: Enable divergence alerts and look for price/RSI divergence. Wait for an RSI crossover for confirmation.
- Entry: Enter on the crossover after the divergence appears. Place the stop loss beyond the starting point of the divergence.
Strategy 4: Multi-Timeframe Confirmation
1. Check the higher timeframe e.g. Daily to identify the main trend.
2. Use the current timeframe e.g. 4H/1H for your entry.
3. Only enter in the direction of the main trend.
4. Use the RSI crossover as the entry trigger.
Optimal Settings by Market
- Forex Major Pairs
RSI Length: 14, Signal Length: 9, Overbought/Oversold: 70/30
- Crypto High Volatility
RSI Length: 10-12, Signal Length: 6-8, Overbought/Oversold: 75/25
- Stocks Trending
RSI Length: 14-21, Signal Length: 9-12, Overbought/Oversold: 70/30
- Commodities
RSI Length: 14, Signal Length: 9, Overbought/Oversold: 80/20
Risk Management Rules
1. Position Sizing: Never risk more than 1-2% on a single trade. Reduce size in ranging markets.
2. Stop Loss Placement: Place stops beyond the recent swing high/low for crossovers. Using an ATR-based stop is also effective.
3. Profit Taking: Take partial profits at a 1:1 risk-reward ratio. Switch to a trailing stop after reaching 2:1.
1. Filtering Signals
- Combine with volume indicators.
- Confirm the trend on a higher timeframe.
- Wait for candlestick pattern confirmation.
2. Avoid Common Mistakes
- Don't trade every single crossover.
- Avoid taking signals against a strong trend.
- Do not ignore risk management.
3. Market Conditions
- Trending Market: Focus on midline 50 crosses.
- Ranging Market: Look for reversals from overbought/oversold levels.
- Volatile Market: Widen the overbought/oversold levels.
- If you get too many false signals:
Increase the signal line period, add other confirmation indicators, or use a higher timeframe.
- If you are missing major moves:
Decrease the RSI length, shorten the signal line period, or check your alert settings.
Recommended Combinations
1. RSI + MACD: For dual momentum confirmation.
2. RSI + Bollinger Bands: For volatility-adjusted signals.
3. RSI + Volume: To confirm the strength of a signal.
4. RSI + Moving Averages: To use as a trend filter.
This indicator provides a comprehensive RSI analysis. Success depends on proper configuration, risk management, and combining signals with the overall market context. Start with the default settings, then optimize based on your trading style and market conditions.