Price Changes Relative to Previous CloseThis script displays the price values in percentages (open, high, low, and close) of the current bars relative to the previous bar's close. This helps visualize the amplitude of price movements. Depending on the user's choice, the display can be in the form of candles or bars.
Main steps of the script
Retrieves the previous bar's closing price.
Calculates the percentage changes in the open, high, low, and close prices of the current bar relative to the previous bar's close.
Sets the colors for bullish (green) and bearish (red) candles/bars.
Allows the user to choose the display type (candles or bars).
Displays the candles or bars on the chart.
Creates arrays to store the highs and lows of the last 252 bars and filters them based on the current bar's close.
Calculates the average values of the highs and lows for the filtered bars and displays them on the chart.
Изменение цен относительно предыдущего закрытия
Этот скрипт отображает значения цен в процентах (открытие, высокие, низкие и закрытие) текущих баров относительно закрытия предыдущего бара. Это помогает визуализировать амплитуду движений цен. В зависимости от выбора пользователя, отображение может быть в виде свечей или баров.
Основные шаги скрипта
Получает цену закрытия предыдущего бара.
Вычисляет процентные изменения открытой, высокой, низкой и закрытой цен текущего бара относительно закрытия предыдущего бара.
Настраивает цвета для бычьих (зелёных) и медвежьих (красных) свечей/баров.
Позволяет пользователю выбирать тип отображения (свечи или бары).
Отображает свечи или бары на графике.
Создаёт массивы для хранения максимумов и минимумов за последние 252 бара и фильтрует их в зависимости от закрытия текущего бара.
Вычисляет средние значения максимумов и минимумов для отфильтрованных баров и отображает их на графике.
Analisi trend
Enhanced Market Opportunity StrategyThe Enhanced Market Opportunity Strategy is a versatile Pine Script designed for trading various asset classes (forex, crypto, indices, etc.) and timeframes. It combines technical indicators like MACD, RSI, and EMA with dynamic risk management tools such as ATR-based stop-loss and take-profit levels. The script highlights buy/sell signals and includes features like partial profit targets, trailing stops, and performance tracking (wins/losses). It also provides customizable alerts and labels for price movements (+100 points) for effective trade execution
TAPDA Hourly Open Lines (Candle Body Box)-What is TAPDA?
TAPDA (Time and Price Displacement Analysis) is based on the belief that markets are driven by algorithms that respond to key time-based price levels, such as session opens. Traders who follow TAPDA track these levels to anticipate price movements, reversals, and breakouts, aligning their strategies with the patterns left by these underlying algorithms. By plotting lines at specific hourly opens, the indicator allows traders to visualize where the market may react, providing a structured way to trade alongside the algorithmic flow.
***************
**Sauce Alert** "TAPDA levels essentially act like algorithmic support and resistance" By plotting these hourly opens, the TAPDA Hourly Open Lines indicator helps traders track where algorithms might engage with the market.
***************
-How It Works:
The indicator draws a "candle body box" at selected hours, marking the open and close prices to highlight price ranges at significant times. This creates dynamic zones that reflect market sentiment and structure throughout the day. TAPDA levels are commonly respected by price, making them useful for identifying potential entry points, stop placements, and trend reversals.
-Key Features:
Customizable Hour Levels – Enable or disable specific times to fit your trading approach.
Color & Label Control – Assign unique colors and labels to each hour for better visualization.
Line Extension – Project lines for up to 24 hours into the future to track key levels.
Dynamic Cleanup – Old lines automatically delete to maintain chart clarity.
Manual Time Offset – Adjust for broker or server time zone differences.
-Current Development:
This indicator is still in development, with further updates planned to enhance functionality and customization. If you find this script helpful, feel free to copy the code and stay tuned for new features and improvements!
S&P 500 E-Mini TrackerThis script generates a reference price for the S&P 500 ETF - SPY based on the current price of the ES contract, which is an E-Mini Futures contract representing the S&P 500 index. The indicator plots this reference price on the chart, providing a unique view of the relationship between these two popular markets.
Advantages:
Identifies divergence between the ES and SPY prices, indicating potential trading opportunities or shifts in market sentiment.
Confirms trends by showing the correlation between the ES and SPY prices.
Eliminates the need for multiple charts, allowing traders to focus on a single screen and make more informed decisions.
Customizable Parameters:
Color Scheme: Choose from various color options to customize the appearance of the indicator.
Line Style: Select from different line styles to change the visual representation of the reference price.
Divisor: Set the dividing factor to adjust the ratio at which the reference price is calculated. (Default value: 10). It is recommended to keep it at 10 for SPY.
To use it with other Stocks/ ETFs, use simple ratio math to calculate the divisor and you can customize the indicator to scale accordingly.
By using this indicator, traders can gain a deeper understanding of the relationship between the E-Mini and SPY markets, making it easier to identify trading opportunities and confirm trends.
Supertrend + KAMA Long StrategyThis strategy combines Supertrend and Kaufman Adaptive Moving Average (KAMA) indicators to identify long positions and manage stop-loss conditions effectively.
**Supertrend**: Determines the trend direction and helps identify entry and exit points.
**KAMA**: Adapts dynamically to market volatility and confirms trend reversals.
The strategy enters a long position when the Supertrend indicates an uptrend and the price is above the KAMA. It exits when the Supertrend switches to a downtrend and the price is below the KAMA, minimizing losses or protecting profits.
SMA & RSI Al Sinyalleri kendi özel ayarlarımdır her grafikte çalışmaz genelde 4s 2s gibi grafiklerde çalışır
Custom MACD with Distance (Table Format)just added a calculation distance on macd line and signal line
ODR/PDR in Prices@DrGirishSawhneyThis indicator guide us about the recent rally of minimum 20% in any given script with consecutive green candles . the lowest point of green candle gives the buy signal and the highest point of green candle gives the sell or exit signal.
London Session High/LowPoints to the high and low of london session. Use this to show you the high and low of the session.
Setup 123V3Setup based on 123 signal from trader Stormer, improved with daily open, volume average, EMA34 and RSI indicators.
Market Sessions
//@version=5
indicator('Market Sessions', 'Sessions', overlay=true, max_lines_count=200, max_boxes_count=200, max_labels_count=200, max_bars_back=500, explicit_plot_zorder=true)
import boitoki/AwesomeColor/9 as ac
import boitoki/Utilities/3 as util
///////////////
// Groups
///////////////
g0 = '// GENERAL //'
g1_01 = '// ♯1 SESSION //'
g1_02 = '// ♯2 SESSION //'
g1_03 = '// ♯3 SESSION //'
g1_04 = '// ♯4 SESSION //'
g1_05 = '// ♯5 SESSION //'
g4 = '// BOX //'
g6 = '// LABELS //'
g5 = '// OPENING RANGE //'
g7 = '// FIBONACCI LEVELS //'
g8 = '// OPTIONS //'
g11 = '// CANDLE //'
g10 = '// ALERTS VISUALISED //'
g12 = '// INFORMATION //'
///////////////
// Defined
///////////////
MAX_BARS = 500
option_yes = 'Yes'
option_no = '× No'
option_extend1 = 'Yes'
option_hide = '× Hide'
option_border_style1 = '────'
option_border_style2 = '- - - - - -'
option_border_style3 = '•••••••••'
option_chart_x = '× No'
option_chart_1 = 'Bar color'
option_chart_2 = 'Candles'
option_opr_label1 = 'High・Low'
option_opr_label2 = 'Buy・Sell'
option_opr_label_none = 'None'
option_candle_color1 = 'Session color'
option_candle_color2 = 'Red • Green'
fmt_price = '{0,number,#.#####}'
fmt_pips = '{0,number,#.#}'
icon_separator = ' • '
color_text = color.new(color.white, 0)
TRANSPARENT = color.new(color.black, 100)
///////////////
// Methods
///////////////
method clear (array id, int _min = 0) =>
if array.size(id) > _min
array.pop(id)
method clear (array id, int _min = 0) =>
if array.size(id) > _min
array.pop(id)
///////////////
// Types
///////////////
// OHLC
type OHLC
float open
float high
float low
float close
float hl
// Dot
type Dot
int x
float y
string t = ''
color c
method create(Dot this) =>
label.new(this.x, this.y, this.t, style=label.style_label_center, color=TRANSPARENT, textcolor=this.c, size=size.small)
// Candle
type Candle
box body
line wick
method create(Candle this) =>
this.body := array.new()
this.wick := array.new()
this
type State
string extend_style
bool show_fibs
bool show_op
method is_extended (State this) =>
this.extend_style != option_no
// OpeningRange
type OpeningRange
float top
float btm
float avg
float R1
float R2
float S1
float S2
int total_count = 0
int reached_count = 0
int reached_R1_count = 0
int reached_R2_count = 0
int reached_S1_count = 0
int reached_S2_count = 0
// Data
type Session
string sess
string tz
string name
color colour
float price_ranges
float price_range_avg
box boxes
line lines
label labels
line oclines
box ocboxes
label oc_labels
box opr_boxes
line opr_lines
linefill opr_linefills
label opr_labels
line fib
int session
bool is_extended
bool in_session
Candle candle
OHLC ohlc
State state
OpeningRange op
method create (Session this, string _extend, bool _show_fib, bool _show_op) =>
this.boxes := array.new()
this.lines := array.new()
this.labels := array.new()
this.oclines := array.new()
this.ocboxes := array.new()
this.oc_labels := array.new()
this.opr_boxes := array.new()
this.opr_lines := array.new()
this.opr_linefills := array.new()
this.opr_labels := array.new()
this.fib := array.new()
this.price_ranges := array.new()
this.state := State.new(_extend, _show_fib, _show_op)
this.candle := Candle.new().create()
this.ohlc := OHLC.new()
this.op := OpeningRange.new()
this.is_extended := this.state.is_extended()
this
method session (Session this) =>
time(timeframe.period, this.sess, this.tz)
method add (Session this, range_price, length = 50) =>
this.price_ranges.unshift(range_price)
this.price_ranges.clear(length)
this.price_range_avg := array.avg(this.price_ranges)
///////////////
// Functions
///////////////
f_get_time_by_bar (bar_count) => timeframe.multiplier * bar_count * 60 * 1000
f_border_style (_style) =>
switch _style
option_border_style1 => line.style_solid
option_border_style2 => line.style_dashed
option_border_style3 => line.style_dotted
=> _style
f_get_period (_session, _start, _lookback) =>
result = math.max(_start, 1)
for i = result to _lookback
if na(_session ) and _session
result := i+1
break
result
f_get_label_position (_y, _side) =>
switch _y
'top' => _side == 'outside' ? label.style_label_lower_left : label.style_label_upper_left
'bottom' => _side == 'outside' ? label.style_label_upper_left : label.style_label_lower_left
f_get_started (_session) => na(_session ) and _session
f_get_ended (_session) => na(_session) and _session
f_message_limit_bars (_v) => '⚠️ This box\'s right position exceeds 500 bars(' + str.tostring(_v) + '). This box is not displayed correctly.'
f_set_line_x1 (_line, _x) =>
if (line.get_x1(_line) != _x)
line.set_x1(_line, _x)
f_set_line_x2 (_line, _x) =>
if (line.get_x2(_line) != _x)
line.set_x2(_line, _x)
f_set_box_right (_box, _x) =>
if box.get_right(_box) != _x
box.set_right(_box, _x)
///////////////
// Inputs
///////////////
// Timezone
i_tz = input.string('GMT+0', title='Timezone', options= , group=g0)
i_history_period = input.int(10, 'History', minval=0, group=g0)
i_show = i_history_period > 0
i_lookback = 12 * 60
// Sessions
i_show_sess1 = input.bool(true, 'Session 1 ', group=g1_01, inline='session1_1') and i_show
i_sess1_label = input.string('London', '', group=g1_01, inline='session1_1')
i_sess1_color = input.color(#66D9EF, '', group=g1_01, inline='session1_1')
i_sess1_barcolor1 = input.color(#66D9EF, '•', group=g1_01, inline='session1_1')
i_sess1_barcolor2 = input.color(#66D9EF, '', group=g1_01, inline='session1_1')
i_sess1 = input.session('0800-1700', 'Time', group=g1_01)
i_sess1_extend = input.string(option_no, 'Extend', options= , group=g1_01)
i_sess1_op = input.string(option_no, 'Opening range', group=g1_01, options= ) != option_no and i_show
i_sess1_fib = input.string(option_no, 'Fibonacci levels', group=g1_01, options= ) != option_no
i_sess1_chart = input.string(option_chart_x, 'Bar', options= , group=g1_01)
i_sess1_barcolor = i_sess1_chart == option_chart_1
i_sess1_plotcandle = i_sess1_chart == option_chart_2
i_show_sess2 = input.bool(true, 'Session 2 ', group=g1_02, inline='session2_1') and i_show
i_sess2_label = input.string('New York', '', group=g1_02, inline='session2_1')
i_sess2_color = input.color(#FD971F, '', group=g1_02, inline='session2_1')
i_sess2_barcolor1 = input.color(#FD971F, '•', group=g1_02, inline='session2_1')
i_sess2_barcolor2 = input.color(#FD971F, '', group=g1_02, inline='session2_1')
i_sess2 = input.session('1300-2200', 'Time', group=g1_02)
i_sess2_extend = input.string(option_no, 'Extend', options= , group=g1_02)
i_sess2_op = input.string(option_no, 'Opening range', group=g1_02, options= ) != option_no and i_show
i_sess2_fib = input.string(option_no, 'Fibonacci levels', group=g1_02, options= ) != option_no
i_sess2_chart = input.string(option_chart_x, 'Bar', options= , group=g1_02)
i_sess2_barcolor = i_sess2_chart == option_chart_1
i_sess2_plotcandle = i_sess2_chart == option_chart_2
i_show_sess3 = input.bool(true, 'Session 3 ', group=g1_03, inline='session3_1') and i_show
i_sess3_label = input.string('Tokyo', '', group=g1_03, inline='session3_1')
i_sess3_color = input.color(#AE81FF, '', group=g1_03, inline='session3_1')
i_sess3_barcolor1 = input.color(#AE81FF, '•', group=g1_03, inline='session3_1')
i_sess3_barcolor2 = input.color(#AE81FF, '', group=g1_03, inline='session3_1')
i_sess3 = input.session('0000-0900', 'Time', group=g1_03)
i_sess3_extend = input.string(option_no, 'Extend', options= , group=g1_03)
i_sess3_op = input.string(option_no, 'Opening range', group=g1_03, options= ) != option_no and i_show
i_sess3_fib = input.string(option_no, 'Fibonacci levels', group=g1_03, options= ) != option_no
i_sess3_chart = input.string(option_chart_x, 'Bar', options= , group=g1_03)
i_sess3_barcolor = i_sess3_chart == option_chart_1
i_sess3_plotcandle = i_sess3_chart == option_chart_2
i_show_sess4 = input.bool(false, 'Session 4 ', group=g1_04, inline='session4_1') and i_show
i_sess4_label = input.string('Sydney', '', group=g1_04, inline='session4_1')
i_sess4_color = input.color(#FB71A3, '', group=g1_04, inline='session4_1')
i_sess4_barcolor1 = input.color(#FB71A3, '•', group=g1_04, inline='session4_1')
i_sess4_barcolor2 = input.color(#FB71A3, '', group=g1_04, inline='session4_1')
i_sess4 = input.session('2000-0500', 'Time', group=g1_04)
i_sess4_extend = input.string(option_no, 'Extend', options= , group=g1_04)
i_sess4_op = input.string(option_no, 'Opening range', group=g1_04, options= ) != option_no and i_show
i_sess4_fib = input.string(option_no, 'Fibonacci levels', group=g1_04, options= ) != option_no
i_sess4_chart = input.string(option_chart_x, 'Bar', options= , group=g1_04)
i_sess4_barcolor = i_sess4_chart == option_chart_1
i_sess4_plotcandle = i_sess4_chart == option_chart_2
i_show_sess5 = input.bool(false, 'Session 5 ', group=g1_05, inline='session5_1') and i_show
i_sess5_label = input.string('Sydney', '', group=g1_05, inline='session5_1')
i_sess5_color = input.color(#FB71A3, '', group=g1_05, inline='session5_1')
i_sess5_barcolor1 = input.color(#FB71A3, '•', group=g1_05, inline='session5_1')
i_sess5_barcolor2 = input.color(#FB71A3, '', group=g1_05, inline='session5_1')
i_sess5 = input.session('2000-0500', 'Time', group=g1_05)
i_sess5_extend = input.string(option_no, 'Extend', options= , group=g1_05)
i_sess5_op = input.string(option_no, 'Opening range', group=g1_05, options= ) != option_no and i_show
i_sess5_fib = input.string(option_no, 'Fibonacci levels', group=g1_05, options= ) != option_no
i_sess5_chart = input.string(option_chart_x, 'Bar', options= , group=g1_05)
i_sess5_barcolor = i_sess5_chart == option_chart_1
i_sess5_plotcandle = i_sess5_chart == option_chart_2
// Show & Styles
i_sess_box_style = input.string('Box', '', options= , group=g4, inline='box_style')
i_sess_border_style = f_border_style(input.string(option_border_style2, '', options= , group=g4, inline='box_style'))
i_sess_border_width = input.int(1, '', minval=0, group=g4, inline='box_style')
i_sess_box_background = input.bool(true, 'BG color', group=g4, inline='box_style_options')
i_sess_box_dots = input.bool(true, 'Dots', group=g4, inline='box_style_options')
i_sess_end_offset = input.bool(true, 'Include the latest bar in the Session end', group=g4)
i_sess_bgopacity = i_sess_box_background ? 94 : 100
i_sess_bgopacity2 = math.min(i_sess_bgopacity - 4, 100)
i_sess_border_width := i_sess_box_style == 'Background' ? 0 : i_sess_border_width
session_end_offset = i_sess_end_offset ? 0 : 1
// Labels
i_label_show = input.bool(true, '', inline='label_show', group=g6) and i_show
i_label_size = str.lower(input.string('Small', '', options= , inline='label_show', group=g6))
i_label_position_y = str.lower(input.string('Top', '', options= , inline='label_show', group=g6))
i_label_position_s = str.lower(input.string('Outside', '', options= , inline='label_show', group=g6))
i_label_position = f_get_label_position(i_label_position_y, i_label_position_s)
i_label_format_name = input.bool(true, 'Name', inline='label_format', group=g6)
i_label_format_day = input.bool(false, 'Day', inline='label_format', group=g6)
i_label_format_price = input.bool(false, 'Price', inline='label_format', group=g6)
i_label_format_pips = input.bool(false, 'Pips', inline='label_format', group=g6)
// Opening range
i_o_minutes = input.int(15, title='Periods mins', minval=1, step=1, group=g5)
i_o_minutes := math.max(i_o_minutes, timeframe.multiplier + 1)
i_o_transp = 65
i_o_size = input.string(size.small, 'Label size', options= , group=g5)
i_o_color = input.string(option_candle_color1, 'Label color', options= , group=g5)
i_o_label_1 = input.string('High', 'Label text ', group=g5, inline='op_label', tooltip="Type \"price\" to display the price")
i_o_label_2 = input.string('Low', '', group=g5, inline='op_label')
i_o_nowonly = input.bool(false, 'Now only', group=g5, inline='op_options')
i_o_breakout_icon = input.bool(false, 'Breakout flag', group=g5, inline='op_options')
i_o_target = input.bool(false, 'Target lines', group=g5, inline='op_options')
// Candle
option_candle_body = 'OC'
option_candle_wick = 'OHLC'
i_show_candle = input.bool(false, '', group=g11, inline='candle_display') //and (i_candle_border_width > 0)
i_candle = input.string(option_candle_wick, '', options= , group=g11, inline='candle_display')
i_candle_border_width = input.int(1, '', minval=1, group=g11, inline='candle_display')
i_candle_color = input.string(option_candle_color1, '', options= , group=g11, inline='candle_display')
i_candle_color_g = input.color(#A6E22E, '', group=g11, inline='candle_display')
i_candle_color_r = input.color(#F92672, '', group=g11, inline='candle_display')
i_candle := i_show_candle ? i_candle : option_hide
i_show_candle_wick = i_candle == option_candle_wick
i_sess_bgopacity2 := i_show_candle ? 100 : i_sess_bgopacity2
// Fibonacci levels
i_f_show = input.bool(true, '', group=g7, inline='fib_display')
i_f_linestyle = f_border_style(input.string(option_border_style1, '', options= , group=g7, inline='fib_display'))
i_f_linewidth = input.int(1, '', minval=1, group=g7, inline='fib_display')
i_sess1_fib := i_f_show ? i_sess1_fib : false
i_sess2_fib := i_f_show ? i_sess2_fib : false
i_sess3_fib := i_f_show ? i_sess3_fib : false
i_sess4_fib := i_f_show ? i_sess4_fib : false
// Information table
i_show_info = input.bool(true, '', group=g12, inline='info_display')
i_info_size = input.string(size.normal, '', options= , group=g12, inline='info_display')
i_info_value_type = input.string('Pips', '', options= , group=g12, inline='info_display')
i_info_period = input.int(50, '', group=g12, inline='info_display')
// Alerts
i_alert1_show = input.bool(false, 'Alerts - Sessions stard/end', group=g10)
i_alert2_show = input.bool(false, 'Alerts - Opening range breakouts', group=g10)
i_alert3_show = input.bool(false, 'Alerts - Price crossed session\'s High/Low after session closed', group=g10)
// ------------------------
// Drawing labels
// ------------------------
f_render_label (_show, Session data, _is_started, _color, _top, _bottom) =>
var label my_label = na
var int start_time = na
session = data.session()
v_position_y = (i_label_position_y == 'top') ? _top : _bottom
v_label = array.new_string()
v_chg = _top - _bottom
if _is_started
start_time := time
if i_label_format_name and not na(data.name)
array.push(v_label, data.name)
if i_label_format_day
array.push(v_label, util.get_day(dayofweek(start_time, i_tz)))
if i_label_format_price
array.push(v_label, str.format(fmt_price, v_chg))
if i_label_format_pips
array.push(v_label, str.format(fmt_pips, util.toPips(v_chg)))
if _show
if _is_started
my_label := label.new(bar_index, v_position_y, array.join(v_label, icon_separator), textcolor=_color, color=TRANSPARENT, size=i_label_size, style=i_label_position, tooltip='Pips')
array.push(data.labels, my_label)
util.clear_labels(data.labels, data.is_extended ? 1 : i_history_period)
else if session
label.set_y(my_label, v_position_y)
label.set_text(my_label, array.join(v_label, icon_separator))
data
// ------------------------
// Drawing Fibonacci levels
// ------------------------
f_render_fibonacci (_show, data, _is_started, _is_ended, _x1, _x2, _color, _top, _bottom, _level, _width, _style) =>
var line my_line = na
session = data.session()
if _show
y = (_top - _bottom) * _level + _bottom
if _is_started
my_line := line.new(_x1, y, _x2, y, width=_width, color=color.new(_color, 30), style=_style)
array.push(data.fib, my_line)
if data.is_extended
line.set_extend(my_line, extend.right)
else if session
line.set_y1(my_line, y)
line.set_y2(my_line, y)
f_set_line_x2(my_line, _x2)
else if _is_ended
f_set_line_x2(my_line, _x2-session_end_offset)
data
// ------------------------
// Drawing Opening range
// ------------------------
f_render_oprange (_show, Session data, _is_started, _is_ended, _x1, _x2, _color, _max) =>
var int start_time = na
var box my_box = na
var line my_line1 = na
var line my_line2 = na
var label my_label1 = na
var label my_label2 = na
var bool is_opened = false
var float R1 = na, var float R2 = na
var float S1 = na, var float S2 = na
var is_reached_R1 = false
var is_reached_R2 = false
var is_reached_S1 = false
var is_reached_S2 = false
var color_gray = ac.tradingview('gray')
var color_orange = ac.tradingview('orange')
var target_line_width = 2
session = data.session()
top = ta.highest(high, _max)
btm = ta.lowest(low, _max)
is_crossover = ta.crossover(close, box.get_top(my_box))
is_crossunder = ta.crossunder(close, box.get_bottom(my_box))
var float saved_top = na
if _show
if _is_started
util.clear_boxes(data.opr_boxes, math.max(0, i_history_period - 1))
util.clear_lines(data.opr_lines, math.max(0, (i_history_period - 1) * 6))
util.clear_labels(data.opr_labels, math.max(0, (i_history_period - 1) * 2))
start_time := time
my_box := na
is_opened := true
else if session
time_op = start_time + (i_o_minutes * 60 * 1000)
time_op_delay = time_op - f_get_time_by_bar(1)
if time <= time_op and time > time_op_delay
top_color = i_o_color == option_candle_color2 ? ac.tradingview('blue') : _color
btm_color = i_o_color == option_candle_color2 ? ac.tradingview('red') : _color
top_text_color = color.from_gradient(85, 0, 100, top_color, ac.panda('white'))
bot_text_color = color.from_gradient(85, 0, 100, btm_color, ac.panda('white'))
mdl = math.avg(top, btm)
avg1 = (data.price_range_avg * 0.786) * 0.5
avg2 = (data.price_range_avg * 1.272) * 0.5
saved_top := top
R1 := math.avg(btm, mdl) + avg1
R2 := math.avg(btm, mdl) + avg2
S1 := math.avg(top, mdl) - avg1
S2 := math.avg(top, mdl) - avg2
array.push(data.opr_boxes, box.new (_x1, top, bar_index, btm, border_width=0, bgcolor=color.new(_color, i_o_transp)))
array.push(data.opr_lines, line.new(_x1, top, _x2, top, style=line.style_dashed, color=top_color))
array.push(data.opr_lines, line.new(_x1, btm, _x2, btm, style=line.style_dashed, color=btm_color))
array.push(data.opr_lines, line.new(_x1, R2 , _x2, R2 , style=line.style_solid, color=i_o_target ? color.new(top_color, 40) : TRANSPARENT, width=target_line_width))
array.push(data.opr_lines, line.new(_x1, S2 , _x2, S2 , style=line.style_solid, color=i_o_target ? color.new(btm_color, 40) : TRANSPARENT, width=target_line_width))
array.push(data.opr_lines, line.new(_x1, R1 , _x2, R1 , style=line.style_solid, color=i_o_target ? color.new(top_color, 40) : TRANSPARENT, width=target_line_width))
array.push(data.opr_lines, line.new(_x1, S1 , _x2, S1 , style=line.style_solid, color=i_o_target ? color.new(btm_color, 40) : TRANSPARENT, width=target_line_width))
if i_o_target
array.unshift(data.opr_linefills, linefill.new(array.get(data.opr_lines, array.size(data.opr_lines)-1), array.get(data.opr_lines, array.size(data.opr_lines)-3), color.new(btm_color, 96))) // S
array.unshift(data.opr_linefills, linefill.new(array.get(data.opr_lines, array.size(data.opr_lines)-2), array.get(data.opr_lines, array.size(data.opr_lines)-4), color.new(top_color, 96))) // R
t1 = i_o_label_1 == 'price' ? str.tostring(top, format.mintick) : i_o_label_1
t2 = i_o_label_2 == 'price' ? str.tostring(btm, format.mintick) : i_o_label_2
my_label1 := label.new(_x1-1, top, t1, yloc=yloc.price, style=label.style_label_right, color=top_color, textcolor=top_text_color, size=i_o_size, tooltip=str.tostring(top, format.mintick))
my_label2 := label.new(_x1-1, btm, t2, yloc=yloc.price, style=label.style_label_right, color=btm_color, textcolor=bot_text_color, size=i_o_size, tooltip=str.tostring(btm, format.mintick))
array.push(data.opr_labels, my_label1)
array.push(data.opr_labels, my_label2)
array.push(data.opr_boxes , my_box)
if data.is_extended
box.set_extend(my_box, extend.right)
alert('Opening range is fixed.', alert.freq_once_per_bar)
else if is_opened
if ta.crossover(high, R1) and (not is_reached_R1)
is_reached_R1 := true
if i_o_breakout_icon
label.new(bar_index, high, '×', yloc=yloc.price, style=label.style_label_center, color=TRANSPARENT, textcolor=ac.tradingview('blue'), size=size.large)
if ta.crossover(high, R2) and (not is_reached_R2)
is_reached_R2 := true
if i_o_breakout_icon
label.new(bar_index, high, '×', yloc=yloc.price, style=label.style_label_center, color=TRANSPARENT, textcolor=ac.tradingview('blue'), size=size.large)
if ta.crossunder(low, S1) and (not is_reached_S1)
is_reached_S1 := true
if i_o_breakout_icon
label.new(bar_index, low, '×', yloc=yloc.price, style=label.style_label_center, color=TRANSPARENT, textcolor=ac.tradingview('red'), size=size.large)
if ta.crossunder(low, S2) and (not is_reached_S2)
is_reached_S2 := true
if i_o_breakout_icon
label.new(bar_index, low, '×', yloc=yloc.price, style=label.style_label_center, color=TRANSPARENT, textcolor=ac.tradingview('red'), size=size.large)
true
else
if is_crossover
alert('Price crossed over the opening range', alert.freq_once_per_bar)
if i_alert2_show
label.new(bar_index, box.get_top(my_box), "×", color=color.blue, textcolor=ac.tradingview('blue'), style=label.style_none, size=size.large)
if is_crossunder
alert('Price crossed under the opening range', alert.freq_once_per_bar)
if i_alert2_show
label.new(bar_index, box.get_bottom(my_box), "×", color=color.red, textcolor=ac.tradingview('red'), style=label.style_none, size=size.large)
else if _is_ended
if i_o_nowonly
util.clear_lines(data.opr_lines, 0)
util.clear_labels(data.opr_labels, 0)
util.clear_boxes(data.opr_boxes, 0)
else if array.size(data.opr_lines) > 0
for i = 0 to 5
the_line = array.get(data.opr_lines, array.size(data.opr_lines) - (i + 1))
line.set_x2(the_line, _x2-session_end_offset)
for i = 0 to 1
the_label = array.get(data.opr_labels, array.size(data.opr_labels) - (i + 1))
label.set_text(the_label, '●')
label.set_style(the_label, label.style_label_center)
label.set_textcolor(the_label, i_o_color == option_candle_color2 ? label.get_y(the_label) >= saved_top ? ac.tradingview('blue') : ac.tradingview('red') : _color)
label.set_color(the_label, TRANSPARENT)
label.set_size(the_label, size.tiny)
label.set_x(the_label,_x1)
data.op.total_count := data.op.total_count + 1
data.op.reached_count := (is_reached_R1 or is_reached_R2 or is_reached_S1 or is_reached_S2) ? data.op.reached_count + 1 : data.op.reached_count
data.op.reached_R1_count := is_reached_R1 ? data.op.reached_R1_count + session_end_offset : data.op.reached_R1_count
data.op.reached_R2_count := is_reached_R2 ? data.op.reached_R2_count + session_end_offset : data.op.reached_R2_count
data.op.reached_S1_count := is_reached_S1 ? data.op.reached_S1_count + session_end_offset : data.op.reached_S1_count
data.op.reached_S2_count := is_reached_S2 ? data.op.reached_S2_count + session_end_offset : data.op.reached_S2_count
// Reset
R1 := na, R2 := na, S1 := na, S2 := na
is_reached_R1 := false
is_reached_R2 := false
is_reached_S1 := false
is_reached_S2 := false
is_opened := false
saved_top := na
is_opened
data
// ------------------------
// Drawing candle
// ------------------------
f_render_candle (_show, Session data, _is_started, _is_ended, _color, _top, _bottom, _open, _x1, _x2) =>
var box body = na
var line wick1 = na
var line wick2 = na
session = data.session()
border_width = i_candle_border_width
cx = math.round(math.avg(_x2, _x1)) - math.round(border_width / 2)
body_color = i_candle_color == option_candle_color2 ? close > _open ? i_candle_color_g : i_candle_color_r : _color
body_color := color.new(body_color, 30)
if _show
if _is_started
body := box.new(_x1, _top, _x2, _bottom, body_color, border_width, line.style_solid, bgcolor=color.new(color.black, 100))
wick1 := i_show_candle_wick ? line.new(cx, _top, cx, _top, color=body_color, width=border_width, style=line.style_solid) : na
wick2 := i_show_candle_wick ? line.new(cx, _bottom, cx, _bottom, color=body_color, width=border_width, style=line.style_solid) : na
array.push(data.candle.body, body)
array.push(data.candle.wick, wick1)
array.push(data.candle.wick, wick2)
util.clear_boxes(data.candle.body, i_history_period)
util.clear_lines(data.candle.wick, i_history_period * 2)
else if session
top = math.max(_open, close)
bottom = math.min(_open, close)
box.set_top(body, top)
box.set_bottom(body, bottom)
box.set_right(body, _x2)
box.set_border_color(body, body_color)
line.set_y1(wick1, _top)
line.set_y2(wick1, top)
f_set_line_x1(wick1, cx)
f_set_line_x2(wick1, cx)
line.set_color(wick1, body_color)
line.set_y1(wick2, _bottom)
line.set_y2(wick2, bottom)
f_set_line_x1(wick2, cx)
f_set_line_x2(wick2, cx)
line.set_color(wick2, body_color)
else if _is_ended
box.set_right(body, bar_index-session_end_offset)
data
// ------------------------
// Rendering limit message
// ------------------------
f_render_limitmessage (_show, Session data, _is_started, _is_ended, _x, _y, _rightbars) =>
var label my_note = na
session = data.session()
if _show
if _is_started
if _rightbars > MAX_BARS
my_note := label.new(_x, _y, f_message_limit_bars(_rightbars), style=label.style_label_upper_left, color=color.yellow, textalign=text.align_left, yloc=yloc.price)
else if session
if _rightbars > MAX_BARS
label.set_y(my_note, _y)
label.set_text(my_note, f_message_limit_bars(_rightbars))
else
label.delete(my_note)
else if _is_ended
label.delete(my_note)
data
// Rendering session
//
f_render_sessionrange (_show, Session data, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_vertical = false) =>
var line above_line = na
var line below_line = na
session = data.session()
if _show
if _is_started
if _is_vertical
above_line := line.new(_x1, _top, _x1, _bottom, width=i_sess_border_width, style=i_sess_border_style, color=_color)
below_line := line.new(_x2, _top, _x2, _bottom, width=i_sess_border_width, style=i_sess_border_style, color=_color)
else
above_line := line.new(_x1, _top, _x2, _top, width=i_sess_border_width, style=i_sess_border_style, color=_color)
below_line := line.new(_x1, _bottom, _x2, _bottom, width=i_sess_border_width, style=i_sess_border_style, color=_color)
linefill.new(above_line, below_line, color.new(_color, i_sess_bgopacity))
array.push(data.lines, above_line)
array.push(data.lines, below_line)
util.clear_lines(data.lines, data.is_extended ? 2 : i_history_period * 2)
if data.is_extended
if _is_vertical
line.set_extend(above_line, extend.both)
line.set_extend(below_line, extend.both)
else
line.set_extend(above_line, extend.right)
line.set_extend(below_line, extend.right)
else if session
if _is_vertical
line.set_y1(above_line, _bottom)
line.set_y2(above_line, _top)
line.set_y1(below_line, _bottom)
line.set_y2(below_line, _top)
else
line.set_y1(above_line, _top)
line.set_y2(above_line, _top)
line.set_x2(above_line, _x2)
line.set_y1(below_line, _bottom)
line.set_y2(below_line, _bottom)
line.set_x2(below_line, _x2)
else if _is_ended
if _is_vertical
line.set_x1(below_line, _x2-session_end_offset)
line.set_x2(below_line, _x2-session_end_offset)
else
line.set_x2(above_line, _x2-session_end_offset)
line.set_x2(below_line, _x2-session_end_offset)
data.add(_top - _bottom , i_info_period)
data
// ------------------------
// Rendering session box
// ------------------------
f_render_session (_show, Session data, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2) =>
var box my_box = na
session = data.session()
if _show
if _is_started
my_box := box.new(_x1, _top, _x2, _bottom, _color, i_sess_border_width, i_sess_border_style, bgcolor=color.new(_color, i_sess_bgopacity))
array.push(data.boxes, my_box)
util.clear_boxes(data.boxes, data.is_extended ? 1 : i_history_period)
if data.is_extended
box.set_extend(my_box, extend.right)
else if session
box.set_top(my_box, _top)
box.set_bottom(my_box, _bottom)
f_set_box_right(my_box, _x2)
else if _is_ended
box.set_right(my_box, bar_index-session_end_offset)
data.add(_top - _bottom , i_info_period)
data
f_render_dots (_show, Session data, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2) =>
var float _open = na
var box oc_box = na
var line oc_line_u = na
var line oc_line_l = na
session = data.session()
if _show and i_sess_box_dots
if _is_started
oc_line_u := line.new(_x1, open , _x2, open , color=color.new(_color, 70), style=line.style_dotted)
oc_line_l := line.new(_x1, close, _x2, close, color=color.new(_color, 70), style=line.style_dotted)
linefill.new(oc_line_u, oc_line_l, color.new(_color, i_sess_bgopacity2))
array.push(data.oclines, oc_line_u)
array.push(data.oclines, oc_line_l)
util.clear_lines(data.oclines, data.is_extended ? 2 : i_history_period * 2)
util.clear_labels(data.oc_labels, data.is_extended ? 2 : math.max(0, (i_history_period - 1) * 2))
_open := open
else if session
line.set_x2(oc_line_u, _x2)
line.set_x2(oc_line_l, _x2)
line.set_y1(oc_line_l, close)
line.set_y2(oc_line_l, close)
else if _is_ended
array.push(data.oc_labels, Dot.new(_x1, _open, '●', _color).create())
array.push(data.oc_labels, Dot.new(_x2-session_end_offset, close , '◉', _color).create())
line.set_x2(oc_line_u, _x2-session_end_offset)
line.set_x2(oc_line_l, _x2-session_end_offset)
line.set_y1(oc_line_l, close )
line.set_y2(oc_line_l, close )
_open := na
true
// ------------------------
// Drawing market
// ------------------------
f_render_main (_show, Session data, _is_started, _is_ended, _color, _top, _bottom) =>
var x1 = 0
var x2 = 0
x2_offset = 1
session = data.session()
x0_1 = ta.valuewhen(na(session ) and session, bar_index, 1)
x0_2 = ta.valuewhen(na(session) and session , bar_index, 0)
x0_d = math.min(math.abs(x0_2 - x0_1), MAX_BARS)
rightbars = x0_d
if _show
if _is_started
x1 := bar_index
x2 := bar_index + x0_d
data.ohlc.open := open
data.ohlc.high := _top
data.ohlc.low := _bottom
data.ohlc.hl := _top -_bottom
data.in_session := true
else if session
true_x2 = x1 + x0_d
rightbars := true_x2 - bar_index
max_bars = bar_index + MAX_BARS
x2 := math.min(true_x2, max_bars)
data.ohlc.high := _top
data.ohlc.low := _bottom
data.ohlc.hl := _top - _bottom
else if _is_ended
data.in_session := false
data.ohlc.open := na
// ------------------------
// Drawing
// ------------------------
draw (_show, Session data, _extend, _show_fib, _show_op) =>
session = data.session()
max = f_get_period(session, 1, i_lookback)
top = ta.highest(high, max)
bottom = ta.lowest(low, max)
col = data.colour
is_started = f_get_started(session)
is_ended = f_get_ended(session)
= f_render_main(_show, data, is_started, is_ended, col, top, bottom)
if i_sess_box_style == 'Box' or i_sess_box_style == 'Background' or i_sess_box_style == 'Candle'
f_render_session(_show, data, is_started, is_ended, col, top, bottom, x1, x2)
f_render_dots(_show, data, is_started, is_ended, col, top, bottom, x1, x2)
else if i_sess_box_style == 'Hamburger'
f_render_sessionrange(_show, data, is_started, is_ended, col, top, bottom, x1, x2)
else if i_sess_box_style == 'Sandwich'
f_render_sessionrange(_show, data, is_started, is_ended, col, top, bottom, x1, x2, true)
if i_show_candle
f_render_candle(_show, data, is_started, is_ended, col, top, bottom, ohlc.open, x1, x2)
if i_label_show
f_render_label(_show, data, is_started, col, top, bottom)
if _show_op
f_render_oprange(_show, data, is_started, is_ended, x1, x2, col, max)
if _show_fib
f_render_fibonacci(_show, data, is_started, is_ended, x1, x2, col, top, bottom, 0.500, 2, line.style_solid)
f_render_fibonacci(_show, data, is_started, is_ended, x1, x2, col, top, bottom, 0.628, i_f_linewidth, i_f_linestyle)
f_render_fibonacci(_show, data, is_started, is_ended, x1, x2, col, top, bottom, 0.382, i_f_linewidth, i_f_linestyle)
util.clear_lines(data.fib, i_history_period * 3)
f_render_limitmessage(_show, data, is_started, is_ended, x1, bottom, _rightbars)
///////////////////
// Calculating
///////////////////
string tz = (i_tz == option_no or i_tz == '') ? na : i_tz
///////////////////
// Plotting
///////////////////
var sess1_data = Session.new(i_sess1, tz, i_sess1_label, i_sess1_color).create(i_sess1_extend, i_sess1_fib, i_sess1_op)
var sess2_data = Session.new(i_sess2, tz, i_sess2_label, i_sess2_color).create(i_sess2_extend, i_sess2_fib, i_sess2_op)
var sess3_data = Session.new(i_sess3, tz, i_sess3_label, i_sess3_color).create(i_sess3_extend, i_sess3_fib, i_sess3_op)
var sess4_data = Session.new(i_sess4, tz, i_sess4_label, i_sess4_color).create(i_sess4_extend, i_sess4_fib, i_sess4_op)
var sess5_data = Session.new(i_sess5, tz, i_sess5_label, i_sess5_color).create(i_sess5_extend, i_sess5_fib, i_sess5_op)
= draw(i_show_sess1, sess1_data, i_sess1_extend, i_sess1_fib, i_sess1_op)
= draw(i_show_sess2, sess2_data, i_sess2_extend, i_sess2_fib, i_sess2_op)
= draw(i_show_sess3, sess3_data, i_sess3_extend, i_sess3_fib, i_sess3_op)
= draw(i_show_sess4, sess4_data, i_sess4_extend, i_sess4_fib, i_sess4_op)
= draw(i_show_sess5, sess5_data, i_sess5_extend, i_sess5_fib, i_sess5_op)
is_positive_bar = close > open
color c_barcolor = na
color c_plotcandle = na
c_sess1_barcolor = (is_sess1) ? (is_positive_bar ? i_sess1_barcolor1 : i_sess1_barcolor2) : na
c_sess2_barcolor = (is_sess2) ? (is_positive_bar ? i_sess2_barcolor1 : i_sess2_barcolor2) : na
c_sess3_barcolor = (is_sess3) ? (is_positive_bar ? i_sess3_barcolor1 : i_sess3_barcolor2) : na
c_sess4_barcolor = (is_sess4) ? (is_positive_bar ? i_sess4_barcolor1 : i_sess4_barcolor2) : na
c_sess5_barcolor = (is_sess5) ? (is_positive_bar ? i_sess5_barcolor1 : i_sess5_barcolor2) : na
if (i_sess1_chart != option_chart_x) and is_sess1
c_barcolor := i_sess1_barcolor ? c_sess1_barcolor : na
c_plotcandle := i_sess1_plotcandle ? c_sess1_barcolor : na
if (i_sess2_chart != option_chart_x) and is_sess2
c_barcolor := i_sess2_barcolor ? c_sess2_barcolor : na
c_plotcandle := i_sess2_plotcandle ? c_sess2_barcolor : na
if (i_sess3_chart != option_chart_x) and is_sess3
c_barcolor := i_sess3_barcolor ? c_sess3_barcolor : na
c_plotcandle := i_sess3_plotcandle ? c_sess3_barcolor : na
if (i_sess4_chart != option_chart_x) and is_sess4
c_barcolor := i_sess4_barcolor ? c_sess4_barcolor : na
c_plotcandle := i_sess4_plotcandle ? c_sess4_barcolor : na
if (i_sess5_chart != option_chart_x) and is_sess5
c_barcolor := i_sess5_barcolor ? c_sess5_barcolor : na
c_plotcandle := i_sess5_plotcandle ? c_sess5_barcolor : na
barcolor(c_barcolor)
plotcandle(open, high, low, close, color=is_positive_bar ? TRANSPARENT : c_plotcandle, bordercolor=c_plotcandle, wickcolor=c_plotcandle)
////////////////////
// Alerts
////////////////////
// Session alerts
sess1_started = is_sess1 and not is_sess1 , sess1_ended = not is_sess1 and is_sess1
sess2_started = is_sess2 and not is_sess2 , sess2_ended = not is_sess2 and is_sess2
sess3_started = is_sess3 and not is_sess3 , sess3_ended = not is_sess3 and is_sess3
sess4_started = is_sess4 and not is_sess4 , sess4_ended = not is_sess4 and is_sess4
sess5_started = is_sess5 and not is_sess5 , sess5_ended = not is_sess5 and is_sess5
alertcondition(sess1_started, 'Session #1 started')
alertcondition(sess1_ended, 'Session #1 ended' )
alertcondition(sess2_started, 'Session #2 started')
alertcondition(sess2_ended, 'Session #2 ended' )
alertcondition(sess3_started, 'Session #3 started')
alertcondition(sess3_ended, 'Session #3 ended' )
alertcondition(sess4_started, 'Session #4 started')
alertcondition(sess4_ended, 'Session #4 ended' )
alertcondition(sess5_started, 'Session #5 started')
alertcondition(sess5_ended, 'Session #5 ended' )
alertcondition((not is_sess1) and ta.crossover (close, sess1_ohlc.high), 'Session #1 High crossed (after session closed)')
alertcondition((not is_sess1) and ta.crossunder(close, sess1_ohlc.low) , 'Session #1 Low crossed (after session closed)' )
alertcondition((not is_sess2) and ta.crossover (close, sess2_ohlc.high), 'Session #2 High crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossunder(close, sess2_ohlc.low) , 'Session #2 Low crossed (after session closed)' )
alertcondition((not is_sess3) and ta.crossover (close, sess3_ohlc.high), 'Session #3 High crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossunder(close, sess3_ohlc.low) , 'Session #3 Low crossed (after session closed)' )
alertcondition((not is_sess4) and ta.crossover (close, sess4_ohlc.high), 'Session #4 High crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossunder(close, sess4_ohlc.low) , 'Session #4 Low crossed (after session closed)' )
alertcondition((not is_sess5) and ta.crossover (close, sess5_ohlc.high), 'Session #5 High crossed (after session closed)')
alertcondition((not is_sess5) and ta.crossunder(close, sess5_ohlc.low) , 'Session # Low crossed (after session closed)' )
// Alerts visualized
if i_alert1_show
if i_show_sess1
if sess1_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess1_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess1_ended
label.new(bar_index - session_end_offset, close, 'End' , yloc=yloc.abovebar, color=i_sess1_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess2
if sess2_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess2_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess2_ended
label.new(bar_index - session_end_offset, close, 'End' , yloc=yloc.abovebar, color=i_sess2_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess3
if sess3_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess3_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess3_ended
label.new(bar_index - session_end_offset, close, 'End' , yloc=yloc.abovebar, color=i_sess3_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess4
if sess4_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess4_ended
label.new(bar_index - session_end_offset, close, 'End' , yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess5
if sess5_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess5_ended
label.new(bar_index - session_end_offset, close, 'End' , yloc=yloc.abovebar, color=i_sess5_color, textcolor=color_text, size=size.small, style=label.style_label_down)
plot(i_alert3_show ? sess1_ohlc.high : na, 'sess1_high', style=plot.style_linebr, color=i_sess1_color)
plot(i_alert3_show ? sess1_ohlc.low : na, 'sess1_low' , style=plot.style_linebr, color=i_sess1_color, linewidth=2)
plot(i_alert3_show ? sess2_ohlc.high : na, 'sess2_high', style=plot.style_linebr, color=i_sess2_color)
plot(i_alert3_show ? sess2_ohlc.low : na, 'sess2_low' , style=plot.style_linebr, color=i_sess2_color, linewidth=2)
plot(i_alert3_show ? sess3_ohlc.high : na, 'sess3_high', style=plot.style_linebr, color=i_sess3_color)
plot(i_alert3_show ? sess3_ohlc.low : na, 'sess3_low' , style=plot.style_linebr, color=i_sess3_color, linewidth=2)
plot(i_alert3_show ? sess4_ohlc.high : na, 'sess4_high', style=plot.style_linebr, color=i_sess4_color)
plot(i_alert3_show ? sess4_ohlc.low : na, 'sess4_low' , style=plot.style_linebr, color=i_sess4_color, linewidth=2)
plot(i_alert3_show ? sess5_ohlc.high : na, 'sess5_high', style=plot.style_linebr, color=i_sess5_color)
plot(i_alert3_show ? sess5_ohlc.low : na, 'sess5_low' , style=plot.style_linebr, color=i_sess5_color, linewidth=2)
plotshape(i_alert3_show and (not is_sess1) and ta.crossover (close, sess1_ohlc.high) ? sess1_ohlc.high : na, 'cross sess1_high', color=i_sess1_color, style=shape.triangleup , location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess1) and ta.crossunder(close, sess1_ohlc.low) ? sess1_ohlc.low : na, 'cross sess1_low' , color=i_sess1_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess2) and ta.crossover (close, sess2_ohlc.high) ? sess2_ohlc.high : na, 'cross sess2_high', color=i_sess2_color, style=shape.triangleup , location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess2) and ta.crossunder(close, sess2_ohlc.low) ? sess2_ohlc.low : na, 'cross sess2_low' , color=i_sess2_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess3) and ta.crossover (close, sess3_ohlc.high) ? sess3_ohlc.high : na, 'cross sess3_high', color=i_sess3_color, style=shape.triangleup , location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess3) and ta.crossunder(close, sess3_ohlc.low) ? sess3_ohlc.low : na, 'cross sess3_low' , color=i_sess3_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess4) and ta.crossover (close, sess4_ohlc.high) ? sess4_ohlc.high : na, 'cross sess4_high', color=i_sess4_color, style=shape.triangleup , location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess4) and ta.crossunder(close, sess4_ohlc.low) ? sess4_ohlc.low : na, 'cross sess4_low' , color=i_sess4_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
//////////////
// Analysis //
var text_color = #e1e2e4
var bgcolor = #1a1c20
var color_green = ac.monokai('green')
var color_orange = ac.monokai('orange')
var color_red = ac.monokai('red')
var color_ind_green = ac.tradingview('green')
var color_ind_gray = color.new(ac.tradingview('gray'), 30)
var color_white = #e1e2e4
i_show_op_analysis = false//input.bool(true, 'Opening range table')
i_show_analysis2 = false//input.bool(false)
if i_show_info and barstate.islast
data = array.new()
if array.size(sess1_data.price_ranges) > 0
data.push(sess1_data)
if array.size(sess2_data.price_ranges) > 0
data.push(sess2_data)
if array.size(sess3_data.price_ranges) > 0
data.push(sess3_data)
if array.size(sess4_data.price_ranges) > 0
data.push(sess4_data)
var tbl_avg = table.new(position.top_right, 5, 5, frame_width=2, bgcolor=bgcolor, frame_color=#25272c, border_width=1, border_color=#25272c)
table.cell(tbl_avg, 0, 0, 'Session', text_color=color.new(text_color, 60), text_size=i_info_size, text_halign=text.align_center)
table.cell(tbl_avg, 1, 0, '', text_color=color.new(text_color, 60), text_size=i_info_size)
table.cell(tbl_avg, 2, 0, 'Cur', text_color=color.new(text_color, 60), text_size=i_info_size)
table.cell(tbl_avg, 3, 0, 'Avg('+str.tostring(i_info_period)+')', text_color=color.new(text_color, 60), text_size=i_info_size)
table.cell(tbl_avg, 4, 0, '%', text_color=color.new(text_color, 60), text_size=i_info_size)
table.merge_cells(tbl_avg, 0, 0, 1, 0)
if array.size(data) > 0
for i = 0 to array.size(data) - 1
my_data = array.get(data, i)
in_session = my_data.in_session and session.ismarket
p = my_data.ohlc.hl / my_data.price_range_avg
col_cur = p < 0.75 ? color_green : p < 1.25 ? color_orange : color_red
v1 = i_info_value_type == 'Price' ? str.tostring(my_data.ohlc.hl, format.mintick) : str.tostring(util.toPips(my_data.ohlc.hl), '#.#')
v2 = i_info_value_type == 'Price' ? str.tostring(my_data.price_range_avg, format.mintick) : str.tostring(util.toPips(my_data.price_range_avg), '#.#')
v3 = in_session ? '◉' : '●'
color_name = in_session ? color_white : color.new(ac.monokai('gray'), 30)
color_ind = in_session ? color_ind_green : color_ind_gray
color_cur = in_session ? col_cur : color.new(col_cur, 60)
table.cell(tbl_avg, 0, i + 1, my_data.name, text_color=color_name, text_size=i_info_size, text_halign=text.align_left)
table.cell(tbl_avg, 1, i + 1, v3, text_color=color_ind , text_size=size.tiny, text_halign=text.align_center, text_valign=text.align_center)
table.cell(tbl_avg, 2, i + 1, v1, text_color=color_cur , text_size=i_info_size, text_halign=text.align_right, text_font_family=font.family_monospace)
table.cell(tbl_avg, 3, i + 1, v2, text_color=color_name, text_size=i_info_size, text_halign=text.align_right, text_font_family=font.family_monospace)
table.cell(tbl_avg, 4, i + 1, str.format('{0,number,percent}', p), text_color=color_cur, text_size=i_info_size, text_halign=text.align_right, text_font_family=font.family_monospace)
if i_show_op_analysis and (barstate.islast or barstate.isconfirmed)
data = array.new()
if sess1_data.op.reached_count > 0
array.unshift(data, sess1_data)
if sess2_data.op.reached_count > 0
array.unshift(data, sess2_data)
if sess3_data.op.reached_count > 0
array.unshift(data, sess3_data)
if sess4_data.op.reached_count > 0
array.unshift(data, sess4_data)
var tbl_op = table.new(position.bottom_right, 7, 5, frame_width=2, bgcolor=bgcolor, frame_color=#25272c, border_width=1, border_color=#25272c)
table.cell(tbl_op, 0, 0, 'Opening range' + (array.size(data) == 0 ? ' (No data)' : ''), text_size=i_info_size)
table.merge_cells(tbl_op, 0, 0, 6, 0)
if array.size(data) > 0
table.cell(tbl_op, 0, 1, 'Session', text_size=i_info_size)
table.cell(tbl_op, 1, 1, 'Sum', text_size=i_info_size)
table.cell(tbl_op, 2, 1, 'R1', text_size=i_info_size)
table.cell(tbl_op, 3, 1, 'S1', text_size=i_info_size)
table.cell(tbl_op, 4, 1, 'R2', text_size=i_info_size)
table.cell(tbl_op, 5, 1, 'S2', text_size=i_info_size)
table.cell(tbl_op, 6, 1, 'Total', text_size=i_info_size)
row_index = 2
for i = 0 to array.size(data) -1
my_data = array.get(data, i)
table.cell(tbl_op, 0, row_index + i, my_data.name, text_size=i_info_size, text_color=color_white, text_halign=text.align_left)
table.cell(tbl_op, 1, row_index + i, str.format('{0,number,percent}', my_data.op.reached_count / my_data.op.total_count), text_font_family=font.family_monospace, text_halign=text.align_right, text_color=color_white, text_size=i_info_size)
table.cell(tbl_op, 2, row_index + i, str.format('{0,number,percent}', my_data.op.reached_R1_count / my_data.op.total_count), text_font_family=font.family_monospace, text_halign=text.align_right, text_color=color_white, text_size=i_info_size)
table.cell(tbl_op, 3, row_index + i, str.format('{0,number,percent}', my_data.op.reached_S1_count / my_data.op.total_count), text_font_family=font.family_monospace, text_halign=text.align_right, text_color=color_white, text_size=i_info_size)
table.cell(tbl_op, 4, row_index + i, str.format('{0,number,percent}', my_data.op.reached_R2_count / my_data.op.total_count), text_font_family=font.family_monospace, text_halign=text.align_right, text_color=color_white, text_size=i_info_size)
table.cell(tbl_op, 5, row_index + i, str.format('{0,number,percent}', my_data.op.reached_S2_count / my_data.op.total_count), text_font_family=font.family_monospace, text_halign=text.align_right, text_color=color_white, text_size=i_info_size)
table.cell(tbl_op, 6, row_index + i, str.tostring(my_data.op.total_count), text_font_family=font.family_monospace, text_halign=text.align_right, text_color=color_white, text_size=i_info_size)
if i_show_analysis2 and barstate.islast
max = 100
g_base = ta.lowest(max)
s3_count = 0
s2_count = 0
var g_lines = array.new()
x = bar_index + 20
util.clear_lines(g_lines, 0)
array.push(g_lines, line.new(x + 0, g_base, x + 0, g_base + sess1_data.price_range_avg, color=sess1_data.colour, width=3))
array.push(g_lines, line.new(x + 2, g_base, x + 2, g_base + sess2_data.price_range_avg, color=sess2_data.colour, width=3))
array.push(g_lines, line.new(x + 4, g_base, x + 4, g_base + sess3_data.price_range_avg, color=sess3_data.colour, width=3))
array.push(g_lines, line.new(x + 6, g_base, x + 6, g_base + sess4_data.price_range_avg, color=sess4_data.colour, width=3))
if array.size(sess1_data.price_ranges) > 0 and array.size(sess3_data.price_ranges) > 0
for i = 0 to array.size(sess1_data.price_ranges) - 1
s1 = array.get(sess1_data.price_ranges, i)
s3 = array.get(sess3_data.price_ranges, i)
if s3 / s1 > 1
s3_count := s3_count + 1
tbl = table.new(position.bottom_right, 3, 3, frame_width=2, bgcolor=bgcolor, frame_color=#25272c, border_width=1, border_color=#25272c)
table.cell(tbl, 0, 0, sess3_data.name + ' > ' + sess1_data.name, text_color=#e1e2e4)
table.cell(tbl, 1, 0, str.tostring(s3_count) + ' / ' + str.tostring(array.size(sess1_data.price_ranges)), text_color=#e1e2e4)
table.cell(tbl, 2, 0, str.format('{0,number,percent}', s3_count / array.size(sess1_data.price_ranges) ), text_color=#e1e2e4)
table.cell(tbl, 0, 1, syminfo.ticker + '('+ syminfo.currency +')', text_color=#e1e2e4)
table.merge_cells(tbl, 0, 1, 2, 1)
// --- Input Definitions ---
range_start_hour = input.int(4, "Range Start Hour", group="START", inline="start", minval=0, maxval=23)
range_start_minute = input.int(0, "Minutes", group="START", inline="start", minval=0, maxval=59)
range_end_hour = input.int(12, "Range End Hour", group="END", inline="end", minval=0, maxval=23)
range_end_minute = input.int(0, "Minutes", group="END", inline="end", minval=0, maxval=59)
timezone_offset_hours = input.int(0, "Timezone UTC Offset Hours", group="Time Zone Offset", minval=-12, maxval=14)
timezone_offset_minutes = input.int(0, "Timezone UTC Offset Minutes", group="Time Zone Offset", minval=-59, maxval=59)
count = input(3, "Count")
colorTop = input(color.green, "Top Color", group="STYLING")
colorBetween = input(color.new(color.gray, 50), "Between Color", group="STYLING")
colorBottom = input(color.red, "Bottom Color", group="STYLING")
colorRange = input(color.blue, "Range Color", group="STYLING")
rangeIsDotted = input(true, "Dash Line Style For The Range", group="STYLING")
plot_mid = input(true, "Plot Mid Lines")
close_to_close = input(false, "Close To Close (instead of low to high distance)")
// --- Variable Initialization ---
var float range_high = na
var float range_low = na
var float distance = na
var int startIDX = na
// Function to calculate adjusted time based on timezone offset
getAdjustedTime(hour, minute, offset_hours, offset_minutes) =>
total_minutes = hour * 60 + minute + offset_hours * 60 + offset_minutes
// Function to normalize time to minutes from the start of the week
normalizeTimeToWeek(hour, minute) =>
(dayofweek - 1) * 24 * 60 + hour * 60 + minute
// Adjusted Time Calculations
= getAdjustedTime(range_start_hour, range_start_minute, timezone_offset_hours, timezone_offset_minutes)
= getAdjustedTime(range_end_hour, range_end_minute, timezone_offset_hours, timezone_offset_minutes)
// Normalize times to minutes from the start of the week
start_time_minutes = normalizeTimeToWeek(adjusted_start_hour, adjusted_start_minute)
end_time_minutes = normalizeTimeToWeek(adjusted_end_hour, adjusted_end_minute)
// Adjust the end time if the range spans over midnight
if adjusted_start_hour > adjusted_end_hour or (adjusted_start_hour == adjusted_end_hour and adjusted_start_minute > adjusted_end_minute)
end_time_minutes := end_time_minutes + 7 * 24 * 60 // Add 7 days worth of minutes
// Current time normalized to minutes from the start of the week
current_time_minutes = normalizeTimeToWeek(hour, minute)
// Detect if the current time is before the start of the week normalized time
if current_time_minutes < start_time_minutes
current_time_minutes := current_time_minutes + 7 * 24 * 60 // Adjust for new week
// Determine if we are in the plotting range
isInRange = current_time_minutes >= start_time_minutes and current_time_minutes <= end_time_minutes
// Main Logic
if isInRange
if na(range_high) // If this is the first bar to plot
startIDX := bar_index
range_high := close_to_close ? close : high
range_low := close_to_close ? close : low
else
range_high := math.max(range_high, close_to_close ? close : high)
range_low := math.min(range_low, close_to_close ? close : low)
distance := range_high - range_low
else if not na(range_high) // If we have completed the range
// Draw the range lines
line.new(startIDX, range_high, bar_index , range_high, xloc=xloc.bar_index, style=rangeIsDotted ? line.style_dashed : line.style_solid, color=colorRange)
line.new(startIDX, range_low, bar_index , range_low, xloc=xloc.bar_index, style=rangeIsDotted ? line.style_dashed : line.style_solid, color=colorRange)
// Draw additional lines based on the count input
for i = 1 to count
line.new(startIDX, range_high + i * distance, bar_index , range_high + i * distance, xloc=xloc.bar_index, style=line.style_solid, color=colorTop)
line.new(startIDX, range_low - i * distance, bar_index , range_low - i * distance, xloc=xloc.bar_index, style=line.style_solid, color=colorBottom)
if plot_mid
line.new(startIDX, range_high + (i - 0.5) * distance, bar_index , range_high + (i - 0.5) * distance, xloc=xloc.bar_index, style=line.style_dashed, color=colorBetween)
line.new(startIDX, range_low - (i - 0.5) * distance, bar_index , range_low - (i - 0.5) * distance, xloc=xloc.bar_index, style=line.style_dashed, color=colorBetween)
// Reset the variables after plotting
range_high := na
range_low := na
distance := na
startIDX := na
Ichi+QLine+DLine+TenkShift+RoadCross+5MAs V2.1Previous Version of Full Ichi...
Many of my old friends had requested that I re-upload the full Ichimoku indicator on TradingView, which unfortunately was removed from the platform two years ago due to some of TradingView's strict policies. Now, I’m making this indicator available again with the updated version of Pine Script.
RSI Status v2 Multi-TFThe RSI provides two values, the RSI and the RSI-EMA. This simple indicator simply displays the status of the RSI (Green/Red) and the associated values for the Weekly, Daily and 4-hour time-frames, regardless of what time-frame you are viewing. The exception is the 4-hour value, that will have a minor difference when viewed from the Daily or Weekly due to the code picking up the first 4-hour reading of the day rather than the final 4-hour (end-of-day). It will read correctly when viewing the 4-hour chart.
ROC with AveragesMain Idea
This script provides traders with a comprehensive view of market momentum by calculating the Rate of Change (ROC) and categorizing its impact into averages of positive, negative, and total values.
Key Features
Rate of Change (ROC) Calculation: Measures the percentage change in closing prices over a user-defined period.
Categorical Averages:
Positive Average: Average ROC for upward movements.
Negative Average: Average ROC for downward movements.
Total Average: Aggregate average across all movements.
Dynamic Visualization: Plots ROC alongside its categorized averages for better trend analysis.
Benefits
Simplifies the evaluation of market trends by breaking down data into actionable insights.
Helps traders identify the strength of upward or downward movements.
Offers a clear visual representation for quick decision-making.
This structure highlights the purpose and value of the script while aligning with the Minto Pyramid Principle. Let me know if you'd like further refinements!
الفكرة الرئيسية
يوفر هذا السكربت للمتداولين رؤية شاملة لزخم السوق من خلال حساب معدل التغير (ROC) وتصنيفه إلى متوسطات القيم الإيجابية والسلبية والإجمالية.
المميزات الرئيسية
حساب معدل التغير (ROC): يقيس النسبة المئوية للتغير في أسعار الإغلاق خلال فترة محددة يختارها المستخدم.
المتوسطات التصنيفية:
المتوسط الإيجابي: متوسط معدل التغير للحركات الصعودية.
المتوسط السلبي: متوسط معدل التغير للحركات الهبوطية.
المتوسط الإجمالي: متوسط إجمالي يشمل جميع الحركات.
تصور ديناميكي: يعرض معدل التغير إلى جانب المتوسطات المصنفة لتسهيل تحليل الاتجاهات.
الفوائد
يبسط تقييم اتجاهات السوق من خلال تقسيم البيانات إلى رؤى قابلة للتنفيذ.
يساعد المتداولين على تحديد قوة الحركات الصعودية أو الهبوطية.
يقدم تمثيلاً بصرياً واضحاً لاتخاذ قرارات سريعة ودقيقة.
Temporary Help Services Jobs - Trend Allocation StrategyThis strategy is designed to capitalize on the economic trends represented by the Temporary Help Services (TEMPHELPS) index, which is published by the Federal Reserve Economic Data (FRED). Temporary Help Services Jobs are often regarded as a leading indicator of labor market conditions, as changes in temporary employment levels frequently precede broader employment trends.
Methodology:
Data Source: The strategy uses the FRED dataset TEMPHELPS for monthly data on temporary help services.
Trend Definition:
Uptrend: When the current month's value is greater than the previous month's value.
Downtrend: When the current month's value is less than the previous month's value.
Entry Condition: A long position is opened when an uptrend is detected, provided no position is currently held.
Exit Condition: The long position is closed when a downtrend is detected.
Scientific Basis:
The TEMPHELPS index serves as a leading economic indicator, as noted in studies analyzing labor market cyclicality (e.g., Katz & Krueger, 1999). Temporary employment is often considered a proxy for broader economic conditions, particularly in predicting recessions or recoveries. Incorporating this index into trading strategies allows for aligning trades with potential macroeconomic shifts, as suggested by research on employment trends and market performance (Autor, 2001; Valetta & Bengali, 2013).
Usage:
This strategy is best suited for long-term investors or macroeconomic trend followers who wish to leverage labor market signals for equity or futures trading. It operates exclusively on end-of-month data, ensuring minimal transaction costs and noise.
5SMA W/TrendTrend Filter for identifying 5 day trend based on direction of moving averages and price.
Cumulative Force Oscillator with MACDCumulative Force Oscillator with MACD
The Cumulative Force Oscillator with MACD is an advanced technical indicator designed to provide traders with a unique perspective on market momentum and trend strength. By combining the power of cumulative candle force analysis with MACD crossover signals, this indicator offers a multifaceted approach to market analysis.
Key Features
1. Cumulative Force Calculation**: Measures the net force of price movements over a specified number of candles.
2. MACD Integration**: Incorporates MACD crossover signals for additional trend confirmation.
3. Visual Cues**: Utilizes color-coded oscillator lines and background zones for easy interpretation.
4. **Dynamic Labeling**: Displays real-time force values and percentage changes.
How It Works
Cumulative Force Calculation
The indicator calculates the "force" of each candle by subtracting the open price from the close price. It then sums this force over a user-defined number of candles to create a cumulative force value. This value oscillates above and below zero, indicating bullish or bearish pressure respectively.
MACD Crossover Detection
The indicator uses the standard MACD (12, 26, 9) to detect bullish and bearish crossovers. These crossovers are visually represented by colored background zones, providing an additional layer of trend confirmation.
Visual Representation
- The main oscillator line is plotted in green when above zero (bullish) and red when below zero (bearish).
- Background colors change based on MACD crossovers: light blue for bullish crossovers and light orange for bearish crossovers.
- A dynamic label displays the current cumulative force value and its percentage change from the previous period.
Interpretation
1. Oscillator Line : When the line is above zero, it indicates net bullish pressure; below zero suggests net bearish pressure.
2. Oscillator Momentum : The steepness and direction of the oscillator line indicate the strength and direction of the current market force.
3. MACD Crossovers : Blue background zones suggest potential bullish trends, while orange zones indicate potential bearish trends.
4. Divergences : Look for divergences between the oscillator and price action for potential trend reversal signals.
Customization
Users can customize several aspects of the indicator :
- Number of candles for force calculation
- Label offset and text size
- Color schemes (through code modification)
Conclusion
The Cumulative Force Oscillator with MACD is a versatile tool that combines momentum analysis with trend confirmation signals. By providing a visual representation of cumulative market force alongside MACD crossovers, it offers traders a comprehensive view of market dynamics. This indicator can be particularly useful for identifying potential trend reversals, confirming existing trends, and gauging overall market strength.
Smart Moving Average Trend IndicatorThe Smart Moving Average Trend Indicator is designed to provide traders with a comprehensive analysis of market trends, confirmations, and potential reversals. Here’s a detailed description of its technical features:
Technical Features
Moving Average Calculation:
Simple Moving Average (SMA): The indicator calculates a simple moving average over a user-defined period (default is 14 bars). This average helps smooth out price fluctuations and identify the overall direction of the trend.
Trend Detection:
Primary Trend: Identifies long-term trends (weeks to months) based on price movement above or below the SMA.
Secondary Trend: Tracks short-term corrections or retracements against the primary trend.
Minor Trend: Monitors short-term fluctuations, providing insights into immediate market movements.
Volume Confirmation:
The indicator assesses whether the current volume exceeds a threshold (default is 1.5 times the SMA of volume). A price increase accompanied by higher volume indicates stronger trend validity.
Trendline Detection:
The script draws trendlines for primary, secondary, and minor trends, visually assisting traders in identifying potential support and resistance levels. These trendlines help visualize the overall market structure.
Trend Reversal Signals:
The indicator highlights potential trend reversals based on specific conditions (e.g., lower troughs or peaks). This feature allows traders to anticipate changes in trend direction, increasing the likelihood of capturing significant price moves.
Alerts:
Alert Conditions: The indicator includes alert conditions for potential trend reversals and volume confirmations. Traders can set up alerts to be notified when these conditions are met, facilitating timely decision-making.
Visual Indications:
Background Color: Changes the background color to red when a potential trend reversal is detected, providing a clear visual cue.
Volume Confirmation Markers: Displays small upward labels below bars when volume confirmation is present, indicating significant trading activity accompanying price movements.
Overall Benefits
Multi-Faceted Analysis: The combination of trend detection, volume analysis, and reversal signals provides a holistic view of market dynamics.
Enhanced Decision-Making: With alerts and visual cues, traders can make more informed decisions, potentially increasing their success in identifying entry and exit points.
Flexibility: Users can customize the moving average length and volume threshold, allowing the indicator to adapt to different trading strategies and timeframes.
This Smart Moving Average Trend Indicator is particularly useful for traders looking to capture trends while minimizing noise and false signals, making it a valuable tool in technical analysis.
Amirreza_ahli v2Amirrezaahli-v2
This indicator is designed for technical analysis, providing buy and sell signals based on multiple confirmations from various well-known indicators. The indicator generates a signal only when at least 7 confirmations from 10 different indicators are met, ensuring higher reliability.
Features:
• Utilizes EMA, MACD, RSI, Stochastic Oscillator, SAR, CCI, Keltner Channels, and Volume to generate signals.
• Includes Divergence Detection for multiple indicators like RSI, MACD, Stochastic, and CCI, enhancing the quality of signals.
• Green Rocket symbols for buy signals and Red Rocket symbols for sell signals, with the number of confirmations displayed on the rockets.
• Alerts for buy and sell signals are available on TradingView, providing notifications whenever a signal is triggered.
• Separate buy and sell confirmations are set for each condition, and a signal is generated only when the minimum number of confirmations is met.
How to Use:
1. This indicator analyzes signals based on 10 different indicators by default.
2. A buy signal is triggered when at least 7 confirmations from the 10 indicators are met, and it is displayed on the chart as a green rocket.
3. A sell signal is triggered when at least 7 confirmations from the 10 indicators are met, and it is displayed on the chart as a red rocket.
4. Alerts for buy and sell signals are preset, so you can receive notifications as soon as a signal is generated.
Note:
This indicator can be used as a supplemental tool for decision-making in trading. However, it is recommended to test the indicator in demo markets before using it for live trading.
or.
Dynamic Signal EngineDynamic Signal Engine
The Dynamic Signal Engine is a powerful and versatile indicator, designed to help traders make informed decisions by combining trend analysis with key support and resistance levels. This tool is inspired by the Linear Regression Oscillator , which laid the foundation for this enhanced implementation. By building on the original concept, this script introduces additional features, customization, and integration with dynamic trading strategies to suit diverse trading styles.
Key Features
Inspiration and Foundation
This indicator draws inspiration from the Linear Regression Oscillator , leveraging its robust trend detection capabilities while adding custom enhancements for broader functionality and user adaptability.
Trading Style Customization
Adaptable for Scalping, Intraday, and Swing Trading with dynamic parameter adjustments for each style.
User-defined inputs for thresholds, lookback periods, and visualization options provide further control.
Enhanced Linear Regression Oscillator (LRO)
A refined implementation of the LRO calculates deviations from a regression line, normalized for improved trend detection.
Identifies bullish and bearish crossovers with added alerts and visual markers.
Includes proximity alerts for critical thresholds to help traders anticipate key market movements.
Dynamic Support and Resistance Integration
Incorporates ENIGMA Signal Logic to identify swing highs and lows, dynamically marking them as fractal support and resistance levels.
When a sell signal from ENIGMA is generated, traders can choose to sell immediately or use the low of the previous candle as the entry point. Similarly, for a buy signal, traders can buy immediately or use the high of the previous candle for entry. These signals are visually indicated by a green triangle for buy signals, ensuring clear and actionable insights.
Advanced Visualization
Displays key levels with customizable horizontal lines (solid, dashed, or dotted) and labels for clarity.
Candle colours and mini arrows highlight trends and potential trading opportunities.
Real-Time Alerts
Alerts for LRO threshold crossings and swing-level breaches keep you updated without the need for constant monitoring.
Optimized for Usability
Designed to keep charts clean by limiting displayed trades and signals to recent activity.
Adjustable parameters ensure flexibility and a user-friendly experience.
How It Works
Trend Detection with Enhanced LRO
The indicator builds on the Linear Regression Oscillator , calculating oscillations of price movements and normalizing them for trend analysis. Crossovers and threshold proximity are visualized on the chart and trigger alerts for potential market shifts.
Dynamic Support and Resistance Levels
The ENIGMA Signal Logic identifies recent swing highs and lows, marking them as key levels. These levels are dynamically updated as new swing points are detected, providing actionable support and resistance zones.
Signal Confirmation
Buy or sell signals are confirmed when:
Price breaches the swing levels.
The LRO aligns with directional bias (e.g., bearish crossover for sell signals).
Signals are further clarified by ENIGMA's green triangle indicators, showing key buy and sell opportunities.
Visualization and Alerts
Signals are displayed using arrows, labelled horizontal lines, and optional candle colours. Alerts notify traders of key events, such as LRO threshold crossings or swing-level breaches.
How to Use
Choose your Trading Style: Scalping, Intraday, or Swing Trading. The indicator adjusts its default settings automatically.
Fine-tune parameters like LRO thresholds, line lengths, and the number of visible trades to suit your preferences.
Observe the chart for signals:
Green arrows and lines indicate buy opportunities.
Red arrows and lines signal sell opportunities.
Use the alert system to stay informed about LRO thresholds and signal confirmations.
Integrate the indicator with your existing trading strategy for better decision-making.
Acknowledgement
This script was inspired by the Linear Regression Oscillator . While it builds on the core concept, this implementation introduces unique enhancements, such as dynamic signal integration, trading style adaptability, and advanced visualization tools, making it a highly customizable and versatile tool for traders.
Disclaimer
This indicator is intended for educational purposes only and should not be considered financial advice. Always perform due diligence and apply appropriate risk management when trading.