Traders Dynamic Index(RSI) w/ Bull&Bear Control ZonesMomentum (RSI) is one of the most commonly used indicators for trading, but the vast majority of traders who use it, simply apply it as an oscillator to measure overbought and oversold conditions. However, momentum is much more complex than that and using a basic RSI fails to highlight these complexities.
What this highlights are some of the areas/zones that many people may not even know about or are unaware what the RSI can actually reveal about a particular trend.
What this indicator is showing:
Fast moving RSI (Green) - 1 period
Slow moving RSI (Red) - 9 period
Bollinger Bands
Relative Strength: 1 - 100
Bearish Control Zone: 30(Below) - 45
Bullish Control Zone: 60 - 70 (Above)
How this identifies trends:
Bear Market(Bearish Control Zone):
-Support: 20(Below) - 30
-Resistance: 55 - 65
-Momentum will test resistance but will fail to hold support at 50
Bull Market(Bullish Control Zone):
-Support: 45 - 50
-Resistance: 80 - 90(Above)
-Momentum will test support but will not continue past the 45 support
How this identifies reversals:
If a market is bullish, but loses support at 45 and tests 30, it has begun reversal. If a market is bearish, but breaks 60 and tests 70, it has begun reversal.
-A bull market reversal is confirmed if it finds resistance at 60 after testing bearish support
-A bear market reversal is confirmed if it finds support at 50 after testing bullish resistance
Slow & Fast RSI w/ Boll Bands:
-The Slow and Fast RSI crossovers will act as Intermediate trends within the Macro trend - Fast crosses slow, bullish. Slow cross fast, bearish.
-Use in confluence with the Macro trend.
-While under Bearish Control, the Slow RSI will act as resistance for the Fast RSI.
-While under Bullish Control, the Slow RSI will act as support for the Fast RSI.
-The two will have an impulsive crossover when the Macro trend reverses.
-The Bollinger Bands will act as a volatility gauge for potential approaching tests of Support & Resistances. (Expansions & Contractions)
This is an analog of TDIGM (GoldMinds)
-Added Bullish/Bearish Control Zones.
-Changed Fast RSI to Green and Slow RSI to Red.
Cari skrip untuk "重庆30天天气预报"
50ema + 105emaIf price action is above the 50ema + 105ema on the 30-minute chart, be bullish.
If price action is below the 50ema + 105ema on the 30-minute chart, be bearish.
If price action is in-between buy off the lower when it acts like support and sell near the top ema which will act like resistance.
The purpose of this indicator is to show these 30-minute moving averages -- regardless of timeframe. This will only appear if you are using an intraday timeframe.
Fibonacci + RSI - StrategyStrategy: Fibonacci + RSI:
- Intraday trading strategy (Scalping).
Time Frames Tested with best Results:
30 Minutes.
5 Minutes.
15 Minutes.
1 Minute
Indicators Used:
RSI (30 / 70)
Fibonacci (1 - 0.784)
How it Works:
Once the Price Hits the 1 or -1 Fibonacci Level and bounces a little bit, It checks the RSI if Over Bought or Over Sold According to 30 - 70.
If both conditions are satisfied, it triggers a Long or Short Positions.
Further Notes:
- I have put a Stop-loss with a 2% just for further upgrades.
- Not advised to use in High Volatility Markets.
- No Repaint was observed during a 2-Weeks Tests.
If you have any suggestions or modifications please contact to add.
If you have observed any bad behavior please contact to fix.
Trade wisely.
[LunaOwl] 智慧型RSI (Smart RSI - a handy tool with less noise)Relative Strength Index is a common technical analysis tool, it is classified as a momentum oscillator, measuring the velocity and magnitude of directional price movements. it is most typically used on a 14-period timeframe, measured on a scale from 0 to 100, with high and low levels marked at 70 and 30.
相對強弱指標是常見的技術分析工具,它被歸類為動量振盪器,用於測量定向價格運動的速度和幅度,通常會使用14期數,擺盪範圍在0到100間,超買超賣分別標記成70、30。
after simple improvement and addition of logical judgment, it becomes a passive judge from subjective judgments, avoid the shortcomings of peoples in watching passivation, and the trade can be more consistent.
經過簡單的改良與添加邏輯判斷,能夠使RSI指標的使用,從主觀的判斷成為被動的確認指標,有效避免人們判斷指標鈍化的主觀缺失,並能夠使得交易更加一致。
--------------------------*
1) parameter
RSI period 1 - default is 14, same as general RSI.
RSI period 2 - default is 5, due to its own formula, the amplitude of the oscillator will become larger and more agile or fast. When the parameter is small.
exponential moving avg of RSI - using the result of RSI period 1 as the source of Ema's formula, the default length is 14, which can filter the excessive agility of RSI period 2 to reduce noise, and compared to using the baseline as the criterion for long and short judgments, The characteristics of exponential moving avg are more suitable to become flexible filtering standards.
Overbought - default is 70, you can set your overbought level.
Oversold - same as above, the default is 30.
2) Options
Open Candle color(開啟蠟燭線趨勢) - choose whether to start the color of the candle.
Open background color(開啟指標背景色) - the default is false, you can turn on.
--------------------------*
1. 設置參數
RSI期數1:預設值是14,是普通的RSI指標。
RSI期數2:預設值是5,由於RSI公式的算法,造成參數愈小擺盪幅度就會變大,反應比較快。
指數平均化的RSI期數1:將RSI期數1的結果帶入指數移動平均公式,預設值14,它能過濾RSI期數2過度敏捷的缺點,減少雜訊,相較於單純使用基準線作為多空判斷標準,用EMA的判斷標準更加因時制宜。
超買線:預設值是70,可以隨意調。
超賣線:預設值是30,一樣的。
2. 設定選項
開啟蠟燭線趨勢:顧名思義。已經幫您開好了。
開啟指標背景色:顏色太淺的話可以調深一點。
--------------------------*
ver.2- adjust new style design and create two options.
修改2: 調整新的樣式設計與建立兩個選項。
--------------------------*
ver.3- Create alert condition. maybe I should refer to the Alert Creation Framework,
there is also room for improvement.
修改3: 建立快訊選項。我應該參考警報創建框架,還有進步空間。
--------------------------*
Indicator Style - 指標樣式
The design uses casual light color style, light gray between overbought and oversold.
--------------------------*
Market Example - 市場範例
1. Bitcoin/Tether, Binance, 1 day
2. Bitcoin/USD, Coinbase, 4 hour
3. EUR/USD, Forex Market, 4 hour
4. GBP/USD, Forex Market, 30 min
5. TAIEX, Taiwan SE Weighted Index, 1 week
--------------------------*
postscript - 後記感想
The purpose of publishing Chinese Scripts is to make Pine close to more Chinese user.
I hope English skills enhancement...staggered writing makes me feel hard.
發布中文腳本的目的,是希望可以讓 Pine 親近更多中文圈的使用者。希望我的英語進步,中英文交錯撰寫有一些困難。
--------------------------*
If you find my works useful, you can give me encouragement. I can buy more books to sophisticated themselves.
如果您發現我的作品有用,可以給我鼓勵。讓我可以買更多書籍來精進自己。
MacD (Future Known or Unknown) StrategyThis indicator/strategy is to be used as a way to baseline the top potential any strategy could have with other strategies and indicators.
What I have created literally shows the BEST moves possible you could have made in my opinion for SHORTING or LONGING using only the MacD values of the 4 hour while on the 30 minute chart.
To use this, try checking out XBTUSD on the 30 minute chart . It will work under different time frames but works best on the 30 minute chart in my opinion. It WILL NOT WORK Above 2 hours time frame.
DO NOT TRADE WITH THIS indicator . I can't emphasize this enough. These results only work because of the lookahead_on parameter. A lot of scam indicators and strategies use this to trick people on tradingView into buying their scripts.
This code is OPEN SOURCE and as such there is nothing to hide and no scam!
I like to use this as a comparison tool for how good I 'could' have traded and at what points those were. By knowing where the perfect trading positions are, you can create real indicators and scripts that try to find patterns in those positions.
This also shows that IF you could know the direction the MacD was going what amazing results you could get ^_~.
This is meant purely for entertainment purposes and for comparing against your own scripts.
I've included the options in the settings to allow ONLY LONG or ONLY SHORTS. By default it attempts both buy attempts. You can also change your starting ($) amount and commission percentage that is taken per trade as well.
Also included in the options is the ability to set the back testing time frame to see how it performs during just certain time periods.
Finally a color explanation
Red - MacD 4 hour going down
Green - MacD 4 hour going up
Purple - MacD 4 hour going down (from an up position)
Yellow - MacD 4 hour going up (from a down position)
Notice the program will always buy right before it turns into a yellow color since it knows the future.
In the options you can turn off 'use the future' to see the horrible results if you trade the moment you know which direction the MacD 4 hour is actually going. I will revise this script in the future with attempts to work without knowing the future as play options to get better results.
If you have any questions or comments, please do not hesitate to ask!
(JS)DMI BarsAlright - so this is my own version of John Carter's "10x Bars"... I have done multiple things that are different from his version so they are slightly different..
So first of all the main indicator is based off of the ADX and the DMI;
For those who aren't familiar with it, Directional Movement is what you'd pull up under "built-in's" from the indicators tab (if you want to check it out).
The standard interpretation of this however, is when the ADX is above 20 that suggests the trend is strong, whereas under 20 suggests it is weak.
Also, when the D+ is above the D- that suggests a bullish trend, and D- above D+ suggests a bearish trend.
These bars take away the need to have it at the bottom of your screen, and places the data on the bars on your chart instead.
=========================================================================================================================================
So here's what the colors stand for -
Yellow - The ADX is under 20, no strength in trend
Shades of green occur when the ADX is above 20 and there's a bullish trend (D+ higher than D-)
Bright Green (Lime) - Bullish trend, D+ above 30
Green - Bullish Trend
Yellow Green - Bullish trend, D+ below 15
Shades of red occur when the ADX is above 20 and there's a bearish trend (D- higher than D+)
Bright Red - Bearish trend, D- above 30
Red - Bearish Trend
Orange - Bearish trend, D- below 15
=========================================================================================================================================
I have also added multiple time frame labels (label script used is the one created by Ricardo Santos)
These labels are color coded the same as the bars/candles, and they appear off to the right of your screen using every built in time increment from TradingView.
The purpose is to show you in real time, and on any chart resolution, what the current trend is on every individual time frame.
So using just one single chart you'll see your current resolutions candles, but also on the labels you'll see:
1 Minute
3 Minute
5 Minute
15 Minute
30 Minute
45 Minute
1 Hour
2 Hour
3 Hour
4 Hour
Daily
Weekly
Monthly
There is an input I added that allows you to adjust where your labels appear on the side of your screen as well!
=========================================================================================================================================
Now onto the volume spike portion of the indicator. This will plot a blue dot under each bar that has a spike in volume which meets your specified criteria.
I have 500% as the default setting.
What that means is that this indicator looks back and gets the 50 bar volume average and then applies dots where volume is 500% above average.
=========================================================================================================================================
Now finally, the reversal arrows. This is another simple to understand concept that I first read in John Carter's book "Mastering the Trade" that he calls "HOLP/LOHP".
I have added the ability to change the look back period you'd like the indicator to watch for highs and lows on.
What that stands for is 'High of Low Period' and 'Low of High Period', and it is used like this-
Whenever a bar makes a new high the indicator watches the low on that highest bar. Then when a bar afterwards makes a lower low then the one on the high bar,
a reversal arrow is given. Apply this same concept in the other direction in for the highs on the lowest bars.
=========================================================================================================================================
Now, I didn't want to make a "set" or have a bunch of different indicators out there that are all intended for the same package, so I took the time to put them together,
and if there's a part of it you don't care for they can easily be turned off in the settings.
Enjoy!
ADX +- DiThis Adx +-Di is just a complete version of what the ADX is supposed to signal.
So you have:
15 (contraction), 20 (threshold), 30 (expansion), 40 (resistance) levels.
Below 20 the price is not trending
Above 30 the price is trending
Below 15 price has been in contraction for too long
Between 20 and 30 price is in a "transition zone".
I finally added a "Resistance" level (40), which has to be adapted to best represent the historical levels where price usually encounters resistance, and where the price can be declared "overtrending", which means a return to lower levels is likely to happen.
I've chosen mild colors, and set the Adx Color to White, because I use black background, you can easily change that.
Enjoy
-Maurice
ICHIMOKU MTFMultiple Time Frame Version of Ichimoku Kinko Hyo Indicator.
Created in 1940's by Goichi Hosoda withe the help of University students in Japan.
Ichimoku is one of the best trend following indicators that works nearly perfect in all markets and time frames.
Ichimoku is originally an built in indicator in Tradingview but there are some problems like:
the indicator hast 5 lines but you can change only 4 parameters in the settings menu of Tradingview Charts which you could only control 3 of the lines effectively. A second problem is that Tradingview preferred to use English titles for the ICHIMOKU lines instead of giving them the most common original Japanese ones. (So I rewrite the indicator)
Kijun Sen (blue line): Also called standard line or base line, this is calculated by averaging the highest high and the lowest low for the past 26 periods.
Tenkan Sen (red line): This is also known as the turning line and is derived by averaging the highest high and the lowest low for the past nine periods.
Chikou Span (Plum line): This is called the lagging line. It is today’s closing price plotted 26 periods behind.
Senkou SpanA (green line): The first Senkou line is calculated by averaging the Tenkan Sen and the Kijun Sen and plotted 26 periods ahead.
Senkou SpanB (purple line):
The second Senkou line is determined by averaging the highest high and the lowest low for the past 52 periods and plotted 26 periods ahead.
PERSONALLY I ADVISE YOU TO USE ICHIMOKU WITH DEAFULT LENGTHS (9,26,26,52,26) IN ORDER FOR STOCK MARKETS AND FOREX MARKETS
FOR CRYPTO YOU'D BETTER USE:
10,30,30,60,30 OR 20,60,60,120,60
THE TRICKY THING IS THAT KEEPING THE 1-3-3-6-3 RATIO CONSTANT IS NECESSARY
Here's a link of my Youtube video explaining ICHIMOKU but unfortunately only in TURKISH:
www.youtube.com
Developed by: Goichi Hosoda
Here's the link to a complete list of all my indicators:
tr.tradingview.com
Ichimoku kullanımı anlattığım detaylı video serisini linkten izleyebilirsiniz:
www.youtube.com
İndikatörü geliştiren: Goichi Hosoda
ICHIMOKU Kinko Hyo by KIVANC fr3762Created in 1940's by Goichi Hosoda withe the help of University students in Japan.
Ichimoku is one of the best trend following indicators that works nearly perfect in all markets and time frames.
Ichimoku is originally an built in indicator in Tradingview but there are some problems like:
the indicator hast 5 lines but you can change only 4 parameters in the settings menu of Tradingview Charts which you could only control 3 of the lines effectively. A second problem is that Tradingview preferred to use English titles for the ICHIMOKU lines instead of giving them the most common original Japanese ones. (So I rewrite the indicator)
Kijun Sen (blue line): Also called standard line or base line, this is calculated by averaging the highest high and the lowest low for the past 26 periods.
Tenkan Sen (red line): This is also known as the turning line and is derived by averaging the highest high and the lowest low for the past nine periods.
Chikou Span (Plum line): This is called the lagging line. It is today’s closing price plotted 26 periods behind.
Senkou SpanA (green line): The first Senkou line is calculated by averaging the Tenkan Sen and the Kijun Sen and plotted 26 periods ahead.
Senkou SpanB (purple line):
The second Senkou line is determined by averaging the highest high and the lowest low for the past 52 periods and plotted 26 periods ahead.
PERSONALLY I ADVISE YOU TO USE ICHIMOKU WITH DEAFULT LENGTHS (9,26,26,52,26) IN ORDER FOR STOCK MARKETS AND FOREX MARKETS
FOR CRYPTO YOU'D BETTER USE:
10,30,30,60,30 OR 20,60,60,120,60
THE TRICKY THING IS THAT KEEPING THE 1-3-3-6-3 RATIO CONSTANT IS NECESSARY
Here's a link of my Youtube video explaining ICHIMOKU but unfortunately only in TURKISH:
www.youtube.com
Developed by: Goichi Hosoda
RSI Multi-TimeframeThe Relative Strength Index (RSI) is an extremely useful oscillating momentum indicator that was developed by J. Welles Wilder and is one of the most widely used indicators in technical analysis.
HOW IS IT USED ?
In the classic view, a security is thought to be overbought when its RSI reading is above 70 and oversold when its RSI reading falls below 30. This makes it a good indicator for mean-reversion systems. Wilder recommended using the 70 and 30 levels as overbought and oversold levels respectively. When the RSI moves up over the 30 line it is considered a possible bullish reversal while a move down below the 70 line is considered a possible bearish reversal.
When the RSI is above 70 it is a potential exit signal if you are in a long position and when it is below 30 it is a potential exit signal if you are in a short position. Some traders use extreme readings for entry points in the direction of the long-term trend. Thus, if the long-term trend is bullish, then you'd wait for the RSI to reach oversold territory, which would be a potential entry point for a long position. Conversely, if the long-term trend is bearish, then overbought conditions could be a potential point to short the security.
I added the possibility to add on the chart a 2nd timeframe for confirmation.
If you found this script useful, a tip is always welcome... :)
Ichimoku Cloud w/SelIchimoku Cloud with selection for:
Regular:
conversionPeriods = 9,
basePeriods = 26
laggingSpan2Periods = 52,
displacement = 26
Crypto:
conversionPeriods = 10,
basePeriods = 30,
laggingSpan2Periods = 60,
displacement = 30
Crypto Doubled:
conversionPeriods = 20,
basePeriods = 60,
laggingSpan2Periods = 120,
displacement = 30
CM_Ultimate RSI Multi Time FrameAvailable Options on Inputs Tab!!!
RSI with ability to change first RSI to a different Time Frame.(Defaults To Current Chart Time Frame).
Ability To Turn On/Off Background Highlighting if First RSI is Above/Below 70 or 30 Lines.
Ability To Turn On/Off Background Highlighting When First RSI Crosses Above 30 Or Below 70.
Ability To Turn On/Off "B" Or "S" When First RSI Crosses Above 30 Or Below 70.
Ability To Turn On/Off Mid -Line Plot.
Option To Plot 2nd RSI to show different Time Frames on same chart!!!
Ability To Use Different Look Back Period If You Plot 2nd RSI.
Opening Range Breakout with 2 Profit Targets.Opening Range Breakout with 2 Profit Targets.
Updated Indicator now works on all Symbols with Many Different Session Options.
***Known PineScript Issue…While the Opening Range is being Formed the lines only adjust for that individual bar. Just reset Indicator after Opening Range Completes.
***All Times are Based on New York Time
Session Options Forex U.S. Banks Open (8:00), Gold U.S. Open (8:20), Oil U.S. Open (9:00), U.S. Cash Session - Stocks (9:30), NY Forex Open (17:00) , Europe Open (02:00), or if you choose Setting 0 the Session Runs from 00:00 to 00:00 (Midnight to Midnight).
***Ability to use 60 minute Opening Range, 30 minute, 15 minute, and many other options.
***However you can manually change the times in the Inputs Tab to adjust for any session you prefer. This is useful for Day Light Savings Adjustments. Also the default times work if your charts are set to EST Time. If you use A different time zone in your settings you need to Adjust the times in the inputs tab.
Initially Opening Range High and Low plot as Yellow Lines. If Price Goes Above Opening Range then Line Turns Green. If Price Goes Below Opening Range Line Turns Red.
By default the First Profit Target is 1/2 the Width of the Opening Range and the 2nd Profit Target is 1 Times the Opening Range. However these are Adjustable in the Inputs Tab.
By Default the Opening Range Length is 1 Hour. However, you can Change the Opening Range Length to 15 min, 30 min, 2 hours etc. in the Inputs Tab.
Plots a 1 Above or Below Candle when 1st Profit Target is Achieved, and a 2 when 2nd Profit Target is Achieved.
Мой скрипт//@version=5
indicator("Fibonacci Yearly Levels – Pro (by Pablo)", overlay=true)
// 1) Фиксация закрытия прошлого года
var float year_close = na
isNewYear = ta.change(year(time)) // true на первом баре нового года
if isNewYear
year_close := close // закрытие последнего бара прошлого года
year_close := nz(year_close, close) // первичная инициализация на истории
// 2) Уровни вверх (базовые + расширения)
up5 = year_close * 1.05
up8 = year_close * 1.08
up13 = year_close * 1.13
up21 = year_close * 1.21
up34 = year_close * 1.34
up54 = year_close * 1.54
up89 = year_close * 1.89 // расширение
up144 = year_close * 2.44 // расширение
up233 = year_close * 3.33 // расширение
// 3) Уровни вниз (симметрично и только позитивные цены)
dn5 = year_close * 0.95
dn8 = year_close * 0.92
dn13 = year_close * 0.87
dn21 = year_close * 0.79
dn34 = year_close * 0.66
dn54 = year_close * 0.46
dn89 = year_close * 0.11 // 1 - 0.89 = 0.11 (ниже -144% и -233% не рисуем — это < 0)
// 4) Плоты уровней (title — константы)
plot(year_close, color=color.yellow, linewidth=2, title="Year Close")
// вверх
plot(up5, color=color.new(color.green, 70), title="+5%")
plot(up8, color=color.new(color.green, 60), title="+8%")
plot(up13, color=color.new(color.green, 50), title="+13%")
plot(up21, color=color.new(color.green, 40), title="+21%")
plot(up34, color=color.new(color.green, 30), title="+34%")
plot(up54, color=color.new(color.green, 20), title="+54%")
plot(up89, color=color.new(color.green, 10), title="+89%")
plot(up144, color=color.new(color.green, 0), title="+144%")
plot(up233, color=color.new(color.green, 0), linewidth=2, style=plot.style_circles, title="+233%")
// вниз
plot(dn5, color=color.new(color.red, 70), title="-5%")
plot(dn8, color=color.new(color.red, 60), title="-8%")
plot(dn13, color=color.new(color.red, 50), title="-13%")
plot(dn21, color=color.new(color.red, 40), title="-21%")
plot(dn34, color=color.new(color.red, 30), title="-34%")
plot(dn54, color=color.new(color.red, 20), title="-54%")
plot(dn89, color=color.new(color.red, 10), title="-89%")
// -144% и -233% не отрисовываем — это отрицательные цены
// 5) Сигналы входов по методике (пробой ±8% с подтверждением)
longEntry = ta.crossover(close, up8) // LONG при пробое +8% снизу вверх
shortEntry = ta.crossunder(close, dn8) // SHORT при пробое -8% сверху вниз
plotshape(longEntry, title="Long Entry", style=shape.triangleup, color=color.lime,
size=size.small, location=location.belowbar, text="LONG")
plotshape(shortEntry, title="Short Entry", style=shape.triangledown, color=color.red,
size=size.small, location=location.abovebar, text="SHORT")
// (опционально — включи алерты)
alertcondition(longEntry, title="LONG entry (+8%)", message="LONG: price crossed above +8% yearly level")
alertcondition(shortEntry, title="SHORT entry (-8%)", message="SHORT: price crossed below -8% yearly level")
CRT 4H/1D + FVG + OB (Entry/SL/TP Alerts) — v2.0 Gökhan//@version=5
indicator("CRT 4H/1D + FVG + OB (Entry/SL/TP Alerts) — v2.0", overlay=true, max_labels_count=500, max_lines_count=500)
//──── Inputs
use4H = input.bool(true, "Use 4H CRT")
use1D = input.bool(true, "Use 1D CRT")
needFVG = input.bool(true, "Require FVG confirmation")
useOBfilter = input.bool(false, "Require simple OB filter (prev body mid)")
lookFVGbars = input.int(5, "FVG lookback bars", minval=2, maxval=20)
atrLen = input.int(14, "ATR Length", minval=5)
atrMult = input.float(0.5, "ATR SL buffer (xATR)", step=0.05)
lineW = input.int(2, "Line Width", minval=1, maxval=4)
boxTransp = input.int(85, "Range Box Transparency", minval=0, maxval=100)
showBoxes = input.bool(true, "Show HTF Range Boxes")
showLines = input.bool(true, "Show HTF Lines & 50%")
showPlan = input.bool(true, "Show Entry/SL/TP lines when active")
persistBars = input.int(30, "Keep plan on chart (bars)", minval=5, maxval=500)
//──── Colors
col4H = color.new(color.teal, 0)
col1D = color.new(color.orange, 0)
colUp = color.new(color.lime, 0)
colDn = color.new(color.red, 0)
colMid = color.new(color.gray, 30)
colPlan = color.new(color.blue, 0)
//──── Helpers: previous HTF candle OHLC
f_prevHTF(tf) =>
hh = request.security(symbol=syminfo.tickerid, timeframe=tf, expression=high , gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
ll = request.security(symbol=syminfo.tickerid, timeframe=tf, expression=low , gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
= f_prevHTF("240")
= f_prevHTF("D")
H4_hi = nz(H4_hi_raw)
H4_lo = nz(H4_lo_raw)
D1_hi = nz(D1_hi_raw)
D1_lo = nz(D1_lo_raw)
H4_mid = (H4_hi + H4_lo)/2.0
D1_mid = (D1_hi + D1_lo)/2.0
//──── Local
h = high, l = low, c = close, o = open
//──── CRT: Sweep & Reclaim
H4_upSweep = use4H and (h > H4_hi) and (c < H4_hi) // yukarı süpür → aşağı dönüş
H4_dnSweep = use4H and (l < H4_lo) and (c > H4_lo) // aşağı süpür → yukarı dönüş
D1_upSweep = use1D and (h > D1_hi) and (c < D1_hi)
D1_dnSweep = use1D and (l < D1_lo) and (c > D1_lo)
// Hangi TF tetikledi? Öncelik: 4H sonra 1D (isteğe göre değiştirilebilir)
bearSweep = H4_upSweep or (not H4_upSweep and D1_upSweep)
bullSweep = H4_dnSweep or (not H4_dnSweep and D1_dnSweep)
useH4levels = H4_upSweep or H4_dnSweep
rngHi = useH4levels ? H4_hi : D1_hi
rngLo = useH4levels ? H4_lo : D1_lo
rngMid= useH4levels ? H4_mid: D1_mid
//──── FVG (classic 3-candle)
// Bullish FVG at bar i: low > high
// Bearish FVG at bar i: high < low
f_hasBullFVG(window) =>
ok = false
for i = 0 to window-1
ok := ok or (low > high )
ok
f_hasBearFVG(window) =>
ok = false
for i = 0 to window-1
ok := ok or (high < low )
ok
bullFVG = f_hasBullFVG(lookFVGbars) // yukarı dönüş teyidi
bearFVG = f_hasBearFVG(lookFVGbars) // aşağı dönüş teyidi
//──── Basit OB filtresi (prev body midpoint reclaim)
// Bullish: c > (o +c )/2
// Bearish: c < (o +c )/2
prevMid = (o + c ) / 2.0
bullOBok = c > prevMid
bearOBok = c < prevMid
// Zorunlu teyit seti
bullConfirm = (not needFVG or bullFVG) and (not useOBfilter or bullOBok)
bearConfirm = (not needFVG or bearFVG) and (not useOBfilter or bearOBok)
// Nihai SETUP (yön + teyit)
bearSetup = bearSweep and bearConfirm
bullSetup = bullSweep and bullConfirm
//──── Lines & Boxes
plot(showLines and use4H ? H4_hi : na, "4H High", col4H, lineW, plot.style_linebr)
plot(showLines and use4H ? H4_lo : na, "4H Low", col4H, lineW, plot.style_linebr)
plot(showLines and use4H ? H4_mid: na, "4H 50%", colMid, 1, plot.style_linebr)
plot(showLines and use1D ? D1_hi : na, "1D High", col1D, lineW, plot.style_linebr)
plot(showLines and use1D ? D1_lo : na, "1D Low", col1D, lineW, plot.style_linebr)
plot(showLines and use1D ? D1_mid: na, "1D 50%", colMid, 1, plot.style_linebr)
var box h4Box = na
var box d1Box = na
if showBoxes and barstate.islast
if use4H and not na(H4_hi) and not na(H4_lo)
if na(h4Box)
h4Box := box.new(bar_index-1, H4_lo, bar_index, H4_hi, bgcolor=color.new(col4H, boxTransp), border_color=col4H)
else
box.set_left(h4Box, bar_index-1), box.set_right(h4Box, bar_index)
box.set_bottom(h4Box, H4_lo), box.set_top(h4Box, H4_hi)
if use1D and not na(D1_hi) and not na(D1_lo)
if na(d1Box)
d1Box := box.new(bar_index-1, D1_lo, bar_index, D1_hi, bgcolor=color.new(col1D, boxTransp), border_color=col1D)
else
box.set_left(d1Box, bar_index-1), box.set_right(d1Box, bar_index)
box.set_bottom(d1Box, D1_lo), box.set_top(d1Box, D1_hi)
//──── Entry/SL/TP Plan (stateful)
atr = ta.atr(atrLen)
tick = syminfo.mintick
var bool planActive = false
var bool planBull = na
var float planEntry = na
var float planSL = na
var float planTP1 = na
var float planTP2 = na
var int planBars = 0
// Yeni setup oluştuğunda plan kur
if barstate.isconfirmed
if bearSetup
planActive := true, planBull := false
planEntry := rngHi // retest: prev High
planSL := math.max(high, rngHi) + atrMult*atr
planTP1 := rngMid
planTP2 := rngLo
planBars := 0
label.new(bar_index, high, "CRT BEAR setup\nEntry≈"+str.tostring(planEntry)+"\nSL≈"+str.tostring(planSL)+"\nTP1≈"+str.tostring(planTP1)+" TP2≈"+str.tostring(planTP2),
style=label.style_label_down, color=color.new(colDn,0), textcolor=color.white, size=size.tiny)
if bullSetup
planActive := true, planBull := true
planEntry := rngLo // retest: prev Low
planSL := math.min(low, rngLo) - atrMult*atr
planTP1 := rngMid
planTP2 := rngHi
planBars := 0
label.new(bar_index, low, "CRT BULL setup\nEntry≈"+str.tostring(planEntry)+"\nSL≈"+str.tostring(planSL)+"\nTP1≈"+str.tostring(planTP1)+" TP2≈"+str.tostring(planTP2),
style=label.style_label_up, color=color.new(colUp,0), textcolor=color.white, size=size.tiny)
// Plan takibi
entryTouched = planActive and ((planBull and low <= planEntry) or (not planBull and high >= planEntry))
tp1Hit = planActive and ((planBull and high >= planTP1) or (not planBull and low <= planTP1))
tp2Hit = planActive and ((planBull and high >= planTP2) or (not planBull and low <= planTP2))
slHit = planActive and ((planBull and low <= planSL) or (not planBull and high >= planSL))
if planActive
planBars += 1
// de-activate on exit
if slHit or tp2Hit or planBars > persistBars
planActive := false
// Görsel plan çizgileri
plot(showPlan and planActive ? planEntry : na, "Entry", color.new(colPlan, 0), 2, plot.style_linebr)
plot(showPlan and planActive ? planSL : na, "SL", color.new(color.red, 0), 2, plot.style_linebr)
plot(showPlan and planActive ? planTP1 : na, "TP1", color.new(color.gray, 0), 1, plot.style_linebr)
plot(showPlan and planActive ? planTP2 : na, "TP2", color.new(color.gray, 0), 1, plot.style_linebr)
// İşaretler
plotshape(bearSetup, title="Bear Setup", style=shape.triangledown, location=location.abovebar, size=size.tiny, color=colDn, text="CRT▼")
plotshape(bullSetup, title="Bull Setup", style=shape.triangleup, location=location.belowbar, size=size.tiny, color=colUp, text="CRT▲")
//──── Alerts
alertcondition(bearSetup, title="CRT Setup Ready (Bearish)",
message="CRT Bearish setup ready on {{ticker}} {{interval}} | Entry≈{{plot(\"Entry\")}} SL≈{{plot(\"SL\")}} TP1≈{{plot(\"TP1\")}} TP2≈{{plot(\"TP2\")}}")
alertcondition(bullSetup, title="CRT Setup Ready (Bullish)",
message="CRT Bullish setup ready on {{ticker}} {{interval}} | Entry≈{{plot(\"Entry\")}} SL≈{{plot(\"SL\")}} TP1≈{{plot(\"TP1\")}} TP2≈{{plot(\"TP2\")}}")
alertcondition(entryTouched, title="CRT Retest Filled",
message="CRT Entry retest filled on {{ticker}} {{interval}}")
Relative Performance Binary FilterDescription:
This indicator monitors the relative performance of 30 selected crypto assets and generates a binary signal for each: 1 if the asset’s price has increased above a user-defined threshold over a specified lookback period, 0 otherwise. The script produces a JSON-formatted output suitable for webhooks, allowing you to send the signals to external applications like Google Sheets.
Key Features:
Configurable lookback period, price source, and performance threshold.
Supports confirmed or real-time bar data.
Monitors 30 crypto assets simultaneously.
Produces a one-line JSON output with batch grouping for easy webhook integration.
Includes an optional visual sum plot showing how many assets are above the threshold at any time.
Use Cases:
Automate performance tracking across multiple crypto assets.
Feed binary signals into external dashboards, trading bots, or Google Sheets.
Quickly identify which assets are outperforming a set threshold.
Flow_RSI_StochRSI_Volume//@version=5
indicator("Flow + RSI + StochRSI + Volume - Panel", overlay=false)
// ---- Inputs
cmfLen = input.int(20, "CMF Length", minval=2)
rsiLen = input.int(14, "RSI Length", minval=2)
srsiLen = input.int(14, "StochRSI Base Length", minval=2)
kLen = input.int(3, "%K Smoothing", minval=1)
dLen = input.int(3, "%D Smoothing", minval=1)
// ---- CMF (세력 유입)
rng = high - low
mfm = rng != 0 ? ((close - low) - (high - close)) / rng : 0.0
mfv = mfm * volume
cmf = ta.sma(mfv, cmfLen) / ta.sma(volume, cmfLen)
// ---- RSI
rsi = ta.rsi(close, rsiLen)
// ---- StochRSI (%K, %D)
rsiLL = ta.lowest(rsi, srsiLen)
rsiHH = ta.highest(rsi, srsiLen)
base = (rsiHH - rsiLL) != 0 ? (rsi - rsiLL) / (rsiHH - rsiLL) * 100.0 : 0.0
k = ta.sma(base, kLen)
d = ta.sma(k, dLen)
// ---- Volume (거래량)
vol = volume
vma20 = ta.sma(volume, 20)
// ---- Plots (색상 지정 없이 기본값 사용)
plot(cmf, title="CMF (Flow)")
hline(0, "CMF Zero")
plot(rsi, title="RSI")
hline(30, "RSI 30")
hline(50, "RSI 50")
hline(70, "RSI 70")
plot(k, title="StochRSI %K")
plot(d, title="StochRSI %D")
plot(vol, title="Volume", style=plot.style_histogram)
plot(vma20, title="Vol MA20")
[Statistics] killzone SFPSFP Statistics (ICT Sessions)
This indicator automatically finds and draws the high and low of the Asia, London, and New York trading sessions. It then hunts for Swing Failure Patterns (SFPs) that sweep these key session levels.
The main purpose of this script is to gather statistics on when these high-probability SFPs occur, allowing you to map out and identify the times of day when they are most frequent.
How to Use This Indicator
Set Your SFP Timeframe: In the settings, choose the timeframe you want to hunt for SFPs on (e.g., 1H, 15m). Important: You must also set your main chart to this exact same timeframe for the statistics to be collected correctly.
Define Your Sessions: Go to the "Session Definitions" tab.
Set the Global Timezone to your preferred trading timezone (e.g., "America/New_York"). This controls all session times and table times.
Adjust the start and end times for Asia, London, and NY AM sessions.
You can turn off sessions you don't want to track (like NY Lunch or NY PM).
You can also change the colors and text style for the session boxes here.
Set Confirmation Bars: In "SFP Engine Settings," the "Confirmation Bars" (default is 2) defines how many bars must close after the SFP bar without invalidating the level. An SFP is only "confirmed" and drawn after this period.
0 = Confirms immediately on the SFP candle's close.
2 = Confirms 2 bars after the SFP candle's close.
Read the Statistics: The "Custom SFP Statistics" table will appear on your chart. This table logs every confirmed SFP and tells you:
Which time of day they happen most.
How many were Bearish (swept a high) vs. Bullish (swept a low).
It's set by default to show the "Top 20" most frequent times, sorted chronologically.
Filter Your Chart (Optional): If your chart feels cluttered, go to "Visual Time Filter" and turn it ON.
Set a time window (e.g., "09:30-11:00").
The indicator will now only draw SFP signals that occurred within that specific time window. This is perfect for focusing on a single killzone.
How to Set Up Alerts
You can set up server-side alerts to be notified every time a new SFP is confirmed.
Check the "Enable SFP Alerts" box at the top of the indicator's settings.
Click the "Alert" button (alarm clock icon) on the TradingView toolbar.
In the "Condition" dropdown, select "SFP Statistics (ICT Sessions)".
In the second dropdown, choose "Any alert() function call".
Most Important Step: In the "Message" box, delete any default text and type in this exact placeholder:
{{alert_message}}
Set the trigger to "Once Per Bar Close".
Click "Create".
How Alerts Work (Triggers & Filtering)
Trigger: Alerts are tied to the confirmed signal. An alert will only fire after your "Confirmation Bars" have passed and the SFP is locked in. This prevents you from getting alerts on fake-outs.
Alert Filtering: The alerts are linked to the "Visual Time Filter". If you turn on the Visual Time Filter (e.g., to 09:30-11:00), you will only receive alerts for SFPs that are confirmed within that time window. If an SFP happens at 14:00, the script will ignore it, it will not be drawn, and it will not send you an alert. This allows you to get alerts only for the session you are actively trading.
Note: This is a first draft of this indicator. I will continue to work on it and improve it over time, as it may still contain small bugs.
Acknowledgements:
A big thank you to TFO (tradeforopp). The session detection logic and the visual style for the session boxes were adapted from his excellent "ICT Killzones & Pivots " indicator.
Strategy XAU/M5 RSI+EMAXAU M5 Strategy — EMA + RSI with Flexible TP/SL
Recommended timeframe: M5
Best suited for: XAUUSD (Gold) — can also be tested on other pairs after optimization.
Concept
This strategy combines trend direction via EMA and momentum confirmation via RSI (oversold/overbought levels).
Buy (Long): when price is above EMA and RSI crosses above the oversold level.
Sell (Short): when price is below EMA and RSI crosses below the overbought level.
This method follows the trend but waits for RSI confirmation, avoiding premature entries during unconfirmed market moves.
Entry Conditions
Buy: close > EMA and RSI crossover RSI_oversold
Sell: close < EMA and RSI crossunder RSI_overbought
Default settings:
EMA Length = 500 (smooth trend filter for M5)
RSI Length = 8, Overbought = 70, Oversold = 30 (sensitive enough to catch early impulses)
Trade Management (TP/SL)
This strategy supports two TP/SL modes:
Fixed Value
Adds or subtracts a fixed price value directly from the entry price.
Example: TP = +14, SL = -7 (measured in price points, not USD).
Pip Mode
Uses pip size conversion: pip = syminfo.mintick * 10.
TP/SL = (entered pip value × pip size) added/subtracted from entry.
Note: although the inputs are labeled “USD/Pip,” the calculations are based on price points and pip-size scaling.
If you use a symbol other than XAUUSD, double-check pip size to ensure TP/SL aligns correctly.
Suggested Parameters (for XAUUSD M5)
EMA Length: 500
RSI Length: 8
RSI Overbought: 70
RSI Oversold: 30
TP/SL Mode: “Fixed Value” (easier for beginners)
TP (Value): 14
SL (Value): 7
Default risk–reward ratio ≈ 1:2 (TP twice the SL), ideal for fast-paced M5 scalping.
Usage & Optimization Tips
Use on M5 timeframe as designed. Adjust EMA/RSI if changing timeframes.
Select one TP/SL mode only (“Value” or “Pip”) and confirm actual units.
Avoid high-volatility news events (NFP, CPI, FOMC) to reduce slippage.
Focus on active sessions:
Gold is most volatile during London and New York sessions.
Risk management:
Risk ≤1–2% per trade.
Avoid countertrend stacking when RSI remains extreme in strong trends.
Trend confirmation:
EMA 500 filters noise well;
Backtesting Tips
Set initial capital realistically.
Include commissions/spread to mirror broker conditions.
Keep pyramiding low (0–1) to assess signal quality.
Start with On bar close mode, then test Every tick for detailed sensitivity.
Strengths
Simple and transparent: clear, rule-based signals.
Trend + momentum confirmation: avoids catching falling knives.
Flexible TP/SL system: switch easily between fixed or pip-based setups.
Limitations
RSI can trigger early during extended strong trends (persistent overbought/oversold).
TP/SL tuning is essential for each market and volatility regime.
Disclaimer
This is not financial advice.
Past performance does not guarantee future results.
Always backtest and paper trade before using real capital, and practice strict risk management.
RSI ExtremesRSI Extremes — Educational Indicator (Pine v5)
Per-Tick Dual-RSI Extremes · Real-Time Visualization · Cooldown Logic
Overview
RSI Extremes is a real-time educational indicator built to show where the Relative Strength Index (RSI) reaches its most extreme levels during every tick of live price action.
Instead of using only the candle close, it continuously tracks both RSI(low) and RSI(high) to reveal how deeply each bar stretches into demand or supply extremes.
This tool is meant solely for study and visualization, helping you understand how RSI behaves intrabar when price wicks expand. It produces no signals, no alerts, and no trade suggestions — it’s a microscope for momentum pressure.
Core Idea
Standard RSI hides a lot of the wick-based stress in price because it calculates from close values only.
RSI Extremes solves this by splitting the measurement into two perspectives:
RSI of LOW (green) → shows how far momentum falls into potential demand exhaustion.
RSI of HIGH (red) → shows how far momentum extends into potential supply exhaustion.
Seeing both together exposes the full oscillation envelope — what RSI looks like between candle opens and closes, not just after the fact.
What Gets Plotted
RSI (Low) — green line representing intrabar downside pressure.
RSI (High) — red line representing intrabar upside pressure.
RSI Ghost (Smoothed) — gray line for soft context only.
Bands: 30 / 50 / 70 visual guides with a shaded 30–70 region.
Markers:
Enter marker when RSI(low) ≤ levelEnter (default 15).
Exit marker when RSI(high) ≥ levelExit (default 85).
Markers appear in real time as soon as a touch occurs and are locked per bar to avoid duplicates.
Inputs & Educational Purpose
Input Description Learning Focus
Source (for ghost smoother) Data used for the ghost RSI. Observe RSI smoothing lag.
RSI Length Period for both RSI(high) and RSI(low). Shorter = faster reaction; longer = smoother.
RSI-based MA Length (ghost) Smoothing for the ghost line. Compare sharp vs smoothed RSI rhythm.
levelEnter (touch or below) Default 15. Study how deep RSI(low) falls during market stress.
levelExit (touch or above) Default 85. Study how high RSI(high) rises during momentum bursts.
Rest period (bars) Cooldown after any event. Encourages post-event observation and prevents overlap.
Real-Time Behavior
Evaluates conditions per tick, not only at bar close.
Uses both real-time detection and bar-close backup for reliability.
Employs per-bar locks to prevent duplicate markers.
Integrates a cooldown so new markers only appear after the rest period.
The result is a clean, stable display of RSI stress points in live price motion — no flicker, no repaint.
How to Study with RSI Extremes
Watch how Enter markers form during sharp sell wicks — these highlight where intrabar RSI(low) dives into extreme territory.
Watch how Exit markers appear during aggressive tops — these show when RSI(high) surges beyond its upper boundary.
Compare both lines to the gray ghost: if the ghost is rising while Enter markers print, you’re seeing a temporary overshoot within strengthening momentum; if it’s falling while Exit markers print, you’re seeing supply exhaustion in weakening momentum.
Use cooldown spacing to examine how long markets take to recover or consolidate after an extreme tick.
Educational Value
Learn how RSI behaves inside a candle rather than only at its close.
Visualize how volatility affects the amplitude of RSI swings.
Understand that extremes don’t mean reversal — they measure intensity, not direction.
Build intuition for momentum saturation and liquidity hunts.
This indicator turns RSI into a real-time stress monitor rather than a delayed oscillator.
Category & Tags
Category: Indicator → Momentum (or Indicator → Educational / Research)
Tags: indicator, rsi, momentum, extremes, enter-exit, levelenter, levelexit, realtime, educational, research, visualization, pine-v5
Disclaimer
This indicator is intended exclusively for educational and research purposes.
It does not issue trade signals or financial advice.
All market activity carries risk; use this tool to learn, not to predict or execute trades.
ICT Killzones & FVG// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// © Mutharasan12
//@version=5
indicator("ICT Killzones & FVG", "ICT Killzones & FVG", overlay = true, max_labels_count = 500, max_lines_count = 500, max_boxes_count = 500)
// ---------------------------------------- Constant Functions --------------------------------------------------
get_line_type(_style) =>
result = switch _style
'Solid' => line.style_solid
'Dotted' => line.style_dotted
'Dashed' => line.style_dashed
result
get_size(x) =>
result = switch x
'Auto' => size.auto
'Tiny' => size.tiny
'Small' => size.small
'Normal' => size.normal
'Large' => size.large
'Huge' => size.huge
get_table_pos(pos) =>
result = switch pos
"Bottom Center" => position.bottom_center
"Bottom Left" => position.bottom_left
"Bottom Right" => position.bottom_right
"Middle Center" => position.middle_center
"Middle Left" => position.middle_left
"Middle Right" => position.middle_right
"Top Center" => position.top_center
"Top Left" => position.top_left
"Top Right" => position.top_right
get_font_style(s) =>
result = switch s
'Monospace' => font.family_monospace
'Default' => font.family_default
// ---------------------------------------- Constant Functions --------------------------------------------------
// ---------------------------------------- Inputs --------------------------------------------------
gmt_tz = input.string('America/New_York', "Timezone", options = , tooltip = "Note GMT is not adjusted to reflect Daylight Saving Time changes", group = 'Time Zone')
DWM_profile = input.bool(true,"Show All Profile",inline="Show",group = 'Profile')
D_profile = input.bool(true,"Show Daily",inline = "Show",group = 'Profile')
hide_lines_DO = input.timeframe("60","Daily:",inline = "Hide",group = 'Hide Above')
W_profile = input.bool(true,"Weekly",inline="Show",group = 'Profile')
hide_lines_WO = input.timeframe("240","Weekly:",inline="Hide",group = 'Hide Above')
M_profile = input.bool(true,"Monthly",inline="Show",group = 'Profile')
hide_lines_MO = input.timeframe("1D","Monthly:",inline="Hide",group = 'Hide Above')
show_kz = input.bool(false, "Show Killzone Boxes", inline = "skz", group = 'Hide KillZone')
var g_SETTINGS = "Settings"
max_days = input.int(60, "Drawing Limit", 1, inline = 'dl', tooltip = "Only this many drawings will be kept on the chart, for each selected drawing type (killzone boxes, pivot lines, open lines, etc.)", group = g_SETTINGS)
tf_limit = input.timeframe("30", "Timeframe Limit", inline = 'dl', tooltip = "Drawings will not appear on timeframes greater than or equal to this", group = g_SETTINGS)
lbl_size = get_size(input.string('Tiny', "Label Size", inline = 'sc', options = , tooltip = "The size of all labels", group = g_SETTINGS))
font_style = get_font_style(input.string('Monospace', "Font Style", inline = 'sc', group = g_SETTINGS, options = ))
txt_color = input.color(#000000, "Text Color", inline = 'sc', tooltip = "The color of all label and table text", group = g_SETTINGS)
use_cutoff = input.bool(true, "Drawing Cutoff Time", inline = "CO", tooltip = "When enabled, all pivots and open price lines will stop extending at this time", group = g_SETTINGS)
cutoff = input.session("1700-1701", "", inline = "CO", group = g_SETTINGS)
var g_KZ = "Killzones"
show_kz_text = input.bool(false, "Display Text", inline = "KZ", group = g_KZ)
box_transparency = input.int(85, "Box Transparency", 0, 100, group = g_KZ)
text_transparency = input.int(50, "Text Transparency", 0, 100, group = g_KZ)
use_asia = input.bool(true, "", inline = "ASIA", group = g_KZ)
as_txt = input.string("ASIA", "", inline = "ASIA", group = g_KZ)
asia = input.session("2000-0000", "", inline = "ASIA", group = g_KZ)
as_color = input.color(#9598a1, "", inline = "ASIA", group = g_KZ)
use_london = input.bool(true, "", inline = "LONDON", group = g_KZ)
lo_txt = input.string("OPEN", "", inline = "LONDON", group = g_KZ)
london = input.session("0200-0500", "", inline = "LONDON", group = g_KZ)
lo_color = input.color(#9598a1, "", inline = "LONDON", group = g_KZ)
use_nyam = input.bool(true, "", inline = "NYAM", group = g_KZ)
na_txt = input.string("NYAM", "", inline = "NYAM", group = g_KZ)
nyam = input.session("0700-1000", "", inline = "NYAM", group = g_KZ)
na_color = input.color(#9598a1, "", inline = "NYAM", group = g_KZ)
use_nylu = input.bool(false, "", inline = "NYLU", group = g_KZ)
nl_txt = input.string("Lunch", "", inline = "NYLU", group = g_KZ)
nylu = input.session("1200-1300", "", inline = "NYLU", group = g_KZ)
nl_color = input.color(#9598a1, "", inline = "NYLU", group = g_KZ)
use_nypm = input.bool(false, "", inline = "NYPM", group = g_KZ)
np_txt = input.string("NYPM", "", inline = "NYPM", group = g_KZ)
nypm = input.session("1300-1600", "", inline = "NYPM", group = g_KZ)
np_color = input.color(#9598a1, "", inline = "NYPM", group = g_KZ)
use_loop = input.bool(true, "", inline = "LOOP", group = g_KZ)
op_txt = input.string("CBDR", "", inline = "LOOP", group = g_KZ)
loop = input.session("1400-2000", "", inline = "LOOP", group = g_KZ)
op_color = input.color(#9598a1, "", inline = "LOOP", group = g_KZ)
use_locl = input.bool(true, "", inline = "LOCL", group = g_KZ)
cl_txt = input.string("CLOSE", "", inline = "LOCL", group = g_KZ)
locl = input.session("1000-1200", "", inline = "LOCL", group = g_KZ)
cl_color = input.color(#9598a1, "", inline = "LOCL", group = g_KZ)
use_sb1 = input.bool(false, "", inline = "SB1", group = g_KZ)
m1_txt = input.string("London SB", "", inline = "SB1", group = g_KZ)
sb1 = input.session("0300-0400", "", inline = "SB1", group = g_KZ)
m1_color = input.color(#9598a1, "", inline = "SB1", group = g_KZ)
use_sb2 = input.bool(false, "", inline = "SB2", group = g_KZ)
m2_txt = input.string("NewYork AM SB", "", inline = "SB2", group = g_KZ)
sb2 = input.session("1000-1100", "", inline = "SB2", group = g_KZ)
m2_color = input.color(#9598a1, "", inline = "SB2", group = g_KZ)
use_sb3 = input.bool(false, "", inline = "SB3", group = g_KZ)
m3_txt = input.string("NewYork PM SB", "", inline = "SB3", group = g_KZ)
sb3 = input.session("1400-1500", "", inline = "SB3", group = g_KZ)
m3_color = input.color(#9598a1, "", inline = "SB3", group = g_KZ)
var g_LABELS = "Killzone Pivots"
use_alerts = input.bool(false, "Alert Broken Pivots", inline = "PV", group = g_LABELS)
show_pivots = input.bool(false, "Show Pivots", inline = "SV", group = g_LABELS)
show_labels = input.bool(false, "Pivots Labels", inline = "SV", group = g_LABELS)
show_midpoints = input.bool(false, "Pivots Midpoints",inline = "SV", group = g_LABELS)
ext_pivots = input.string("Until Mitigated", "Extend Pivots...", options = , group = g_LABELS)
ext_which = input.string("Most Recent", "...From Which Sessions", options = , group = g_LABELS)
ash_str = input.string("AS.H", "Killzone 01 Labels", inline = "L_AS", group = g_LABELS)
asl_str = input.string("AS.L", "", inline = "L_AS", group = g_LABELS)
loh_str = input.string("LO.H", "Killzone 02 Labels", inline = "L_LO", group = g_LABELS)
lol_str = input.string("LO.L", "", inline = "L_LO", group = g_LABELS)
nah_str = input.string("NYAM.H", "Killzone 03 Labels", inline = "L_NA", group = g_LABELS)
nal_str = input.string("NYAM.L", "", inline = "L_NA", group = g_LABELS)
nlh_str = input.string("NYL.H", "Killzone 04 Labels", inline = "L_NL", group = g_LABELS)
nll_str = input.string("NYL.L", "", inline = "L_NL", group = g_LABELS)
nph_str = input.string("NYPM.H", "Killzone 05 Labels", inline = "L_NP", group = g_LABELS)
npl_str = input.string("NYPM.L", "", inline = "L_NP", group = g_LABELS)
oph_str = input.string("LOOP.H", "Killzone 06 Labels", inline = "L_OP", group = g_LABELS)
opl_str = input.string("LOOP.L", "", inline = "L_OP", group = g_LABELS)
clh_str = input.string("LOCL.H", "Killzone 07 Labels", inline = "L_CL", group = g_LABELS)
cll_str = input.string("LOCL.L", "", inline = "L_CL", group = g_LABELS)
m1h_str = input.string("SB1.H", "Killzone 08 Labels", inline = "L_M1", group = g_LABELS)
m1l_str = input.string("SB1.L", "", inline = "L_M1", group = g_LABELS)
m2h_str = input.string("SB2.H", "Killzone 09 Labels", inline = "L_M2", group = g_LABELS)
m2l_str = input.string("SB2.L", "", inline = "L_M2", group = g_LABELS)
m3h_str = input.string("SB3.H", "Killzone 10 Labels", inline = "L_M3", group = g_LABELS)
m3l_str = input.string("SB3.L", "", inline = "L_M3", group = g_LABELS)
kzp_style = get_line_type(input.string(defval = 'Solid', title = "Pivot Style", options = , inline = "KZP", group = g_LABELS))
kzp_width = input.int(1, "", inline = "KZP", group = g_LABELS)
kzm_style = get_line_type(input.string(defval = 'Dotted', title = "Midpoint Style", options = , inline = "KZM", group = g_LABELS))
kzm_width = input.int(1, "", inline = "KZM", group = g_LABELS)
var g_RNG = "Killzone Range"
show_range = input.bool(false, "Show Killzone Range", tooltip = "Show the most recent ranges of each selected killzone, from high to low", group = g_RNG)
show_range_avg = input.bool(true, "Show Average", tooltip = "Show the average range of each selected killzone", group = g_RNG)
range_avg = input.int(5, "Average Length", 0, tooltip = "This many previous sessions will be used to calculate the average. If there isn't enough data on the current chart, it will use as many sessions as possible", group = g_RNG)
range_pos = get_table_pos(input.string('Top Right', "Table Position", options = , group = g_RNG))
range_size = get_size(input.string('Normal', "Table Size", options = , group = g_RNG))
var g_DWM = "Day - Week - Month"
dow_labels = input.bool(false, "Day of Week Labels", inline = "DOW", group = g_DWM)
dow_yloc = input.string('Bottom', "", options = , inline = "DOW", group = g_DWM)
dow_xloc = input.string('Midnight', "", options = , inline = "DOW", group = g_DWM)
sep_unlimited = input.bool(true, "Unlimited", tooltip = "Unlimited will show as many of the selected lines as possible. Otherwise, the session drawing limit will be used", group = g_DWM)
show_d_open = input.bool(true, "D Open", inline = "DO", group = g_DWM)
dhl = input.bool(true, "High/Low", inline = "DO", tooltip = "", group = g_DWM)
ds = input.bool(true, "Separators", inline = "DO", tooltip = "Mark where a new day begins", group = g_DWM)
d_color = input.color(color.blue, "", inline = "DO", group = g_DWM)
show_w_open = input.bool(true, "W Open", inline = "WO", group = g_DWM)
whl = input.bool(true, "High/Low", inline = "WO", tooltip = "", group = g_DWM)
ws = input.bool(true, "Separators", inline = "WO", tooltip = "Mark where a new week begins", group = g_DWM)
w_color = input.color(#089981, "", inline = "WO", group = g_DWM)
show_m_open = input.bool(true, "M Open", inline = "MO", group = g_DWM)
mhl = input.bool(true, "High/Low", inline = "MO", tooltip = "", group = g_DWM)
ms = input.bool(true, "Separators", inline = "MO", tooltip = "Mark where a new month begins", group = g_DWM)
m_color = input.color(color.red, "", inline = "MO", group = g_DWM)
htf_style = get_line_type(input.string(defval = 'Dotted', title = "Style", options = , inline = "D0", group = g_DWM))
htf_width = input.int(1, "", inline = "D0", group = g_DWM)
var g_OPEN = "Opening Prices"
open_unlimited = input.bool(true, "Unlimited", tooltip = "Unlimited will show as many of the selected lines as possible. Otherwise, the session drawing limit will be used", group = g_OPEN)
hide_hline = input.bool(true,"Show Opening Price",group = g_OPEN)
hide_lines_h = input.timeframe("60","Hide Above Time Frame",group = g_OPEN)
use_h1 = input.bool(true, "", inline = "H1", group = g_OPEN)
h1_text = input.string("00:00", "", inline = "H1", group = g_OPEN)
h1 = input.session("0000-0001", "", inline = "H1", group = g_OPEN)
h1_color = input.color(#000000, "", inline = "H1", group = g_OPEN)
use_h2 = input.bool(true, "", inline = "H2", group = g_OPEN)
h2_text = input.string("08:30", "", inline = "H2", group = g_OPEN)
h2 = input.session("0830-0831", "", inline = "H2", group = g_OPEN)
h2_color = input.color(#000000, "", inline = "H2", group = g_OPEN)
use_h3 = input.bool(false, "", inline = "H3", group = g_OPEN)
h3_text = input.string("10:00", "", inline = "H3", group = g_OPEN)
h3 = input.session("1000-1001", "", inline = "H3", group = g_OPEN)
h3_color = input.color(#000000, "", inline = "H3", group = g_OPEN)
use_h4 = input.bool(false, "", inline = "H4", group = g_OPEN)
h4_text = input.string("14:00", "", inline = "H4", group = g_OPEN)
h4 = input.session("1400-1401", "", inline = "H4", group = g_OPEN)
h4_color = input.color(#000000, "", inline = "H4", group = g_OPEN)
hz_style = get_line_type(input.string(defval = 'Dotted', title = "Style", options = , inline = "H0", group = g_OPEN))
hz_width = input.int(1, "", inline = "H0", group = g_OPEN)
var g_VERTICAL = "Timestamps"
hide_vline = input.bool(true,"Show Timestamp",group = g_VERTICAL)
hide_lines_v = input.timeframe("60","Hide Above Time Frame",group = g_VERTICAL)
use_v1 = input.bool(true, "", inline = "V1", group = g_VERTICAL)
v1 = input.session("0000-0001", "", inline = "V1", group = g_VERTICAL)
v1_color = input.color(#000000, "", inline = "V1", group = g_VERTICAL)
use_v2 = input.bool(false, "", inline = "V2", group = g_VERTICAL)
v2 = input.session("0800-0801", "", inline = "V2", group = g_VERTICAL)
v2_color = input.color(#000000, "", inline = "V2", group = g_VERTICAL)
use_v3 = input.bool(false, "", inline = "V3", group = g_VERTICAL)
v3 = input.session("1000-1001", "", inline = "V3", group = g_VERTICAL)
v3_color = input.color(#000000, "", inline = "V3", group = g_VERTICAL)
use_v4 = input.bool(false, "", inline = "V4", group = g_VERTICAL)
v4 = input.session("1200-1201", "", inline = "V4", group = g_VERTICAL)
v4_color = input.color(#000000, "", inline = "V4", group = g_VERTICAL)
vl_style = get_line_type(input.string(defval = 'Dotted', title = "Style", options = , inline = "V0", group = g_VERTICAL))
vl_width = input.int(1, "", inline = "V0", group = g_VERTICAL)
// ---------------------------------------- Inputs --------------------------------------------------
// ---------------------------------------- Variables & Constants --------------------------------------------------
type kz
string _title
box _box
line _hi_line
line _md_line
line _lo_line
label _hi_label
label _lo_label
bool _hi_valid
bool _md_valid
bool _lo_valid
float _range_store
float _range_current
type hz
line LN
label LB
bool CO
type dwm_hl
line hi_line
line lo_line
label hi_label
label lo_label
type dwm_info
string tf
float o = na
float h = na
float l = na
float ph = na
float pl = na
var as_kz = kz.new(as_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var lo_kz = kz.new(lo_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var na_kz = kz.new(na_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var nl_kz = kz.new(nl_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var np_kz = kz.new(np_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var op_kz = kz.new(op_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var cl_kz = kz.new(cl_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var m1_kz = kz.new(m1_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var m2_kz = kz.new(m2_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var m3_kz = kz.new(m3_txt, array.new_box(), array.new_line(), array.new_line(), array.new_line(), array.new_label(), array.new_label(), array.new_bool(), array.new_bool(), array.new_bool(), array.new_float())
var hz_1 = hz.new(array.new_line(), array.new_label(), array.new_bool())
var hz_2 = hz.new(array.new_line(), array.new_label(), array.new_bool())
var hz_3 = hz.new(array.new_line(), array.new_label(), array.new_bool())
var hz_4 = hz.new(array.new_line(), array.new_label(), array.new_bool())
var d_hl = dwm_hl.new(array.new_line(), array.new_line(), array.new_label(), array.new_label())
var w_hl = dwm_hl.new(array.new_line(), array.new_line(), array.new_label(), array.new_label())
var m_hl = dwm_hl.new(array.new_line(), array.new_line(), array.new_label(), array.new_label())
var d_info = dwm_info.new("D")
var w_info = dwm_info.new("W")
var m_info = dwm_info.new("M")
t_as = not na(time("", asia, gmt_tz))
t_lo = not na(time("", london, gmt_tz))
t_na = not na(time("", nyam, gmt_tz))
t_nl = not na(time("", nylu, gmt_tz))
t_np = not na(time("", nypm, gmt_tz))
t_op = not na(time("", loop, gmt_tz))
t_cl = not na(time("", locl, gmt_tz))
t_m1 = not na(time("", sb1, gmt_tz))
t_m2 = not na(time("", sb2, gmt_tz))
t_m3 = not na(time("", sb3, gmt_tz))
t_co = not na(time("", cutoff, gmt_tz))
t_h1 = not na(time("", h1, gmt_tz))
t_h2 = not na(time("", h2, gmt_tz))
t_h3 = not na(time("", h3, gmt_tz))
t_h4 = not na(time("", h4, gmt_tz))
t_v1 = not na(time("", v1, gmt_tz))
t_v2 = not na(time("", v2, gmt_tz))
t_v3 = not na(time("", v3, gmt_tz))
t_v4 = not na(time("", v4, gmt_tz))
var d_sep_line = array.new_line()
var w_sep_line = array.new_line()
var m_sep_line = array.new_line()
var d_line = array.new_line()
var w_line = array.new_line()
var m_line = array.new_line()
var d_label = array.new_label()
var w_label = array.new_label()
var m_label = array.new_label()
var v1_line = array.new_line()
var v2_line = array.new_line()
var v3_line = array.new_line()
var v4_line = array.new_line()
var transparent = #ffffff00
var ext_current = ext_which == 'Most Recent'
var ext_past = ext_pivots == 'Past Mitigation'
update_dwm_info(dwm_info n) =>
if timeframe.change(n.tf)
n.ph := n.h
n.pl := n.l
n.o := open
n.h := high
n.l := low
else
n.h := math.max(high, n.h)
n.l := math.min(low, n.l)
if dhl or show_d_open
update_dwm_info(d_info)
if whl or show_w_open
update_dwm_info(w_info)
if mhl or show_m_open
update_dwm_info(m_info)
// ---------------------------------------- Variables & Constants --------------------------------------------------
// ---------------------------------------- Functions --------------------------------------------------
get_box_color(color c) =>
result = color.new(c, box_transparency)
get_text_color(color c) =>
result = color.new(c, text_transparency)
// ---------------------------------------- Functions --------------------------------------------------
// ---------------------------------------- Core Logic --------------------------------------------------
dwm_sep(string tf, bool use, line arr, color col) =>
if use
if timeframe.change(tf)
arr.unshift(line.new(bar_index, high*1.0001, bar_index, low, style = htf_style, width = htf_width, extend = extend.both, color = col))
if not sep_unlimited and arr.size() > max_days
arr.pop().delete()
dwm_open(string tf, bool use, line lns, label lbls, dwm_info n, color col) =>
if use
if timeframe.change(tf)
lns.unshift(line.new(time, n.o, time, n.o, xloc = xloc.bar_time, style = htf_style, width = htf_width, color = col))
lbls.unshift(label.new(time, n.o, tf + " OPEN", xloc = xloc.bar_time, style = label.style_label_left, color = transparent, textcolor = txt_color, size = lbl_size, text_font_family = font_style))
if not sep_unlimited and lns.size() > max_days
lns.pop().delete()
lbls.pop().delete()
else if lns.size() > 0
lns.get(0).set_x2(time)
lbls.get(0).set_x(time)
dwm_hl(string tf, bool use, dwm_hl hl, dwm_info n, color col) =>
if use
if timeframe.change(tf)
hl.hi_line.unshift(line.new(time, n.ph, time, n.ph, xloc = xloc.bar_time, style = htf_style, width = htf_width, color = col))
hl.lo_line.unshift(line.new(time, n.pl, time, n.pl, xloc = xloc.bar_time, style = htf_style, width = htf_width, color = col))
hl.hi_label.unshift(label.new(time, n.ph, "P"+tf+"H", xloc = xloc.bar_time, style = label.style_label_left, color = transparent, textcolor = txt_color, size = lbl_size, text_font_family = font_style))
hl.lo_label.unshift(label.new(time, n.pl, "P"+tf+"L", xloc = xloc.bar_time, style = label.style_label_left, color = transparent, textcolor = txt_color, size = lbl_size, text_font_family = font_style))
if not sep_unlimited and hl.hi_line.size() > max_days
hl.hi_line.pop().delete()
hl.lo_line.pop().delete()
hl.hi_label.pop().delete()
hl.lo_label.pop().delete()
else if hl.hi_line.size() > 0
hl.hi_line.get(0).set_x2(time)
hl.lo_line.get(0).set_x2(time)
hl.hi_label.get(0).set_x(time)
hl.lo_label.get(0).set_x(time)
dwm() =>
//if timeframe.in_seconds() <= hide_lines_sessions *60
if DWM_profile
if D_profile and timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_DO)
// Draw Daily separators, open lines, and high/low lines
dwm_sep("D", ds, d_sep_line, d_color)
dwm_open("D", show_d_open, d_line, d_label, d_info, d_color)
dwm_hl("D", dhl, d_hl, d_info, d_color)
// Draw Weekly and Monthly only if Daily profile allows it
if W_profile and timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_WO)
dwm_sep("W", ws, w_sep_line, w_color)
dwm_open("W", show_w_open, w_line, w_label, w_info, w_color)
dwm_hl("W", whl, w_hl, w_info, w_color)
if M_profile and timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_MO)
dwm_sep("M", ms, m_sep_line, m_color)
dwm_open("M", show_m_open, m_line, m_label, m_info, m_color)
dwm_hl("M", mhl, m_hl, m_info, m_color)
else if W_profile and timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_WO)
// Draw Weekly separators, open lines, and high/low lines
dwm_sep("W", ws, w_sep_line, w_color)
dwm_open("W", show_w_open, w_line, w_label, w_info, w_color)
dwm_hl("W", whl, w_hl, w_info, w_color)
// Draw Monthly only if Weekly profile allows it
if M_profile and timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_MO)
dwm_sep("M", ms, m_sep_line, m_color)
dwm_open("M", show_m_open, m_line, m_label, m_info, m_color)
dwm_hl("M", mhl, m_hl, m_info, m_color)
else if M_profile and timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_MO)
// Draw Monthly separators, open lines, and high/low lines
dwm_sep("M", ms, m_sep_line, m_color)
dwm_open("M", show_m_open, m_line, m_label, m_info, m_color)
dwm_hl("M", mhl, m_hl, m_info, m_color)
vline(bool use, bool t, line arr, color col) =>
if use
if t and not t
arr.unshift(line.new(bar_index, high*1.0001, bar_index, low, style = vl_style, width = vl_width, extend = extend.both, color = col))
vlines() =>
if hide_vline
if timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_v)
vline(use_v1, t_v1, v1_line, v1_color)
vline(use_v2, t_v2, v2_line, v2_color)
vline(use_v3, t_v3, v3_line, v3_color)
vline(use_v4, t_v4, v4_line, v4_color)
hz_line(bool use, bool t, hz hz, string txt, color col) =>
if use
if t and not t
hz.LN.unshift(line.new(bar_index, open, bar_index, open, style = hz_style, width = hz_width, color = col))
hz.LB.unshift(label.new(bar_index, open, txt, style = label.style_label_left, color = transparent, textcolor = txt_color, size = lbl_size, text_font_family = font_style))
array.unshift(hz.CO, false)
if not open_unlimited and hz.LN.size() > max_days
hz.LN.pop().delete()
hz.LB.pop().delete()
hz.CO.pop()
if not t and hz.CO.size() > 0
if not hz.CO.get(0)
hz.LN.get(0).set_x2(bar_index)
hz.LB.get(0).set_x(bar_index)
if (use_cutoff ? t_co : false)
hz.CO.set(0, true)
hz_lines() =>
if hide_hline
if timeframe.in_seconds("") <= timeframe.in_seconds(hide_lines_h)
hz_line(use_h1, t_h1, hz_1, h1_text, h1_color)
hz_line(use_h2, t_h2, hz_2, h2_text, h2_color)
hz_line(use_h3, t_h3, hz_3, h3_text, h3_color)
hz_line(use_h4, t_h4, hz_4, h4_text, h4_color)
del_kz(kz k) =>
if k._box.size() > max_days
k._box.pop().delete()
if k._hi_line.size() > max_days
k._hi_line.pop().delete()
k._lo_line.pop().delete()
k._hi_valid.pop()
k._lo_valid.pop()
if show_midpoints
k._md_line.pop().delete()
k._md_valid.pop()
if k._hi_label.size() > max_days
k._hi_label.pop().delete()
k._lo_label.pop().delete()
adjust_in_kz(kz kz, bool t) =>
if t
kz._box.get(0).set_right(time)
kz._box.get(0).set_top(math.max(kz._box.get(0).get_top(), high))
kz._box.get(0).set_bottom(math.min(kz._box.get(0).get_bottom(), low))
kz._range_current := kz._box.get(0).get_top() - kz._box.get(0).get_bottom()
if show_pivots and kz._hi_line.size() > 0
if high > kz._hi_line.get(0).get_y1()
kz._hi_line.get(0).set_xy1(time, high)
kz._hi_line.get(0).set_xy2(time, high)
if low < kz._lo_line.get(0).get_y1()
kz._lo_line.get(0).set_xy1(time, low)
kz._lo_line.get(0).set_xy2(time, low)
if show_midpoints
kz._md_line.get(0).set_xy1(time, math.avg(kz._hi_line.get(0).get_y2(), kz._lo_line.get(0).get_y2()))
kz._md_line.get(0).set_xy2(time, math.avg(kz._hi_line.get(0).get_y2(), kz._lo_line.get(0).get_y2()))
if show_labels and kz._hi_label.size() > 0
if high > kz._hi_label.get(0).get_y()
kz._hi_label.get(0).set_xy(time, high)
if low < kz._lo_label.get(0).get_y()
kz._lo_label.get(0).set_xy(time, low)
adjust_out_kz(kz kz, bool t) =>
if not t and kz._box.size() > 0
if t
array.unshift(kz._range_store, kz._range_current)
if kz._range_store.size() > range_avg
kz._range_store.pop()
if kz._box.size() > 0 and show_pivots
for i = 0 to kz._box.size() - 1
if not ext_current or (ext_current and i == 0)
if ext_past ? true : (kz._hi_valid.get(i) == true)
kz._hi_line.get(i).set_x2(time)
if high > kz._hi_line.get(i).get_y1() and kz._hi_valid.get(i) == true
if use_alerts and i == 0
alert("Broke "+kz._title+" High", alert.freq_once_per_bar)
kz._hi_valid.set(i, false)
else if (use_cutoff ? t_co : false)
kz._hi_valid.set(i, false)
if ext_past ? true : (kz._lo_valid.get(i) == true)
kz._lo_line.get(i).set_x2(time)
if low < kz._lo_line.get(i).get_y1() and kz._lo_valid.get(i) == true
if use_alerts and i == 0
alert("Broke "+kz._title+" Low", alert.freq_once_per_bar)
kz._lo_valid.set(i, false)
else if (use_cutoff ? t_co : false)
kz._lo_valid.set(i, false)
if show_midpoints
kz._md_line.get(i).set_x2(time)
else
break
manage_kz(kz kz, bool use, bool t, color c, string box_txt, string hi_txt, string lo_txt) =>
if timeframe.in_seconds("") <= timeframe.in_seconds(tf_limit) and use
if t and not t
_c = get_box_color(c)
_t = get_text_color(c)
kz._box.unshift(box.new(time, high, time, low, xloc = xloc.bar_time, border_color = show_kz ? _c : na, bgcolor = show_kz ? _c : na, text = (show_kz and show_kz_text) ? box_txt : na, text_color = _t))
if show_pivots
kz._hi_line.unshift(line.new(time, high, time, high, xloc = xloc.bar_time, style = kzp_style, color = c, width = kzp_width))
kz._lo_line.unshift(line.new(time, low, time, low, xloc = xloc.bar_time, style = kzp_style, color = c, width = kzp_width))
if show_midpoints
kz._md_line.unshift(line.new(time, math.avg(high, low), time, math.avg(high, low), xloc = xloc.bar_time, style = kzm_style, color = c, width = kzm_width))
array.unshift(kz._md_valid, true)
array.unshift(kz._hi_valid, true)
array.unshift(kz._lo_valid, true)
if show_labels
kz._hi_label.unshift(label.new(time, high, hi_txt, xloc = xloc.bar_time, color = transparent, textcolor = txt_color, style = label.style_label_down, size = lbl_size))
kz._lo_label.unshift(label.new(time, low, lo_txt, xloc = xloc.bar_time, color = transparent, textcolor = txt_color, style = label.style_label_up, size = lbl_size))
del_kz(kz)
adjust_in_kz(kz, t)
adjust_out_kz(kz, t)
manage_kz(as_kz, use_asia, t_as, as_color, as_txt, ash_str, asl_str)
manage_kz(lo_kz, use_london, t_lo, lo_color, lo_txt, loh_str, lol_str)
manage_kz(na_kz, use_nyam, t_na, na_color, na_txt, nah_str, nal_str)
manage_kz(nl_kz, use_nylu, t_nl, nl_color, nl_txt, nlh_str, nll_str)
manage_kz(np_kz, use_nypm, t_np, np_color, np_txt, nph_str, npl_str)
manage_kz(op_kz, use_loop, t_op, op_color, op_txt, oph_str, opl_str)
manage_kz(cl_kz, use_locl, t_cl, cl_color, cl_txt, clh_str, cll_str)
manage_kz(m1_kz, use_sb1, t_m1, m1_color, m1_txt, m1h_str, m1l_str)
manage_kz(m2_kz, use_sb2, t_m2, m2_color, m2_txt, m2h_str, m2l_str)
manage_kz(m3_kz, use_sb3, t_m3, m3_color, m3_txt, m3h_str, m3l_str)
dwm()
vlines()
hz_lines()
new_dow_time = dow_xloc == 'Midday' ? time - timeframe.in_seconds("D") / 2 * 1000 : time
new_day = dayofweek(new_dow_time, gmt_tz) != dayofweek(new_dow_time, gmt_tz)
var dow_top = dow_yloc == 'Top'
var sunday = "SUNDAY"
var monday = "MONDAY"
var tuesday = "TUESDAY"
var wednesday = "WEDNESDAY"
var thursday = "THURSDAY"
var friday = "FRIDAY"
plotchar(dow_labels and timeframe.isintraday and dayofweek(new_dow_time, gmt_tz) == 1 and new_day, location = dow_top ? location.top : location.bottom, char = "", textcolor = txt_color, text = sunday)
plotchar(dow_labels and timeframe.isintraday and dayofweek(new_dow_time, gmt_tz) == 2 and new_day, location = dow_top ? location.top : location.bottom, char = "", textcolor = txt_color, text = monday)
plotchar(dow_labels and timeframe.isintraday and dayofweek(new_dow_time, gmt_tz) == 3 and new_day, location = dow_top ? location.top : location.bottom, char = "", textcolor = txt_color, text = tuesday)
plotchar(dow_labels and timeframe.isintraday and dayofweek(new_dow_time, gmt_tz) == 4 and new_day, location = dow_top ? location.top : location.bottom, char = "", textcolor = txt_color, text = wednesday)
plotchar(dow_labels and timeframe.isintraday and dayofweek(new_dow_time, gmt_tz) == 5 and new_day, location = dow_top ? location.top : location.bottom, char = "", textcolor = txt_color, text = thursday)
plotchar(dow_labels and timeframe.isintraday and dayofweek(new_dow_time, gmt_tz) == 6 and new_day, location = dow_top ? location.top : location.bottom, char = "", textcolor = txt_color, text = friday)
get_min_days_stored() =>
store = array.new_int()
if as_kz._range_store.size() > 0
store.push(as_kz._range_store.size())
if lo_kz._range_store.size() > 0
store.push(lo_kz._range_store.size())
if na_kz._range_store.size() > 0
store.push(na_kz._range_store.size())
if nl_kz._range_store.size() > 0
store.push(nl_kz._range_store.size())
if np_kz._range_store.size() > 0
store.push(np_kz._range_store.size())
if op_kz._range_store.size() > 0
store.push(op_kz._range_store.size())
if cl_kz._range_store.size() > 0
store.push(cl_kz._range_store.size())
if m1_kz._range_store.size() > 0
store.push(m1_kz._range_store.size())
if m2_kz._range_store.size() > 0
store.push(m2_kz._range_store.size())
if m3_kz._range_store.size() > 0
store.push(m3_kz._range_store.size())
result = store.min()
set_table(table tbl, kz kz, int row, string txt, bool use, bool t, color col) =>
if use
table.cell(tbl, 0, row, txt, text_size = range_size, bgcolor = get_box_color(col), text_color = txt_color)
table.cell(tbl, 1, row, str.tostring(kz._range_current), text_size = range_size, bgcolor = t ? get_box_color(col) : na, text_color = txt_color)
if show_range_avg
table.cell(tbl, 2, row, str.tostring(kz._range_store.avg()), text_size = range_size, text_color = txt_color)
if show_range and barstate.islast
var tbl = table.new(range_pos, 10, 10, chart.bg_color, chart.fg_color, 2, chart.fg_color, 1)
table.cell(tbl, 0, 0, "Killzone", text_size = range_size, text_color = txt_color)
table.cell(tbl, 1, 0, "Range", text_size = range_size, text_color = txt_color)
if show_range_avg
table.cell(tbl, 2, 0, "Avg ("+str.tostring(get_min_days_stored())+")", text_size = range_size, text_color = txt_color)
set_table(tbl, as_kz, 1, as_txt, use_asia, t_as, as_color)
set_table(tbl, lo_kz, 2, lo_txt, use_london, t_lo, lo_color)
set_table(tbl, na_kz, 3, na_txt, use_nyam, t_na, na_color)
set_table(tbl, nl_kz, 4, nl_txt, use_nylu, t_nl, nl_color)
set_table(tbl, np_kz, 5, np_txt, use_nypm, t_np, np_color)
set_table(tbl, op_kz, 6, op_txt, use_loop, t_op, op_color)
set_table(tbl, cl_kz, 7, cl_txt, use_locl, t_cl, cl_color)
set_table(tbl, m1_kz, 8, m1_txt, use_sb1, t_m1, m1_color)
set_table(tbl, m2_kz, 9, m2_txt, use_sb2, t_m2, m2_color)
set_table(tbl, m3_kz, 10, m3_txt, use_sb3, t_m3, m3_color)
// ---------------------------------------- Core Logic --------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------//
// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// ©Mutharasan2
// Prev Published: 608
// Curr Published: 907
//@version=5
//2nd indicator("ICT HTF Candles (fadi)", overlay=true, max_boxes_count = 500, max_lines_count = 500, max_bars_back = 5000)
type Candle
float o
float c
float h
float l
int o_idx
int c_idx
int h_idx
int l_idx
box body
line wick_up
line wick_down
type Trace
line o
line c
line h
line l
label o_l
label c_l
label h_l
label l_l
type Imbalance
box b
int idx
type CandleSettings
bool show
string htf
int max_display
type Settings
int max_sets
color bull_body
color bull_border
color bull_wick
color bear_body
color bear_border
color bear_wick
int offset
int buffer
int htf_buffer
int width
bool trace_show
color trace_o_color
string trace_o_style
int trace_o_size
color trace_c_color
string trace_c_style
int trace_c_size
color trace_h_color
string trace_h_style
int trace_h_size
color trace_l_color
string trace_l_style
int trace_l_size
string trace_anchor
bool label_show
color label_color
string label_size
bool fvg_show
color fvg_color
bool vi_show
color vi_color
bool htf_label_show
color htf_label_color
string htf_label_size
bool htf_timer_show
color htf_timer_color
string htf_timer_size
string level
string liquidity_open_style
string liquidity_claimed_style
color liquidity_open_color
color liquidity_claimed_color
int liquidity_open_size
int liquidity_claimed_size
int max_lines
int extend
type CandleSet
Candle candles
Imbalance imbalances
CandleSettings settings
label tfName
label tfTimer
type Helper
string name = "Helper"
Settings settings = Settings.new()
var CandleSettings SettingsHTF1 = CandleSettings.new()
var CandleSettings SettingsHTF2 = CandleSettings.new()
var CandleSettings SettingsHTF3 = CandleSettings.new()
var CandleSettings SettingsHTF4 = CandleSettings.new()
var CandleSettings SettingsHTF5 = CandleSettings.new()
var CandleSettings SettingsHTF6 = CandleSettings.new()
var Candle candles_1 = array.new(0)
var Candle candles_2 = array.new(0)
var Candle candles_3 = array.new(0)
var Candle candles_4 = array.new(0)
var Candle candles_5 = array.new(0)
var Candle candles_6 = array.new(0)
var Imbalance imbalances_1 = array.new()
var Imbalance imbalances_2 = array.new()
var Imbalance imbalances_3 = array.new()
var Imbalance imbalances_4 = array.new()
var Imbalance imbalances_5 = array.new()
var Imbalance imbalances_6 = array.new()
var CandleSet htf1 = CandleSet.new()
htf1.settings := SettingsHTF1
htf1.candles := candles_1
htf1.imbalances := imbalances_1
var CandleSet htf2 = CandleSet.new()
htf2.settings := SettingsHTF2
htf2.candles := candles_2
htf2.imbalances := imbalances_2
var CandleSet htf3 = CandleSet.new()
htf3.settings := SettingsHTF3
htf3.candles := candles_3
htf3.imbalances := imbalances_3
var CandleSet htf4 = CandleSet.new()
htf4.settings := SettingsHTF4
htf4.candles := candles_4
htf4.imbalances := imbalances_4
var CandleSet htf5 = CandleSet.new()
htf5.settings := SettingsHTF5
htf5.candles := candles_5
htf5.imbalances := imbalances_5
var CandleSet htf6 = CandleSet.new()
htf6.settings := SettingsHTF6
htf6.candles := candles_6
htf6.imbalances := imbalances_6
//+------------------------------------------------------------------------------------------------------------+//
//+--- Settings ---+//
//+------------------------------------------------------------------------------------------------------------+//
htf1.settings.show := input.bool(false, "HTF 1 ", inline="htf1")
htf_1 = input.timeframe("60", "", inline="htf1")
htf1.settings.htf := htf_1
htf1.settings.max_display := input.int(1, "", inline="htf1")
htf2.settings.show := input.bool(false, "HTF 2 ", inline="htf2")
htf_2 = input.timeframe("240", "", inline="htf2")
htf2.settings.htf := htf_2
htf2.settings.max_display := input.int(1, "", inline="htf2")
htf3.settings.show := input.bool(true, "HTF 3 ", inline="htf3")
htf_3 = input.timeframe("1D", "", inline="htf3")
htf3.settings.htf := htf_3
htf3.settings.max_display := input.int(1, "", inline="htf3")
htf4.settings.show := input.bool(true, "HTF 4 ", inline="htf4")
htf_4 = input.timeframe("1W", "", inline="htf4")
htf4.settings.htf := htf_4
htf4.settings.max_display := input.int(1, "", inline="htf4")
htf5.settings.show := input.bool(true, "HTF 5 ", inline="htf5")
htf_5 = input.timeframe("1M", "", inline="htf5")
htf5.settings.htf := htf_5
htf5.settings.max_display := input.int(1, "", inline="htf5")
htf6.settings.show := input.bool(false, "HTF 6 ", inline="htf6")
htf_6 = input.timeframe("3M", "", inline="htf6")
htf6.settings.htf := htf_6
htf6.settings.max_display := input.int(1, "", inline="htf6")
settings.max_sets := input.int(6, "Limit to next HTFs only", minval=1, maxval=6)
settings.bull_body := input.color(color.rgb(76, 175, 80), "Body ", inline="body")
settings.bear_body := input.color(color.rgb(0, 0, 0), "", inline="body")
settings.bull_border := input.color(color.rgb(93, 96, 107), "Borders", inline="borders")
settings.bear_border := input.color(color.rgb(0, 0, 0), "", inline="borders")
settings.bull_wick := input.color(color.rgb(93, 96, 107), "Wick ", inline="wick")
settings.bear_wick := input.color(color.rgb(93, 96, 107), "", inline="wick")
settings.offset := input.int(10, "padding from current candles", minval = 1)
settings.buffer := input.int(1, "space between candles", minval = 1, maxval = 4)
settings.htf_buffer := input.int(10, "space between Higher Timeframes", minval = 1, maxval = 10)
settings.width := input.int(4, "Candle Width", minval = 1, maxval = 10)*2
settings.htf_label_show := input.bool(false, "HTF Label ", inline="HTFlabel")
settings.htf_label_color := input.color(color.rgb(0, 0, 0), "", inline='HTFlabel')
settings.htf_label_size := input.string(size.tiny, "", , inline="HTFlabel")
settings.htf_timer_show := input.bool(false, "Remaining time ", inline="timer")
settings.htf_timer_color := input.color(color.rgb(0, 0, 0), "", inline='timer')
settings.htf_timer_size := input.string(size.tiny, "", , inline="timer")
settings.fvg_show := input.bool(true, "Fair Value Gap ", group="Imbalance", inline="fvg")
settings.fvg_color := input.color(color.new(color.gray, 80), "", inline='fvg', group="Imbalance")
settings.vi_show := input.bool(true, "Volume Imbalance", group="Imbalance", inline="vi")
settings.vi_color := input.color(color.new(color.red, 50), "", inline='vi', group="Imbalance")
settings.trace_show := input.bool(false, "Trace lines", group="trace")
settings.trace_o_color := input.color(color.rgb(0, 0, 0), "Open ", inline='1', group="trace")
settings.trace_o_style := input.string('····', '', options = , inline='1', group="trace")
settings.trace_o_size := input.int(1, '', options = , inline='1', group="trace")
settings.trace_c_color := input.color(color.rgb(0, 0, 0), "Close ", inline='2', group="trace")
settings.trace_c_style := input.string('····', '', options = , inline='2', group="trace")
settings.trace_c_size := input.int(1, '', options = , inline='2', group="trace")
settings.trace_h_color := input.color(color.rgb(0, 0, 0), "High ", inline='3', group="trace")
settings.trace_h_style := input.string('····', '', options = , inline='3', group="trace")
settings.trace_h_size := input.int(1, '', options = , inline='3', group="trace")
settings.trace_l_color := input.color(color.rgb(0, 0, 0), "Low ", inline='4', group="trace")
settings.trace_l_style := input.string('····', '', options = , inline='4', group="trace")
settings.trace_l_size := input.int(1, '', options = , inline='4', group="trace")
settings.trace_anchor := input.string("First Timeframe", "Anchor to", options= , group="trace")
settings.label_show := input.bool(false, "Price Label ", inline="label")
settings.label_color := input.color(color.rgb(0, 0, 0), "", inline='label')
settings.label_size := input.string(size.small, "", , inline="label")
//+------------------------------------------------------------------------------------------------------------+//
//+--- Variables ---+//
//+------------------------------------------------------------------------------------------------------------+//
Helper helper = Helper.new()
var Trace trace = Trace.new()
color color_transparent = #ffffff00
//+------------------------------------------------------------------------------------------------------------+//
//+--- Internal Functions ---+//
//+------------------------------------------------------------------------------------------------------------+//
method LineStyle(Helper helper, string style) =>
helper.name := style
out = switch style
'----' => line.style_dashed
'····' => line.style_dotted
=> line.style_solid
method ValidTimeframe(Helper helper, string HTF) =>
helper.name := HTF
if timeframe.in_seconds(HTF) >= timeframe.in_seconds("D") and timeframe.in_seconds(HTF) > timeframe.in_seconds()
true
else
n1 = timeframe.in_seconds()
n2 = timeframe.in_seconds(HTF)
n3 = n1 % n2
(n1 < n2 and math.round(n2/n1) == n2/n1)
method RemainingTime(Helper helper, string HTF) =>
helper.name := HTF
if barstate.isrealtime
timeRemaining = (time_close(HTF) - timenow)/1000
days = math.floor(timeRemaining / 86400)
hours = math.floor((timeRemaining - (days*86400)) / 3600)
minutes = math.floor((timeRemaining - (days*86400) - (hours*3600))/ 60)
seconds = math.floor(timeRemaining - (days*86400) - (hours*3600) - (minutes*60))
r = str.tostring(seconds, "00")
if minutes > 0 or hours > 0 or days > 0
r := str.tostring(minutes, "00") + ":" + r
if hours > 0 or days > 0
r := str.tostring(hours, "00") + ":" + r
if days > 0
r := str.tostring(days) + "D " + r
r
else
"n/a"
method HTFName(Helper helper, string HTF) =>
helper.name := "HTFName"
formatted = HTF
seconds = timeframe.in_seconds(HTF)
if seconds < 60
formatted := str.tostring(seconds) + "s"
else if (seconds / 60) < 60
formatted := str.tostring((seconds/60)) + "m"
else if (seconds/60/60) < 24
formatted := str.tostring((seconds/60/60)) + "H"
formatted
method HTFEnabled(Helper helper) =>
helper.name := "HTFEnabled"
int enabled =0
enabled += htf1.settings.show ? 1 : 0
enabled += htf2.settings.show ? 1 : 0
enabled += htf3.settings.show ? 1 : 0
enabled += htf4.settings.show ? 1 : 0
enabled += htf5.settings.show ? 1 : 0
enabled += htf6.settings.show ? 1 : 0
int last = math.min(enabled, settings.max_sets)
last
method CandleSetHigh(Helper helper, Candle candles, float h) =>
helper.name := "CandlesSetHigh"
float _h = h
if array.size(candles) > 0
for i = 0 to array.size(candles)-1
Candle c = array.get(candles, i)
if c.h > _h
_h := c.h
_h
method CandlesHigh(Helper helper, Candle candles) =>
helper.name := "CandlesHigh"
h = 0.0
int cnt = 0
int last = helper.HTFEnabled()
if htf1.settings.show and helper.ValidTimeframe(htf1.settings.htf)
h := helper.CandleSetHigh(htf1.candles, h)
cnt += 1
if htf2.settings.show and helper.ValidTimeframe(htf2.settings.htf) and cnt < last
h := helper.CandleSetHigh(htf2.candles, h)
cnt +=1
if htf3.settings.show and helper.ValidTimeframe(htf3.settings.htf) and cnt < last
h := helper.CandleSetHigh(htf3.candles, h)
cnt += 1
if htf4.settings.show and helper.ValidTimeframe(htf4.settings.htf) and cnt < last
h := helper.CandleSetHigh(htf4.candles, h)
cnt += 1
if htf5.settings.show and helper.ValidTimeframe(htf5.settings.htf) and cnt < last
h := helper.CandleSetHigh(htf5.candles, h)
cnt += 1
if htf6.settings.show and helper.ValidTimeframe(htf6.settings.htf) and cnt < last
h := helper.CandleSetHigh(htf6.candles, h)
h
if array.size(candles) > 0
for i = 0 to array.size(candles)-1
Candle c = array.get(candles, i)
if c.h > h
h := c.h
h
method Reorder(CandleSet candleSet, int offset) =>
size = candleSet.candles.size()
if size > 0
for i = size-1 to 0
Candle candle = candleSet.candles.get(i)
t_buffer = offset + ((settings.width+settings.buffer)*(size-i-1))
box.set_left(candle.body, bar_index + t_buffer)
box.set_right(candle.body, bar_index + settings.width + t_buffer)
line.set_x1(candle.wick_up, bar_index+((settings.width)/2) + t_buffer)
line.set_x2(candle.wick_up, bar_index+((settings.width)/2) + t_buffer)
line.set_x1(candle.wick_down, bar_index+((settings.width)/2) + t_buffer)
line.set_x2(candle.wick_down, bar_index+((settings.width)/2) + t_buffer)
candleSet
top = helper.CandlesHigh(candleSet.candles)
left = bar_index + offset + ((settings.width+settings.buffer)*(size-1))/2
if settings.htf_label_show
var label l = candleSet.tfName
string lbl = helper.HTFName(candleSet.settings.htf)
if settings.htf_timer_show
lbl += "\n"
if not na(l)
label.set_xy(l, left, top)
else
l := label.new(left, top, lbl, color=color_transparent, textcolor = settings.htf_label_color, style=label.style_label_down, size = settings.htf_label_size)
if settings.htf_timer_show
var label t = candleSet.tfTimer
string tmr = "(" + helper.RemainingTime(candleSet.settings.htf) + ")"
if not na(t)
label.set_xy(t, left, top)
else
t := label.new(left, top, tmr, color=color_transparent, textcolor = settings.htf_timer_color, style=label.style_label_down, size = settings.htf_timer_size)
candleSet
method FindImbalance(CandleSet candleSet) =>
if barstate.isrealtime or barstate.islast
if candleSet.imbalances.size() > 0
for i = candleSet.imbalances.size()-1 to 0
Imbalance del = candleSet.imbalances.get(i)
box.delete(del.b)
candleSet.imbalances.pop()
if candleSet.candles.size() > 3 and settings.fvg_show
for i = 1 to candleSet.candles.size() -3
candle1 = candleSet.candles.get(i)
candle2 = candleSet.candles.get(i+2)
candle3 = candleSet.candles.get(i+1)
if (candle1.l > candle2.h and math.min(candle1.o, candle1.c) > math.max(candle2.o, candle2.c))
Imbalance imb = Imbalance.new()
imb.b := box.new(box.get_left(candle2.body), candle2.h, box.get_right(candle1.body), candle1.l, bgcolor=settings.fvg_color, border_color = color_transparent, xloc=xloc.bar_index)
candleSet.imbalances.push(imb)
if (candle1.h < candle2.l and math.max(candle1.o, candle1.c) < math.min(candle2.o, candle2.c))
Imbalance imb = Imbalance.new()
imb.b := box.new(box.get_right(candle1.body), candle1.h, box.get_left(candle2.body), candle2.l, bgcolor=settings.fvg_color, border_color = color_transparent)
candleSet.imbalances.push(imb)
box temp = box.copy(candle3.body)
box.delete(candle3.body)
candle3.body := temp
if candleSet.candles.size() > 2 and settings.vi_show
for i = 1 to candleSet.candles.size() -2
candle1 = candleSet.candles.get(i)
candle2 = candleSet.candles.get(i+1)
if (candle1.l < candle2.h and math.min(candle1.o, candle1.c) > math.max(candle2.o, candle2.c))
Imbalance imb = Imbalance.new()
imb.b := box.new(box.get_left(candle2.body), math.min(candle1.o, candle1.c), box.get_right(candle1.body), math.max(candle2.o, candle2.c), bgcolor=settings.vi_color, border_color = color_transparent)
candleSet.imbalances.push(imb)
if (candle1.h > candle2.l and math.max(candle1.o, candle1.c) < math.min(candle2.o, candle2.c))
Imbalance imb = Imbalance.new()
imb.b := box.new(box.get_right(candle1.body), math.min(candle2.o, candle2.c), box.get_left(candle2.body), math.max(candle1.o, candle1.c), bgcolor=settings.vi_color, border_color = color_transparent)
candleSet.imbalances.push(imb)
candleSet
method Monitor(CandleSet candleSet) =>
HTFBarTime = time(candleSet.settings.htf)
isNewHTFCandle = ta.change(HTFBarTime)
if isNewHTFCandle
Candle candle = Candle.new()
candle.o := open
candle.c := close
candle.h := high
candle.l := low
candle.o_idx := bar_index
candle.c_idx := bar_index
candle.h_idx := bar_index
candle.l_idx := bar_index
bull = candle.c > candle.o
candle.body := box.new(bar_index, math.max(candle.o, candle.c), bar_index+2, math.min(candle.o, candle.c), bull ? settings.bull_border : settings.bear_border, 1, bgcolor = bull ? settings.bull_body : settings.bear_body)
candle.wick_up := line.new(bar_index+1, candle.h, bar_index, math.max(candle.o, candle.c), color=bull ? settings.bull_wick : settings.bear_wick)
candle.wick_down := line.new(bar_index+1, math.min(candle.o, candle.c), bar_index, candle.l, color=bull ? settings.bull_wick : settings.bear_wick)
candleSet.candles.unshift(candle)
if candleSet.candles.size() > candleSet.settings.max_display
Candle delCandle = array.pop(candleSet.candles)
box.delete(delCandle.body)
line.delete(delCandle.wick_up)
line.delete(delCandle.wick_down)
candleSet
method Update(CandleSet candleSet, int offset, bool showTrace) =>
if candleSet.candles.size() > 0
Candle candle = candleSet.candles.first()
candle.h_idx := high > candle.h ? bar_index : candle.h_idx
candle.h := high > candle.h ? high : candle.h
candle.l_idx := low < candle.l ? bar_index : candle.l_idx
candle.l := low < candle.l ? low : candle.l
candle.c := close
candle.c_idx := bar_index
bull = candle.c > candle.o
box.set_top(candle.body, candle.o)
box.set_bottom(candle.body, candle.c)
box.set_bgcolor(candle.body, bull ? settings.bull_body : settings.bear_body)
box.set_border_color(candle.body, bull ? settings.bull_border : settings.bear_border)
line.set_color(candle.wick_up, bull ? settings.bull_wick : settings.bear_wick)
line.set_color(candle.wick_down, bull ? settings.bull_wick : settings.bear_wick)
line.set_y1(candle.wick_up, candle.h)
line.set_y2(candle.wick_up, math.max(candle.o, candle.c))
line.set_y1(candle.wick_down, candle.l)
line.set_y2(candle.wick_down, math.min(candle.o, candle.c))
if barstate.isrealtime or barstate.islast
candleSet.Reorder(offset)
if settings.trace_show and showTrace
if bar_index - candle.o_idx < 5000
if na(trace.o)
trace.o := line.new(candle.o_idx, candle.o, box.get_left(candle.body), candle.o, xloc= xloc.bar_index, color=settings.trace_o_color, style= helper.LineStyle(settings.trace_o_style), width=settings.trace_o_size)
else
line.set_xy1(trace.o, candle.o_idx, candle.o)
line.set_xy2(trace.o, box.get_left(candle.body), candle.o)
if settings.label_show
if na(trace.o_l)
trace.o_l := label.new(box.get_right(candle.body), candle.o, str.tostring(candle.o), textalign = text.align_center, style=label.style_label_left, size=settings.label_size, color=color_transparent, textcolor=settings.label_color)
else
label.set_xy(trace.o_l, box.get_right(candle.body), candle.o)
label.set_text(trace.o_l, str.tostring(candle.o))
if bar_index - candle.c_idx < 5000
if na(trace.c)
trace.c := line.new(candle.c_idx, candle.c, box.get_left(candle.body), candle.c, xloc= xloc.bar_index, color=settings.trace_c_color, style=helper.LineStyle(settings.trace_c_style), width=settings.trace_c_size)
else
line.set_xy1(trace.c, candle.c_idx, candle.c)
line.set_xy2(trace.c, box.get_left(candle.body), candle.c)
if settings.label_show
if na(trace.c_l)
trace.c_l := label.new(box.get_right(candle.body), candle.c, str.tostring(candle.c), textalign = text.align_center, style=label.style_label_left, size=settings.label_size, color=color_transparent, textcolor=settings.label_color)
else
label.set_xy(trace.c_l, box.get_right(candle.body), candle.c)
label.set_text(trace.c_l, str.tostring(candle.c))
if bar_index - candle.h_idx < 5000
if na(trace.h)
trace.h := line.new(candle.h_idx, candle.h, line.get_x1(candle.wick_up), candle.h, xloc= xloc.bar_index, color=settings.trace_h_color, style=helper.LineStyle(settings.trace_h_style), width=settings.trace_h_size)
else
line.set_xy1(trace.h, candle.h_idx, candle.h)
line.set_xy2(trace.h, line.get_x1(candle.wick_up), candle.h)
if settings.label_show
if na(trace.h_l)
trace.h_l := label.new(box.get_right(candle.body), candle.h, str.tostring(candle.h), textalign = text.align_center, style=label.style_label_left, size=settings.label_size, color=color_transparent, textcolor=settings.label_color)
else
label.set_xy(trace.h_l, box.get_right(candle.body), candle.h)
label.set_text(trace.h_l, str.tostring(candle.o))
if bar_index - candle.l_idx < 5000
if na(trace.l)
trace.l := line.new(candle.l_idx, candle.l, line.get_x1(candle.wick_down), candle.l, xloc= xloc.bar_index, color=settings.trace_l_color, style=helper.LineStyle(settings.trace_l_style), width=settings.trace_l_size)
else
line.set_xy1(trace.l, candle.l_idx, candle.l)
line.set_xy2(trace.l, line.get_x1(candle.wick_down), candle.l)
if settings.label_show
if na(trace.l_l)
trace.l_l := label.new(box.get_right(candle.body), candle.l, str.tostring(candle.l), textalign = text.align_center, style=label.style_label_left, size=settings.label_size, color=color_transparent, textcolor=settings.label_color)
else
label.set_xy(trace.l_l, box.get_right(candle.body), candle.l)
label.set_text(trace.l_l, str.tostring(candle.o))
candleSet
int cnt = 0
int last = helper.HTFEnabled()
int offset = settings.offset
if htf1.settings.show and helper.ValidTimeframe(htf1.settings.htf)
bool showTrace = false
if settings.trace_anchor == "First Timeframe"
showTrace := true
if settings.trace_anchor == "Last Timeframe" and settings.max_sets == 1
showTrace := true
htf1.Monitor().Update(offset, showTrace).FindImbalance()
cnt +=1
offset += cnt > 0 ? (htf1.candles.size() * settings.width) + (htf1.candles.size() > 0 ? htf1.candles.size()-1 * settings.buffer : 0) + settings.htf_buffer : 0
if htf2.settings.show and helper.ValidTimeframe(htf2.settings.htf) and cnt < last
bool showTrace = false
if settings.trace_anchor == "First Timeframe" and cnt == 0
showTrace := true
if settings.trace_anchor == "Last Timeframe" and cnt == last-1
showTrace := true
htf2.Monitor().Update(offset, showTrace).FindImbalance()
cnt+=1
offset += cnt > 0 ? (htf2.candles.size() * settings.width) + (htf2.candles.size() > 0 ? htf2.candles.size()-1 * settings.buffer : 0) + settings.htf_buffer : 0
if htf3.settings.show and helper.ValidTimeframe(htf3.settings.htf) and cnt < last
bool showTrace = false
if settings.trace_anchor == "First Timeframe" and cnt == 0
showTrace := true
if settings.trace_anchor == "Last Timeframe" and cnt == last-1
showTrace := true
htf3.Monitor().Update(offset, showTrace).FindImbalance()
cnt+=1
offset += cnt > 0 ? (htf3.candles.size() * settings.width) + (htf3.candles.size() > 0 ? htf3.candles.size()-1 * settings.buffer : 0) + settings.htf_buffer : 0
if htf4.settings.show and helper.ValidTimeframe(htf4.settings.htf) and cnt < last
bool showTrace = false
if settings.trace_anchor == "First Timeframe" and cnt == 0
showTrace := true
if settings.trace_anchor == "Last Timeframe" and cnt == last-1
showTrace := true
htf4.Monitor().Update(offset, showTrace).FindImbalance()
cnt+=1
offset += cnt > 0 ? (htf4.candles.size() * settings.width) + (htf4.candles.size() > 0 ? htf4.candles.size()-1 * settings.buffer : 0) + settings.htf_buffer : 0
if htf5.settings.show and helper.ValidTimeframe(htf5.settings.htf) and cnt < last
bool showTrace = false
if settings.trace_anchor == "First Timeframe" and cnt == 0
showTrace := true
if settings.trace_anchor == "Last Timeframe" and cnt == last-1
showTrace := true
htf5.Monitor().Update(offset, showTrace).FindImbalance()
cnt+=1
offset += cnt > 0 ? (htf5.candles.size() * settings.width) + (htf5.candles.size() > 0 ? htf5.candles.size()-1 * settings.buffer : 0) + settings.htf_buffer : 0
if htf6.settings.show and helper.ValidTimeframe(htf6.settings.htf) and cnt < last
bool showTrace = false
if settings.trace_anchor == "First Timeframe" and cnt == 0
showTrace := true
if settings.trace_anchor == "Last Timeframe"
showTrace := true
htf6.Monitor().Update(offset, showTrace).FindImbalance()
//------------------------------------------------------------------------------------------------//
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// ©Mutharasan12
//@version=5
//indicator("Notes, Watermark",overlay = true)
// STICKY NOTES #BEGIN --------------------------------------------------------------------------------------------------------------------------------------------------------//
var StickyNote_settings = "STICKY NOTES --------------------------------------------------"
showStickyNotes = input.bool(false, "Show Sticky Notes?", group = StickyNote_settings)
if showStickyNotes
stickynote01 = input.text_area("Your Note Here","NOTES",group = StickyNote_settings)
tl1 = input.string("top", title = "Sticky Note Position (Vertical)", options = , group = StickyNote_settings)
tl2 = input.string("right", title = "Sticky Note Position (Horizontal)", options = , group = StickyNote_settings)
font_size = input.string("Normal", title = "Sticky Note Text Size", options = , group = StickyNote_settings)
font_type = input.string("Default", title = "Font Type", options = , group = StickyNote_settings)
font_color = input.color(color.rgb(0,0,0,0), title = "Note Color", inline = 'nc', group = StickyNote_settings)
note_color = input.color(color (color.rgb(0,0,0,100)), title = "Note Background", inline='nc', group = StickyNote_settings)
selected_font = font_type == "Default" ? font.family_default : font.family_monospace
selected_size = font_size == "Auto" ? size.auto : font_size == "Huge" ? size.huge : font_size == "Large" ? size.large : font_size == "Normal" ? size.normal : font_size == "Small" ? size.small : font_size == "Tiny" ? size.tiny : na
var table t1 = table.new(tl1 + "_" + tl2, 1, 10)
if barstate.islast
if not na(stickynote01) and stickynote01 != ""
table.cell(t1,0,0, text = stickynote01 , bgcolor = note_color, text_color = font_color, text_halign = text.align_left, text_size = selected_size, text_font_family = selected_font)
// STICKY NOTES #END ----------------------------------------------------------------------------------------------------------------------------------------------------------//
// WATERMARK #BEGIN --
ORB - Openning Range BreakoutORB - Opening Range Breakout (Indicator)
This indicator visualizes the Opening Range Breakout (ORB) for the New York market session (9:30 AM – 4:00 PM NY), highlighting the High and Low of the first 5 minutes of the session.
Key Features:
Automatically calculates the High and Low of the 9:30 AM candle and updates if subsequent candles expand the range within the first 5 minutes.
Plots invisible lines representing the High and Low of the opening range throughout the session.
Fills the area between High and Low with a semi-transparent background, clearly showing the opening range zone.
Works on any intraday timeframe and adapts automatically to the NY session.
Perfect for breakout strategies, visually marking early support and resistance zones.
How to Use:
The shaded area between High and Low indicates the opening range.
Traders can watch for breakouts above the High or breakdowns below the Low for potential entry signals.
Can be combined with trend or volume indicators for confirmation.
Notes:
The session is automatically calculated using New York time.
Background transparency can be adjusted to your preference.
MACD Volume VWAP Scalping (2min) by Obiii📘 Strategy Description (for TradingView)
MACD Volume VWAP Scalping Strategy (2-Minute Intraday Momentum)
This strategy is designed for scalpers and short-term intraday traders who focus on capturing small, high-probability moves during the most active hours of the trading session — typically between 9:45 AM and 11:30 AM (New York time).
The system combines three key momentum confirmations:
MACD crossovers to detect short-term trend shifts,
Volume spikes to validate real market participation, and
VWAP / EMA alignment to filter trades in the direction of the prevailing intraday trend.
🔹 Entry Logic
Long Entry:
MACD line crosses above the signal line
Both MACD and Signal are above zero
Current volume > average of the last 10 candles
Price is above VWAP and (optionally) above EMA 9 and EMA 20
Short Entry:
MACD line crosses below the signal line
Both MACD and Signal are below zero
Current volume > average of the last 10 candles
Price is below VWAP and (optionally) below EMA 9 and EMA 20
🎯 Exit Logic
Fixed Take Profit: +0.25%
Fixed Stop Loss: -0.15% to -0.20%
Optionally, switch to the 5-minute chart after entry to monitor momentum and manage exits more smoothly.
⚙️ Recommended Settings
Timeframe: 2 minutes (entries), 5 minutes (monitoring)
Market Session: 9:45 AM – 11:30 AM EST
Assets: Highly liquid instruments such as SPY, QQQ, NVDA, TSLA, AAPL, or large-cap momentum stocks.
💡 Notes
This is a momentum-based scalping strategy — precision and discipline are key.
It performs best in high-volume environments where clear direction emerges after the morning volatility settles.
The system can be fine-tuned for different profit targets, MACD settings, or volume thresholds depending on volatility.






















