SMA Reversal Sequential MTF - Pure Confirmed Final V2SMA Reversal Sequential MTF - Detailed Indicator Manual
This indicator identifies trend reversal points based on the shape of a Simple Moving Average (SMA) and monitors these signals across multiple timeframes (MTF). By synchronizing trends from various intervals, it provides a robust framework for identifying high-probability entry points.
1. Core Logic Overview
The indicator detects "peaks" and "troughs" in the SMA to identify potential reversal points.
Bullish Reversal (UP): Occurs when the SMA turns upward after a period of decline (forming a "trough").
Bearish Reversal (DN): Occurs when the SMA turns downward after a period of inclination (forming a "peak").
In addition to detecting these turns, the indicator tracks the high/low prices of the most recent reversal points on a "Confirmed Bar" basis. When the current price breaks these levels, it confirms a trend continuation or a breakout.
2. Full Description of Input Settings
Basic Settings / Main Settings
Use Short Period (5, 4, 7) / 短期設定を使用:
true: Increases sensitivity to price movements by using shorter parameters (e.g., SMA 5). Suitable for scalping.
false: Uses standard parameters (e.g., SMA 20). Suitable for day trading and swing trading.
Timeframe Visibility / 時間足表示設定
Allows individual toggling of visibility for each timeframe's labels and lines.
Show 1M to 1m / 1M〜1m表示: Individually enable or disable the calculation and display of data for Monthly (1M), Weekly (1W), Daily (Daily), 4H, 1H, 15M, 5M, and 1m timeframes.
Hide Higher TF Settings on Lower TFs / 下位足での上位設定を非表示: When enabled, this removes lower timeframe data from higher timeframe charts to reduce visual noise.
Drawing Options / 表示オプション
Show Only Current TF Labels / 現在足のラベルのみ表示: If enabled, only labels corresponding to the chart's current interval (e.g., "5" labels on a 5M chart) will be displayed.
Show Trendlines & Channels / トレンドライン&チャネルを表示: Automatically draws trendlines and parallel channels by connecting recent local reversal points on the current timeframe.
Show Sequential Labels / 転換点ラベル表示: Displays timeframe labels (e.g., "15", "1H") at the exact point where the SMA reversed.
Show Break Lines / ブレイクライン表示: Draws horizontal lines from the most recent peaks or troughs and displays a "BREAK" label when price crosses them.
Break Label Offset / ブレイク文字の右オフセット: Adjusts the horizontal distance of the "BREAK" label from the current bar for better visibility.
Additional Alert Settings / 追加アラート設定
Alert 1: Current + 2 Higher TFs Sync (Blue/Red) / アラート1: 現在・上位2つ同調:
Triggers a notification when the trend (UP/DN) of the current chart's timeframe, the next higher timeframe, and the second higher timeframe all align.
Alert 2: 4-TF Sync Including Current (Orange) / アラート2: 表示足を含む4足同調:
Triggers a notification when four consecutive timeframes (Current + 3 Higher) align in the same direction. This is considered a high-conviction signal.
3. How to Read the Dashboard (Table)
The compact table in the top-right corner displays the current trend status for key timeframes in real-time.
Blue Background (UP): Indicates price has broken the recent peak, confirming an uptrend for that timeframe.
Red Background (DN): Indicates price has broken the recent trough, confirming a downtrend for that timeframe.
Gray Background: Indicates the trend status is yet to be determined or is in a neutral state.
The table items are fixed to show 1D, 4H, 1H, 15M, and 5M from top to bottom. When all rows turn the same color, it indicates a strong market trend across the entire spectrum.
4. Key Feature: MTF Sync Alerts
The primary advantage of this indicator is its automation of manual Multi-Timeframe Analysis.
3-TF Sync: On a 15M chart, if the 15M, 1H, and 4H trends align, a small Blue (Buy) or Red (Sell) label appears on the chart.
4-TF Sync: If the alignment extends to a 4th timeframe (e.g., up to the Daily timeframe on a 15M chart), an Orange label is displayed, signaling a very strong trend confluence.
このインジケーター(SMA Reversal Sequential MTF)は、移動平均線(SMA)の形状からトレンドの転換点を特定し、それを複数の時間足(MTF)で監視・同期させることで、高精度なエントリーポイントを探るためのツールです。
以下に、すべてのインプット項目を含む詳細な説明をまとめました。
1. 概要と基本ロジック
このインジケーターは、SMA(単純移動平均線)が「山」や「谷」を作ったポイントを転換点として認識します。
上昇転換: SMAが一定期間、下降した後に上昇へ転じた(谷を作った)タイミング。
下降転換: SMAが一定期間、上昇した後に下降へ転じた(山を作った)タイミング。
これに加えて、直近の転換点の価格(高値・安値)を「確定足」で更新し、そのラインを価格がブレイクした際にトレンドの継続や転換を判定します。
2. インプット項目の詳細
基本設定 / Main Settings
短期設定を使用 (5, 4, 7):
true(チェックあり): 短期的な動きに敏感になります(SMA 5期間など)。スキャルピング向け。
false(チェックなし): 標準的な設定(SMA 20期間など)。デイトレード・スイング向け。
時間足表示設定 / Timeframe Visibility
各時間足のラベルやラインを表示するかどうかを個別に設定します。
1M〜1m表示: 月足(1M)から1分足(1m)まで、各MTFデータの計算・表示をオン/オフします。
下位足での上位設定を非表示: * 現在表示しているチャートより上位の時間足設定だけを表示し、ノイズを減らすためのスイッチです。
表示オプション / Drawing Options
現在足のラベルのみ表示: チェックすると、チャートの時間足と一致するラベル(例:5分足チャートなら「5」のラベル)のみ表示されます。
トレンドライン&チャネルを表示: 現在表示している足の直近の転換点同士を結び、トレンドラインと並行チャネルを自動描画します。
転換点ラベル表示: SMAが反転した位置に「15」や「1H」などの時間足ラベルを表示します。
ブレイクライン表示: 直近の転換点(高値・安値)から右側に水平線を引き、そこを価格が抜けた際に「BREAK」の文字を表示します。
ブレイク文字の右オフセット: 「BREAK」ラベルを右側にどれくらい離して表示するかを調整します。
追加アラート設定 / GRP_NEW_AL
アラート1: 現在・上位2つ同調 (青/赤):
「表示中の足 + 1つ上 + 2つ上」の計3つのトレンド(UP/DN)が一致した瞬間に通知します。
アラート2: 表示足を含む4足同調 (オレンジ):
「表示中の足 + 上位3つ」の計4つのトレンドがすべて一致した強力なサイン時に通知します。
3. テーブル(ダッシュボード)の見方
画面右上に表示されるコンパクトなテーブルは、各時間足の現在のトレンド状態をリアルタイムで示しています。
青背景(UP): 直近で高値をブレイクし、上昇トレンドにある状態。
赤背景(DN): 直近で安値をブレイクし、下降トレンドにある状態。
灰背景: 状態が未確定なケース。
表示項目は上位足から順に 1D(日足), 4H, 1H, 15M, 5M となっており、これらが一色に染まるタイミングが環境認識上の強いトレンドを示唆します。
4. 特徴的な機能:MTF同調アラート
このインジケーターの最大の強みは、手動でのマルチタイムフレーム分析を自動化している点です。
3足同調(SYNC): 15分足チャートであれば「15M・1H・4H」が同じ方向を向いた時にチャート上に青(買い)または赤(売り)の小さなラベルが表示されます。
4足同調(4-TF SYNC): さらに上位の足(15分足なら日足まで)が同調すると、オレンジ色のラベルが表示され、より強い根拠となります。
Buscar en scripts para "Candlestick"
RSI + Smoothed HA Strategy 🚀 RSI + SMOOTHED HEIKEN ASHI STRATEGY (TRAILING TP, 1% SL) 📊
🎯 STRATEGY OVERVIEW
This professional trading strategy combines MOMENTUM ANALYSIS with TREND CONFIRMATION using two powerful technical indicators. The system executes LONG-ONLY POSITIONS when bullish conditions align, featuring AUTOMATED RISK MANAGEMENT with a fixed stop loss and dynamic trailing exit.
⚙️ CORE COMPONENTS
📈 INDICATOR 1: RELATIVE STRENGTH INDEX (RSI)
CALCULATION: Standard 14-period RSI (configurable)
ENTRY THRESHOLD: 55 LEVEL (adjustable parameter)
PURPOSE: Identifies MOMENTUM STRENGTH and OVERBOUGHT CONDITIONS
VISUAL: Blue RSI line with gray threshold level plotted separately
🕯️ INDICATOR 2: DOUBLE-SMOOTHED HEIKEN ASHI
UNIQUE FEATURE: DOUBLE EMA SMOOTHING applied to Heiken Ashi candles
SMOOTHING LAYERS:
FIRST LAYER: EMA applied to raw OHLC data (default: 10 periods)
SECOND LAYER: EMA applied to Heiken Ashi values (default: 10 periods)
COLOR SCHEME:
🟢 LIME GREEN: Bullish candle (close > open)
🔴 RED: Bearish candle (close < open)
BENEFIT: REDUCES MARKET NOISE while maintaining trend clarity
🎮 ENTRY CONDITIONS
📈 LONG POSITIONS ACTIVATE WHEN ALL THREE CONDITIONS CONVERGE:
RSI MOMENTUM: RSI ≥ 55 (configurable level)
TREND CONFIRMATION: Current smoothed Heiken Ashi candle is GREEN
TREND REVERSAL SIGNAL: Previous smoothed Heiken Ashi candle was RED
✅ ENTRY LOGIC: This triple-filter approach ensures trades are taken only during CONFIRMED BULLISH SHIFTS with underlying momentum strength.
🛡️ RISK MANAGEMENT SYSTEM
⛔ STOP LOSS PROTECTION
FIXED 1% RISK PER TRADE
AUTOMATIC CALCULATION: Stop placed at 99% of entry price
IMMEDIATE ACTIVATION: Engages upon position entry
BENEFIT: CAPS MAXIMUM LOSS regardless of market volatility
💰 TRAILING TAKE-PROFIT MECHANISM
DYNAMIC EXIT STRATEGY: Tracks trend continuation
EXIT CONDITION: Closes position when smoothed Heiken Ashi turns RED
ADVANTAGE: LOCKS IN PROFITS during trend reversals
LOGIC: Allows winners to run while protecting gains
💼 POSITION SIZING
CAPITAL ALLOCATION: 10% of equity per trade (fully customizable)
INITIAL CAPITAL: $10,000 (user-adjustable)
FLEXIBILITY: Compatible with various account sizes
✨ KEY ADVANTAGES
🎯 PRECISE TIMING
Combines MOMENTUM FILTER (RSI) with TREND FILTER (Heiken Ashi)
Reduces false signals through CONFIRMATION SEQUENCE
🛡️ DISCIPLINED RISK CONTROL
PREDEFINED 1% STOP LOSS eliminates emotional decisions
SYSTEMATIC EXITS remove subjective profit-taking
👁️ VISUAL CLARITY
CLEAN CHART PLOTTING with color-coded candles
SEPARATE RSI DISPLAY for momentum monitoring
REAL-TIME SIGNALS directly on price chart
⚡ OPTIMIZATION TIPS
ADJUST RSI LEVEL based on asset volatility (55-70 range)
MODIFY SMOOTHING PERIODS for different timeframes
TEST POSITION SIZE according to risk tolerance
COMBINE WITH VOLUME CONFIRMATION for enhanced accuracy
📊 RECOMMENDED MARKETS
TRENDING FOREX PAIRS (EUR/USD, GBP/USD)
LIQUID INDICES (S&P 500, NASDAQ)
HIGH-CAP CRYPTO (BTC/USD, ETH/USD)
TIME FRAMES: 1-hour to daily charts
⚠️ RISK DISCLAIMER
This strategy is a TOOL FOR ANALYSIS, not financial advice. Always:
BACKTEST extensively before live trading
START WITH SMALL CAPITAL
USE PROPER RISK MANAGEMENT
CONSULT FINANCIAL PROFESSIONALS
Synthetic Renko Early Flip AlertGives you the alert slightly before the Renko flip, but still based on real price.
Statistical Probability Entry & ExitWHAT THIS INDICATOR WILL DO
This indicator will:
✅ Identify market direction
✅ Analyze the last 2–5 candles statistically
✅ Trigger BUY / SELL signals when continuation probability is high
✅ Trigger EXIT signals when probability collapses
✅ Be fast, made for 1-minute NQ trading
✅ Avoid laggy indicators (no RSI, MACD spam)
CORE LOGIC (HOW PROBABILITY IS ESTIMATED)
We estimate probability using conditional continuation logic:
Bullish continuation is likely when:
Price is above EMA (trend bias)
Last candles show:
Higher closes
Strong bodies (not wicks)
Volume expands in direction of move
Momentum doesn’t stall (no large opposite candle)
Same logic inverted for shorts.
Previous Hourly candle2 previous hourly high and low candle and last H4 high and low candle for intra or scalp strategy
Sheldon HTF CandlesSee higher-timeframe candles directly on your current chart without changing timeframes. This indicator shows the open, high, low, and close of a higher timeframe while you trade on a lower timeframe.
Combo Detector (The Strat)Description:
The Combo Detector (The Strat) identifies sequences of bar types on a higher timeframe (HTF) according to a user-defined combo pattern. Bar types are classified as:
1 (Inside bar): High ≤ previous high and Low ≥ previous low
2 (Directional bar): Neither inside nor outside
3 (Outside bar): High > previous high and Low < previous low
The indicator matches the combo pattern from most recent bar backward and highlights occurrences with optional labels.
For combos ending in 2-2, the indicator can further classify the pattern as:
Reversal: First and third bars exceed the second bar in the same direction (highs or lows)
Continuation: The second bar’s high or low is between the extremes of the first and third bars
Inputs:
Detection Timeframe: Choose the higher timeframe to analyze (e.g., 60, 240, 4H, 12H)
Strat Combo: Define a pattern of bar types (e.g., 3-2-2, 322, 122). Hyphens are optional; labels always display hyphenated.
Include Forming Candle: If enabled, the currently forming bar is included in detection; otherwise only confirmed bars are used.
Show Labels: Toggle to display labels on chart (turn OFF for clean charts).
Pattern Option for 22: Choose "All", "Reversal", or "Continuation" for Strat combos ending in 2-2.
Usage Notes:
Intended as a research and pattern-detection tool; not a trading signal.
Labels and colors are customizable for visual reference.
An optional alert condition is provided for informational awareness only and is not intended as a trading signal.
The bar classification framework aligns with the widely known “The Strat” methodology popularized by Rob Smith; this indicator is an independent, unaffiliated research tool.
The Rumer's Box v2Credit goes to rzhanley for creating the original script.
I noticed in the comments section that users wanted more control of the colour on their charts.
You can customise the fill colour of the box as well as the upper/lower and mid line/
So hopefully this works well for you.
BUZARA// © Buzzara
// =================================
// PLEASE SUPPORT THE TEAM
// =================================
//
// Telegram: t.me
// =================================
//@version=5
VERSION = ' Buzzara2.0'
strategy('ALGOX V6_1_24', shorttitle = '🚀〄 Buzzara2.0 〄🚀'+ VERSION, overlay = true, explicit_plot_zorder = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, initial_capital = 1000, default_qty_value = 1, calc_on_every_tick = false, process_orders_on_close = true)
G_SCRIPT01 = '■ ' + 'SAIYAN OCC'
//#region ———— <↓↓↓ G_SCRIPT01 ↓↓↓> {
// === INPUTS ===
res = input.timeframe('15', 'TIMEFRAME', group ="NON REPAINT")
useRes = input(true, 'Use Alternate Signals')
intRes = input(10, 'Multiplier for Alernate Signals')
basisType = input.string('ALMA', 'MA Type: ', options= )
basisLen = input.int(50, 'MA Period', minval=1)
offsetSigma = input.int(5, 'Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(2, 'Offset for ALMA', minval=0, step=0.01)
scolor = input(false, 'Show coloured Bars to indicate Trend?')
delayOffset = input.int(0, 'Delay Open/Close MA', minval=0, step=1,
tooltip = 'Forces Non-Repainting')
tradeType = input.string('BOTH', 'What trades should be taken : ',
options = )
//=== /INPUTS ===
h = input(false, 'Signals for Heikin Ashi Candles')
//INDICATOR SETTINGS
swing_length = input.int(10, 'Swing High/Low Length', group = 'Settings', minval = 1, maxval = 50)
history_of_demand_to_keep = input.int(20, 'History To Keep', minval = 5, maxval = 50)
box_width = input.float(2.5, 'Supply/Demand Box Width', group = 'Settings', minval = 1, maxval = 10, step = 0.5)
//INDICATOR VISUAL SETTINGS
show_zigzag = input.bool(false, 'Show Zig Zag', group = 'Visual Settings', inline = '1')
show_price_action_labels = input.bool(false, 'Show Price Action Labels', group = 'Visual Settings', inline = '2')
supply_color = input.color(#00000000, 'Supply', group = 'Visual Settings', inline = '3')
supply_outline_color = input.color(#00000000, 'Outline', group = 'Visual Settings', inline = '3')
demand_color = input.color(#00000000, 'Demand', group = 'Visual Settings', inline = '4')
demand_outline_color = input.color(#00000000, 'Outline', group = 'Visual Settings', inline = '4')
bos_label_color = input.color(#00000000, 'BOS Label', group = 'Visual Settings', inline = '5')
poi_label_color = input.color(#00000000, 'POI Label', group = 'Visual Settings', inline = '7')
poi_border_color = input.color(#00000000, 'POI border', group = 'Visual Settings', inline = '7')
swing_type_color = input.color(#00000000, 'Price Action Label', group = 'Visual Settings', inline = '8')
zigzag_color = input.color(#00000000, 'Zig Zag', group = 'Visual Settings', inline = '9')
//END SETTINGS
// FUNCTION TO ADD NEW AND REMOVE LAST IN ARRAY
f_array_add_pop(array, new_value_to_add) =>
array.unshift(array, new_value_to_add)
array.pop(array)
// FUNCTION SWING H & L LABELS
f_sh_sl_labels(array, swing_type) =>
var string label_text = na
if swing_type == 1
if array.get(array, 0) >= array.get(array, 1)
label_text := 'HH'
else
label_text := 'LH'
label.new(
bar_index - swing_length,
array.get(array,0),
text = label_text,
style = label.style_label_down,
textcolor = swing_type_color,
color = swing_type_color,
size = size.tiny)
else if swing_type == -1
if array.get(array, 0) >= array.get(array, 1)
label_text := 'HL'
else
label_text := 'LL'
label.new(
bar_index - swing_length,
array.get(array,0),
text = label_text,
style = label.style_label_up,
textcolor = swing_type_color,
color = swing_type_color,
size = size.tiny)
// FUNCTION MAKE SURE SUPPLY ISNT OVERLAPPING
f_check_overlapping(new_poi, box_array, atrValue) =>
atr_threshold = atrValue * 2
okay_to_draw = true
for i = 0 to array.size(box_array) - 1
top = box.get_top(array.get(box_array, i))
bottom = box.get_bottom(array.get(box_array, i))
poi = (top + bottom) / 2
upper_boundary = poi + atr_threshold
lower_boundary = poi - atr_threshold
if new_poi >= lower_boundary and new_poi <= upper_boundary
okay_to_draw := false
break
else
okay_to_draw := true
okay_to_draw
// FUNCTION TO DRAW SUPPLY OR DEMAND ZONE
f_supply_demand(value_array, bn_array, box_array, label_array, box_type, atrValue) =>
atr_buffer = atrValue * (box_width / 10)
box_left = array.get(bn_array, 0)
box_right = bar_index
var float box_top = 0.00
var float box_bottom = 0.00
var float poi = 0.00
if box_type == 1
box_top := array.get(value_array, 0)
box_bottom := box_top - atr_buffer
poi := (box_top + box_bottom) / 2
else if box_type == -1
box_bottom := array.get(value_array, 0)
box_top := box_bottom + atr_buffer
poi := (box_top + box_bottom) / 2
okay_to_draw = f_check_overlapping(poi, box_array, atrValue)
// okay_to_draw = true
//delete oldest box, and then create a new box and add it to the array
if box_type == 1 and okay_to_draw
box.delete( array.get(box_array, array.size(box_array) - 1) )
f_array_add_pop(box_array, box.new( left = box_left, top = box_top, right = box_right, bottom = box_bottom, border_color = supply_outline_color,
bgcolor = supply_color, extend = extend.right, text = 'SUPPLY', text_halign = text.align_center, text_valign = text.align_center, text_color = poi_label_color, text_size = size.small, xloc = xloc.bar_index))
box.delete( array.get(label_array, array.size(label_array) - 1) )
f_array_add_pop(label_array, box.new( left = box_left, top = poi, right = box_right, bottom = poi, border_color = poi_border_color,
bgcolor = poi_border_color, extend = extend.right, text = 'POI', text_halign = text.align_left, text_valign = text.align_center, text_color = poi_label_color, text_size = size.small, xloc = xloc.bar_index))
else if box_type == -1 and okay_to_draw
box.delete( array.get(box_array, array.size(box_array) - 1) )
f_array_add_pop(box_array, box.new( left = box_left, top = box_top, right = box_right, bottom = box_bottom, border_color = demand_outline_color,
bgcolor = demand_color, extend = extend.right, text = 'DEMAND', text_halign = text.align_center, text_valign = text.align_center, text_color = poi_label_color, text_size = size.small, xloc = xloc.bar_index))
box.delete( array.get(label_array, array.size(label_array) - 1) )
f_array_add_pop(label_array, box.new( left = box_left, top = poi, right = box_right, bottom = poi, border_color = poi_border_color,
bgcolor = poi_border_color, extend = extend.right, text = 'POI', text_halign = text.align_left, text_valign = text.align_center, text_color = poi_label_color, text_size = size.small, xloc = xloc.bar_index))
// FUNCTION TO CHANGE SUPPLY/DEMAND TO A BOS IF BROKEN
f_sd_to_bos(box_array, bos_array, label_array, zone_type) =>
if zone_type == 1
for i = 0 to array.size(box_array) - 1
level_to_break = box.get_top(array.get(box_array,i))
// if ta.crossover(close, level_to_break)
if close >= level_to_break
copied_box = box.copy(array.get(box_array,i))
f_array_add_pop(bos_array, copied_box)
mid = (box.get_top(array.get(box_array,i)) + box.get_bottom(array.get(box_array,i))) / 2
box.set_top(array.get(bos_array,0), mid)
box.set_bottom(array.get(bos_array,0), mid)
box.set_extend( array.get(bos_array,0), extend.none)
box.set_right( array.get(bos_array,0), bar_index)
box.set_text( array.get(bos_array,0), 'BOS' )
box.set_text_color( array.get(bos_array,0), bos_label_color)
box.set_text_size( array.get(bos_array,0), size.small)
box.set_text_halign( array.get(bos_array,0), text.align_center)
box.set_text_valign( array.get(bos_array,0), text.align_center)
box.delete(array.get(box_array, i))
box.delete(array.get(label_array, i))
if zone_type == -1
for i = 0 to array.size(box_array) - 1
level_to_break = box.get_bottom(array.get(box_array,i))
// if ta.crossunder(close, level_to_break)
if close <= level_to_break
copied_box = box.copy(array.get(box_array,i))
f_array_add_pop(bos_array, copied_box)
mid = (box.get_top(array.get(box_array,i)) + box.get_bottom(array.get(box_array,i))) / 2
box.set_top(array.get(bos_array,0), mid)
box.set_bottom(array.get(bos_array,0), mid)
box.set_extend( array.get(bos_array,0), extend.none)
box.set_right( array.get(bos_array,0), bar_index)
box.set_text( array.get(bos_array,0), 'BOS' )
box.set_text_color( array.get(bos_array,0), bos_label_color)
box.set_text_size( array.get(bos_array,0), size.small)
box.set_text_halign( array.get(bos_array,0), text.align_center)
box.set_text_valign( array.get(bos_array,0), text.align_center)
box.delete(array.get(box_array, i))
box.delete(array.get(label_array, i))
// FUNCTION MANAGE CURRENT BOXES BY CHANGING ENDPOINT
f_extend_box_endpoint(box_array) =>
for i = 0 to array.size(box_array) - 1
box.set_right(array.get(box_array, i), bar_index + 100)
//
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') :
timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') :
timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') :
timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') :
'60'
src = h ? request.security(ticker.heikinashi(syminfo.tickerid),
timeframe.period, close, lookahead = barmerge.lookahead_off) : close
// CALCULATE ATR
atrValue = ta.atr(50)
// CALCULATE SWING HIGHS & SWING LOWS
swing_high = ta.pivothigh(high, swing_length, swing_length)
swing_low = ta.pivotlow(low, swing_length, swing_length)
// ARRAYS FOR SWING H/L & BN
var swing_high_values = array.new_float(5,0.00)
var swing_low_values = array.new_float(5,0.00)
var swing_high_bns = array.new_int(5,0)
var swing_low_bns = array.new_int(5,0)
// ARRAYS FOR SUPPLY / DEMAND
var current_supply_box = array.new_box(history_of_demand_to_keep, na)
var current_demand_box = array.new_box(history_of_demand_to_keep, na)
// ARRAYS FOR SUPPLY / DEMAND POI LABELS
var current_supply_poi = array.new_box(history_of_demand_to_keep, na)
var current_demand_poi = array.new_box(history_of_demand_to_keep, na)
// ARRAYS FOR BOS
var supply_bos = array.new_box(5, na)
var demand_bos = array.new_box(5, na)
//END CALCULATIONS
// NEW SWING HIGH
if not na(swing_high)
//MANAGE SWING HIGH VALUES
f_array_add_pop(swing_high_values, swing_high)
f_array_add_pop(swing_high_bns, bar_index )
if show_price_action_labels
f_sh_sl_labels(swing_high_values, 1)
f_supply_demand(swing_high_values, swing_high_bns, current_supply_box, current_supply_poi, 1, atrValue)
// NEW SWING LOW
else if not na(swing_low)
//MANAGE SWING LOW VALUES
f_array_add_pop(swing_low_values, swing_low)
f_array_add_pop(swing_low_bns, bar_index )
if show_price_action_labels
f_sh_sl_labels(swing_low_values, -1)
f_supply_demand(swing_low_values, swing_low_bns, current_demand_box, current_demand_poi, -1, atrValue)
f_sd_to_bos(current_supply_box, supply_bos, current_supply_poi, 1)
f_sd_to_bos(current_demand_box, demand_bos, current_demand_poi, -1)
f_extend_box_endpoint(current_supply_box)
f_extend_box_endpoint(current_demand_box)
channelBal = input.bool(false, "Channel Balance", group = "CHART")
lr_slope(_src, _len) =>
x = 0.0, y = 0.0, x2 = 0.0, xy = 0.0
for i = 0 to _len - 1
val = _src
per = i + 1
x += per
y += val
x2 += per * per
xy += val * per
_slp = (_len * xy - x * y) / (_len * x2 - x * x)
_avg = y / _len
_int = _avg - _slp * x / _len + _slp
lr_dev(_src, _len, _slp, _avg, _int) =>
upDev = 0.0, dnDev = 0.0
val = _int
for j = 0 to _len - 1
price = high - val
if price > upDev
upDev := price
price := val - low
if price > dnDev
dnDev := price
price := _src
val += _slp
//
= ta.kc(close, 80, 10.5)
= ta.kc(close, 80, 9.5)
= ta.kc(close, 80, 8)
= ta.kc(close, 80, 3)
barsL = 10
barsR = 10
pivotHigh = fixnan(ta.pivothigh(barsL, barsR) )
pivotLow = fixnan(ta.pivotlow(barsL, barsR) )
source = close, period = 150
= lr_slope(source, period)
= lr_dev(source, period, s, a, i)
y1 = low - (ta.atr(30) * 2), y1B = low - ta.atr(30)
y2 = high + (ta.atr(30) * 2), y2B = high + ta.atr(30)
x1 = bar_index - period + 1, _y1 = i + s * (period - 1), x2 = bar_index, _y2 = i
//Functions
//Line Style function
get_line_style(style) =>
out = switch style
'???' => line.style_solid
'----' => line.style_dashed
' ' => line.style_dotted
//Function to get order block coordinates
get_coordinates(condition, top, btm, ob_val)=>
var ob_top = array.new_float(0)
var ob_btm = array.new_float(0)
var ob_avg = array.new_float(0)
var ob_left = array.new_int(0)
float ob = na
//Append coordinates to arrays
if condition
avg = math.avg(top, btm)
array.unshift(ob_top, top)
array.unshift(ob_btm, btm)
array.unshift(ob_avg, avg)
ob := ob_val
//Function to remove mitigated order blocks from coordinate arrays
remove_mitigated(ob_top, ob_btm, ob_left, ob_avg, target, bull)=>
mitigated = false
target_array = bull ? ob_btm : ob_top
for element in target_array
idx = array.indexof(target_array, element)
if (bull ? target < element : target > element)
mitigated := true
array.remove(ob_top, idx)
array.remove(ob_btm, idx)
array.remove(ob_avg, idx)
array.remove(ob_left, idx)
mitigated
//Function to set order blocks
set_order_blocks(ob_top, ob_btm, ob_left, ob_avg, ext_last, bg_css, border_css, lvl_css)=>
var ob_box = array.new_box(0)
var ob_lvl = array.new_line(0)
//Global elements
var os = 0
var target_bull = 0.
var target_bear = 0.
// Create non-repainting security function
rp_security(_symbol, _res, _src) =>
request.security(_symbol, _res, _src )
htfHigh = rp_security(syminfo.tickerid, res, high)
htfLow = rp_security(syminfo.tickerid, res, low)
// Main Indicator
// Functions
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ta.ema(math.abs(x - x ), t)
smoothrng = ta.ema(avrng, wper) * m
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt ) ? x - r < nz(rngfilt ) ? nz(rngfilt ) : x - r : x + r > nz(rngfilt ) ? nz(rngfilt ) : x + r
percWidth(len, perc) => (ta.highest(len) - ta.lowest(len)) * perc / 100
securityNoRep(sym, res, src) => request.security(sym, res, src, barmerge.gaps_off, barmerge.lookahead_on)
swingPoints(prd) =>
pivHi = ta.pivothigh(prd, prd)
pivLo = ta.pivotlow (prd, prd)
last_pivHi = ta.valuewhen(pivHi, pivHi, 1)
last_pivLo = ta.valuewhen(pivLo, pivLo, 1)
hh = pivHi and pivHi > last_pivHi ? pivHi : na
lh = pivHi and pivHi < last_pivHi ? pivHi : na
hl = pivLo and pivLo > last_pivLo ? pivLo : na
ll = pivLo and pivLo < last_pivLo ? pivLo : na
f_chartTfInMinutes() =>
float _resInMinutes = timeframe.multiplier * (
timeframe.isseconds ? 1 :
timeframe.isminutes ? 1. :
timeframe.isdaily ? 60. * 24 :
timeframe.isweekly ? 60. * 24 * 7 :
timeframe.ismonthly ? 60. * 24 * 30.4375 : na)
f_kc(src, len, sensitivity) =>
basis = ta.sma(src, len)
span = ta.atr(len)
wavetrend(src, chlLen, avgLen) =>
esa = ta.ema(src, chlLen)
d = ta.ema(math.abs(src - esa), chlLen)
ci = (src - esa) / (0.015 * d)
wt1 = ta.ema(ci, avgLen)
wt2 = ta.sma(wt1, 3)
f_top_fractal(_src) => _src < _src and _src < _src and _src > _src and _src > _src
f_bot_fractal(_src) => _src > _src and _src > _src and _src < _src and _src < _src
top_fractal = f_top_fractal(src)
bot_fractal = f_bot_fractal(src)
f_fractalize (_src) => top_fractal ? 1 : bot_fractal ? -1 : 0
f_findDivs(src, topLimit, botLimit) =>
fractalTop = f_fractalize(src) > 0 and src >= topLimit ? src : na
fractalBot = f_fractalize(src) < 0 and src <= botLimit ? src : na
highPrev = ta.valuewhen(fractalTop, src , 0)
highPrice = ta.valuewhen(fractalTop, high , 0)
lowPrev = ta.valuewhen(fractalBot, src , 0)
lowPrice = ta.valuewhen(fractalBot, low , 0)
bearSignal = fractalTop and high > highPrice and src < highPrev
bullSignal = fractalBot and low < lowPrice and src > lowPrev
// Get user input
enableSR = input(false , "SR On/Off", group="SR")
colorSup = input(#00000000 , "Support Color", group="SR")
colorRes = input(#00000000 , "Resistance Color", group="SR")
strengthSR = input.int(2 , "S/R Strength", 1, group="SR")
lineStyle = input.string("Dotted", "Line Style", , group="SR")
lineWidth = input.int(2 , "S/R Line Width", 1, group="SR")
useZones = input(true , "Zones On/Off", group="SR")
useHLZones = input(true , "High Low Zones On/Off", group="SR")
zoneWidth = input.int(2 , "Zone Width %", 0,
tooltip = "it's calculated using % of the distance between highest/lowest in last 300 bars", group="SR")
expandSR = input(true , "Expand SR")
// Get components
rb = 10
prd = 284
ChannelW = 10
label_loc = 55
style = lineStyle == "Solid" ? line.style_solid :
lineStyle == "Dotted" ? line.style_dotted : line.style_dashed
ph = ta.pivothigh(rb, rb)
pl = ta.pivotlow (rb, rb)
sr_levels = array.new_float(21, na)
prdhighest = ta.highest(prd)
prdlowest = ta.lowest(prd)
cwidth = percWidth(prd, ChannelW)
zonePerc = percWidth(300, zoneWidth)
aas = array.new_bool(41, true)
u1 = 0.0, u1 := nz(u1 )
d1 = 0.0, d1 := nz(d1 )
highestph = 0.0, highestph := highestph
lowestpl = 0.0, lowestpl := lowestpl
var sr_levs = array.new_float(21, na)
label hlabel = na, label.delete(hlabel )
label llabel = na, label.delete(llabel )
var sr_lines = array.new_line(21, na)
var sr_linesH = array.new_line(21, na)
var sr_linesL = array.new_line(21, na)
var sr_linesF = array.new_linefill(21, na)
var sr_labels = array.new_label(21, na)
if (not na(ph) or not na(pl))
for x = 0 to array.size(sr_levels) - 1
array.set(sr_levels, x, na)
highestph := prdlowest
lowestpl := prdhighest
countpp = 0
for x = 0 to prd
if na(close )
break
if not na(ph ) or not na(pl )
highestph := math.max(highestph, nz(ph , prdlowest), nz(pl , prdlowest))
lowestpl := math.min(lowestpl, nz(ph , prdhighest), nz(pl , prdhighest))
countpp += 1
if countpp > 40
break
if array.get(aas, countpp)
upl = (not na(ph ) and (ph != 0) ? high : low ) + cwidth
dnl = (not na(ph ) and (ph != 0) ? high : low ) - cwidth
u1 := countpp == 1 ? upl : u1
d1 := countpp == 1 ? dnl : d1
tmp = array.new_bool(41, true)
cnt = 0
tpoint = 0
for xx = 0 to prd
if na(close )
break
if not na(ph ) or not na(pl )
chg = false
cnt += 1
if cnt > 40
break
if array.get(aas, cnt)
if not na(ph )
if high <= upl and high >= dnl
tpoint += 1
chg := true
if not na(pl )
if low <= upl and low >= dnl
tpoint += 1
chg := true
if chg and cnt < 41
array.set(tmp, cnt, false)
if tpoint >= strengthSR
for g = 0 to 40 by 1
if not array.get(tmp, g)
array.set(aas, g, false)
if (not na(ph ) and countpp < 21)
array.set(sr_levels, countpp, high )
if (not na(pl ) and countpp < 21)
array.set(sr_levels, countpp, low )
// Plot
var line highest_ = na, line.delete(highest_)
var line lowest_ = na, line.delete(lowest_)
var line highest_fill1 = na, line.delete(highest_fill1)
var line highest_fill2 = na, line.delete(highest_fill2)
var line lowest_fill1 = na, line.delete(lowest_fill1)
var line lowest_fill2 = na, line.delete(lowest_fill2)
hi_col = close >= highestph ? colorSup : colorRes
lo_col = close >= lowestpl ? colorSup : colorRes
if enableSR
highest_ := line.new(bar_index - 311, highestph, bar_index, highestph, xloc.bar_index, expandSR ? extend.both : extend.right, hi_col, style, lineWidth)
lowest_ := line.new(bar_index - 311, lowestpl , bar_index, lowestpl , xloc.bar_index, expandSR ? extend.both : extend.right, lo_col, style, lineWidth)
if useHLZones
highest_fill1 := line.new(bar_index - 311, highestph + zonePerc, bar_index, highestph + zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na)
highest_fill2 := line.new(bar_index - 311, highestph - zonePerc, bar_index, highestph - zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na)
lowest_fill1 := line.new(bar_index - 311, lowestpl + zonePerc , bar_index, lowestpl + zonePerc , xloc.bar_index, expandSR ? extend.both : extend.right, na)
lowest_fill2 := line.new(bar_index - 311, lowestpl - zonePerc , bar_index, lowestpl - zonePerc , xloc.bar_index, expandSR ? extend.both : extend.right, na)
linefill.new(highest_fill1, highest_fill2, hi_col)
linefill.new(lowest_fill1 , lowest_fill2 , lo_col)
if (not na(ph) or not na(pl))
for x = 0 to array.size(sr_lines) - 1
array.set(sr_levs, x, array.get(sr_levels, x))
for x = 0 to array.size(sr_lines) - 1
line.delete(array.get(sr_lines, x))
line.delete(array.get(sr_linesH, x))
line.delete(array.get(sr_linesL, x))
linefill.delete(array.get(sr_linesF, x))
if (not na(array.get(sr_levs, x)) and enableSR)
line_col = close >= array.get(sr_levs, x) ? colorSup : colorRes
array.set(sr_lines, x, line.new(bar_index - 355, array.get(sr_levs, x), bar_index, array.get(sr_levs, x), xloc.bar_index, expandSR ? extend.both : extend.right, line_col, style, lineWidth))
if useZones
array.set(sr_linesH, x, line.new(bar_index - 355, array.get(sr_levs, x) + zonePerc, bar_index, array.get(sr_levs, x) + zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na))
array.set(sr_linesL, x, line.new(bar_index - 355, array.get(sr_levs, x) - zonePerc, bar_index, array.get(sr_levs, x) - zonePerc, xloc.bar_index, expandSR ? extend.both : extend.right, na))
array.set(sr_linesF, x, linefill.new(array.get(sr_linesH, x), array.get(sr_linesL, x), line_col))
for x = 0 to array.size(sr_labels) - 1
label.delete(array.get(sr_labels, x))
if (not na(array.get(sr_levs, x)) and enableSR)
lab_loc = close >= array.get(sr_levs, x) ? label.style_label_up : label.style_label_down
lab_col = close >= array.get(sr_levs, x) ? colorSup : colorRes
array.set(sr_labels, x, label.new(bar_index + label_loc, array.get(sr_levs, x), str.tostring(math.round_to_mintick(array.get(sr_levs, x))), color=lab_col , textcolor=#000000, style=lab_loc))
hlabel := enableSR ? label.new(bar_index + label_loc + math.round(math.sign(label_loc)) * 20, highestph, "High Level : " + str.tostring(highestph), color=hi_col, textcolor=#000000, style=label.style_label_down) : na
llabel := enableSR ? label.new(bar_index + label_loc + math.round(math.sign(label_loc)) * 20, lowestpl , "Low Level : " + str.tostring(lowestpl) , color=lo_col, textcolor=#000000, style=label.style_label_up ) : na
// Get components
rsi = ta.rsi(close, 28)
//rsiOb = rsi > 78 and rsi > ta.ema(rsi, 10)
//rsiOs = rsi < 27 and rsi < ta.ema(rsi, 10)
rsiOb = rsi > 65 and rsi > ta.ema(rsi, 10)
rsiOs = rsi < 35 and rsi < ta.ema(rsi, 10)
dHigh = securityNoRep(syminfo.tickerid, "D", high )
dLow = securityNoRep(syminfo.tickerid, "D", low )
dClose = securityNoRep(syminfo.tickerid, "D", close )
ema = ta.ema(close, 144)
emaBull = close > ema
equal_tf(res) => str.tonumber(res) == f_chartTfInMinutes() and not timeframe.isseconds
higher_tf(res) => str.tonumber(res) > f_chartTfInMinutes() or timeframe.isseconds
too_small_tf(res) => (timeframe.isweekly and res=="1") or (timeframe.ismonthly and str.tonumber(res) < 10)
securityNoRep1(sym, res, src) =>
bool bull_ = na
bull_ := equal_tf(res) ? src : bull_
bull_ := higher_tf(res) ? request.security(sym, res, src, barmerge.gaps_off, barmerge.lookahead_on) : bull_
bull_array = request.security_lower_tf(syminfo.tickerid, higher_tf(res) ? str.tostring(f_chartTfInMinutes()) + (timeframe.isseconds ? "S" : "") : too_small_tf(res) ? (timeframe.isweekly ? "3" : "10") : res, src)
if array.size(bull_array) > 1 and not equal_tf(res) and not higher_tf(res)
bull_ := array.pop(bull_array)
array.clear(bull_array)
bull_
// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
v1 = ta.sma(src, len) // Simple
v2 = ta.ema(src, len) // Exponential
v3 = 2 * v2 - ta.ema(v2, len) // Double Exponential
v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len) // Triple Exponential
v5 = ta.wma(src, len) // Weighted
v6 = ta.vwma(src, len) // Volume Weighted
v7 = 0.0
sma_1 = ta.sma(src, len) // Smoothed
v7 := na(v7 ) ? sma_1 : (v7 * (len - 1) + src) / len
v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len))) // Hull
v9 = ta.linreg(src, len, offSig) // Least Squares
v10 = ta.alma(src, len, offALMA, offSig) // Arnaud Legoux
v11 = ta.sma(v1, len) // Triangular (extreme smooth)
// SuperSmoother filter
// 2013 John F. Ehlers
a1 = math.exp(-1.414 * 3.14159 / len)
b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3
v12 = 0.0
v12 := c1 * (src + nz(src )) / 2 + c2 * nz(v12 ) + c3 * nz(v12 )
type == 'EMA' ? v2 : type == 'DEMA' ? v3 : type == 'TEMA' ? v4 : type == 'WMA' ? v5 : type == 'VWMA' ? v6 : type == 'SMMA' ? v7 : type == 'HullMA' ? v8 : type == 'LSMA' ? v9 : type == 'ALMA' ? v10 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1
// security wrapper for repeat calls
reso(exp, use, res) =>
security_1 = request.security(syminfo.tickerid, res, exp, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
use ? security_1 : exp
// === /BASE FUNCTIONS ===
// === SERIES SETUP ===
closeSeries = variant(basisType, close , basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open , basisLen, offsetSigma, offsetALMA)
// === /SERIES ===
// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
lxTrigger = false
sxTrigger = false
leTrigger = ta.crossover (closeSeriesAlt, openSeriesAlt)
seTrigger = ta.crossunder(closeSeriesAlt, openSeriesAlt)
G_RISK = '■ ' + 'Risk Management'
//#region ———— <↓↓↓ G_RISK ↓↓↓> {
// ———————————
//Tooltip
T_LVL = '(%) Exit Level'
T_QTY = '(%) Adjust trade exit volume'
T_MSG = 'Paste JSON message for your bot'
//Webhook Message
O_LEMSG = 'Long Entry'
O_LXMSGSL = 'Long SL'
O_LXMSGTP1 = 'Long TP1'
O_LXMSGTP2 = 'Long TP2'
O_LXMSGTP3 = 'Long TP3'
O_LXMSG = 'Long Exit'
O_SEMSG = 'Short Entry'
O_SXMSGSL = 'Short SL'
O_SXMSGA = 'Short TP1'
O_SXMSGB = 'Short TP2'
O_SXMSGC = 'Short TP3'
O_SXMSGX = 'Short Exit'
// ——————————— | | | Line length guide |
i_lxLvlTP1 = input.float (0.2, 'Level TP1' , group = G_RISK,
tooltip = T_LVL)
i_lxQtyTP1 = input.float (80.0, 'Qty TP1' , group = G_RISK,
tooltip = T_QTY)
i_lxLvlTP2 = input.float (0.5, 'Level TP2' , group = G_RISK,
tooltip = T_LVL)
i_lxQtyTP2 = input.float (10.0, 'Qty TP2' , group = G_RISK,
tooltip = T_QTY)
i_lxLvlTP3 = input.float (7.0, 'Level TP3' , group = G_RISK,
tooltip = T_LVL)
i_lxQtyTP3 = input.float (2, 'Qty TP3' , group = G_RISK,
tooltip = T_QTY)
i_lxLvlSL = input.float (0.5, 'Stop Loss' , group = G_RISK,
tooltip = T_LVL)
i_sxLvlTP1 = i_lxLvlTP1
i_sxQtyTP1 = i_lxQtyTP1
i_sxLvlTP2 = i_lxLvlTP2
i_sxQtyTP2 = i_lxQtyTP2
i_sxLvlTP3 = i_lxLvlTP3
i_sxQtyTP3 = i_lxQtyTP3
i_sxLvlSL = i_lxLvlSL
G_MSG = '■ ' + 'Webhook Message'
i_leMsg = input.string (O_LEMSG ,'Long Entry' , group = G_MSG, tooltip = T_MSG)
i_lxMsgSL = input.string (O_LXMSGSL ,'Long SL' , group = G_MSG, tooltip = T_MSG)
i_lxMsgTP1 = input.string (O_LXMSGTP1,'Long TP1' , group = G_MSG, tooltip = T_MSG)
i_lxMsgTP2 = input.string (O_LXMSGTP2,'Long TP2' , group = G_MSG, tooltip = T_MSG)
i_lxMsgTP3 = input.string (O_LXMSGTP3,'Long TP3' , group = G_MSG, tooltip = T_MSG)
i_lxMsg = input.string (O_LXMSG ,'Long Exit' , group = G_MSG, tooltip = T_MSG)
i_seMsg = input.string (O_SEMSG ,'Short Entry' , group = G_MSG, tooltip = T_MSG)
i_sxMsgSL = input.string (O_SXMSGSL ,'Short SL' , group = G_MSG, tooltip = T_MSG)
i_sxMsgTP1 = input.string (O_SXMSGA ,'Short TP1' , group = G_MSG, tooltip = T_MSG)
i_sxMsgTP2 = input.string (O_SXMSGB ,'Short TP2' , group = G_MSG, tooltip = T_MSG)
i_sxMsgTP3 = input.string (O_SXMSGC ,'Short TP3' , group = G_MSG, tooltip = T_MSG)
i_sxMsg = input.string (O_SXMSGX ,'Short Exit' , group = G_MSG, tooltip = T_MSG)
i_src = close
G_DISPLAY = 'Display'
//
i_alertOn = input.bool (true, 'Alert Labels On/Off' , group = G_DISPLAY)
i_barColOn = input.bool (true, 'Bar Color On/Off' , group = G_DISPLAY)
// ———————————
// @function Calculate the Take Profit line, and the crossover or crossunder
f_tp(_condition, _conditionValue, _leTrigger, _seTrigger, _src, _lxLvlTP, _sxLvlTP)=>
var float _tpLine = 0.0
_topLvl = _src + (_src * (_lxLvlTP / 100))
_botLvl = _src - (_src * (_sxLvlTP / 100))
_tpLine := _condition != _conditionValue and _leTrigger ? _topLvl :
_condition != -_conditionValue and _seTrigger ? _botLvl :
nz(_tpLine )
// @function Similar to "ta.crossover" or "ta.crossunder"
f_cross(_scr1, _scr2, _over)=>
_cross = _over ? _scr1 > _scr2 and _scr1 < _scr2 :
_scr1 < _scr2 and _scr1 > _scr2
// ———————————
//
var float condition = 0.0
var float slLine = 0.0
var float entryLine = 0.0
//
entryLine := leTrigger and condition <= 0.0 ? close :
seTrigger and condition >= 0.0 ? close : nz(entryLine )
//
slTopLvl = i_src + (i_src * (i_lxLvlSL / 100))
slBotLvl = i_src - (i_src * (i_sxLvlSL / 100))
slLine := condition <= 0.0 and leTrigger ? slBotLvl :
condition >= 0.0 and seTrigger ? slTopLvl : nz(slLine )
slLong = f_cross(low, slLine, false)
slShort = f_cross(high, slLine, true )
//
= f_tp(condition, 1.2,leTrigger, seTrigger, i_src, i_lxLvlTP3, i_sxLvlTP3)
= f_tp(condition, 1.1,leTrigger, seTrigger, i_src, i_lxLvlTP2, i_sxLvlTP2)
= f_tp(condition, 1.0,leTrigger, seTrigger, i_src, i_lxLvlTP1, i_sxLvlTP1)
tp3Long = f_cross(high, tp3Line, true )
tp3Short = f_cross(low, tp3Line, false)
tp2Long = f_cross(high, tp2Line, true )
tp2Short = f_cross(low, tp2Line, false)
tp1Long = f_cross(high, tp1Line, true )
tp1Short = f_cross(low, tp1Line, false)
switch
leTrigger and condition <= 0.0 => condition := 1.0
seTrigger and condition >= 0.0 => condition := -1.0
tp3Long and condition == 1.2 => condition := 1.3
tp3Short and condition == -1.2 => condition := -1.3
tp2Long and condition == 1.1 => condition := 1.2
tp2Short and condition == -1.1 => condition := -1.2
tp1Long and condition == 1.0 => condition := 1.1
tp1Short and condition == -1.0 => condition := -1.1
slLong and condition >= 1.0 => condition := 0.0
slShort and condition <= -1.0 => condition := 0.0
lxTrigger and condition >= 1.0 => condition := 0.0
sxTrigger and condition <= -1.0 => condition := 0.0
longE = leTrigger and condition <= 0.0 and condition == 1.0
shortE = seTrigger and condition >= 0.0 and condition == -1.0
longX = lxTrigger and condition >= 1.0 and condition == 0.0
shortX = sxTrigger and condition <= -1.0 and condition == 0.0
longSL = slLong and condition >= 1.0 and condition == 0.0
shortSL = slShort and condition <= -1.0 and condition == 0.0
longTP3 = tp3Long and condition == 1.2 and condition == 1.3
shortTP3 = tp3Short and condition == -1.2 and condition == -1.3
longTP2 = tp2Long and condition == 1.1 and condition == 1.2
shortTP2 = tp2Short and condition == -1.1 and condition == -1.2
longTP1 = tp1Long and condition == 1.0 and condition == 1.1
shortTP1 = tp1Short and condition == -1.0 and condition == -1.1
// ——————————— {
//
if strategy.position_size <= 0 and longE and barstate.isconfirmed
strategy.entry(
'Long',
strategy.long,
alert_message = i_leMsg,
comment = 'LE')
if strategy.position_size > 0 and condition == 1.0
strategy.exit(
id = 'LXTP1',
from_entry = 'Long',
qty_percent = i_lxQtyTP1,
limit = tp1Line,
stop = slLine,
comment_profit = 'LXTP1',
comment_loss = 'SL',
alert_profit = i_lxMsgTP1,
alert_loss = i_lxMsgSL)
if strategy.position_size > 0 and condition == 1.1
strategy.exit(
id = 'LXTP2',
from_entry = 'Long',
qty_percent = i_lxQtyTP2,
limit = tp2Line,
stop = slLine,
comment_profit = 'LXTP2',
comment_loss = 'SL',
alert_profit = i_lxMsgTP2,
alert_loss = i_lxMsgSL)
if strategy.position_size > 0 and condition == 1.2
strategy.exit(
id = 'LXTP3',
from_entry = 'Long',
qty_percent = i_lxQtyTP3,
limit = tp3Line,
stop = slLine,
comment_profit = 'LXTP3',
comment_loss = 'SL',
alert_profit = i_lxMsgTP3,
alert_loss = i_lxMsgSL)
if longX
strategy.close(
'Long',
alert_message = i_lxMsg,
comment = 'LX')
//
if strategy.position_size >= 0 and shortE and barstate.isconfirmed
strategy.entry(
'Short',
strategy.short,
alert_message = i_leMsg,
comment = 'SE')
if strategy.position_size < 0 and condition == -1.0
strategy.exit(
id = 'SXTP1',
from_entry = 'Short',
qty_percent = i_sxQtyTP1,
limit = tp1Line,
stop = slLine,
comment_profit = 'SXTP1',
comment_loss = 'SL',
alert_profit = i_sxMsgTP1,
alert_loss = i_sxMsgSL)
if strategy.position_size < 0 and condition == -1.1
strategy.exit(
id = 'SXTP2',
from_entry = 'Short',
qty_percent = i_sxQtyTP2,
limit = tp2Line,
stop = slLine,
comment_profit = 'SXTP2',
comment_loss = 'SL',
alert_profit = i_sxMsgTP2,
alert_loss = i_sxMsgSL)
if strategy.position_size < 0 and condition == -1.2
strategy.exit(
id = 'SXTP3',
from_entry = 'Short',
qty_percent = i_sxQtyTP3,
limit = tp3Line,
stop = slLine,
comment_profit = 'SXTP3',
comment_loss = 'SL',
alert_profit = i_sxMsgTP3,
alert_loss = i_sxMsgSL)
if shortX
strategy.close(
'Short',
alert_message = i_sxMsg,
comment = 'SX')
// ———————————
c_tp = leTrigger or seTrigger ? na :
condition == 0.0 ? na : color.green
c_entry = leTrigger or seTrigger ? na :
condition == 0.0 ? na : color.blue
c_sl = leTrigger or seTrigger ? na :
condition == 0.0 ? na : color.red
p_tp1Line = plot (
condition == 1.0 or
condition == -1.0 ? tp1Line : na,
title = "TP Line 1",
color = c_tp,
linewidth = 1,
style = plot.style_linebr)
p_tp2Line = plot (
condition == 1.0 or
condition == -1.0 or
condition == 1.1 or
condition == -1.1 ? tp2Line : na,
title = "TP Line 2",
color = c_tp,
linewidth = 1,
style = plot.style_linebr)
p_tp3Line = plot (
condition == 1.0 or
condition == -1.0 or
condition == 1.1 or
condition == -1.1 or
condition == 1.2 or
condition == -1.2 ? tp3Line : na,
title = "TP Line 3",
color = c_tp,
linewidth = 1,
style = plot.style_linebr)
p_entryLine = plot (
condition >= 1.0 or
condition <= -1.0 ? entryLine : na,
title = "Entry Line",
color = c_entry,
linewidth = 1,
style = plot.style_linebr)
p_slLine = plot (
condition == 1.0 or
condition == -1.0 or
condition == 1.1 or
condition == -1.1 or
condition == 1.2 or
condition == -1.2 ? slLine : na,
title = "SL Line",
color = c_sl,
linewidth = 1,
style = plot.style_linebr)
fill(
p_tp3Line, p_entryLine,
color = leTrigger or seTrigger ? na :color.new(color.green, 90))
fill(
p_entryLine, p_slLine,
color = leTrigger or seTrigger ? na :color.new(color.red, 90))
//
plotshape(
i_alertOn and longE,
title = 'Long',
text = 'Long',
textcolor = color.white,
color = color.green,
style = shape.labelup,
size = size.tiny,
location = location.belowbar)
plotshape(
i_alertOn and shortE,
title = 'Short',
text = 'Short',
textcolor = color.white,
color = color.red,
style = shape.labeldown,
size = size.tiny,
location = location.abovebar)
plotshape(
i_alertOn and (longX or shortX) ? close : na,
title = 'Close',
text = 'Close',
textcolor = color.white,
color = color.gray,
style = shape.labelup,
size = size.tiny,
location = location.absolute)
l_tp = i_alertOn and (longTP1 or shortTP1) ? close : na
plotshape(
l_tp,
title = "TP1 Cross",
text = "TP1",
textcolor = color.white,
color = color.olive,
style = shape.labelup,
size = size.tiny,
location = location.absolute)
plotshape(
i_alertOn and (longTP2 or shortTP2) ? close : na,
title = "TP2 Cross",
text = "TP2",
textcolor = color.white,
color = color.olive,
style = shape.labelup,
size = size.tiny,
location = location.absolute)
plotshape(
i_alertOn and (longTP3 or shortTP3) ? close : na,
title = "TP3 Cross",
text = "TP3",
textcolor = color.white,
color = color.olive,
style = shape.labelup,
size = size.tiny,
location = location.absolute)
plotshape(
i_alertOn and (longSL or shortSL) ? close : na,
title = "SL Cross",
text = "SL",
textcolor = color.white,
color = color.maroon,
style = shape.labelup,
size = size.tiny,
location = location.absolute)
//
plot(
na,
title = "─── ───",
editable = false,
display = display.data_window)
plot(
condition,
title = "condition",
editable = false,
display = display.data_window)
plot(
strategy.position_size * 100,
title = ".position_size",
editable = false,
display = display.data_window)
//#endregion }
// ——————————— <↑↑↑ G_RISK ↑↑↑>
//#region ———— <↓↓↓ G_SCRIPT02 ↓↓↓> {
// @function Queues a new element in an array and de-queues its first element.
f_qDq(_array, _val) =>
array.push(_array, _val)
_return = array.shift(_array)
_return
var line a_slLine = array.new_line(1)
var line a_entryLine = array.new_line(1)
var line a_tp3Line = array.new_line(1)
var line a_tp2Line = array.new_line(1)
var line a_tp1Line = array.new_line(1)
var label a_slLabel = array.new_label(1)
var label a_tp3label = array.new_label(1)
var label a_tp2label = array.new_label(1)
var label a_tp1label = array.new_label(1)
var label a_entryLabel = array.new_label(1)
newEntry = longE or shortE
entryIndex = 1
entryIndex := newEntry ? bar_index : nz(entryIndex )
lasTrade = bar_index >= entryIndex
l_right = 10
line.delete(
f_qDq(a_slLine,
line.new(
entryIndex,
slLine,
last_bar_index + l_right,
slLine,
style = line.style_solid,
color = c_sl)))
line.delete(
f_qDq(a_entryLine,
line.new(
entryIndex,
entryLine,
last_bar_index + l_right,
entryLine,
style = line.style_solid,
color = color.blue)))
line.delete(
f_qDq(a_tp3Line,
line.new(
entryIndex,
tp3Line,
last_bar_index + l_right,
tp3Line,
style = line.style_solid,
color = c_tp)))
line.delete(
f_qDq(a_tp2Line,
line.new(
entryIndex,
tp2Line,
last_bar_index + l_right,
tp2Line,
style = line.style_solid,
color = c_tp)))
line.delete(
f_qDq(a_tp1Line,
line.new(
entryIndex,
tp1Line,
last_bar_index + l_right,
tp1Line,
style = line.style_solid,
color = c_tp)))
label.delete(
f_qDq(a_slLabel,
label.new(
last_bar_index + l_right,
slLine,
'SL: ' + str.tostring(slLine, '##.###'),
style = label.style_label_left,
textcolor = color.white,
color = c_sl)))
label.delete(
f_qDq(a_entryLabel,
label.new(
last_bar_index + l_right,
entryLine,
'Entry: ' + str.tostring(entryLine, '##.###'),
style = label.style_label_left,
textcolor = color.white,
color = color.blue)))
label.delete(
f_qDq(a_tp3label,
label.new(
last_bar_index + l_right,
tp3Line,
'TP3: ' + str.tostring(tp3Line, '##.###'),
style = label.style_label_left,
textcolor = color.white,
color = c_tp)))
label.delete(
f_qDq(a_tp2label,
label.new(
last_bar_index + l_right,
tp2Line,
'TP2: ' + str.tostring(tp2Line, '##.###'),
style = label.style_label_left,
textcolor = color.white,
color = c_tp)))
label.delete(
f_qDq(a_tp1label,
label.new(
last_bar_index + l_right,
tp1Line,
'TP1: ' + str.tostring(tp1Line, '##.###'),
style = label.style_label_left,
textcolor = color.white,
color = c_tp)))
// ———————————
//
if longE or shortE or longX or shortX
alert(message = 'Any Alert', freq = alert.freq_once_per_bar_close)
if longE
alert(message = 'Long Entry', freq = alert.freq_once_per_bar_close)
if shortE
alert(message = 'Short Entry', freq = alert.freq_once_per_bar_close)
if longX
alert(message = 'Long Exit', freq = alert.freq_once_per_bar_close)
if shortX
alert(message = 'Short Exit', freq = alert.freq_once_per_bar_close)
//#endregion }
// ——————————— <↑↑↑ G_SCRIPT03 ↑↑↑>
FVG by EVEV FVG is a clean and beginner-friendly Fair Value Gap indicator designed to help traders understand and visualize institutional price imbalances in a simple and intuitive way. It automatically detects high-quality bullish and bearish fair value gaps using a non-repainting three-candle structure, ensuring that all zones are confirmed and reliable in real-time trading.
The indicator focuses on clarity over complexity. Active fair value gaps are extended forward to act as potential areas of interest, while filled gaps are automatically frozen at the exact point where price completes them, preserving the historical context without cluttering the chart. Fully mitigated zones are visually muted and do not display labels, keeping attention on what is currently relevant.
To maintain a clean chart, distant gaps fade into outline-only mode, allowing traders to focus on the most actionable areas near price while still retaining broader market structure awareness. Sensitivity is controlled through a single preset selector, making the indicator suitable for beginners without requiring manual optimization or advanced configuration.
EV FVG Lite works on any market and timeframe and is designed to integrate naturally with price action, market structure, and liquidity-based trading approaches. It is intended as an educational and practical tool that helps traders build a solid understanding of fair value gaps without overwhelming them with settings or noise.
OHLC an der Kerze: Hover-Tooltip + Live-Anzeige (v6)Moin Moin.
This Pine-script is helping to show the OHLC-data as tooltipps, effectively eliminationg the need to wander of/avert with the eyes' point of view to the left upper corner.
this helps to avoid a flush of the ultrashort-term-memory due to the aversion of the point of view, which neurologically interrupts the thought-processes. (You ma be noticing this effect if Your ultrashort-term-memory has been flushed for taking too long for an in-my-head caluclation like 1/7=0,14255... oh crap I lost it... again effect)
_Tschüß,
__Michael.
BOS + CHoCH by EVThis indicator is designed to identify market structure shifts through Break of Structure (BOS) and Change of Character (CHoCH) using confirmed swing highs and lows. It provides a clear and objective way to read price structure by distinguishing between continuation moves and genuine directional changes.
BOS events represent structural continuation, occurring when price breaks a previous swing level in the direction of the prevailing bias. CHoCH events highlight potential trend reversals, triggering when price breaks a key level against the current structural bias. This distinction allows traders to better contextualize momentum, trend strength, and possible regime changes.
All calculations are based on confirmed pivots, ensuring the indicator is fully non-repainting and reliable in live market conditions. Break confirmation can be evaluated using candle closes or wicks, depending on user preference, and optional level lines can be drawn to visualize the exact structure point that was broken.
Support Resistance by EVThis indicator is designed to provide a clean and practical market structure view by combining automatic support and resistance detection with dynamic trend analysis. It identifies key support and resistance levels using confirmed swing highs and lows, intelligently merging nearby levels based on market volatility and filtering out outdated or irrelevant zones to keep the chart clear and focused on what matters now.
In addition to horizontal support and resistance, the indicator offers two complementary ways to read trend context. It can display diagonal trendlines built from the most recent swing highs and swing lows to visualize directional structure, or horizontal trend rays based on the latest pivots to highlight dynamic support and resistance acting as trend references. The user can switch between these modes depending on trading style and market conditions.
All visual elements are anchored by time rather than bar index to ensure stability when zooming or scrolling the chart. The indicator is fully non-repainting, relies only on confirmed pivots, and is suitable for any market or timeframe. It is intended as an open-source, professional-grade tool that helps traders quickly identify structure, trend bias, and key reaction levels without clutter or visual noise.
SMA Reversal Sequential MTFSMA Reversal Sequential MTF (Multi-Timeframe)OverviewThe SMA Reversal Sequential MTF is a professional-grade price action tool designed to detect qualitative trend shifts and structural breakouts across multiple timeframes simultaneously. Unlike standard crossover indicators, this script analyzes the "curvature" of the Simple Moving Average (SMA) to identify when the market's average momentum has genuinely rotated.1. Core Logic: SMA Slope CurvatureThe script detects a trend reversal when the SMA (20-period by default) changes its trajectory from a "V-shape" (bottoming out) or an "Inverted V-shape" (topping out).The Reversal Algorithm:Bullish Reversal: Occurs when the SMA value at a specific historical offset is higher than the intermediate offset, but the intermediate offset is lower than the most recent value.Bearish Reversal: Occurs when the SMA value at a specific historical offset is lower than the intermediate offset, but the intermediate offset is higher than the most recent value.By using an OFFSET parameter, the script filters out minor price noise, ensuring that only significant rotations in the moving average are labeled.2. Structural Breakout Detection (MSB)Once a reversal is confirmed, the script automatically identifies the Market Structure of that specific timeframe by looking back at the highest high or lowest low within a defined period (LOOKBK).How Breakouts Work:Level Anchoring: When a reversal is detected, the script "locks in" the highest/lowest price of that swing.Confirmation: A "BREAK" signal and a horizontal line are generated only when a candle closes beyond this structural level.Visual Persistence: The break-line is extended to the right, providing a clear visual reference for support-turned-resistance (or vice versa).3. Advanced Multi-Timeframe (MTF) IntegrationMonitor up to 6 timeframes (5M, 15M, 1H, 4H, 1D, 1W) on a single chart.Auto-Filtering (hideLowerTF): To maintain chart clarity, the script can automatically hide timeframe data that is lower than your current chart (e.g., if you are on a 1H chart, 5M and 15M labels are hidden).Non-Repainting: Built using barmerge.gaps_on and confirmed candle logic, ensuring that historical signals remain accurate and do not disappear or move after the fact.4. Dual Preset ModesSwitch between two specialized trading styles with a single click in the settings:PresetParameters (SMA / Offset / Lookback)Ideal ForStandard (Default)20 / 6 / 20Trend following, swing trading, and major pullbacks.Short-Term5 / 4 / 7Scalping, fast day trading, and sensitive structure shifts.5. Visual Interface FeaturesTimeframe Labels: Clearly indicates which timeframe has rotated (e.g., "1H", "15M").Dynamic BREAK Labels: Labels follow the price action with a customizable right-side offset, ensuring they never overlap with the candles.Memory Management: Uses Pine Script Arrays to manage objects, ensuring the script runs smoothly without hitting the platform's drawing limits.6. How to Trade with This ScriptConfluence Trading: Wait for a "BREAK" on a higher timeframe (e.g., 4H) and then look for a matching "REVERSAL" on a lower timeframe (e.g., 15M) to refine your entry.Trailing Stops: Use the structural breakout lines as logical levels for stop-loss placement or profit-taking targets.Technical SpecificationsLanguage: Pine Script v5Overlay: YesAlerts: Compatible with standard alert functions.
このインジケーターは、**「トレンドの質的な転換」と「構造的な重要水準の打破(ブレイク)」**を、マルチタイムフレーム(MTF)で同時に監視する総合的なプライスアクションツールです。1. コア・コンセプト:SMA Reversal通常の移動平均線クロスオーバーとは異なり、このスクリプトは**SMA(単純移動平均線)の「曲率(カーブ)」**に着目します。判定アルゴリズムSMAが「下落から上昇」または「上昇から下落」へ変化する瞬間を、特定のオフセット(間隔)を用いて検知します。上昇転換(V字回復): NYSE:SMA > SMA $ かつ NYSE:SMA < SMA $下落転換(逆V字): NYSE:SMA < SMA $ かつ NYSE:SMA > SMA $これにより、価格の一時的なノイズに惑わされず、移動平均線という「相場の平均的な意思」が明確に方向を変えたタイミングを捉えます。2. 構造的ブレイクアウトの検知転換が確認された際、スクリプトはその時点から遡って過去LOOKBK期間内の最高値・最安値を特定します。これが「構造的なレジスタンス・サポート」として機能します。ブレイクの定義水準の固定: 転換が発生した瞬間の高値・安値を、その時間足の「重要ライン」として記憶します。確定足での判定: 終値がそのラインを明確に上抜いた(または下抜いた)時、チャート上に "BREAK" ラベルと水平線を表示します。3. マルチタイムフレーム(MTF)機能このインジケーターの最大の強みは、1つのチャート上に最大6つの時間足(5M, 15M, 1H, 4H, 1D, 1W)の状態を重ねて表示できる点です。自動フィルタリング: hideLowerTF 設定により、5分足チャートを見ている時は全時間足を表示し、日足チャートを見ている時は日足と週足のみを表示するといった、視認性の自動最適化が行われます。非リペイント処理: barmerge.gaps_on を使用した request.security 処理により、過去の検証データにおいて「未来の情報を参照して描画する」リペイント現象を防いでいます。4. 2つのプリセット設定ユーザーは相場の性質に合わせて、設定画面のチェックボックス一つで計算ロジックを切り替えられます。設定名SMA期間 / オフセット / 参照期間特徴標準 (規定値)20 / 6 / 20中長期的なトレンド転換を捉える。押し目買い・戻り売りに最適。短期 (Short)5 / 4 / 7スキャルピングや短期デイトレ用。微細な構造の変化を素早く察知。5. 視覚的インターフェースの説明転換ラベル (5M, 1H等): その時間足でSMAの転換が確定したポイント。常に「最新の1つ」のみが表示されるため、チャートが煩雑になりません。BREAKラベル & ライン: 構造が破壊された価格水準。ラインは右側に延長され、現在の価格との距離感がひと目で分かります。右オフセット: ブレイクラベルを現在価格より右側に配置することで、ローソク足とラベルが重なるのを防ぎます。6. 推奨される活用法上位足のBREAKを待つ: 例えば、1時間足で "1H BREAK" が出ている方向にのみ、5分足や15分足でエントリーを仕掛ける「環境認識」のツールとして非常に強力です。損切りの目安: 表示されたブレイクラインの反対側に価格が戻ってきた場合、構造が否定されたと判断し、迅速な撤退の根拠にできます。技術仕様(開発者向け)言語: Pine Script v5描画制限: 常に最新のオブジェクト(ライン・ラベル)のみを保持するように配列(Array)でメモリ管理を行っており、TradingViewの描画制限エラーを回避しています。計算コスト: request.security を効率的に呼び出しているため、複数の時間足を表示しても動作は軽快です。
14SMA13 20/30/50 First Order AppearanceIn white, it's a buy signal, and in orange, it's a sell signal.
The signal is given when the simple moving averages 20+30+50 cross.
To confirm entry, wait for a volume candle that breaks through the 50-period simple moving average of volume, whether for buying or selling.
You set your selling targets according to your own analysis method.
Volume Bubbles by EV Volume Bubbles visualizes high-activity candles using chart bubbles placed at an estimated intrabar origin point derived from lower timeframe data. When enabled, the script uses lower timeframe OHLC to approximate directional volume delta and selects an origin candle inside the parent bar using one of several methods. A relative-volume filter based on the parent bar can be used to reduce noise, and bubble size can be mapped to relative volume to highlight unusually active bars. If intrabar data is unavailable, the script can fall back to placing bubbles on the parent bar to keep behavior consistent. For best stability, the “Only confirmed bars” option is recommended.
Live Candle Range Position SizerThis script displays a fixed execution HUD on the chart that continuously measures the current candle range (high–low) and automatically calculates position size based on a fixed Risk Unit (RU).
Sanjay SwingsSanjay Swings is Pullback Tool, Which is useful for Swings Marking.
This indicator Can helpful in ICT concept for Trade Confirmation






















