HSM MACROS//@version=5
indicator('HSM MACROS', 'HSM MACROS', overlay=true, max_bars_back=500, explicit_plot_zorder=true)
import boitoki/AwesomeColor/4 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'
g4 = 'BOX'
g6 = 'LABELS'
g5 = 'OPENING RANGE'
g7 = 'FIBONACCI LEVELS'
g8 = 'OPTIONS'
g11 = 'CANDLE'
g10 = 'Alerts visualized'
///////////////
// 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'
fmt_price = '{0,number,#.#####}'
fmt_pips = '{0,number,#.#}'
icon_separator = ' • '
color_none = color.new(color.black, 100)
color_text = color.new(color.white, 0)
///////////////
// 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-4', title='Timezone', options= , tooltip='e.g. \'America/New_York\', \'Asia/Tokyo\', \'GMT-4\', \'GMT+9\'...', 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('MC1', '', group=g1_01, inline='session1_1')
i_sess1_color = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1_barcolor1 = input.color(#0a0a0a, '•', group=g1_01, inline='session1_1')
i_sess1_barcolor2 = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1 = input.session('0820-0830', 'Time', group=g1_01)
i_sess1_extend = input.string(option_no, 'Extend', options= , group=g1_01)
i_sess1_fib = input.string(option_no, 'Fibonacci levels', group=g1_01, options= ) != option_no
i_sess1_op = input.string(option_no, 'Opening range', group=g1_01, options= ) != option_no and i_show
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('MC2', '', group=g1_02, inline='session2_1')
i_sess2_color = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2_barcolor1 = input.color(#0a0a0a, '•', group=g1_02, inline='session2_1')
i_sess2_barcolor2 = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2 = input.session('0920-0930', 'Time', group=g1_02)
i_sess2_extend = input.string(option_no, 'Extend', options= , group=g1_02)
i_sess2_fib = input.string(option_no, 'Fibonacci levels', group=g1_02, options= ) != option_no
i_sess2_op = input.string(option_no, 'Opening range', group=g1_02, options= ) != option_no and i_show
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('MC3', '', group=g1_03, inline='session3_1')
i_sess3_color = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3_barcolor1 = input.color(#0a0a0a, '•', group=g1_03, inline='session3_1')
i_sess3_barcolor2 = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3 = input.session('0950-1010', 'Time', group=g1_03)
i_sess3_extend = input.string(option_no, 'Extend', options= , group=g1_03)
i_sess3_fib = input.string(option_no, 'Fibonacci levels', group=g1_03, options= ) != option_no
i_sess3_op = input.string(option_no, 'Opening range', group=g1_03, options= ) != option_no and i_show
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(true, 'Session 4 ', group=g1_04, inline='session4_1') and i_show
i_sess4_label = input.string('MC4', '', group=g1_04, inline='session4_1')
i_sess4_color = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4_barcolor1 = input.color(#0a0a0a, '•', group=g1_04, inline='session4_1')
i_sess4_barcolor2 = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4 = input.session('1050-1110', 'Time', group=g1_04)
i_sess4_extend = input.string(option_no, 'Extend', options= , group=g1_04)
i_sess4_fib = input.string(option_no, 'Fibonacci levels', group=g1_04, options= ) != option_no
i_sess4_op = input.string(option_no, 'Opening range', group=g1_04, options= ) != option_no and i_show
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
// Show & Styles
i_sess_box_style = input.string('Box', 'Style', options= , group=g4)
i_sess_border_style = f_border_style(input.string(option_border_style2, 'Line style', options= , group=g4))
i_sess_border_width = input.int(1, 'Thickness', minval=0, group=g4)
i_sess_bgopacity = input.int(94, 'Transp', minval=0, maxval=100, step=1, group=g4, tooltip='Setting the 100 is no background color')
// Candle
option_candle_body = 'OC'
option_candle_wick = 'OHLC'
i_candle = input.string(option_hide, 'Display', options= , group=g11)
i_candle_border_width = input.int(2, 'Thickness', minval=0, group=g11)
i_show_candle = (i_candle != option_hide) and (i_candle_border_width > 0)
i_show_candle_wick = i_candle == option_candle_wick
option_candle_color1 = 'Session\'s'
option_candle_color2 = 'Red • Green'
i_candle_color = input.string(option_candle_color2, 'Color ', options= , group=g11, inline='candle_color')
i_candle_color_g = input.color(#A6E22E, '', group=g11, inline='candle_color')
i_candle_color_r = input.color(#F92672, '', group=g11, inline='candle_color')
// Labels
i_label_show = input.bool(true, 'Labels', 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)
// Fibonacci levels
i_f_linestyle = f_border_style(input.string(option_border_style1, title="Style", options= , group=g7))
i_f_linewidth = input.int(1, title="Thickness", minval=1, group=g7)
// Opening range
i_o_minutes = input.int(15, title='Periods (minutes)', minval=1, step=1, group=g5)
i_o_minutes := math.max(i_o_minutes, timeframe.multiplier + 1)
i_o_transp = input.int(88, title='Transp', minval=0, maxval=100, step=1, group=g5)
// 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, _is_started, _color, _top, _bottom, _text, _labels) =>
var label my_label = na
var int start_time = na
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(_text)
array.push(v_label, _text)
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)) + ' pips')
if _show
if _is_started
my_label := label.new(bar_index, v_position_y, array.join(v_label, icon_separator), textcolor=_color, color=color_none, size=i_label_size, style=i_label_position)
array.push(_labels, my_label)
util.clear_labels(_labels, 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))
// ------------------------
// Drawing Fibonacci levels
// ------------------------
f_render_fibonacci (_show, _session, _is_started, _x1, _x2, _color, _top, _bottom, _level, _width, _style, _is_extend, _lines) =>
var line my_line = na
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(_lines, my_line)
if _is_extend
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)
// ------------------------
// Drawing Opening range
// ------------------------
f_render_oprange (_show, _session, _is_started, _x1, _x2, _color, _max, _is_extend, _boxes) =>
var int start_time = na
var box my_box = na
top = ta.highest(high, _max)
bottom = ta.lowest(low, _max)
is_crossover = ta.crossover(close, box.get_top(my_box))
is_crossunder = ta.crossunder(close, box.get_bottom(my_box))
if _show
if _is_started
util.clear_boxes(_boxes, math.max(0, i_history_period - 1))
start_time := time
my_box := na
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
my_box := box.new(_x1, top, _x2, bottom, border_width=0, bgcolor=color.new(_color, i_o_transp))
array.push(_boxes, my_box)
if _is_extend
box.set_extend(my_box, extend.right)
my_box
else
f_set_box_right(my_box, _x2)
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)
my_box
// ------------------------
// Drawing candle
// ------------------------
f_render_candle (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _open, _x1, _x2, _boxes, _lines) =>
var box body = na
var line wick1 = na
var line wick2 = na
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
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=_color, width=border_width, style=line.style_solid) : na
wick2 := i_show_candle_wick ? line.new(cx, _bottom, cx, _bottom, color=_color, width=border_width, style=line.style_solid) : na
array.push(_boxes, body)
array.push(_lines, wick1)
array.push(_lines, wick2)
util.clear_boxes(_boxes, i_history_period)
util.clear_lines(_lines, 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)
// ------------------------
// Rendering limit message
// ------------------------
f_render_limitmessage (_show, _session, _is_started, _is_ended, _x, _y, _rightbars) =>
var label my_note = na
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)
true
// Rendering session
//
f_render_sessionrange (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _lines) =>
var line above_line = na
var line below_line = na
if _show
if _is_started
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(_lines, above_line)
array.push(_lines, below_line)
util.clear_lines(_lines, i_history_period * 2)
if _is_extend
line.set_extend(above_line, extend.right)
line.set_extend(below_line, extend.right)
else if _session
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)
true
else if _is_ended
true
true
// ------------------------
// Rendering session box
// ------------------------
f_render_session (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _boxes) =>
var box my_box = na
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(_boxes, my_box)
util.clear_boxes(_boxes, i_history_period)
if _is_extend
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)
my_box
// ------------------------
// Drawing market
// ------------------------
f_render_main (_show, _session, _is_started, _is_ended, _color, _top, _bottom) =>
var box my_box = na
var label my_note = na
var x1 = 0
var x2 = 0
var session_open = 0.0
var session_high = 0.0
var session_low = 0.0
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.abs(x0_2 - x0_1)
limit_bars = max_bars
rightbars = x0_d
if _show
if _is_started
x1 := bar_index
x2 := bar_index + (math.min(x0_d, limit_bars))
session_open := open
session_high := _top
session_low := _bottom
else if _session
true_x2 = x1 + x0_d
rightbars := true_x2 - bar_index
limit_bars := bar_index + max_bars
x2 := math.min(true_x2, limit_bars)
session_high := _top
session_low := _bottom
else if _is_ended
session_open := na
// ------------------------
// Drawing
// ------------------------
draw (_show, _session, _color, _label, _extend, _show_fib, _show_op, _lookback, _boxes_session, _lines_session, _boxes_candle_body, _lines_candle_wick, _boxes_op, _lines_fib, _labels) =>
max = f_get_period(_session, 1, _lookback)
top = ta.highest(high, max)
bottom = ta.lowest(low, max)
is_started = f_get_started(_session)
is_ended = f_get_ended(_session)
is_extend = _extend != option_no
= f_render_main(_show, _session, is_started, is_ended, _color, top, bottom)
if i_sess_box_style == 'Box'
f_render_session(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _boxes_session)
if i_sess_box_style == 'Sandwich'
f_render_sessionrange(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _lines_session)
if i_show_candle
f_render_candle(_show, _session, is_started, is_ended, _color, top, bottom, _open, x1, x2, _boxes_candle_body, _lines_candle_wick)
if i_label_show
f_render_label(_show, _session, is_started, _color, top, bottom, _label, _labels)
if _show_op
f_render_oprange(_show, _session, is_started, x1, x2, _color, max, is_extend, _boxes_op)
if _show_fib
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.500, 2, line.style_solid, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.628, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.382, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
util.clear_lines(_lines_fib, i_history_period * 3)
f_render_limitmessage(_show, _session, is_started, is_ended, x1, bottom, _rightbars)
///////////////////
// Calculating
///////////////////
string tz = (i_tz == option_no or i_tz == '') ? na : i_tz
int sess1 = time(timeframe.period, i_sess1, tz)
int sess2 = time(timeframe.period, i_sess2, tz)
int sess3 = time(timeframe.period, i_sess3, tz)
int sess4 = time(timeframe.period, i_sess4, tz)
///////////////////
// Plotting
///////////////////
var sess1_box = array.new()
var sess2_box = array.new()
var sess3_box = array.new()
var sess4_box = array.new()
var sess1_line = array.new()
var sess2_line = array.new()
var sess3_line = array.new()
var sess4_line = array.new()
var sess1_op = array.new()
var sess2_op = array.new()
var sess3_op = array.new()
var sess4_op = array.new()
var sess1_fib = array.new()
var sess2_fib = array.new()
var sess3_fib = array.new()
var sess4_fib = array.new()
var sess1_candle_body = array.new()
var sess2_candle_body = array.new()
var sess3_candle_body = array.new()
var sess4_candle_body = array.new()
var sess1_candle_wick = array.new()
var sess2_candle_wick = array.new()
var sess3_candle_wick = array.new()
var sess4_candle_wick = array.new()
var sess1_labels = array.new()
var sess2_labels = array.new()
var sess3_labels = array.new()
var sess4_labels = array.new()
= draw(i_show_sess1, sess1, i_sess1_color, i_sess1_label, i_sess1_extend, i_sess1_fib, i_sess1_op, i_lookback, sess1_box, sess1_line, sess1_candle_body, sess1_candle_wick, sess1_op, sess1_fib, sess1_labels)
= draw(i_show_sess2, sess2, i_sess2_color, i_sess2_label, i_sess2_extend, i_sess2_fib, i_sess2_op, i_lookback, sess2_box, sess2_line, sess2_candle_body, sess2_candle_wick, sess2_op, sess2_fib, sess2_labels)
= draw(i_show_sess3, sess3, i_sess3_color, i_sess3_label, i_sess3_extend, i_sess3_fib, i_sess3_op, i_lookback, sess3_box, sess3_line, sess3_candle_body, sess3_candle_wick, sess3_op, sess3_fib, sess3_labels)
= draw(i_show_sess4, sess4, i_sess4_color, i_sess4_label, i_sess4_extend, i_sess4_fib, i_sess4_op, i_lookback, sess4_box, sess4_line, sess4_candle_body, sess4_candle_wick, sess4_op, sess4_fib, sess4_labels)
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
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
barcolor(c_barcolor)
plotcandle(open, high, low, close, color=is_positive_bar ? color_none : 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
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((not is_sess1) and ta.crossover(close, sess1_high), 'Session #1 High crossed (after session closed)')
alertcondition((not is_sess1) and ta.crossunder(close, sess1_low), 'Session #1 Low crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossover(close, sess2_high), 'Session #2 High crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossunder(close, sess2_low), 'Session #2 Low crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossover(close, sess3_high), 'Session #3 High crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossunder(close, sess3_low), 'Session #3 Low crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossover(close, sess4_high), 'Session #4 High crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossunder(close, sess4_low), 'Session #4 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, 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, 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, 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, close, 'End' , yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
plot(i_alert3_show ? sess1_high : na, 'sess1_high', style=plot.style_linebr, color=i_sess1_color)
plot(i_alert3_show ? sess1_low : na, 'sess1_low' , style=plot.style_linebr, color=i_sess1_color, linewidth=2)
plot(i_alert3_show ? sess2_high : na, 'sess2_high', style=plot.style_linebr, color=i_sess2_color)
plot(i_alert3_show ? sess2_low : na, 'sess2_low' , style=plot.style_linebr, color=i_sess2_color, linewidth=2)
plot(i_alert3_show ? sess3_high : na, 'sess3_high', style=plot.style_linebr, color=i_sess3_color)
plot(i_alert3_show ? sess3_low : na, 'sess3_low' , style=plot.style_linebr, color=i_sess3_color, linewidth=2)
plot(i_alert3_show ? sess4_high : na, 'sess4_high', style=plot.style_linebr, color=i_sess4_color)
plot(i_alert3_show ? sess4_low : na, 'sess4_low' , style=plot.style_linebr, color=i_sess4_color, linewidth=2)
plotshape(i_alert3_show and (not is_sess1) and ta.crossover(close, sess1_high) ? sess1_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_low) ? sess1_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_high) ? sess2_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_low) ? sess2_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_high) ? sess3_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_low) ? sess3_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_high) ? sess4_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_low) ? sess4_low : na, 'cross sess4_low', color=i_sess4_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
ابحث في النصوص البرمجية عن "a股开盘前15分钟交易规则"
HSM BULLET//@version=5
indicator('HSM BULLET', 'HSM BULLET', overlay=true, max_bars_back=500, explicit_plot_zorder=true)
import boitoki/AwesomeColor/4 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'
g4 = 'BOX'
g6 = 'LABELS'
g5 = 'OPENING RANGE'
g7 = 'FIBONACCI LEVELS'
g8 = 'OPTIONS'
g11 = 'CANDLE'
g10 = 'Alerts visualized'
///////////////
// 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'
fmt_price = '{0,number,#.#####}'
fmt_pips = '{0,number,#.#}'
icon_separator = ' • '
color_none = color.new(color.black, 100)
color_text = color.new(color.white, 0)
///////////////
// 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-4', title='Timezone', options= , tooltip='e.g. \'America/New_York\', \'Asia/Tokyo\', \'GMT-4\', \'GMT+9\'...', 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 Silver', '', group=g1_01, inline='session1_1')
i_sess1_color = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1_barcolor1 = input.color(#0a0a0a, '•', group=g1_01, inline='session1_1')
i_sess1_barcolor2 = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1 = input.session('0300-0400', 'Time', group=g1_01)
i_sess1_extend = input.string(option_no, 'Extend', options= , group=g1_01)
i_sess1_fib = input.string(option_no, 'Fibonacci levels', group=g1_01, options= ) != option_no
i_sess1_op = input.string(option_no, 'Opening range', group=g1_01, options= ) != option_no and i_show
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('NY AM Bullet', '', group=g1_02, inline='session2_1')
i_sess2_color = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2_barcolor1 = input.color(#0a0a0a, '•', group=g1_02, inline='session2_1')
i_sess2_barcolor2 = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2 = input.session('1000-1100', 'Time', group=g1_02)
i_sess2_extend = input.string(option_no, 'Extend', options= , group=g1_02)
i_sess2_fib = input.string(option_no, 'Fibonacci levels', group=g1_02, options= ) != option_no
i_sess2_op = input.string(option_no, 'Opening range', group=g1_02, options= ) != option_no and i_show
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('NY PM Bullet', '', group=g1_03, inline='session3_1')
i_sess3_color = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3_barcolor1 = input.color(#0a0a0a, '•', group=g1_03, inline='session3_1')
i_sess3_barcolor2 = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3 = input.session('1400-1500', 'Time', group=g1_03)
i_sess3_extend = input.string(option_no, 'Extend', options= , group=g1_03)
i_sess3_fib = input.string(option_no, 'Fibonacci levels', group=g1_03, options= ) != option_no
i_sess3_op = input.string(option_no, 'Opening range', group=g1_03, options= ) != option_no and i_show
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(true, 'Session 4 ', group=g1_04, inline='session4_1') and i_show
i_sess4_label = input.string(' ', '', group=g1_04, inline='session4_1')
i_sess4_color = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4_barcolor1 = input.color(#0a0a0a, '•', group=g1_04, inline='session4_1')
i_sess4_barcolor2 = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4 = input.session('1000-1000', 'Time', group=g1_04)
i_sess4_extend = input.string(option_no, 'Extend', options= , group=g1_04)
i_sess4_fib = input.string(option_no, 'Fibonacci levels', group=g1_04, options= ) != option_no
i_sess4_op = input.string(option_no, 'Opening range', group=g1_04, options= ) != option_no and i_show
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
// Show & Styles
i_sess_box_style = input.string('Box', 'Style', options= , group=g4)
i_sess_border_style = f_border_style(input.string(option_border_style2, 'Line style', options= , group=g4))
i_sess_border_width = input.int(1, 'Thickness', minval=0, group=g4)
i_sess_bgopacity = input.int(94, 'Transp', minval=0, maxval=100, step=1, group=g4, tooltip='Setting the 100 is no background color')
// Candle
option_candle_body = 'OC'
option_candle_wick = 'OHLC'
i_candle = input.string(option_hide, 'Display', options= , group=g11)
i_candle_border_width = input.int(2, 'Thickness', minval=0, group=g11)
i_show_candle = (i_candle != option_hide) and (i_candle_border_width > 0)
i_show_candle_wick = i_candle == option_candle_wick
option_candle_color1 = 'Session\'s'
option_candle_color2 = 'Red • Green'
i_candle_color = input.string(option_candle_color2, 'Color ', options= , group=g11, inline='candle_color')
i_candle_color_g = input.color(#A6E22E, '', group=g11, inline='candle_color')
i_candle_color_r = input.color(#F92672, '', group=g11, inline='candle_color')
// Labels
i_label_show = input.bool(true, 'Labels', 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)
// Fibonacci levels
i_f_linestyle = f_border_style(input.string(option_border_style1, title="Style", options= , group=g7))
i_f_linewidth = input.int(1, title="Thickness", minval=1, group=g7)
// Opening range
i_o_minutes = input.int(15, title='Periods (minutes)', minval=1, step=1, group=g5)
i_o_minutes := math.max(i_o_minutes, timeframe.multiplier + 1)
i_o_transp = input.int(88, title='Transp', minval=0, maxval=100, step=1, group=g5)
// 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, _is_started, _color, _top, _bottom, _text, _labels) =>
var label my_label = na
var int start_time = na
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(_text)
array.push(v_label, _text)
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)) + ' pips')
if _show
if _is_started
my_label := label.new(bar_index, v_position_y, array.join(v_label, icon_separator), textcolor=_color, color=color_none, size=i_label_size, style=i_label_position)
array.push(_labels, my_label)
util.clear_labels(_labels, 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))
// ------------------------
// Drawing Fibonacci levels
// ------------------------
f_render_fibonacci (_show, _session, _is_started, _x1, _x2, _color, _top, _bottom, _level, _width, _style, _is_extend, _lines) =>
var line my_line = na
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(_lines, my_line)
if _is_extend
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)
// ------------------------
// Drawing Opening range
// ------------------------
f_render_oprange (_show, _session, _is_started, _x1, _x2, _color, _max, _is_extend, _boxes) =>
var int start_time = na
var box my_box = na
top = ta.highest(high, _max)
bottom = ta.lowest(low, _max)
is_crossover = ta.crossover(close, box.get_top(my_box))
is_crossunder = ta.crossunder(close, box.get_bottom(my_box))
if _show
if _is_started
util.clear_boxes(_boxes, math.max(0, i_history_period - 1))
start_time := time
my_box := na
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
my_box := box.new(_x1, top, _x2, bottom, border_width=0, bgcolor=color.new(_color, i_o_transp))
array.push(_boxes, my_box)
if _is_extend
box.set_extend(my_box, extend.right)
my_box
else
f_set_box_right(my_box, _x2)
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)
my_box
// ------------------------
// Drawing candle
// ------------------------
f_render_candle (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _open, _x1, _x2, _boxes, _lines) =>
var box body = na
var line wick1 = na
var line wick2 = na
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
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=_color, width=border_width, style=line.style_solid) : na
wick2 := i_show_candle_wick ? line.new(cx, _bottom, cx, _bottom, color=_color, width=border_width, style=line.style_solid) : na
array.push(_boxes, body)
array.push(_lines, wick1)
array.push(_lines, wick2)
util.clear_boxes(_boxes, i_history_period)
util.clear_lines(_lines, 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)
// ------------------------
// Rendering limit message
// ------------------------
f_render_limitmessage (_show, _session, _is_started, _is_ended, _x, _y, _rightbars) =>
var label my_note = na
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)
true
// Rendering session
//
f_render_sessionrange (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _lines) =>
var line above_line = na
var line below_line = na
if _show
if _is_started
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(_lines, above_line)
array.push(_lines, below_line)
util.clear_lines(_lines, i_history_period * 2)
if _is_extend
line.set_extend(above_line, extend.right)
line.set_extend(below_line, extend.right)
else if _session
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)
true
else if _is_ended
true
true
// ------------------------
// Rendering session box
// ------------------------
f_render_session (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _boxes) =>
var box my_box = na
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(_boxes, my_box)
util.clear_boxes(_boxes, i_history_period)
if _is_extend
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)
my_box
// ------------------------
// Drawing market
// ------------------------
f_render_main (_show, _session, _is_started, _is_ended, _color, _top, _bottom) =>
var box my_box = na
var label my_note = na
var x1 = 0
var x2 = 0
var session_open = 0.0
var session_high = 0.0
var session_low = 0.0
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.abs(x0_2 - x0_1)
limit_bars = max_bars
rightbars = x0_d
if _show
if _is_started
x1 := bar_index
x2 := bar_index + (math.min(x0_d, limit_bars))
session_open := open
session_high := _top
session_low := _bottom
else if _session
true_x2 = x1 + x0_d
rightbars := true_x2 - bar_index
limit_bars := bar_index + max_bars
x2 := math.min(true_x2, limit_bars)
session_high := _top
session_low := _bottom
else if _is_ended
session_open := na
// ------------------------
// Drawing
// ------------------------
draw (_show, _session, _color, _label, _extend, _show_fib, _show_op, _lookback, _boxes_session, _lines_session, _boxes_candle_body, _lines_candle_wick, _boxes_op, _lines_fib, _labels) =>
max = f_get_period(_session, 1, _lookback)
top = ta.highest(high, max)
bottom = ta.lowest(low, max)
is_started = f_get_started(_session)
is_ended = f_get_ended(_session)
is_extend = _extend != option_no
= f_render_main(_show, _session, is_started, is_ended, _color, top, bottom)
if i_sess_box_style == 'Box'
f_render_session(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _boxes_session)
if i_sess_box_style == 'Sandwich'
f_render_sessionrange(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _lines_session)
if i_show_candle
f_render_candle(_show, _session, is_started, is_ended, _color, top, bottom, _open, x1, x2, _boxes_candle_body, _lines_candle_wick)
if i_label_show
f_render_label(_show, _session, is_started, _color, top, bottom, _label, _labels)
if _show_op
f_render_oprange(_show, _session, is_started, x1, x2, _color, max, is_extend, _boxes_op)
if _show_fib
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.500, 2, line.style_solid, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.628, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.382, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
util.clear_lines(_lines_fib, i_history_period * 3)
f_render_limitmessage(_show, _session, is_started, is_ended, x1, bottom, _rightbars)
///////////////////
// Calculating
///////////////////
string tz = (i_tz == option_no or i_tz == '') ? na : i_tz
int sess1 = time(timeframe.period, i_sess1, tz)
int sess2 = time(timeframe.period, i_sess2, tz)
int sess3 = time(timeframe.period, i_sess3, tz)
int sess4 = time(timeframe.period, i_sess4, tz)
///////////////////
// Plotting
///////////////////
var sess1_box = array.new()
var sess2_box = array.new()
var sess3_box = array.new()
var sess4_box = array.new()
var sess1_line = array.new()
var sess2_line = array.new()
var sess3_line = array.new()
var sess4_line = array.new()
var sess1_op = array.new()
var sess2_op = array.new()
var sess3_op = array.new()
var sess4_op = array.new()
var sess1_fib = array.new()
var sess2_fib = array.new()
var sess3_fib = array.new()
var sess4_fib = array.new()
var sess1_candle_body = array.new()
var sess2_candle_body = array.new()
var sess3_candle_body = array.new()
var sess4_candle_body = array.new()
var sess1_candle_wick = array.new()
var sess2_candle_wick = array.new()
var sess3_candle_wick = array.new()
var sess4_candle_wick = array.new()
var sess1_labels = array.new()
var sess2_labels = array.new()
var sess3_labels = array.new()
var sess4_labels = array.new()
= draw(i_show_sess1, sess1, i_sess1_color, i_sess1_label, i_sess1_extend, i_sess1_fib, i_sess1_op, i_lookback, sess1_box, sess1_line, sess1_candle_body, sess1_candle_wick, sess1_op, sess1_fib, sess1_labels)
= draw(i_show_sess2, sess2, i_sess2_color, i_sess2_label, i_sess2_extend, i_sess2_fib, i_sess2_op, i_lookback, sess2_box, sess2_line, sess2_candle_body, sess2_candle_wick, sess2_op, sess2_fib, sess2_labels)
= draw(i_show_sess3, sess3, i_sess3_color, i_sess3_label, i_sess3_extend, i_sess3_fib, i_sess3_op, i_lookback, sess3_box, sess3_line, sess3_candle_body, sess3_candle_wick, sess3_op, sess3_fib, sess3_labels)
= draw(i_show_sess4, sess4, i_sess4_color, i_sess4_label, i_sess4_extend, i_sess4_fib, i_sess4_op, i_lookback, sess4_box, sess4_line, sess4_candle_body, sess4_candle_wick, sess4_op, sess4_fib, sess4_labels)
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
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
barcolor(c_barcolor)
plotcandle(open, high, low, close, color=is_positive_bar ? color_none : 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
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((not is_sess1) and ta.crossover(close, sess1_high), 'Session #1 High crossed (after session closed)')
alertcondition((not is_sess1) and ta.crossunder(close, sess1_low), 'Session #1 Low crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossover(close, sess2_high), 'Session #2 High crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossunder(close, sess2_low), 'Session #2 Low crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossover(close, sess3_high), 'Session #3 High crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossunder(close, sess3_low), 'Session #3 Low crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossover(close, sess4_high), 'Session #4 High crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossunder(close, sess4_low), 'Session #4 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, 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, 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, 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, close, 'End' , yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
plot(i_alert3_show ? sess1_high : na, 'sess1_high', style=plot.style_linebr, color=i_sess1_color)
plot(i_alert3_show ? sess1_low : na, 'sess1_low' , style=plot.style_linebr, color=i_sess1_color, linewidth=2)
plot(i_alert3_show ? sess2_high : na, 'sess2_high', style=plot.style_linebr, color=i_sess2_color)
plot(i_alert3_show ? sess2_low : na, 'sess2_low' , style=plot.style_linebr, color=i_sess2_color, linewidth=2)
plot(i_alert3_show ? sess3_high : na, 'sess3_high', style=plot.style_linebr, color=i_sess3_color)
plot(i_alert3_show ? sess3_low : na, 'sess3_low' , style=plot.style_linebr, color=i_sess3_color, linewidth=2)
plot(i_alert3_show ? sess4_high : na, 'sess4_high', style=plot.style_linebr, color=i_sess4_color)
plot(i_alert3_show ? sess4_low : na, 'sess4_low' , style=plot.style_linebr, color=i_sess4_color, linewidth=2)
plotshape(i_alert3_show and (not is_sess1) and ta.crossover(close, sess1_high) ? sess1_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_low) ? sess1_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_high) ? sess2_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_low) ? sess2_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_high) ? sess3_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_low) ? sess3_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_high) ? sess4_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_low) ? sess4_low : na, 'cross sess4_low', color=i_sess4_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
Balanced Big Wicks (50/50) HighlighterThis open-source indicator highlights candles with balanced long wicks (50/50 style)—that is, candles where both upper and lower shadows are each at least 30–60% of the full range and within ~8% of each other, while retaining a substantial body. This specific structure often reflects indecision or liquidity sweeps and can precede strong breakout moves.
How It Works (Inputs and Logic)
Min wick % (each side): 30–60% of candle range
Max body %: up to 60% of range (preserves strong body presence)
Equality tolerance: wicks within 8% of each other
ATR filter (multiples of ATR14): ensures only significant-range candles are flagged
When a “50/50” candle forms, it’s visually colored and labeled; audibly alertable.
How to Use It
Long setup: price closes above the wick-high → potential long entry (SL below wick-low, TP = 1:1).
Short setup: price closes below wick-low → potential short entry (SL above wick-high, TP = 1:1).
Especially effective on 5–15 minute scalping charts when aligned with high-volume sessions or HTF trend context.
Why This Indicator Is Unique
Unlike standard wick or doji voters, this script specifically filters for candles with a strong body and symmetrical wicks, paired with a range filter, reducing noise significantly.
Important Notes
No unrealistic claims: backtested setups indicate high occurrence of clean breakouts, though performance depends on market structure.
Script built responsibly: uses real-time calculations only, no future-data lookahead.
Visuals on the published chart reflect default input values exactly.
ADX with Custom Limit LineSimple ADX with Custom Threshold
A clean, educational ADX indicator that allows traders to set their own trend strength threshold.
Features:
- Customizable limit line for personalized trend analysis
- Color-coded ADX line based on trend strength
- Educational reference lines (15, 25, 40, 50)
- Background highlighting when above custom threshold
- Comprehensive alerts for trend changes
Perfect for traders who want a simple but effective tool to assess trend strength without complexity.
This indicator helps understand:
- When trends are strong enough to trade
- How to interpret ADX readings
- Optimal entry/exit timing based on trend strength
Educational and straightforward - ideal for both beginners and experienced traders.
⚠️ RISK DISCLAIMER:
This indicator is for educational purposes only and does not constitute financial advice.
Trading involves significant risk of loss. Always do your own research and consider
consulting with a qualified financial advisor before making trading decisions.
GMMA ABC Signal Goal (one-liner)
Detect trend-aligned entries using an 18-EMA GMMA stack, then filter out chop with momentum (ATR), trend strength (ADX/RSI), and a tight-range (“box”) mute. Auto-draw SL/TP and fire alerts.
1) Core inputs & idea
Three entry archetypes
Type A (Structure break in a tight bundle): GMMA is narrow → price breaks prior swing with correct bull/bear sequence.
Type B (Trend continuation): Price crosses many EMAs with body and short>mid (bull) or short midAvg, close > longAvg, candle pass.
Short: red body, crossBodyDown ≥ bodyThresh, shortAvg < midAvg, close < longAvg, candle pass.
Anti-chop add-ons:
Require GMMA spread ≥ minSpreadB (trend sufficiently expanded).
ADX/RSI gate (configurable AND/OR and individual enable flags):
ADX ≥ adxMin_B
RSI ≥ rsiMinLong_B (long) or RSI ≤ rsiMaxShort_B (short)
Type C — momentum pop
Needs many crosses (crossUp / crossDown ≥ crossThresh) and a strong candle.
Has its own ATR body threshold: body ≥ ATR * atrMultC (separate from global).
6) Global “Box” (tight-range) mute
Look back boxLookback bars; if (highest−lowest)/close ≤ boxMaxPct, then mute all signals.
Prevents trading inside cramped ranges.
7) Signal priority + confirmation + cooldown
Compute raw A/B/C booleans.
Pick first valid in order A → B → C per side (long/short).
Apply:
Bar confirmation (confirmClose)
Cooldown (no new signal within cooldownBars after last)
Global box mute
Record bar index to enforce cooldown.
8) SL/TP logic (simple R-based scaffolding)
SL: previous swing extreme within structLookback (long uses prevLow, short uses prevHigh).
Risk R: distance from entry close to SL (min-tick protected).
TPs: TP1/TP2/TP3 = close ± R × (tp1R, tp2R, tp3R) depending on side.
On a new signal, draw lines for SL/TP1/TP2/TP3; keep them for keepBars then auto-delete.
9) Visuals & alerts
Plot labels for raw Type A/B/C (so you can see which bucket fired).
Entry label on the chosen signal with SL/TP prices.
Alerts: "ABC LONG/SHORT Entry" with ticker & timeframe placeholders.
10) Info panel (top-right)
Shows spread%, box%, ADX, RSI on the last/confirmed bar for quick situational awareness.
11) How to tune (quick heuristics)
Too many signals? Increase minSpreadB, adxMin_B, bodyThresh, or enable confirmClose and a small cooldownBars.
Missing breakouts? Lower atrMultC (Type C) or crossThresh; relax minSpreadB.
Choppy pairs/timeframes? Raise boxMaxPct sensitivity (smaller value mutes more), or raise atrMult (global) to demand fatter candles.
Cleaner trends only? Turn on strictSeq for Type A; raise minSpreadB and adxMin_B.
12) Mental model (TL;DR)
A = “Tight coil + fresh structure break”
B = “Established trend, strong continuation” (spread + ADX/RSI keep you out of chop)
C = “Momentum burst through many EMAs” (independent ATR gate)
Then add box mute, close confirmation, cooldown, and auto SL/TP scaffolding.
Pump/Dump Detector [Modular]//@version=5
indicator("Pump/Dump Detector ", overlay=true)
// ————— Inputs —————
risk_pct = input.float(1.0, "Risk %", minval=0.1)
capital = input.float(100000, "Capital")
stop_multiplier = input.float(1.5, "Stop Multiplier")
target_multiplier = input.float(2.0, "Target Multiplier")
volume_mult = input.float(2.0, "Volume Spike Multiplier")
rsi_low_thresh = input.int(15, "RSI Oversold Threshold")
rsi_high_thresh = input.int(85, "RSI Overbought Threshold")
rsi_len = input.int(2, "RSI Length")
bb_len = input.int(20, "BB Length")
bb_mult = input.float(2.0, "BB Multiplier")
atr_len = input.int(14, "ATR Length")
show_signals = input.bool(true, "Show Entry Signals")
use_orderflow = input.bool(true, "Use Order Flow Proxy")
use_ml_flag = input.bool(false, "Use ML Risk Flag")
use_session_filter = input.bool(true, "Use Volatility Sessions")
// ————— Symbol Filter (Optional) —————
symbol_nq = input.bool(true, "Enable NQ")
symbol_es = input.bool(true, "Enable ES")
symbol_gold = input.bool(true, "Enable Gold")
is_nq = str.contains(syminfo.ticker, "NQ")
is_es = str.contains(syminfo.ticker, "ES")
is_gold = str.contains(syminfo.ticker, "GC")
symbol_filter = (symbol_nq and is_nq) or (symbol_es and is_es) or (symbol_gold and is_gold)
// ————— Calculations —————
rsi = ta.rsi(close, rsi_len)
atr = ta.atr(atr_len)
basis = ta.sma(close, bb_len)
dev = bb_mult * ta.stdev(close, bb_len)
bb_upper = basis + dev
bb_lower = basis - dev
rolling_vol = ta.sma(volume, 20)
vol_spike = volume > volume_mult * rolling_vol
// ————— Session Filter (EST) —————
est_offset = -5
est_hour = (hour + est_offset + 24) % 24
session_filter = (est_hour >= 18 or est_hour < 6) or (est_hour >= 14 and est_hour < 17)
session_ok = not use_session_filter or session_filter
// ————— Order Flow Proxy —————
mfi = ta.mfi(close, 14)
buy_imbalance = ta.crossover(mfi, 50)
sell_imbalance = ta.crossunder(mfi, 50)
reversal_candle = close > open and close > ta.highest(close , 3)
// ————— ML Risk Flag (Placeholder) —————
ml_risk_flag = use_ml_flag and (ta.sma(close, 5) > ta.sma(close, 20))
// ————— Entry Conditions —————
long_cond = symbol_filter and session_ok and vol_spike and rsi < rsi_low_thresh and close < bb_lower and (not use_orderflow or (buy_imbalance and reversal_candle)) and (not use_ml_flag or ml_risk_flag)
short_cond = symbol_filter and session_ok and vol_spike and rsi > rsi_high_thresh and (not use_orderflow or sell_imbalance) and (not use_ml_flag or ml_risk_flag)
// ————— Position Sizing —————
risk_amt = capital * (risk_pct / 100)
position_size = risk_amt / atr
// ————— Plot Signals —————
plotshape(show_signals and long_cond, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(show_signals and short_cond, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
// ————— Alerts —————
alertcondition(long_cond, title="Long Entry Alert", message="Pump fade detected: Long setup triggered")
alertcondition(short_cond, title="Short Entry Alert", message="Dump detected: Short setup triggered")
Intraday Scalping Trading System with AlertsThis is a unique script in the way it signals and alert on Volume Imbalances and VWAP based out on ATR. Many professional traders consider Volume Imbalance as a great indicator to identify stock movement.
I didn't find any indicator or all these option together so created one for us.
1. Fully controllable with toggle buttons.
2. Choose you best Trading directional signals with filters as per your sentiments -
2. EMA crossings
- EMA crossings + VWAP confirmation
- EMA crossings + SuperTrend Confirmation
3. Highest and Lowest volumes visually appeared
4. OHLCs Daily, Weekly and Monthly line options
5. First Candle Range - you can choose First candle range and it's time frame (default IST 9:15 but you can customize in pinescript as per your preferred Time Zone or just hide with toggle button.
KAMA Trend Flip with Snap & Follow - SightLing Labs🔭 OVERVIEW
KAMA Snap Follow is a customized adaptation of the Kaufman Adaptive Moving Average (KAMA) that overlays a trend-tracking line on the chart. It computes an adaptive smoothing constant from the efficiency ratio, then incorporates conditional enhancements: a "snap" mechanism to boost responsiveness on significant counter-trend bars surpassing an ATR-based threshold, and a temporary "follow" mode after trend flips to intensify adaptation for a user-defined number of bars. This allows the line to hug price more closely during early reversal phases before returning to standard smoothing for noise filtration. The line colors green for upward trends (rising KAMA), red for downward (falling KAMA), and gray for neutral, with optional alerts on trend changes. If the structure invalidates (e.g., via excessive lag or unconfirmed flips), no automatic cleanup occurs—users manage via settings tweaks and backtesting.
🔭 CONCEPTS
* Adaptive smoothing core: Builds on KAMA's efficiency ratio to dynamically adjust between fast and slow constants, gliding over minor volatility while aiming to react to directional shifts.
* Snap trigger: Detects potential reversals via large bar changes opposing the prior trend, exceeding a multiplier of ATR; this temporarily amplifies the smoothing constant (capped at 1.0) to pull KAMA toward price.
* Follow mode activation: Post-flip, engages a boosted adaptation phase for a fixed bar count, forcing tighter shadowing in the new direction to reduce lag on true turns, then reverts to absorber mode.
* Trend detection: Simple comparison of current vs. prior KAMA values defines up/down/neutral, with no embedded signals—purely for visual trend context.
* Risk-aware design: No guarantees; focuses on lag reduction in simulations (e.g., 38-54% trough lag cuts on synthetic volatile series), but real-market performance varies—backtest thoroughly.
🔭 FEATURES
* Custom KAMA calculation with manual efficiency ratio and smoothing powers for baseline adaptation.
* ATR-integrated snap for reversal sensitivity, with adjustable multiplier and boost.
* Post-flip follow mode with configurable period and boost to enhance new-trend hugging.
* Trend coloring and flip alerts: Green/red/gray line with conditions for up/down/neutral; alerts on changes.
* User controls:
Source (e.g., close).
Efficiency Ratio Length (pivot-like sensitivity).
Fast/Slow Powers (adaptation speed).
ATR Length (volatility measure).
Snap Multiplier/Boost (reversal threshold/amplification).
Follow Period/Boost (post-flip duration/intensity).
* Efficient execution: Lightweight, no heavy buffers—suitable for intraday charts via backtested tweaks.
🔭 HOW TO USE
* Tune sensitivity: Shorten Efficiency Ratio Length on lower timeframes for quicker reactions; lengthen on higher for smoother trends. Test ATR Length against asset volatility.
* Monitor flips: Use green/red shifts as trend context—combine with your strategy (e.g., crossovers, support/resistance) for potential entries; alerts notify changes.
* Leverage modes: Snap helps catch sharp turns; follow mode tightens tracking post-reversal—observe on historical data to gauge lag reduction (e.g., 30-57% miss cuts on 0.20 moves in tests).
* Apply MTF: Spot broader trends on 5m; refine on 30s/1m near flips. Backtest configurations to avoid over-optimization.
* Integrate confluence: Pair with volume, RSI, or your filters; never rely solely—markets evolve, so validate via simulations and live observation.
🔭 CONCLUSION
KAMA Snap Follow evolves standard KAMA by adding snap and follow mechanics to combat reversal lag while filtering bumps, offering a visual tool for trend analysis in volatile intraday setups. Developed to address traditional adaptive averages' delays without introducing excessive whipsaw (e.g., zero added in noisy flats per tests), it provides adjustable parameters for customization. No performance promises—results hinge on backtesting and market fit; use as a framework for scenario evaluation, not automated trading.
Example Configurations (derived from synthetic tests on SOFI-like intraday volatility; backtest and adjust):
- For 30s charts (high noise, rapid shifts): Efficiency Ratio Length=20, Fast Power=1, Slow Power=15, ATR Length=10, Snap Multiplier=1.2, Snap Boost=2.0, Follow Period=5, Follow Boost=2.5—yields ~40% lag reduction on turns, filtering 85% of <0.01 fluctuations.
- For 1m charts (moderate volatility): Efficiency Ratio Length=30, Fast Power=2, Slow Power=20, ATR Length=14, Snap Multiplier=1.5, Snap Boost=2.5, Follow Period=8, Follow Boost=3.0—achieves ~30% lower reversal misses (e.g., 0.08 vs. 0.12 on 0.20 swings), stable in 50-bar chops.
- For 5m charts (trendier flows): Efficiency Ratio Length=50, Fast Power=3, Slow Power=40, ATR Length=20, Snap Multiplier=1.8, Snap Boost=3.0, Follow Period=12, Follow Boost=3.5—boosts post-flip hug by 25%, ignoring 90% of ±0.05 noise across 100 bars.
SE – RSI Divergence Scanner (BOTH on 1h & 15m) – v6Screenar svenska mid/large cap bolag som har divergenser i 15 min och 1h timeframe samtidigt.
SJ Fx Session ORMarks opening range (1st 15 Mins) for Europe, London and New York.
Tip - Use white background for your charts
PINAKI__RSI M/W/D/H/15 (Top Right, Padding)display monthly, weekly, daily, 1Hr, 15Min RSI in single frame
BE-Volume Footprint & Pressure Candles█ Overview:
BE-Volume Footprint & Pressure Candles, is an indicator which is preliminarily designed to analyze the supply and demand patterns based on Rally Base Rally (RBR), Drop Base Drop (DBD), Drop Base Rally (DBR) & Rally Base Drop (RBD) concepts in conjunction to volume pressure. Understanding these concepts are crucial. Let's break down why the "Base" is you Best friend in this context.
Commonness in RBR, DBD, DBR, RBD patterns ?
There is an impulse price movement at first, be it rally (price moving up) or the Drop (price moving down), followed by a period of consolidation which is referred as "BASE" and later with another impulse move of price (Rally or Drop).
Why is the Base Important
1. Market Balance: Base represents a balance between buyers and sellers. This is where decisions are made.
2. Confirmation: It confirms the strength of previous impulse move which has happened.
Base & the Liquidity Play:
Supply & Demand Zone predict the presence of all large orders within the limits of the Base Zone. Price is expected to return to the zone to fill the unfilled orders placed by large players.
For the price to move in the intended direction Liquidity plays the major role. hence indicator aims to help traders in identifying those zones where liquidity exists and the volume pressure helps in confirming that liquidity is making its play.
Bottom pane in the below snapshots is a visual representation of Buyers volume pressure (Green Line & the Green filled area) making the price move upwards vs Sellers volume pressure (Red Line & the Red filled area) making the price move downwards.
Top pane in the below snapshots is a visual representation on the pattern identification (Blue marked zone & the Blue line referred as Liquidity level)
Bullish Pressure On Buy Liquidity:
Bearish Pressure On Sell Liquidity:
█ How It Works:
1. Indicator computes technical & mathematical operations such as ATR, delta of Highs & Lows of the candle and Candle ranges to identify the patterns and marks the liquidity lines accordingly.
2. Indicator then waits for price to return to the liquidity levels and checks if Directional volume pressure to flow-in while the prices hover near the Liquidity zones.
3. Once the Volume pressure is evident, loop in to the ride.
█ When It wont Work:
When there no sufficient Liquidity or sustained Opposite volume pressure, trades are expected to fail.
█ Limitations:
Works only on the scripts which has volume info. Relays on LTF candles to determine intra-bar volumes. Hence, Use on TF greater than 1 min and lesser than 15 min.
█ Indicator Features:
1. StrictEntries: employs' tighter rules (rather most significant setups) on the directional volume pressure applied for the price to move. If unchecked, liberal rules applied on the directional volume pressure leading to more setups being identified.
2. Setup Confirmation period: Indicates Waiting period to analyze the directional volume pressure. Early (lesser wait period) is Risky and Late (longer wait period) is too late for the
ride. Find the quant based on the accuracy of the setup provided in the bottom right table.
3. Algo Enabled with Place Holders:
Indicator is equipped with algo alerts, supported with necessary placeholders to trade any instrument like stock, options etc.
Accepted PlaceHolders (Case Sensitive!!)
1. {{ticker}}-->InstrumentName
2. {{datetime}}-->Date & Time Of Order Placement
3. {{close}}-->LTP Price of Script
4. {{TD}}-->Current Level:
Note: Negative Numbers for Short Setup
5. {{EN}} {{SL}} {{TGT}} {{T1}} {{T2}} --> Trade Levels
6. {{Qty}} {{Qty*x}} --> Qty -> Trade Qty mapped in Settings. Replace x with actual number of your choice for the multiplier
7. {{BS}}-->Based on the Direction of Trade Output shall be with B or S (B == Long Trade & S == Short Trade)
8. {{BUYSELL}}-->Based on the Direction of Trade Output shall be with BUY or SELL (BUY == Long Trade & SELL == Short Trade)
9. {{IBUYSELL}}-->Based on the Direction of Trade Output shall be with BUY or SELL (BUY == SHORT Trade & SELL == LONG Trade)
Dynamic Alerts:
10. { {100R0} }-->Dynamic Place Holder 100 Refers to Strike Difference and Zero refers to ATM
11. { {100R-1} }-->Dynamic Place Holder 100 Refers to Strike Difference and -1 refers to
ATM - 100 strike
12. { {50R2} }-->Dynamic Place Holder 50 Refers to Strike Difference and 2 refers to
ATM + (2 * 50 = 100) strike
13. { {"ddMMyy", 0} }-->Dynamically Picks today date in the specified format.
14. { {"ddMMyy", n} }-->replace n with actual number of your choice to Pick date post today date in the specified format.
15. { {"ddMMyy", "MON"} }-->dynamically pick Monday date (coming Monday, if today is not Monday)
Note. for the 2nd Param-->you can choose to specify either Number OR any letter from =>
16. {{CEPE}} {{ICEPE}} {{CP}} {{ICP}} -> Dynamic Option Side CE or C refers to Calls and PE or P refers to Puts. If "I" is used in PlaceHolder text, On long entries PUTs shall be used
Indicator is equipped with customizable Trade & Risk management settings like multiple Take profit levels, Trailing SL.
Globex Trap w/ percentage [SLICKRICK]Globex Trap w/ Percentage
Overview
The Globex Trap w/ Percentage indicator is a powerful tool designed to help traders identify high-probability trading opportunities by analyzing price action during the Globex (overnight) session and regular trading hours. By combining Globex session ranges with Supply & Demand zones, this indicator highlights potential "trap" areas where significant price reactions may occur. Additionally, it calculates the Globex session range as a percentage of the daily Average True Range (ATR), providing valuable context for assessing market volatility.
This indicator is ideal for traders in futures markets or other instruments traded during Globex sessions, offering a visual and analytical edge for spotting key price levels and potential reversals or breakouts.
Key Features
Globex Session Tracking:
Visualizes the high and low of the Globex session (default: 3:00 PM to 6:30 AM PST) with customizable time settings.
Displays a semi-transparent box to mark the Globex range, with labels for "Globex High" and "Globex Low."
Calculates the Globex range as a percentage of the daily ATR, displayed as a label for quick reference.
Supply & Demand Zones:
Identifies Supply & Demand zones during regular trading hours (default: 6:00 AM to 8:00 AM PST) with customizable time settings.
Draws semi-transparent boxes to highlight these zones, aiding in the identification of key support and resistance areas.
Trap Area Identification:
Highlights potential trap zones where Globex ranges and Supply & Demand zones overlap, indicating areas where price may reverse or consolidate due to trapped traders.
Customizable Settings:
Adjust Globex and Supply & Demand session times to suit your trading preferences.
Toggle visibility of Globex and Supply & Demand zones independently.
Customize box colors for better chart readability.
Set the lookback period (default: 10 days) to control how many historical zones are displayed.
Configure the ATR length (default: 14) for the percentage calculation.
PST Timezone Default:
All times are based on Pacific Standard Time (PST) by default, ensuring accurate session tracking for users in this timezone or those aligning with U.S. West Coast market hours.
Recommended Usage
Timeframes: Best used on 1-hour charts or lower (e.g., 15-minute, 5-minute) for precise entry and exit points.
Markets: Optimized for futures (e.g., ES, NQ, CL) and other instruments traded during Globex sessions.
Historical Data: Ensure at least 10 days of historical data for optimal visualization of zones.
Strategy Integration: Use the indicator to identify potential reversals or breakouts at Globex highs/lows or Supply & Demand zones. The ATR percentage provides context for whether the Globex range is significant relative to typical daily volatility.
How It Works
Globex Session:
Tracks the high and low prices during the user-defined Globex session (default: 3:00 PM to 6:30 AM PST).
When the session ends, a box is drawn from the start to the end of the session, capturing the high and low prices.
Labels are placed at the midpoint of the session, showing "Globex High," "Globex Low," and the range as a percentage of the daily ATR (e.g., "75.23% of Daily ATR").
Supply & Demand Zones:
Tracks the high and low prices during the user-defined regular trading hours (default: 6:00 AM to 8:00 AM PST).
Draws a box to mark these zones, which often act as key support or resistance levels.
ATR Percentage:
Calculates the Globex range (high minus low) and divides it by the daily ATR to express it as a percentage.
This metric helps traders gauge whether the overnight price movement is significant compared to the instrument’s typical volatility.
Time Handling:
Uses PST (UTC-8) for all time calculations, ensuring accurate session timing for users aligning with this timezone.
Properly handles overnight sessions that cross midnight, ensuring seamless tracking.
Input Settings
Globex Session Settings:
Show Globex Session: Enable/disable Globex session visualization (default: true).
Globex Start/End Time: Set the start and end times for the Globex session (default: 3:00 PM to 6:30 AM PST).
Globex Box Color: Customize the color of the Globex session box (default: semi-transparent gray).
Supply & Demand Zone Settings:
Show Supply & Demand Zone: Enable/disable zone visualization (default: true).
Zone Start/End Time: Set the start and end times for Supply & Demand zones (default: 6:00 AM to 8:00 AM PST).
Zone Box Color: Customize the color of the zone box (default: semi-transparent aqua).
General Settings:
Days to Look Back: Number of historical days to display zones (default: 10).
ATR Length: Period for calculating the daily ATR (default: 14).
Notes
All times are in Pacific Standard Time (PST). Adjust the start and end times if your market operates in a different timezone or if you prefer different session windows.
The indicator is optimized for instruments with active Globex sessions, such as futures. Results may vary for non-24/5 markets.
A typo in the label "Globe Low" (should be "Globex Low") will be corrected in future updates.
Ensure your TradingView chart is set to display sufficient historical data to view the full lookback period.
Why Use This Indicator?
The Globex Trap w/ Percentage indicator provides a unique combination of session-based range analysis, Supply & Demand zone identification, and volatility context via the ATR percentage. Whether you’re a day trader, swing trader, or scalper, this tool helps you:
Pinpoint key price levels where institutional traders may act.
Assess the significance of overnight price movements relative to daily volatility.
Identify potential trap zones for high-probability setups.
Customize the indicator to fit your trading style and market preferences.
Adaptive Rolling Quantile Bands [CHE] Adaptive Rolling Quantile Bands
Part 1 — Mathematics and Algorithmic Design
Purpose. The indicator estimates distribution‐aware price levels from a rolling window and turns them into dynamic “buy” and “sell” bands. It can work on raw price or on *residuals* around a baseline to better isolate deviations from trend. Optionally, the percentile parameter $q$ adapts to volatility via ATR so the bands widen in turbulent regimes and tighten in calm ones. A compact, latched state machine converts these statistical levels into high-quality discretionary signals.
Data pipeline.
1. Choose a source (default `close`; MTF optional via `request.security`).
2. Optionally compute a baseline (`SMA` or `EMA`) of length $L$.
3. Build the *working series*: raw price if residual mode is off; otherwise price minus baseline (if a baseline exists).
4. Maintain a FIFO buffer of the last $N$ values (window length). All quantiles are computed on this buffer.
5. Map the resulting levels back to price space if residual mode is on (i.e., add back the baseline).
6. Smooth levels with a short EMA for readability.
Rolling quantiles.
Given the buffer $X_{t-N+1..t}$ and a percentile $q\in $, the indicator sorts a copy of the buffer ascending and linearly interpolates between adjacent ranks to estimate:
* Buy band $\approx Q(q)$
* Sell band $\approx Q(1-q)$
* Median $Q(0.5)$, plus optional deciles $Q(0.10)$ and $Q(0.90)$
Quantiles are robust to outliers relative to means. The estimator uses only data up to the current bar’s value in the buffer; there is no look-ahead.
Residual transform (optional).
In residual mode, quantiles are computed on $X^{res}_t = \text{price}_t - \text{baseline}_t$. This centers the distribution and often yields more stationary tails. After computing $Q(\cdot)$ on residuals, levels are transformed back to price space by adding the baseline. If `Baseline = None`, residual mode simply falls back to raw price.
Volatility-adaptive percentile.
Let $\text{ATR}_{14}(t)$ be current ATR and $\overline{\text{ATR}}_{100}(t)$ its long SMA. Define a volatility ratio $r = \text{ATR}_{14}/\overline{\text{ATR}}_{100}$. The effective quantile is:
Smoothing.
Each level is optionally smoothed by an EMA of length $k$ for cleaner visuals. This smoothing does not change the underlying quantile logic; it only stabilizes plots and signals.
Latched state machines.
Two three-step processes convert levels into “latched” signals that only fire after confirmation and then reset:
* BUY latch:
(1) HLC3 crosses above the median →
(2) the median is rising →
(3) HLC3 prints above the upper (orange) band → BUY latched.
* SELL latch:
(1) HLC3 crosses below the median →
(2) the median is falling →
(3) HLC3 prints below the lower (teal) band → SELL latched.
Labels are drawn on the latch bar, with a FIFO cap to limit clutter. Alerts are available for both the simple band interactions and the latched events. Use “Once per bar close” to avoid intrabar churn.
MTF behavior and repainting.
MTF sourcing uses `lookahead_off`. Quantiles and baselines are computed from completed data only; however, any *intrabar* cross conditions naturally stabilize at close. As with all real-time indicators, values can update during a live bar; prefer bar-close alerts for reliability.
Complexity and parameters.
Each bar sorts a copy of the $N$-length window (practical $N$ values keep this inexpensive). Typical choices: $N=50$–$100$, $q_0=0.15$–$0.25$, $k=2$–$5$, baseline length $L=20$ (if used), adaptation strength $s=0.2$–$0.7$.
Part 2 — Practical Use for Discretionary/Active Traders
What the bands mean in practice.
The teal “buy” band marks the lower tail of the recent distribution; the orange “sell” band marks the upper tail. The median is your dynamic equilibrium. In residual mode, these tails are deviations around trend; in raw mode they are absolute price percentiles. When ATR adaptation is on, tails breathe with regime shifts.
Two core playbooks.
1. Mean-reversion around a stable median.
* Context: The median is flat or gently sloped; band width is relatively tight; instrument is ranging.
* Entry (long): Look for price to probe or close below the buy band and then reclaim it, especially after HLC3 recrosses the median and the median turns up.
* Stops: Place beyond the most recent swing low or $1.0–1.5\times$ ATR(14) below entry.
* Targets: First scale at the median; optional second scale near the opposite band. Trail with the median or an ATR stop.
* Symmetry: Mirror the rules for shorts near the sell band when the median is flat to down.
2. Continuation with latched confirmations.
* Context: A developing trend where you want fewer but cleaner signals.
* Entry (long): Take the latched BUY (3-step confirmation) on close, or on the next bar if you require bar-close validation.
* Invalidation: A close back below the median (or below the lower band in strong trends) negates momentum.
* Exits: Trail under the median for conservative exits or under the teal band for trend-following exits. Consider scaling at structure (prior swing highs) or at a fixed $R$ multiple.
Parameter guidance by timeframe.
* Scalping / LTF (1–5m): $N=30$–$60$, $q_0=0.20$, $k=2$–3, residual mode on, baseline EMA $L=20$, adaptation $s=0.5$–0.7 to handle micro-vol spikes. Expect more signals; rely on latched logic to filter noise.
* Intraday swing (15–60m): $N=60$–$100$, $q_0=0.15$–0.20, $k=3$–4. Residual mode helps but is optional if the instrument trends cleanly. $s=0.3$–0.6.
* Swing / HTF (4H–D): $N=80$–$150$, $q_0=0.10$–0.18, $k=3$–5. Consider `SMA` baseline for smoother residuals and moderate adaptation $s=0.2$–0.4.
Baseline choice.
Use EMA for responsiveness (fast trend shifts) and SMA for stability (smoother residuals). Turning residual mode on is advantageous when price exhibits persistent drift; turning it off is useful when you explicitly want absolute bands.
How to time entries.
Prefer bar-close validation for both band recaptures and latched signals. If you must act intrabar, accept that crosses can “un-cross” before close; compensate with tighter stops or reduced size.
Risk management.
Position size to a fixed fractional risk per trade (e.g., 0.5–1.0% of equity). Define invalidation using structure (swing points) plus ATR. Avoid chasing when distance to the opposite band is small; reward-to-risk degrades rapidly once you are deep inside the distribution.
Combos and filters.
* Pair with a higher-timeframe median slope as a regime filter (trade only in the direction of the HTF median).
* Use band width relative to ATR as a range/trend gauge: unusually narrow bands suggest compression (mean-reversion bias); expanding bands suggest breakout potential (favor latched continuation).
* Volume or session filters (e.g., avoid illiquid hours) can materially improve execution.
Alerts for discretion.
Enable “Cross above Buy Level” / “Cross below Sell Level” for early notices and “Latched BUY/SELL” for conviction entries. Set alerts to “Once per bar close” to avoid noise.
Common pitfalls.
Do not interpret band touches as automatic signals; context matters. A strong trend will often ride the far band (“band walking”) and punish counter-trend fades—use the median slope and latched logic to separate trend from range. Do not oversmooth levels; you will lag breaks. Do not set $q$ too small or too large; extremes reduce statistical meaning and practical distance for stops.
A concise checklist.
1. Is the median flat (range) or sloped (trend)?
2. Is band width expanding or contracting vs ATR?
3. Are we near the tail level aligned with the intended trade?
4. For continuation: did the 3 steps for a latched signal complete?
5. Do stops and targets produce acceptable $R$ (≥1.5–2.0)?
6. Are you trading during liquid hours for the instrument?
Summary. ARQB provides statistically grounded, regime-aware bands and a disciplined, latched confirmation engine. Use the bands as objective context, the median as your equilibrium line, ATR adaptation to stay calibrated across regimes, and the latched logic to time higher-quality discretionary entries.
Disclaimer
No indicator guarantees profits. Adaptive Rolling Quantile Bands is a decision aid; always combine with solid risk management and your own judgment. Backtest, forward test, and size responsibly.
The content provided, including all code and materials, is strictly for educational and informational purposes only. It is not intended as, and should not be interpreted as, financial advice, a recommendation to buy or sell any financial instrument, or an offer of any financial product or service. All strategies, tools, and examples discussed are provided for illustrative purposes to demonstrate coding techniques and the functionality of Pine Script within a trading context.
Any results from strategies or tools provided are hypothetical, and past performance is not indicative of future results. Trading and investing involve high risk, including the potential loss of principal, and may not be suitable for all individuals. Before making any trading decisions, please consult with a qualified financial professional to understand the risks involved.
By using this script, you acknowledge and agree that any trading decisions are made solely at your discretion and risk.
Enhance your trading precision and confidence 🚀
Best regards
Chervolino
SMC - Institutional Confidence Oscillator [PhenLabs]📊 Institutional Confidence Oscillator
Version: PineScript™v6
📌 Description
The Institutional Confidence Oscillator (ICO) revolutionizes market analysis by automatically detecting and evaluating institutional activity at key support and resistance levels using our own in-house detection system. This sophisticated indicator combines volume analysis, volatility measurements, and mathematical confidence algorithms to provide real-time readings of institutional sentiment and zone strength.
Using our advanced thin liquidity detection, the ICO identifies high-volume, narrow-range bars that signal institutional zone formation, then tracks how these zones perform under market pressure. The result is a dual-wave confidence oscillator that shows traders when institutions are actively defending price levels versus when they’re abandoning positions.
The indicator transforms complex institutional behavior patterns into clear, actionable confidence percentiles, helping traders align with smart money movements and avoid common retail trading pitfalls.
🚀 Points of Innovation
Automated thin liquidity zone detection using volume threshold multipliers and zone size filtering
Dual-sided confidence tracking for both support and resistance levels simultaneously
Sigmoid function processing for enhanced mathematical accuracy in confidence calculations
Real-time institutional defense pattern analysis through complete test cycles
Advanced visual smoothing options with multiple algorithmic methods (EMA, SMA, WMA, ALMA)
Integrated momentum indicators and gradient visualization for enhanced signal clarity
🔧 Core Components
Volume Threshold System: Analyzes volume ratios against baseline averages to identify institutional activity spikes
Zone Detection Algorithm: Automatically identifies thin liquidity zones based on customizable volume and size parameters
Confidence Lifecycle Engine: Tracks institutional defense patterns through complete observation windows
Mathematical Processing Core: Uses sigmoid functions to convert raw market data into normalized confidence percentiles
Visual Enhancement Suite: Provides multiple smoothing methods and customizable display options for optimal chart interpretation
🔥 Key Features
Auto-Detection Technology: Automatically scans for institutional zones without manual intervention, saving analysis time
Dual Confidence Tracking: Simultaneously monitors both support and resistance institutional activity for comprehensive market view
Smart Zone Validation: Evaluates zone strength through volume analysis, adverse excursion measurement, and defense success rates
Customizable Parameters: Extensive input options for volume thresholds, observation windows, and visual preferences
Real-Time Updates: Continuously processes market data to provide current institutional confidence readings
Enhanced Visualization: Features gradient fills, momentum indicators, and information panels for clear signal interpretation
🎨 Visualization
Dual Oscillator Lines: Support confidence (cyan) and resistance confidence (red) plotted as percentage values 0-100%
Gradient Fill Areas: Color-coded regions showing confidence dominance and strength levels
Reference Grid Lines: Horizontal markers at 25%, 50%, and 75% levels for easy interpretation
Information Panel: Real-time display of current confidence percentiles with color-coded dominance indicators
Momentum Indicators: Rate of change visualization for confidence trends
Background Highlights: Extreme confidence level alerts when readings exceed 80%
📖 Usage Guidelines
Auto-Detection Settings
Use Auto-Detection
Default: true
Description: Enables automatic thin liquidity zone identification based on volume and size criteria
Volume Threshold Multiplier
Default: 6.0, Range: 1.0+
Description: Controls sensitivity of volume spike detection for zone identification, higher values require more significant volume increases
Volume MA Length
Default: 15, Range: 1+
Description: Period for volume moving average baseline calculation, affects volume spike sensitivity
Max Zone Height %
Default: 0.5%, Range: 0.05%+
Description: Filters out wide price bars, keeping only thin liquidity zones as percentage of current price
Confidence Logic Settings
Test Observation Window
Default: 20 bars, Range: 2+
Description: Number of bars to monitor zone tests for confidence calculation, longer windows provide more stable readings
Clean Break Threshold
Default: 1.5 ATR, Range: 0.1+
Description: ATR multiple required for zone invalidation, higher values make zones more persistent
Visual Settings
Smoothing Method
Default: EMA, Options: SMA/EMA/WMA/ALMA
Description: Algorithm for signal smoothing, EMA responds faster while SMA provides more stability
Smoothing Length
Default: 5, Range: 1-50
Description: Period for smoothing calculation, higher values create smoother lines with more lag
✅ Best Use Cases
Trending market analysis where institutional zones provide reliable support/resistance levels
Breakout confirmation by validating zone strength before position entry
Divergence analysis when confidence shifts between support and resistance levels
Risk management through identification of high-confidence institutional backing
Market structure analysis for understanding institutional sentiment changes
⚠️ Limitations
Performs best in liquid markets with clear institutional participation
May produce false signals during low-volume or holiday trading periods
Requires sufficient price history for accurate confidence calculations
Confidence readings can fluctuate rapidly during high-impact news events
Manual fallback zones may not reflect actual institutional activity
💡 What Makes This Unique
Automated Detection: First Pine Script indicator to automatically identify thin liquidity zones using sophisticated volume analysis
Dual-Sided Analysis: Simultaneously tracks institutional confidence for both support and resistance levels
Mathematical Precision: Uses sigmoid functions for enhanced accuracy in confidence percentage calculations
Real-Time Processing: Continuously evaluates institutional defense patterns as market conditions change
Visual Innovation: Advanced smoothing options and gradient visualization for superior chart clarity
🔬 How It Works
1. Zone Identification Process:
Scans for high-volume bars that exceed the volume threshold multiplier
Filters bars by maximum zone height percentage to identify thin liquidity conditions
Stores qualified zones with proximity threshold filtering for relevance
2. Confidence Calculation Process:
Monitors price interaction with identified zones during observation windows
Measures volume ratios and adverse excursions during zone tests
Applies sigmoid function processing to normalize raw data into confidence percentiles
3. Real-Time Analysis Process:
Continuously updates confidence readings as new market data becomes available
Tracks institutional defense success rates and zone validation patterns
Provides visual and numerical feedback through the oscillator display
💡 Note:
The ICO works best when combined with traditional technical analysis and proper risk management. Higher confidence readings indicate stronger institutional backing but should be confirmed with price action and volume analysis. Consider using multiple timeframes for comprehensive market structure understanding.
Apex Edge - London Open Session# Apex Edge - London Open Session Trading System
## Overview
The London Open Session indicator captures institutional price action during the first hour of the London forex session (8:00-9:00 AM GMT) and identifies high-probability breakout and retest opportunities. This system tracks the session's high/low range and generates precise entry signals when price breaks or retests these key institutional levels.
## Core Strategy
**Session Tracking**: Automatically identifies and marks the London Open session boundaries, creating a trading zone from the first hour's price range.
**Dual Entry Logic**:
- **Breakout Entries**: Triggers when price closes beyond the session high/low and continues in that direction
- **Retest Entries**: Activates when price returns to test the broken level as new support/resistance
**Performance Analytics**: Built-in win rate tracking displays real-time performance statistics over user-defined lookback periods, enabling data-driven optimization for each currency pair.
## Key Features
### Automated Zone Detection
- Precise London session timing with timezone offset controls
- Visual session boundaries with customizable colours
- Automatic high/low range calculation and display
### Smart Entry System
- Breakout confirmation requiring candle close beyond zone
- Retest detection with configurable pip distance tolerance
- Separate risk/reward ratios for breakout vs retest entries
- Visual entry arrows with clear trade direction labels
### Performance HUD
- Real-time win rate calculation over customizable periods (7-365 days)
- Total trades tracking with win/loss breakdown
- Average risk-reward ratio display
- Color-coded performance metrics (green >70%, yellow >50%, red <50%)
### PineConnector Integration
- Direct MT4/MT5 execution via PineConnector alerts
- Proper forex pip calculations for all currency pairs
- Customizable risk percentage per trade
- Symbol override capability for broker compatibility
- Automatic SL/TP level calculation in pips
## Critical Usage Requirements
### Pair-Specific Optimization
Each currency pair requires individual optimization due to varying volatility characteristics, institutional participation levels, and typical price ranges during London hours. The performance HUD is essential for identifying optimal settings before live trading.
**Recommended Testing Process**:
1. Apply indicator to desired currency pair and timeframe
2. Experiment with session timing - while 8:00-9:00 AM GMT is standard, some pairs may show improved performance with alternative hourly windows (e.g., 7:00-8:00 AM or 9:00-10:00 AM)
3. Adjust Stop Loss distances, Risk/Reward ratios, and Retest distances
4. Monitor win rate over 30+ day periods using the performance HUD
5. Only proceed with live alerts once consistent 60%+ win rates are achieved
6. Create separate optimized chart setups for each profitable pair/timeframe combination
### Timeframe Specifications
This indicator is specifically designed and tested for:
- **1-minute charts**: Optimal for capturing immediate institutional reactions
- **5-minute charts**: Balanced approach between noise reduction and opportunity frequency
Higher timeframes generally produce inferior results due to increased noise and reduced institutional edge during the London session window.
## Settings Configuration
### Session Timing
- **London Open/Close Hours**: Adjust for your chart's timezone
- **Rectangle End Time**: Set to 4:30 PM to stop signals before NY session close
- **Timezone Offset**: Ensure accurate London session capture
### Entry Parameters
- **Retest Distance**: 3-8 pips depending on pair volatility
- **Stop Loss Pips**: Separate settings for breakouts (10-15 pips) and retests (8-12 pips)
- **Risk/Reward Ratios**: Independent ratios for different entry types
### PineConnector Setup
- **License ID**: Your PineConnector license key
- **Symbol Override**: MT4/MT5 symbol names if different from TradingView
- **Risk Percentage**: Position size as percentage of account balance
- **Prefix/Comment**: Organize trades in terminal
## Manual Trading Limitations
Without PineConnector automation, traders face significant practical challenges:
**Settings Management**: Each currency pair requires different optimized parameters. Switching between charts means manually adjusting multiple settings each time, creating potential for errors and missed opportunities.
**Timing Sensitivity**: London Open signals can occur rapidly during high-volatility periods. Manual execution may result in slippage or missed entries.
**Multi-Pair Monitoring**: Tracking 4-11 currency pairs simultaneously while manually adjusting settings for each switch becomes impractical for most traders.
**Parameter Consistency**: Risk of using suboptimal settings when quickly switching between pairs, potentially compromising the careful optimization work.
## Recommended Workflow
1. **Historical Testing**: Use win rate HUD to identify profitable pairs and optimal parameters
2. **Demo Automation**: Test PineConnector alerts on demo accounts with optimized settings
3. **Live Implementation**: Deploy alerts only on proven profitable pair/timeframe combinations
4. **Ongoing Monitoring**: Regular review of performance metrics to maintain edge
## Risk Disclaimer
This indicator provides analysis tools and automation capabilities but does not guarantee profitable trading outcomes. Past performance does not predict future results. Users should thoroughly backtest and demo trade before risking live capital. The London session strategy works best during specific market conditions and may underperform during low volatility or unusual market environments.
## Support Requirements
Successful implementation requires:
- Basic understanding of London session market dynamics
- PineConnector subscription for automation features
- Patience for proper optimization process
- Realistic expectations about win rates and drawdown periods
This system is designed for serious traders willing to invest time in proper optimization and risk management rather than plug-and-play solutions.
Sunmool's Silver Bullet Model FinderICT Silver Bullet Model Indicator - Complete Guide
📈 Overview
The ICT Silver Bullet Model indicator is a supplementary tool for utilizing ICT's (Inner Circle Trader) market structure analysis techniques. This indicator detects institutional liquidity hunting patterns and automatically identifies structural levels, helping traders analyze market structure more effectively.
🎯 Core Features
1. Structural Level Identification
STL (Short Term Low): Recent support levels formed in the short term
STH (Short Term High): Recent resistance levels formed in the short term
ITL (Intermediate Term Low): Stronger support levels with more significance
ITH (Intermediate Term High): Stronger resistance levels with more significance
2. Kill Zone Time Display
London Kill Zone: 02:00-05:00 (default)
New York Kill Zone: 08:30-11:00 (default)
These are the most active trading hours for institutional players where significant price movements occur
3. Smart Sweep Detection
Bear Sweep (🔻): Pattern where price sweeps below lows then recovers - Simply indicates sweep occurrence
Bull Sweep (🔺): Pattern where price sweeps above highs then declines - Simply indicates sweep occurrence
Important: Sweep labels only mark liquidity hunting locations, not directional bias.
🔧 Configuration Parameters
Basic Settings
Sweep Detection Lookback: Number of candles for sweep detection (default: 20)
Structure Point Lookback: Number of candles for structural point detection (default: 10)
Sweep Threshold: Percentage threshold for sweep validation (default: 0.1%)
Time Settings
London Kill Zone: Active hours for London session
New York Kill Zone: Active hours for New York session
Visualization Settings
Customizable colors for each level type
Enable/disable alert notifications
📊 How to Use
1. Chart Setup
Most effective on 1-minute to 1-hour timeframes
Recommended for major currency pairs (EUR/USD, GBP/USD, etc.)
Also applicable to cryptocurrencies and indices
2. Signal Interpretation
🔻 Bear Sweep / 🔺 Bull Sweep Labels
Simply indicate liquidity hunting occurrence points
Not directional bias indicators
Reference for understanding overall context on HTF
🟢 Silver Bullet Long (Huge Green Triangle)
After Bear Sweep occurrence
Within Kill Zone timeframe
Current price positioned above swept level
→ Actual BUY entry signal
🔴 Silver Bullet Short (Huge Red Triangle)
After Bull Sweep occurrence
Within Kill Zone timeframe
Current price positioned below swept level
→ Actual SELL entry signal
3. Risk Management
Use swept levels as stop-loss reference points
Approach signals outside Kill Zone hours with caution
Recommended to use alongside other technical analysis tools
💡 Trading Strategies
Silver Bullet Strategy
Preparation Phase: Monitor charts 30 minutes before Kill Zone
Sweep Observation: Identify liquidity hunting points with 🔻🔺 labels (reference only)
Entry: Enter ONLY when huge triangle Silver Bullet signal appears within Kill Zone
Take Profit: Target opposite structural level or 1:2 reward ratio
Stop Loss: Beyond the swept level
Important: Small sweep labels are NOT trading signals!
Multi-Timeframe Approach
Step 1: HTF (Higher Time Frame) Sweep Reference
Observe 🔻🔺 sweep labels on 4-hour and daily charts
Reference only sweeps occurring at major structural levels
HTF sweeps are used to identify liquidity hunting points
Reference only, not for directional bias
Step 2: Transition to LTF (Lower Time Frame)
Move to 15-minute, 5-minute, and 1-minute charts
Analyze LTF with reference to HTF sweep information
Use STL, STH, ITL, ITH for precise entry point identification
Structural levels on LTF are the core of actual trading decisions
Only huge triangle (Silver Bullet) signals are actual entry signals
Recommended Usage
Identify overall sweep occurrence points on HTF (🔻🔺 labels)
Use this indicator on LTF to identify structural levels
Reference only huge triangle signals for actual trading during Kill Zone
Small sweep labels (🔻🔺) are for reference only, not entry signals
📋 Information Table Interpretation
Real-time information in the top-right table:
Kill Zone Status: Current active session status
Level Counts: Number of each structural level type
⚠️ Important Disclaimers
Backtesting results do not guarantee future performance
Exercise caution during high market volatility periods
Always apply proper risk management
Recommend comprehensive analysis with other analytical tools
🎓 Learning Resources
Study original ICT concepts through free YouTube educational content
Research Market Structure analysis techniques
Optimize through backtesting for personal use
🔬 Technical Implementation
Algorithm Logic
Pivot Point Detection: Uses TradingView's built-in pivot functions to identify swing highs and lows
Classification System: Automatically categorizes levels based on recent price action frequency
Sweep Validation: Confirms legitimate sweeps through price action analysis
Time-Based Filtering: Prioritizes signals during institutional active hours
Performance Optimization
Efficient array management prevents memory overflow
Dynamic level cleanup maintains chart clarity
Real-time calculation ensures minimal lag
🛠️ Customization Tips
Adjust lookback periods based on market volatility
Modify kill zone times for different market sessions
Experiment with sweep threshold for different instruments
Color-code levels according to personal preference
📈 Expected Outcomes
When properly implemented, this indicator can help traders:
Identify high-probability reversal points
Time entries with institutional flow
Reduce false signals through kill zone filtering
Improve risk-to-reward ratios
This indicator automates ICT's concepts into a user-friendly tool that can be enhanced through continuous learning and practical application. Success depends on understanding the underlying market structure principles and combining them with proper risk management techniques.
Liquidity Sweep Breakout - LSBLiquidity Sweep Breakout - LSB
A professional session-based breakout system designed for OANDA:USDJPY and other JPY pairs.
Not guesswork, but precision - built on detailed observation of institutional moves to capture clear trade direction daily.
Master the Market’s Daily Bank Flow.
---
Strategy Detail:
I discovered this strategy after carefully studying how Japanese banks influence the forex market during their daily settlement period. Banks are some of the biggest players in the financial world, and when they adjust or settle their accounts in the morning, it often creates a push in the market. From years of observation, I noticed a consistent pattern, once banks finish their settlements, the market usually continues moving in the same direction that was formed right after those actions. This daily banking flow often sets the tone for the entire trading session, especially for JPY pairs like USDJPY.
To capture this move, I built the indicator so that it follows the bank-driven trend with clear rules for entries, stop-loss (SL), and take-profit (TP). The system is designed with professional risk management in mind. By default, it assumes a $10,000 account size, risks only 1% of that balance per trade, and targets a 1:1.5 reward-to-risk ratio. This means for every $100 risked, the potential profit is $150. Such controlled risk makes the system safer and more sustainable for long-term traders. At the same time, users are not limited to this setup, they can adjust the account balance in the settings, and the indicator will automatically recalculate the lot size and risk levels based on their own capital. This ensures the strategy works for small accounts and larger accounts alike.
🌍 Why It Works
Fundamentally driven: Based on **daily Japanese banking settlement flows**.
Session-specific precision: Targets the exact window when USDJPY liquidity reshapes.
Risk-managed: Always calculates lot size based on account and risk preferences.
Automatable: With webhook + MT5 EA, it can be fully hands-free.
---
✅ Recommended
Pair: USDJPY (best observed behavior).
Timeframe: 3-Minute chart.
Platform: TradingView Premium (for webhooks).
Execution: MT5 via EA.
---
🔎 Strategy Concept
The Tokyo Magic Breakout (TMB) is built on years of session observation and the unique daily rhythm of the Japanese banking system.
Every morning between 5:50 AM – 6:10 AM PKT (09:50 – 10:10 JST), Japanese banks perform daily reconciliation and settlement. This often sets the tone for the USDJPY direction of the day.
This strategy isolates that critical moment of liquidity adjustment and waits for a clean breakout confirmation. Instead of chasing noise, it executes only when price action is aligned with the Tokyo market’s hidden flows.
---
🕒 Timing Logic
Session Start: 5:00 AM PKT (Tokyo market open range).
Magic Candle: The 5:54 AM PKT candle is marked as the reference “breakout selector.”
Checkpoints: First confirmation at 6:30 AM PKT, then every 15 minutes until 8:30 AM PKT.
* If price stays inside the magic range → wait.
* If a breakout happens but the candle wick touches the range → wait for the next checkpoint.
* If by 8:30 AM PKT no clean breakout occurs → the day is marked as No Trade Day (NTD).
👉 Recommended timeframe: 3-Minute chart (3M) for precise signals.
---
📈 Trade Execution
Entry: Clean break above/below the magic candle’s range.
Stop-Loss: Opposite side of the Tokyo session high/low.
Take-Profit: Calculated by Reward\:Risk ratio (default 1.5:1).
Lot Size: Auto-calculated based on your risk model:
* Fixed Dollar
* % of Equity
* Conservative (minimum of both).
Visuals include:
✅ Entry/SL/TP lines
✅ Shaded risk (red) and reward (green) zones
✅ Trade labels (Buy/Sell with lot size & levels)
✅ TP/SL hit markers
---
🔔 Alerts & Automation (AutoTMB)
This strategy is fully automation-ready with EA + MT5:
1. Enable alerts in TMB settings.
2. Insert your PineConnector License Key.
3. Configure your risk management preferences.
4. Create a TradingView alert → in the message box simply type:
Pine Script®
{{alert_message}}
and set the EA webhook.
Now, every breakout trade (with exact entry, SL, TP, and lot size) is sent instantly.
👉 On your MT5:
* Install the EA.
* Use the same license key.
* Run it on a VPS or local MT5 terminal.
You now have a hands-free trading system: AutoTMB.
MTF Adaptive Trendline Scalper (ATR + EMA System) By GouravThe MTF Adaptive Trendline Scalper is a precision-built trading tool designed for intraday scalpers and swing traders.
🔹 Core Features:
Adaptive Trendline Engine: Dynamically shifts trendline support/resistance using volatility (ATR) and Bollinger-band extremes.
Multi-Timeframe Mode: Calculate signals on your chosen higher timeframe or sync with the chart resolution.
Automatic Buy/Sell Signals: Clear trend reversal markers (💣 Buy / 🔨 Sell) for fast execution.
Volatility Filtering: ATR-based buffer reduces noise in choppy conditions.
Extra EMA Overlay: Plots 9 / 15 / 50 / 200 EMAs to help confirm trend bias and momentum.
🔹 How It Helps You Trade:
Catch scalping entries with trendline flips.
Trade trend-following continuations using EMA alignment.
Spot reversals when price pierces the adaptive channel.
Works on all assets (Forex, Crypto, Stocks, Indices) and any timeframe.
⚠️ Note: This is not financial advice. Always combine with your own risk management and strategy.
ICT GMMA VegasHigh-Level Summary
This indicator blends:
ICT concepts (Market Structure Shift, Break of Structure, Order Blocks, Liquidity Pools, Fair Value Gaps, Killzones, etc.).
GMMA (Guppy Multiple Moving Averages) to visualize short, medium, and long trend strength.
Vegas Tunnels (EMA channels 144/169 and 576/676, plus optional 288/388 mid-tunnels).
Vegas Touch entry module with candlestick patterns (Pin Bar 40%, Engulfing 60%).
Extra slope EMAs (EMA60 & EMA200 with color change by slope).
It not only shows the structure (OB, Liquidity, FVGs) but also plots entry arrows and alerts when Vegas Touch + GMMA align.
⚙️ Script Components
1. GMMA Visualization
Short-term EMAs (3–15, green).
Medium-term EMAs (30–60, red).
Long-term EMAs (100–250, blue).
Used to measure crowd sentiment: short EMAs = traders, long EMAs = investors.
The script counts how many EMAs the close is above/below:
If close above ≥17 → possible buy trend.
If close below ≥17 → possible sell trend.
Plots arrows for buy/sell flips.
2. Vegas Tunnels
Short-term tunnel → EMA144 & EMA169.
Long-term tunnel → EMA576 & EMA676.
Mid-tunnels → EMA288 & EMA388.
Plotted as orange/fuchsia/magenta bands.
Conditions:
Breakout checks → if close crosses above/below these EMAs compared to prior bar.
3. ICT Toolkit
Market Structure Shift (MSS) & BOS (Break of Structure): labels & dotted lines when price shifts trend.
Liquidity zones (Buy/Sell): boxes drawn around swing highs/lows with clustering.
Fair Value Gaps (FVG/IFVG): automatic box drawing, showing break status.
Order Blocks (OB): bullish/bearish blocks, breaker OB recognition.
Killzones: highlights NY open, London open/close, Asia session with background shading.
Displacement: plots arrows on large impulse candles.
NWOG/NDOG: Weekly/Monday Open Gaps.
Basically, this section gives a full ICT price action map on the chart.
4. Vegas Touch Entry Module (Pin40/Eng60 + EMA12 switch)
This is the custom entry system you added:
Logic:
If EMA12 > EMA169, use Tunnel (144/169) as reference.
If EMA12 ≤ EMA169, use Base (576/676).
Hard lock: no longs if EMA12 < EMA676; no shorts if EMA12 > EMA676.
Touch condition:
Long → price touches lower band (Tunnel/Base).
Short → price touches upper band (Tunnel/Base).
With ATR/Percent tolerance.
Trend filter:
Must also align with long-term Vegas direction (144/169 vs 576/676 cross).
Close must be on the outer side of the band.
Candlestick filter:
Pin Bar (≥40% wick) or
Engulfing (≥60% bigger body than previous).
Cooldown: avoids multiple signals in short succession.
Plots:
Green triangle below = Long entry.
Red triangle above = Short entry.
Alerts: triggers once per bar close with full message.
5. Slope EMAs (Extra)
EMA60 and EMA200 plotted as thick lines.
Color:
Green if sloping upward (current > value 2 bars ago).
Red if sloping downward.
📡 Outputs & Alerts
Arrows for GMMA trend flips.
Arrows for Vegas Touch entries.
Labels for MSS, BOS, FVGs, OBs.
Liquidity/FVG/OB boxes.
Background shading for killzones.
Alerts:
“📡 Entry Alert (Long/Short)” for GMMA.
“VT LONG/SHORT” for Vegas Touch.
📝 Key Idea
This is not just one system, but a multi-layered confluence tool:
ICT structure & liquidity context.
GMMA trend recognition.
Vegas Tunnel directional bias.
Candlestick-based confirmation (Pin/Engulf).
Alert automation for live trading.
👉 It’s essentially a trader’s dashboard: structural map + moving averages + entry signals all in one.
Same-Direction Candles (Two Symbols)Same-Direction Candles (Two Symbols)
What it does
Highlights bars on your chart when two symbols print the same candle direction on the chosen timeframe:
Both Bullish → one color
Both Bearish → another color
Great for spotting synchronous moves (e.g., NQ & ES, QQQ & SPY), or confirming risk-on/risk-off with an inverse asset (e.g., NQ vs DXY with inversion).
How it works
For each bar, the script checks whether close > open (bullish), close < open (bearish), or equal (doji) for:
The chart’s symbol
A second symbol pulled via request.security() (optionally on a different timeframe)
If both symbols are bullish, it paints Bull color; if both are bearish, it paints Bear color. Dojis can be ignored.
Inputs
Second symbol: Ticker to compare (e.g., CME_MINI:ES1!, NASDAQ:QQQ, TVC:DXY).
Second symbol timeframe: Leave blank to use the chart’s TF, or set a specific one (e.g., 5, 15, D).
Invert second symbol direction?: Flips the second symbol’s candle direction (useful for inversely related assets like DXY vs indices).
Ignore doji candles: Skip highlights when either candle is neutral (open == close).
Coloring options: Toggle bar coloring and/or background shading; pick colors; set background transparency.
Alerts
Three alert conditions:
Both Bullish
Both Bearish
Both Same Direction (bullish or bearish)
Create alerts from the Add Alert dialog after adding the script.
Use cases
Index confluence: NQ & ES moving in lockstep
ETF confirmation: QQQ & SPY agreement
FX/Index risk signals: Invert DXY against NQ/ES to see when equity strength aligns with dollar weakness
Tips
For mixed timeframes (e.g., chart on 1m, ES on 5m), set Second symbol timeframe to the higher TF to reduce noise.
Keep Ignore dojis on for cleaner signals.
Combine with your own entry rules (structure, FVGs, liquidity sweeps).
Notes
Works on any symbol/timeframe supported by TradingView.
Overlay script; no strategy/entries/exits are executed.
Past performance ≠ future results; for education only.
Version: 1.0 – initial release (bar/background highlights, doji filter, inversion, multi-TF support, alerts).
MACD StrategyOverview
The "MACD Strategy" is a straightforward trading strategy tested for BTCUSDT Futures on the 1-minute timeframe, leveraging the Moving Average Convergence Divergence (MACD) indicator to identify momentum-based buy and sell opportunities. Developed with input from expert trading analyst insights, this strategy combines technical precision with risk management, making it suitable for traders of all levels on platforms like TradingView. It focuses on capturing trend reversals and momentum shifts, with clear visual cues and automated alerts for seamless integration with trading bots (e.g., Bitget webhooks).
#### How It Works
This strategy uses the MACD indicator to generate trading signals based on momentum and trend direction:
- **Buy Signal**: Triggered when the MACD line crosses above the signal line, and the MACD histogram turns positive (above zero). This suggests increasing bullish momentum.
- **Sell Signal**: Triggered when the MACD line crosses below the signal line, and the MACD histogram turns negative (below zero), indicating growing bearish momentum.
Once a signal is detected, the strategy opens a position (long for buy, short for sell) with a position size calculated based on your risk tolerance. It includes a stop-loss to limit losses and a take-profit to lock in gains, both dynamically adjusted using the Average True Range (ATR) for adaptability to market volatility.
#### Key Features
- **MACD-Based Signals**: Relies solely on MACD for entry points, plotted in a separate pane for clear momentum analysis.
- **Risk Management**: Automatically calculates position size based on a percentage of your account balance and sets stop-loss and take-profit levels using ATR multipliers and a risk:reward ratio.
- **Visual Feedback**: Plots entry, stop-loss, and take-profit lines on the chart with labeled markers for easy tracking.
- **Alerts**: Includes Bitget webhook-compatible alerts for automated trading, notifying you of buy and sell signals in real-time.
#### Input Parameters
- **Account Balance**: Default 10000 – Set your initial trading capital to determine position sizing.
- **MACD Fast Length**: Default 12 – The short-term EMA period for MACD sensitivity.
- **MACD Slow Length**: Default 26 – The long-term EMA period for MACD calculation.
- **MACD Signal Length**: Default 9 – The smoothing period for the signal line.
- **Risk Per Trade (%)**: Default 3.0 – The percentage of your account balance risked per trade (e.g., 3% of 10000 = 300).
- **Risk:Reward Ratio**: Default 3.0 – The ratio of potential profit to risk (e.g., 3:1 means risking 1 to gain 3).
- **SL Multiplier**: Default 1.0 – Multiplies ATR to set the stop-loss distance (e.g., 1.0 x ATR).
- **TP Multiplier**: Default 3.0 – Multiplies ATR to set the take-profit distance, adjusted by the risk:reward ratio.
- **Line Length (bars)**: Default 25 – Duration in bars for displaying trade lines on the chart.
- **Label Position**: Default 'left' – Position of text labels (left or right) relative to trade lines.
- **ATR Period**: Default 14 – The number of periods for calculating ATR to measure volatility.
#### How to Use
1. **Add to Chart**: Load the "MACD Strategy" as a strategy and the "MACD Indicator" as a separate indicator on your TradingView chart (recommended for BTCUSDT Futures on the 1-minute timeframe).
2. **Customize Settings**: Adjust the input parameters based on your risk tolerance and market conditions. For BTCUSDT Futures, consider reducing `Risk Per Trade (%)` during high volatility (e.g., 1%) or increasing `SL Multiplier` for wider stops.
3. **Visual Analysis**: Watch the main chart for trade entry lines (green for buy, red for sell), stop-loss (red), and take-profit (green) lines with labels. Use the MACD pane below to confirm momentum shifts.
4. **Set Alerts**: Create alerts in TradingView for "Buy Signal" and "Sell Signal" to automate trades via Bitget webhooks.
5. **Backtest and Optimize**: Test the strategy on historical BTCUSDT Futures 1-minute data to fine-tune parameters. The short timeframe requires quick execution, so monitor closely for slippage or latency.
#### Tips for Success
- **Market Conditions**: This strategy performs best in trending markets on the 1-minute timeframe. Avoid choppy conditions where MACD crossovers may produce false signals.
- **Risk Management**: Start with the default 3% risk per trade and adjust downward (e.g., 1%) during volatile periods like BTCUSDT news events. The 3:1 risk:reward ratio targets consistent profitability.
- **Timeframe**: Optimized for 1-minute charts; switch to 5-minute or 15-minute for less noise if needed.
- **Confirmation**: Cross-check MACD signals with price action or support/resistance levels for higher accuracy on BTCUSDT Futures.
#### Limitations
- This strategy relies solely on MACD, so it may lag in fast-moving or sideways markets. Consider adding a secondary filter (e.g., RSI) if needed.
- Stop-loss and take-profit are ATR-based and may need adjustment for BTCUSDT Futures’ high volatility, especially during leverage trading.
#### Conclusion
The "MACD Strategy" offers a simple yet effective way to trade momentum shifts using the MACD indicator, tested for BTCUSDT Futures on the 1-minute timeframe, with robust risk management and visual tools. Whether you’re scalping crypto futures or exploring short-term trends, this strategy provides a solid foundation for automated or manual trading. Share your feedback or customizations in the comments, and happy trading!