This indicator scans a pasted list of symbols, up to the first forty, and shows long and short momentum setups in a configurable table in a separate pane.
Scanner - Momentum Setup - RSI Direction Confirmation Scanner.txt
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
indicator(title='Momentum Setup: RSI Direction Confirmation Scanner', shorttitle='RSI Dir Conf Scan', overlay=false, max_bars_back=500, max_lines_count=500, max_boxes_count=500)
//_____________________________ Menu Screener Start
g_scrtb = '█████████████████ Scanner █████████████████'
string i_scr_choose = input.string(defval='Break Flip', title='Scanning Method', options=['Break Flip', 'Break Continuous'], group=g_scrtb)
tt_is = "• Reads only up to first 40 symbols." +
"\n• Total characters cannot exceed 4096." +
"\n• Eg: EXCHANGE:SYMBOL_A,EXCHANGE:SYMBOL_B"
string i_symbols = input.text_area(
defval="NSE:AEROFLEX,NSE:BAJAJHFL,NSE:BCLIND,NSE:BOMDYEING,NSE:CESC,NSE:CHAMBLFERT,NSE:DBREALTY,NSE:DCW,NSE:DEVYANI,NSE:DHANI,NSE:ENGINERSIN,NSE:GAEL,NSE:GMRP_UI,NSE:GPIL,NSE:GREAVESCOT,NSE:HFCL,NSE:HITECH,NSE:IEX,NSE:IIFL,NSE:IIFLSEC,NSE:INDUSTOWER,NSE:INOXGREEN,NSE:INOXWIND,NSE:JMFINANCIL,NSE:KELLTONTEC,NSE:LLOYDSENGG,NSE:MARKSANS,NSE:MOREPENLAB,NSE:MTNL,NSE:NLCINDIA,NSE:OLAELEC,NSE:PARAGMILK,NSE:PRSMJOHNSN,NSE:RAILTEL,NSE:RITES,NSE:SANSTAR,NSE:SARDAEN,NSE:SBFC,NSE:SHRIRAMPPS,NSE:VPRPL",
title="Paste Symbols", tooltip=tt_is, group=g_scrtb)
bool i_scr_show_table = input.bool(defval=true, title='Display Table', group=g_scrtb)
bool i_scr_show_long = input.bool(defval=true, title='Long Signals', inline='tb_2', group=g_scrtb)
bool i_scr_show_short = input.bool(defval=true, title='Short Signals', inline='tb_2', group=g_scrtb)
int i_scr_tbl_disp_rows = input.int(defval=12, title='Display Rows', minval=0, maxval=100, group=g_scrtb)
string i_scr_tbl_position = input.string(defval=position.bottom_left, title='Table Position', options=[position.top_left, position.top_center, position.top_right, position.middle_left, position.middle_center, position.middle_right, position.bottom_left, position.bottom_center, position.bottom_right], group=g_scrtb)
string i_scr_tbl_text_size = input.string(defval=size.small, title='Table Size', options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge], group=g_scrtb)
//_____________________________ Menu Screener End
//_____________________________ Menu Indicators Start
g_rsi = '██████████ Relative Strength Index (RSI) ██████████'
int i_rsi_length = input.int(defval=14, title='RSI Length', minval=1, group=g_rsi)
float i_rsi_source = input.source(defval=close, title="RSI Source", group=g_rsi)
int i_rsi_ma_length = input.int(defval=14, title='SMA Length', minval=1, group=g_rsi)
//_____________________________ Menu Indicators End
//_____________________________ Menu Additional Fiters Start
g_af = '███████████████ Additional Fiters ███████████████'
tt_pchg =
"• If '% Change Above/Below +/-' is 4, it means relative volume is considered when the price change is above 4%." +
"\n• A value of 4% is positive for bullish scenarios and negative for bearish scenarios." +
"\n• The percentage change is calculated using cumulative percentage change, so there might be a minor difference between the actual and displayed percentage change."
tt_vpchg =
"• If 'Volume % Change Above' is 0, it means Relative Volume is considered when today's volume is greater than the previous day's volume." +
"\n• For 'Screening Method' choice 'Retracement to EMA,' the 'Apply Volume % Change Filter' can be unchecked." +
"\n• A 'Volume % Change Above' 300% or more often indicates a major breakout, which may happen today or the next day." +
"\n• The volume percentage change is calculated using cumulative percentage change, so there might be a minor difference between the actual and displayed percentage change."
tt_atr =
"• ATR helps filter out longer or more volatile signal candles."
tt_atr_mul =
"• Higher multiplier value filters a longer or more volatile signal candle."
tt_bf =
"• If the input is '80', it means the body covers over 80% of the candle."
tt_bs =
"• 2 means the candle is 2 times larger than the previous candle."
tt_vol =
"• Filter out a candle when its volume is greater than the SMA of the volume."
tt_rv =
"• Filter out a candle when its volume is greater than the Relative Volume."
tt_tf =
"• Filter out a signals between the given Time."
bool i_pchg_filter = input.bool(defval=false, title='Apply % Change Filter', tooltip=tt_pchg, group=g_af)
float i_pchg_above_below = input.float(defval=2, title='% Change Above/Below +/-', minval=0, group=g_af)
bool i_vol_filter = input.bool(defval=false, title='Apply Volume Filter', tooltip=tt_vpchg, group=g_af)
int i_vol_above = input.int(defval=500000, title='Volume Above', minval=0, group=g_af)
bool i_vol_pchg_filter = input.bool(defval=false, title='Apply Volume % Change Filter', tooltip=tt_vpchg, group=g_af)
float i_vol_pchg_above = input.float(defval=0, title='Volume % Change Above', minval=0, group=g_af)
bool i_atr_filter = input.bool(defval=true, title='Apply ATR Filter', tooltip=tt_atr, group=g_af)
int i_atr_length = input.int(defval=14, minval=1, title='ATR Length', group=g_af)
float i_atr_multi = input.float(defval=1, title='ATR Multiplier', minval=1, group=g_af)
bool i_body_filter = input.bool(defval=false, title='Apply Body % Filter', tooltip=tt_bf, group=g_af)
float i_body_percent = input.float(defval=70, title='Body % Above', minval=0, maxval=100, group=g_af) / 100
bool i_body_size_filter = input.bool(defval=false, title='Apply Body Size Filter', tooltip=tt_bs, group=g_af)
int i_body_size_multiplier = input.int(defval=2, title='Body Size Multiplier (x)', minval=0, group=g_af)
bool i_volume_filter = input.bool(defval=false, title='Apply Volume Filter', tooltip=tt_vol, group=g_af)
int i_vol_sma_length = input.int(defval=20, minval=1, title='Volume SMA Length', group=g_af)
bool i_rel_vol_filter = input.bool(defval=false, title='Apply Continuous Signals Filter', tooltip=tt_rv, group=g_af)
int i_rel_vol_avg_vol_len = input.int(defval=90, title='Break Signals Length', minval=2, group=g_af)
float i_rel_vol_avg_vol_multi = input.float(defval=5, title='Rel Vol SMA Multiplier', minval=0, group=g_af)
bool i_time_filter = input.bool(defval=false, title='Apply Time Filter', tooltip=tt_tf, group=g_af)
int i_hour_1 = input.int(defval=9, minval=0, title='Time From', inline='t_1', group=g_af)
int i_minute_1 = input.int(defval=15, minval=0, title=':', inline='t_1', group=g_af)
int i_hour_2 = input.int(defval=10, minval=0, title='Time To ', inline='t_2', group=g_af)
int i_minute_2 = input.int(defval=15, minval=0, title=':', inline='t_2', group=g_af)
//_____________________________ Menu Additional Fiters End
//_____________________________ Menu Table Start
g_dtb = '█████████████████ Data Table █████████████████'
bool i_tbl_data_show = input.bool(defval=true, title='Display Table', group=g_dtb)
string i_tbl_data_pos = input.string(defval=position.bottom_right, title='Position', options=[position.top_left, position.top_center, position.top_right, position.middle_left, position.middle_center, position.middle_right, position.bottom_left, position.bottom_center, position.bottom_right], group=g_dtb)
string i_tbl_data_txt_size = input.string(defval=size.normal, title='Size', options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge], group=g_dtb)
//_____________________________ Menu Table End
//_____________________________ Chart Settings Start
g_ch = '███████████████ Chart Settings ███████████████'
color i_pos_dark_color = input.color(defval=#03110F, title='Positive Dark', group=g_ch)
color i_pos_color = input.color(defval=#26A69A, title='Positive Mid', group=g_ch)
color i_pos_light_color = input.color(defval=#ACE5DC, title='Positive Light', group=g_ch)
color i_neg_light_color = input.color(defval=#FCCBCD, title='Negative Light', group=g_ch)
color i_neg_color = input.color(defval=#FF5252, title='Negative Mid', group=g_ch)
color i_neg_dark_color = input.color(defval=#180809, title='Negative Dark', group=g_ch)
color i_indicator_color = input.color(defval=#2962FF, title='Indicator', group=g_ch)
color i_signal_color = input.color(defval=#FF6D00, title='Signal', group=g_ch)
color i_neu_color = input.color(defval=#D1D4DC, title='Neutral Light', group=g_ch)
color i_neu_mid_color = input.color(defval=#2A2E39, title='Neutral Mid', group=g_ch)
color i_neu_dark_color = input.color(defval=#141516, title='Neutral Dark', group=g_ch)
//_____________________________ Chart Settings End
//_____________________________ RSI Start
float rsi = ta.rsi(i_rsi_source, i_rsi_length)
float rsi_ma = ta.sma(rsi, i_rsi_ma_length)
// Plot RSI
plot(series=rsi, title="RSI", color=i_indicator_color)
plot(series=rsi_ma, title="RSI MA", color=i_signal_color)
// Bands
hline(price=80, title="RSI Overbought", color=color.new(i_neg_color, 50), linestyle=hline.style_dotted)
upper_band = hline(price=60, title="RSI Upper Band", color=color.new(i_pos_color, 50), linestyle=hline.style_dotted)
hline(price=50, title="RSI Middle Band", color=color.new(i_neu_color, 50), linestyle=hline.style_dotted)
lower_band = hline(price=40, title="RSI Lower Band", color=color.new(i_neg_color, 50), linestyle=hline.style_dotted)
hline(price=20, title="RSI Oversold", color=color.new(i_pos_color, 50), linestyle=hline.style_dotted)
fill(hline1=upper_band, hline2=lower_band, color=color.new(i_neu_color, 95), title="RSI Middle Fill")
//_____________________________ RSI End
//_____________________________ Cumulative Percentage Change Start
// Function to calculate Daily Cumulative Percentage Change of Close Price
cumulative_percentage_change() =>
var float _cum_pct_change = na
_is_new_day = ta.change(time('D')) != 0 ? 1 : 0
_daily_pct_change = na(close[1]) ? 0 : (close - close[1]) / close[1] * 100
_cum_pct_change := _is_new_day ? _daily_pct_change : (na(_cum_pct_change) ? _daily_pct_change : (_cum_pct_change + _daily_pct_change))
_cum_pct_change
// Calculate current cumulative percentage change
cum_pchg = cumulative_percentage_change()
//_____________________________ Cumulative Percentage Change End
//_____________________________ Cumulative Volume Percentage Change Start
// Function to calculate Daily Cumulative Volume
cumulative_volume() =>
var float _cum_vol = na
_is_new_day = ta.change(time('D')) != 0 ? 1 : 0
_cum_vol := _is_new_day ? volume : (na(_cum_vol) ? volume : (_cum_vol + volume))
_cum_vol
// Calculate current and previous day cumulative volumes
var float current_cum_vol = na
var float prev_cum_vol = na
if ta.change(time('D')) != 0
prev_cum_vol := current_cum_vol
current_cum_vol := volume
else
current_cum_vol += volume
// Calculate Cumulative Volume Percentage Change
cum_vol_pchg = (current_cum_vol - nz(prev_cum_vol, current_cum_vol)) / nz(prev_cum_vol, current_cum_vol) * 100
//_____________________________ Cumulative Volume Percentage Change End
//_____________________________ Additional Filters Start
// % Change Filter
bool pchg_above_filter = true
bool pchg_below_filter = true
if i_pchg_filter
pchg_above_filter := cum_pchg > i_pchg_above_below
pchg_below_filter := cum_pchg < -i_pchg_above_below
// Volume Filter
bool vol_filter = true
if i_vol_filter
vol_filter := current_cum_vol >= i_vol_above
// Volume % Change Filter
bool vol_pchg_filter = true
if i_vol_pchg_filter
vol_pchg_filter := cum_vol_pchg >= i_vol_pchg_above
// ATR Filter
bool atr_filter = true
if i_atr_filter
atr_filter := (high - low) > ta.atr(i_atr_length) * i_atr_multi
// Body Percent Filter
bool body_filter = true
if i_body_filter
body_filter := (math.abs(close - open)) / (high - low) >= i_body_percent
// Body Size Filter
bool body_size_filter = true
if i_body_size_filter
body_size_filter := (math.abs(close - open)) / (high - low) >= i_body_percent and (high - low) >= (high[1] - low[1]) * i_body_size_multiplier
// Volume SMA Filter
bool volume_filter = true
if i_volume_filter
volume_filter := volume > ta.sma(volume, i_vol_sma_length)
// Continuous Signals Filter
average_volume = ta.sma(volume, i_rel_vol_avg_vol_len)
relative_volume = volume / average_volume[1]
rel_vol_sma_multiplier = ta.sma(relative_volume, i_rel_vol_avg_vol_len) * i_rel_vol_avg_vol_multi
bool rel_vol_filter = true
if i_rel_vol_filter
rel_vol_filter := relative_volume > rel_vol_sma_multiplier
// Time Filter
bool time_filter = true
if i_time_filter
time_filter := (hour > i_hour_1 or (hour == i_hour_1 and minute >= i_minute_1)) and (hour < i_hour_2 or (hour == i_hour_2 and minute < i_minute_2))
//_____________________________ Additional Filters End
//_____________________________ Retracement Signals Start
// Short Retracement Start
// Short Condition 1
short_ret_cont_1 =
rsi > 40
// Short Condition 2
short_ret_cont_2 =
rsi < 40 and
rsi < rsi_ma and
open < close and
open[1] > close[1]
var short_ret_cont_2_low = float(na)
if short_ret_cont_2
short_ret_cont_2_low := low
// Short Condition 3
short_ret_cont_3 =
rsi < 40 and
rsi < rsi_ma and
close < short_ret_cont_2_low and
pchg_below_filter and
vol_filter and
vol_pchg_filter and
atr_filter and
body_filter and
body_size_filter and
volume_filter and
rel_vol_filter and
time_filter and
barstate.isconfirmed
// Short Retracement Trigger
var short_break_current_state = 0
short_break_previous_state = nz(short_break_current_state[1])
short_break_current_state := short_break_previous_state == 3 ? 0 : short_break_previous_state
if short_ret_cont_1 and short_break_current_state == 0
short_break_current_state := 1
if short_ret_cont_2 and short_break_current_state == 1
short_break_current_state := 2
if short_ret_cont_3 and short_break_current_state == 2
short_break_current_state := 3
short_ret_trigger = short_break_current_state == 3 ? true : false
//___________________________ Short Retracement End
//___________________________ Long Retracement Start
// Long Retracement Start
// Long Condition 1
long_ret_cont_1 =
rsi < 60
// Long Condition 2
long_ret_cont_2 =
rsi > 60 and
rsi > rsi_ma and
open > close and
open[1] < close[1]
var long_ret_cont_2_high = float(na)
if long_ret_cont_2
long_ret_cont_2_high := high
// Long Condition 3
long_ret_cont_3 =
rsi > 60 and
rsi > rsi_ma and
close > long_ret_cont_2_high and
pchg_above_filter and
vol_filter and
vol_pchg_filter and
atr_filter and
body_filter and
body_size_filter and
volume_filter and
rel_vol_filter and
time_filter and
barstate.isconfirmed
// Long Retracement Trigger
var long_break_current_state = 0
long_break_previous_state = nz(long_break_current_state[1])
long_break_current_state := long_break_previous_state == 3 ? 0 : long_break_previous_state
if long_ret_cont_1 and long_break_current_state == 0
long_break_current_state := 1
if long_ret_cont_2 and long_break_current_state == 1
long_break_current_state := 2
if long_ret_cont_3 and long_break_current_state == 2
long_break_current_state := 3
long_ret_trigger = long_break_current_state == 3 ? true : false
//___________________________ Long Retracement End
//_______________________ Signals End
//___________________________ Plot Retracements
// 1
plotshape(series=i_scr_show_short and i_scr_choose == 'Break Continuous' and short_ret_trigger ? 4 : na, title='Break Short Shape', style=shape.triangledown, location=location.abovebar, color=i_neg_light_color, size=size.tiny, force_overlay=true)
plotshape(series=i_scr_show_long and i_scr_choose == 'Break Continuous' and long_ret_trigger ? 4 : na, title='Break Long Shape', style=shape.triangleup, location=location.belowbar, color=i_pos_light_color, size=size.tiny, force_overlay=true)
barcolor(color=i_scr_show_short and i_scr_choose == 'Break Continuous' and short_ret_trigger ? i_neg_light_color : i_scr_show_long and i_scr_choose == 'Break Continuous' and long_ret_trigger ? i_pos_light_color : na, title='Break Candle')
bgcolor(color=i_scr_show_short and i_scr_choose == 'Break Continuous' and short_ret_trigger ? color.new(i_neg_color, 90) : i_scr_show_long and i_scr_choose == 'Break Continuous' and long_ret_trigger ? color.new(i_pos_color, 90) : na, title='Break Bgcolor')
//_____________________________ Retracement Signals End
//_____________________________ Flip Signals Start
// Signal Generation Function
exrem(condition_1, condition_2) =>
var entry_signal = 0
entry_signal := condition_1 ? 1 : condition_2 ? -1 : entry_signal[1]
entry = entry_signal != entry_signal[1]
long = entry and entry_signal == 1
short = entry and entry_signal == -1
[long, short]
[long_flip_signal, short_flip_signal] = exrem(long_ret_trigger, short_ret_trigger)
//___________________________ Plot Flip
plotshape(series=i_scr_show_short and i_scr_choose == 'Break Flip' ? short_flip_signal : na, title='Flip Short Shape', style=shape.triangledown, location=location.abovebar, color=i_neg_light_color, size=size.tiny, force_overlay=true)
plotshape(series=i_scr_show_long and i_scr_choose == 'Break Flip' ? long_flip_signal : na, title='Flip Long Shape', style=shape.triangleup, location=location.belowbar, color=i_pos_light_color, size=size.tiny, force_overlay=true)
bgcolor(color=i_scr_show_short and i_scr_choose == 'Break Flip' and short_flip_signal ? color.new(i_neg_light_color, 90) : i_scr_show_long and i_scr_choose == 'Break Flip' and long_flip_signal ? color.new(i_pos_light_color, 90) : na, title='Flip Bgcolor')
barcolor(color=i_scr_show_short and i_scr_choose == 'Break Flip' and short_flip_signal ? i_neg_light_color : i_scr_show_long and i_scr_choose == 'Break Flip' and long_flip_signal ? i_pos_light_color : na, title='Flip Candle')
//_____________________________ Flip Signals End
//_____________________________ Signals End
//_____________________________ Data Table Start
// To String
day_pchg_str = str.tostring(cum_pchg,"#.##") + ' %'
volume_pchg_str = str.tostring(cum_vol_pchg,"#.##") + ' %'
day_volume_str = str.tostring(current_cum_vol/100000,"#.##") + ' L'
prev_day_volume_str = str.tostring(prev_cum_vol/100000,"#.##") + ' L'
// Color
bgcolor_1 = i_neu_dark_color
bgcolor_2 = i_neu_mid_color
pchg_col = cum_pchg > 0 ? i_pos_color : i_neg_color
vol_pchg_col = cum_vol_pchg > 0 ? i_pos_color : i_neg_color
prev_vol_pchg_col = prev_cum_vol < current_cum_vol ? i_neg_color : i_pos_color
// Plot Table
var table tbl_data = table.new(position=i_tbl_data_pos, columns=2, rows=4, border_width=1, force_overlay=true)
if barstate.islast and i_tbl_data_show
table.cell(table_id=tbl_data, column=0, row=0, text="%Chg", text_color=i_neu_color, text_halign=text.align_left, bgcolor=bgcolor_1, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=1, row=0, text=day_pchg_str, text_color=pchg_col, text_halign=text.align_right, bgcolor=bgcolor_1, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=0, row=1, text="Vol %Chg", text_color=i_neu_color, text_halign=text.align_left, bgcolor=bgcolor_2, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=1, row=1, text=volume_pchg_str, text_color=vol_pchg_col, text_halign=text.align_right, bgcolor=bgcolor_2, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=0, row=2, text="Vol", text_color=i_neu_color, text_halign=text.align_left, bgcolor=bgcolor_1, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=1, row=2, text=day_volume_str, text_color=vol_pchg_col, text_halign=text.align_right, bgcolor=bgcolor_1, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=0, row=3, text="PD Vol", text_color=i_neu_color, text_halign=text.align_left, bgcolor=bgcolor_2, text_size=i_tbl_data_txt_size)
table.cell(table_id=tbl_data, column=1, row=3, text=prev_day_volume_str, text_color=prev_vol_pchg_col, text_halign=text.align_right, bgcolor=bgcolor_2, text_size=i_tbl_data_txt_size)
//_____________________________ Data Table End
//_____________________________ Get Symbols for Screener Start
// Acknowledgement & Reference
// Trader: 'allanster'
// Indicator Title: 'How To Input CSV List Of Symbol Data Used For Screener'
// Indicator Link: 'https://www.tradingview.com/script/KfqHqHUH-How-To-Input-CSV-List-Of-Symbol-Data-Used-For-Screener/'
feed(back) => // extract tickerid and decrement list of ticker IDs
loop = back // declare string variable to hold content list
getT = string(na) // declare string variable to hold tickerid
if str.length(loop) == 0 // if list is empty
getT := string(na) // assign na to tickerid variable
loop := string(na) // assign na to list of ticker Ids variable
else // else extract first tickerid
getP = nz(str.pos(loop, ','), str.length(loop)) // get position of first comma or last character
getT := str.substring(loop, 0, getP) // get tickerid in first position of list
loop := str.replace(loop, getT + ',', '') // clear tickerid + delimiter character from list
[getT, loop] // return tickerid in first position & truncated list
[tid_01, out_01] = feed(i_symbols), [tid_02, out_02] = feed(out_01), [tid_03, out_03] = feed(out_02), [tid_04, out_04] = feed(out_03),
[tid_05, out_05] = feed(out_04), [tid_06, out_06] = feed(out_05), [tid_07, out_07] = feed(out_06), [tid_08, out_08] = feed(out_07),
[tid_09, out_09] = feed(out_08), [tid_10, out_10] = feed(out_09), [tid_11, out_11] = feed(out_10), [tid_12, out_12] = feed(out_11),
[tid_13, out_13] = feed(out_12), [tid_14, out_14] = feed(out_13), [tid_15, out_15] = feed(out_14), [tid_16, out_16] = feed(out_15),
[tid_17, out_17] = feed(out_16), [tid_18, out_18] = feed(out_17), [tid_19, out_19] = feed(out_18), [tid_20, out_20] = feed(out_19),
[tid_21, out_21] = feed(out_20), [tid_22, out_22] = feed(out_21), [tid_23, out_23] = feed(out_22), [tid_24, out_24] = feed(out_23),
[tid_25, out_25] = feed(out_24), [tid_26, out_26] = feed(out_25), [tid_27, out_27] = feed(out_26), [tid_28, out_28] = feed(out_27),
[tid_29, out_29] = feed(out_28), [tid_30, out_30] = feed(out_29), [tid_31, out_31] = feed(out_30), [tid_32, out_32] = feed(out_31),
[tid_33, out_33] = feed(out_32), [tid_34, out_34] = feed(out_33), [tid_35, out_35] = feed(out_34), [tid_36, out_36] = feed(out_35),
[tid_37, out_37] = feed(out_36), [tid_38, out_38] = feed(out_37), [tid_39, out_39] = feed(out_38), [tid_40, out_40] = feed(out_39)
//_____________________________ Get Symbols for Screener End
//_____________________________ Screener Start
// Acknowledgement & Reference
// Trader: 'MUQWISHI'
// Indicator Title: 'Candlestick Patterns Screener [By MUQWISHI]'
// Indicator Link: 'https://www.tradingview.com/script/xiWQuGOq-Candlestick-Patterns-Screener-By-MUQWISHI/'
// Scanner Conditions
short_cond =
i_scr_choose == 'Break Continuous' ? short_ret_trigger : short_flip_signal
long_cond =
i_scr_choose == 'Break Continuous' ? long_ret_trigger : long_flip_signal
// Function for Screener Indicator Calculation
indicator_calculation() =>
// Initialize variables
price = float(na)
_time = int(na)
_cum_pchg = float(na)
_cum_vol_pchg = float(na)
signal = int(na)
if barstate.isconfirmed
// Check for Short Momentum Candle and conditions (Modify here to customize indicators)
if i_scr_show_long and long_cond
signal := 1
// Check for Long Momentum Candle and conditions (Modify here to customize indicators)
else if i_scr_show_short and short_cond
signal := -1
// Update price and time if signal is not null
if not na(signal)
price := math.round_to_mintick(close)
_time := time
_cum_pchg := cum_pchg
_cum_vol_pchg := cum_vol_pchg
[_time, price, _cum_pchg, _cum_vol_pchg, signal]
// Function to format time
format_time(x) =>
timezone = syminfo.timezone
timeframe.isintraday ? str.format_time(x, "HH:mm dd-MM-yyyy", timezone) : str.format_time(x, "dd-MM-yyyy", timezone)
// Function to extract symbol name
symbol(s) =>
array.get(str.split(s, ":"), 1)
// Matrix setup
var matrix = matrix.new<string>(0, 6, na)
// Function to add rows to the matrix
mtxFun(symbol, _time, price, _cum_pchg, _cum_vol_pchg, signal) =>
matrix.add_row(matrix, 0, array.from(symbol, _time, price, _cum_pchg, _cum_vol_pchg, signal))
// Screener function to collect data
screener(s) =>
sym = ticker.modify(s, syminfo.session)
[_time, price, _cum_pchg, _cum_vol_pchg, signal] = request.security(sym, timeframe.period, indicator_calculation())
// Check if the signal is not na and the time matches
if not na(signal) and _time == time
symbolName = symbol(s)
formattedTime = format_time(_time)
strPrice = str.tostring(price)
str_cum_pchg = str.tostring(_cum_pchg, '#.##')
str_cum_vol_pchg = str.tostring(_cum_vol_pchg, '#.##')
strSignal = str.tostring(signal)
// Add data to the matrix
mtxFun(symbolName, formattedTime, strPrice, str_cum_pchg, str_cum_vol_pchg, strSignal)
// Call Screener function for multiple symbols
screener(tid_01), screener(tid_02), screener(tid_03), screener(tid_04), screener(tid_05), screener(tid_06), screener(tid_07),
screener(tid_08), screener(tid_09), screener(tid_10), screener(tid_11), screener(tid_12), screener(tid_13), screener(tid_14),
screener(tid_15), screener(tid_16), screener(tid_17), screener(tid_18), screener(tid_19), screener(tid_20), screener(tid_21),
screener(tid_22), screener(tid_23), screener(tid_24), screener(tid_25), screener(tid_26), screener(tid_27), screener(tid_28),
screener(tid_29), screener(tid_30), screener(tid_31), screener(tid_32), screener(tid_33), screener(tid_34), screener(tid_35),
screener(tid_36), screener(tid_37), screener(tid_38), screener(tid_39), screener(tid_40)
// Trim excess rows in the matrix
if matrix.rows(matrix) > i_scr_tbl_disp_rows
while matrix.rows(matrix) > i_scr_tbl_disp_rows
matrix.remove_row(matrix, matrix.rows(matrix)-1)
// Plot Table
// Create table with specified properties
var table scr_tbl = table.new(position=i_scr_tbl_position, columns=5, rows=102, border_width=1, force_overlay=true)
// Function to populate cells in the table
scr_cell_title(col, row, txt) =>
table.cell(scr_tbl, col, row, text = txt, text_color = i_neu_color, text_halign=text.align_center, bgcolor=i_neu_dark_color, text_size=i_scr_tbl_text_size)
scr_cell(col, row, txt, _text_color, _bgcolor) =>
table.cell(scr_tbl, col, row, text = txt, text_color = _text_color, text_halign=text.align_left, bgcolor=_bgcolor, text_size=i_scr_tbl_text_size)
// Check if it's the last bar
if barstate.islast and i_scr_show_table
// Clear existing data in the table
table.clear(scr_tbl, 0, 0, 2, 101)
scr_cell_title(0, 0, i_scr_choose)
table.merge_cells(table_id=scr_tbl, start_column=0, start_row=0, end_column=4, end_row=0)
scr_cell_title(0, 1, "Symbol")
scr_cell_title(1, 1, "Time")
scr_cell_title(2, 1, "Price")
scr_cell_title(3, 1, "%Chg")
scr_cell_title(4, 1, "V %Chg")
j = 4
// Populate table with matrix data
if matrix.rows(matrix) > 0
for i = 0 to matrix.rows(matrix) - 1
// Determine color based on the signal
_textcolor =
matrix.get(matrix, i, 5) == "1" ? i_pos_color :
matrix.get(matrix, i, 5) == "-1" ? i_neg_color : i_neu_color
_bg_color =
matrix.get(matrix, i, 5) == "1" ? i_pos_dark_color :
matrix.get(matrix, i, 5) == "-1" ? i_neg_dark_color : i_neu_color
// Populate cells in the table
scr_cell(0, j, matrix.get(matrix, i, 0), _textcolor, _bg_color)
scr_cell(1, j, matrix.get(matrix, i, 1), _textcolor, _bg_color)
scr_cell(2, j, matrix.get(matrix, i, 2), _textcolor, _bg_color)
scr_cell(3, j, matrix.get(matrix, i, 3), _textcolor, _bg_color)
scr_cell(4, j, matrix.get(matrix, i, 4), _textcolor, _bg_color)
j += 1
//_____________________________ Screener End
//_____________________________ Code End
// Readme First:
// Momentum Setup: RSI Direction Confirmation Scanner
// Long Signal Logic:
// - RSI crosses above 60.
// - Look for a red candle where RSI is still above 60.
// - If a green candle crosses above the red candle and RSI is still above 60, a long signal is generated.
// - If the signal candle is large, wait for a 50% or FVG retracement before entering; otherwise, enter after the signal with a predefined risk and quantity.
// - Use additional personal confirmations as needed.
// Short Signal Logic:
// - RSI crosses below 40.
// - Look for a green candle where RSI is still below 40.
// - If a red candle crosses below the green candle and RSI is still below 40, a short signal is generated.
// - If the signal candle is large, wait for a 50% or FVG retracement before entering; otherwise, enter after the signal with a predefined risk and quantity.
// - Use additional personal confirmations as needed.
Overview
Momentum Setup: RSI Direction Confirmation Scanner compares RSI with an SMA of RSI using Break Flip or Break Continuous scanning. Optional filters cover price percent change, volume, volume percent change, ATR, candle body size, relative volume, and time. Table rows, position, and text size are adjustable. It does not place trades and has no stop or exit rules.
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.
This statistical analysis tool mines historical relationships between RSI values and candle volatility. It calculates a 14-period RSI from the previous bar and normalizes absolute price change using a 14-period Average True Range (ATR). Based on the normalized
Market Speedometer plots a 0-100 market speed reading in a separate pane. It measures movement by bar-to-bar change, true range, or a short average of recent bars, then ranks that movement against ATR and a percentile lookback. An EMA smooths the reading, and
The 8-Factor Composite Screener evaluates equities across fundamental and technical criteria, including valuation ratios, earnings and revenue growth, 12-month return momentum, proximity to 52-week highs, Stage 2 moving average alignment, benchmark relative st
This indicator transforms standard RSI calculations into logit space, estimating rolling distributions to derive empirical z-scores mapped back to the 0–100 RSI scale. Plotted in a separate pane, it features multi-horizon central lines—fast and structural cent
Manias, Panics and Crashes is a separate-pane market regime indicator that quantifies market sentiment and systemic risk. It processes technical metrics including RSI, moving averages, and volume alongside optional intermarket data such as VIX volatility and c
This overlay indicator plots a Supertrend from an ATR length and factor, four exponential moving averages, and a selectable VWAP or TWAP taken from a chosen timeframe on the price chart. It also shows MACD and stochastic with adjustable lengths, smoothing, ver