Volume Stress Level V2Volume Stress Level V2, is designed to provide a nuanced view of "RECENT" trading volume by identifying different levels of volume stress relative to a smoothed average.
Key Features:
Dynamic Volume Stress Calculation: The indicator calculates volume stress based on a Simple Moving Average (SMA) of volume and its standard deviation. The length of the SMA and the multiplier for the standard deviation are fully customizable, allowing you to adapt the indicator to different market conditions and trading styles.
Visual Volume Zones: The script visually categorizes volume into distinct zones:
Low Volume Zone: Represented by a white background, indicating periods of lower-than-average trading activity.
Normal Volume Zone: Highlighted in blue, signifying typical trading volume.
Medium Volume Zone: Displayed in yellow, denoting a moderate increase in volume.
High Volume Zone: Shown in orange, indicating significant volume spikes.
Spike Volume Zone: Marked in black, representing extreme volume events.
Customizable Background: You have the option to enable or disable the colored background fill for these volume zones, providing flexibility in how you visualize the data.
Bar Coloring: The volume bars themselves are color-coded according to the identified volume stress level, offering an immediate visual cue on your chart.
Adjustable Parameters:
VSL Length: Controls the lookback period for the SMA and standard deviation calculations.
Multiplier: Adjusts the sensitivity of the standard deviation bands, thereby influencing the width of the volume zones.
How to Use:
This indicator can be valuable for identifying potential shifts in market sentiment, confirming breakouts, or spotting periods of accumulation and distribution. By observing the transitions between volume zones, traders can gain insights into the conviction behind price movements.
Göstergeler ve stratejiler
8MA Compass — HTF map + GC/DC cues8MA Compass provides a clean trend context by combining strict 4-of-4 confluence (Current TF vs Higher TF) with SMA200 repainting on Golden/Death Cross (GC/DC).
What it shows
4-of-4 background (context): compares EMA10, EMA20, SMA50, SMA200 on the Current TF against the same four MAs on the Higher TF (HTF).
All 4 above their HTF values → bullish background.
All 4 below their HTF values → bearish background.
SMA200 color on GC/DC (Current TF):
Last signal is DC and price below SMA200 → SMA200 turns red.
Price above SMA200 but the last signal is DC (no GC afterward) → SMA200 stays base color.
Last signal is GC and price above SMA200 → SMA200 turns green #089981.
Why “8MA” ? The 4-of-4 logic uses 8 moving averages in total: 4 on the Current TF and 4 on the HTF (EMA10/20 and SMA50/200 on both frames). HTF EMAs are used in calculations but are not plotted by default—hence the name 8MA Compass.
Auto HTF mapping
Current 1H → HTF 4H
Current 4H → HTF 1D
Current 1D → HTF 1W
All other timeframes: HTF defaults to Current TF (4-of-4 will typically be neutral).
Manual mode: choose any HTF. If Manual HTF equals Current TF, HTF SMAs are hidden to avoid overlap.
Settings
1. Display
Show CURRENT TF — plot EMA10/20, SMA50/200 on Current TF.
Show HARD TF — plot SMA50/200 on HTF (hidden if HTF == Current TF).
HTF mode — Auto / Manual, with Hard TF (Manual) selector.
2. Filter
Show base background (4-of-4) — enable/disable confluence shading.
Epsilon (in ticks) — small tolerance in Cur vs HTF comparisons to reduce flicker.
3. Golden/Death
Color SMA200 on GC/DC (Cur TF) — repaint SMA200 on GC/DC per rules above (enabled by default).
Alerts
GC/DC (Current TF, SMA50/200): Golden Cross / Death Cross (on bar close).
EMA10/20 (Current TF): “Bull regime ON” / “Bear regime ON” on crossovers.
Optional HTF GC/DC alerts (SMA50/200 on chosen HTF).
Visual details
HTF SMA50/200 are drawn first; Current TF lines are drawn on top for clarity.
SMA200 (Current TF) is drawn last (and slightly thicker) to remain readable.
HTF EMAs are used in 4-of-4 logic but not plotted by design.
Usage
1. Use the 4-of-4 background as inter-timeframe momentum context.
2. Use SMA200 color to gauge long-term regime confirmation:
Prefer longs when last GC and price holds above SMA200 (#089981 line).
Avoid longs when last DC and price is below SMA200 (red line).
Disclaimer : For educational purposes only. Not financial advice. Trading involves risk.
Slingshot Trend 🎯⏰How to Use the Slingshot Trend Indicator 🎯⏰ (65-Minute Timeframe)
The **Slingshot Trend Indicator** helps spot bullish trend entries using price action and EMAs, optimized for your favorite 65-minute timeframe. Here’s a simple guide:
⚙️ Setup
- Add the indicator to your chart.
- Set the 89 EMA timeframe to 65 minutes (or keep the default 195 minutes for higher-timeframe confirmation).
🔑 Key Features
- **Slingshot EMA**: Short-term EMA (default length: 4) to detect breakouts.
- **EMA Stack**: Confirms bullish trend when 21 EMA > 34 EMA > 55 EMA > 89 EMA.
- **Price Above 89 EMA**: Ensures price is above the 65-minute 89 EMA.
- **ATR Targets**: Uses 14-period ATR for dynamic price targets.
- **Visuals**:
- Blue EMA line (optional).
- Teal bars for bullish conditions (optional).
- Orange labels for entry signals (optional).
- Yellow entry line and green dashed target line (optional).
- Price labels for entry/target (optional).
- ATR dashboard showing average ATR multiple, win %, and time-to-target (optional).
📘 How to Trade
- **Entry**: Go long when an orange label appears (price closes above Slingshot EMA after three closes below, with bullish EMAs on the 65-minute chart).
- **Target**: Aim for the green dashed line (entry price + ATR-based target).
- **Exit**: Close when bullish conditions end (EMAs not stacked or price below 65-minute 89 EMA).
- **Stop Loss**: Not included; consider 2× ATR below entry or a support level.
- **Alerts**: Enable “First Trending SlingShot” for entry notifications.
✨ Customize
Adjust in settings:
- 89 EMA timeframe (e.g., set to 65 minutes).
- Bar color (default: teal).
- Toggle EMA line, bar coloring, entry labels, lines, price labels, and dashboard.
- Slingshot EMA length (default: 4).
💡 Tips
- Backtest on the 65-minute timeframe for your asset.
- Combine with support/resistance or other indicators.
- Use proper risk management.
APC Companion – Volume Accumulation/DistributionIndicator Description (TradingView – Open Source)
APC Companion – Volume Accumulation/Distribution Filter
(Designed to work standalone or together with the APC Compass)
What this indicator does
The APC Companion measures whether markets are under Accumulation (buying pressure) or Distribution (selling pressure) by combining:
Chaikin A/D slope – volume flow into price moves
On-Balance Volume momentum – confirms trend strength
VWAP spread – price vs. fair value by traded volume
CLV × Volume Z-Score – detects intrabar absorption / selling pressure
VWMA vs. EMA100 – confirms whether weighted volume supports price action
The result is a single Acc/Dist Score (−5 … +5) and a Coherence % showing how many signals agree.
How to interpret
Score ≥ +3 & Coherence ≥ 60% → Accumulation (green) → market supported by buyers
Score ≤ −3 & Coherence ≥ 60% → Distribution (red) → market pressured by sellers
Anything in between = neutral (no strong bias)
Using with APC Compass
Long trades: Only take Compass Long signals when Companion shows Accumulation.
Short trades: Only take Compass Short signals when Companion shows Distribution.
Neutral Companion: Skip or reduce size if there is no confirmation.
This filter greatly reduces false signals and improves trade quality.
Best practice
Swing trading: 4H / 1D charts, lenZ 40–80, lenSlope 14–20
Intraday: 5m–30m charts, lenZ 20–30, lenSlope 10–14
Position sizing: Increase with higher Coherence %, reduce when below 60%
Exits: Reduce or close if Score drops back to neutral or flips opposite
Disclaimer
This script is published open source for educational purposes only.
It is not financial advice. Test thoroughly before using in live trading.
ICT 00:00, 08:30, 09:30 & 13:30 Opens (NY) — Prior-Day HistoryICT 00:00, 08:30, 09:30 & 13:30 Opens (NY)
This is a derivative of ALPHAICTRADER’s open-source script, republished under the MPL-2.0 with clear attribution and documented changes. It plots four New-York–anchored intraday reference levels—0000, 0830, 0930, 1330—as short, right-padded stubs with clean side labels. Use these time anchors (ICT-style midnight + key US windows) to frame bias, volatility pockets, and intraday trade locations.
What’s original in this version (changes)
Right-padded stubs instead of chart-wide rays — each level ends N bars past the latest candle (configurable).
Side labels at the line tip — text-only labels (0000, 0830, 0930, 1330) that sit at the right end of each stub and update every bar.
Optional prior-day history — show Today only or Today + Prior Day; older lines/labels auto-pruned.
Per-anchor controls — Display, Style, Color, Width, and Show Label for each time.
What it plots (and why)
0000 (NY Midnight): daily session anchor for bias/liquidity context.
0830 (NY): macro data window (CPI/NFP/claims) where volatility often concentrates.
0930 (NY): US cash equity market open; opening-drive structure/acceptance tests.
1330 (NY): early-afternoon anchor for continuation vs. fade.
How it works (under the hood)
Session detection: time("1", session, "America/New_York"); first bar flagged via not na(ts) and na(ts ).
Anchor price: open of that first bar per session/day.
Rendering: lines drawn with xloc=bar_index from start bar to bar_index + Right Pad; x2 updates every bar (no extend.right).
Labels: placed at line.get_x2(line) + Label Pad, soft color variant; updated per bar to stay on the tip.
History: arrays keep either today only or today + yesterday and delete anything older immediately.
How to use
Add to any intraday chart (futures/FX/indices). Anchors are always NY-time; TradingView handles DST.
Inputs
00:00 / 08:30 / 09:30 / 13:30 (NY): Display, Line Style, Color, Width, Show Label
Right Edge: Right Pad (bars) · Label Pad (bars)
History: Show Prior Day (History) — off = today only; on = today + yesterday
Suggested pads: Right Pad 2–5 bars; Label Pad 0–2.
These are context anchors, not signals. Combine with your execution model (market structure, liquidity, FVG/OBs, etc.).
Attribution & License (MPL-2.0)
Original work: “ICT NEW YORK MIDNIGHT OPEN AND 8.30 AM OPEN” by ALPHAICTRADER (MPL-2.0).
This derivative: modifications listed above; source published and kept under MPL-2.0 per license terms.
If you distribute a modified version of this Pine file, you must keep MPL-2.0, retain the copyright/licensing header, publish your modified source, and document your changes.
Notes: Pine v5. Minimalist (no day dividers). Educational tool; not financial advice.
Copyright: © ALPHAICTRADER 2022 · © Funk 2025
License: MPL-2.0
Médias Móveis 5 - SMA, EMA, Pivot Boss📈 5 Moving Averages – SMA, EMA, Pivot Boss
This indicator displays five fully customizable moving averages, allowing you to choose between:
SMA (Simple Moving Average)
EMA (Exponential Moving Average)
Pivot Boss S (SMA of Pivot Point)
Pivot Boss E (EMA of Pivot Point)
Each moving average can have its own type and length, making this tool suitable for scalping, trend-following, and multi-timeframe analysis.
Zero LineHere's a professional description for publishing your Zero Line indicator on TradingView:
Title:
Zero Line - Reference Level Indicator
Description:
Overview
A clean and simple indicator that displays a prominent horizontal line at the zero level on your chart. Essential for traders who need a clear visual reference point for price action, momentum oscillators, or custom strategies.
Key Features
Clear Visual Reference - Instantly identify when price or indicators cross the zero threshold
Customizable Appearance - Adjust color, line style, and thickness to match your chart setup
Non-Intrusive - Lightweight indicator that won't clutter your workspace
Universal Compatibility - Works with all timeframes and market types
Use Cases
Price Action Trading - Monitor when price moves above/below key baseline levels
Spread Trading - Track positive/negative spreads between assets
P&L Visualization - See profit/loss transitions at a glance
Mean Reversion - Identify deviation from equilibrium points
Multi-Indicator Analysis - Align multiple oscillators with a common reference
How to Use
Add the indicator to any chart
Customize the line appearance in settings if desired
Use as a visual anchor point for your analysis
Ideal For
Scalpers and day traders needing quick visual references
Swing traders monitoring momentum shifts
Algorithmic traders backtesting strategies
Anyone requiring a fixed reference point on their charts
ORB with 50% lineThis script plots the high and low of any custom session and extends these levels until the daily close. By default, it will not display on timeframes higher than the length of the defined opening session.
From the settings, you can adjust both the opening range period and the maximum timeframe on which the levels are displayed.
In addition, the script also plots a median line between the ORB High and ORB Low, providing an extra reference level for traders.
GK Momentum Crossover with Risk MgmtThe **GK Momentum Crossover with Risk Mgmt** strategy is a trend-following Pine Script v5 strategy for TradingView, trading 1 unit. It uses:
- **Entry**: Buys when the 9-period EMA crosses above the 21-period EMA (bullish) with volume above its 20-period SMA; sells when the 9-period EMA crosses below (bearish).
- **Risk Management**:
- Fixed stop loss (e.g., $10 below/above entry for long/short).
- Trailing stop activates after a $10 profit, trailing by $5.
- Optional fixed take profit (e.g., $20) is commented out.
- **Goal**: Captures trends while limiting drawdown via absolute price-based stops, suitable for stocks, forex, or crypto. Adjustable inputs for SL, TP, and trailing thresholds.
LONG Daily Candle (MACD)LONG Daily Candle (MACD)
A long-entry strategy based on the daily bullish candle (SC) with filters by EMA200, EMA20, volume, and MACD (modes: Spring / Spring+Summer / No filter).
Risk management via ATR: customizable SL and TP, position sizing based on account capital and risk percentage.
Includes an optional breakeven shift once 1RR is reached.
LONG Daily Candle (MACD)
Стратегия входа в лонг по дневной бычьей свече (SC) с фильтрами по EMA200, EMA20, объёму и MACD (режимы: весна / весна+лето / без фильтра).
Управление риском через ATR: настраиваемые SL и TP, расчёт размера позиции от капитала и процента риска.
Есть опция перевода позиции в безубыток при достижении 1RR.
Rally Base Drop Signals [LuxAlgo]The Rally Base Drop indicator is built around the Supply and Demand (SND) concept known as "Rally, Base & Drop" Candles. These candle types are commonly used in this trading approach to identify price structure.
This indicator highlights bars by labeling them as "Rally," "Drop," or "Base" candles. It also identifies specific sequence patterns formed by these candles.
🔶 USAGE
The Rally, Base, Drop candlestick approach is a straightforward method for identifying price action structure.
Candles are categorized into three types, which are then analyzed to understand market structure and Supply/Demand levels.
Rally: Two or more consecutive bullish candles.
Drop: Two or more consecutive bearish candles.
Base: A single bullish or bearish candle that breaks the previous trend.
🔹 Rally & Drop Candles
These candles show clear directional momentum and signal whether demand or supply is dominating. They are helpful when identifying trends, as they highlight strong price movement.
🔹 Base Candles
In most SND strategies, "Base" can have several interpretations.
Typically, base candles represent short periods of consolidation that test the trend before continuation. They can also be found at turning points (tops or bottoms).
For this indicator, a base candle is simply one that does not follow the direction of nearby candles or is where a Drop and Rally meet. Multiple base candles often reflect indecision in the market, suggesting a temporary balance between buyers and sellers.
🔹 Reversal Sequences
Rally-Base-Drop (RBD)
Drop-Base-Rally (DBR)
In Supply and Demand analysis, these sequences are considered reversals. They mark zones where buyer and seller activity has shifted, which can lead to future price reactions. These areas are known as "Supply or Demand Zones" and are often revisited by price, making them useful for trade setups.
🔹 Continuation Sequences
Rally-Base-Rally (RBR)
Drop-Base-Drop (DBD)
Continuation sequences show a brief pause in the trend, followed by further movement in the same direction. In SND terms, they represent zones where orders accumulate before a continuation move. These are typically used to join ongoing trends, as they indicate sustained interest from buyers or sellers.
🔶 DETAILS
🔹 Color Modes
The script includes three color modes. "No Color" is self-explanatory, while the other two options relate to how candles are detected.
A Rally or Drop requires at least two candles to be successfully identified. As a result, detection occurs on the second candle. However, the full Rally or Drop includes both candles.
Two coloring methods are available:
Full Color: Once a Rally or Drop is detected (on the second bar), both candles are colored, starting from the first. This reflects the full pattern.
Color on Detection: Only the second candle (where detection occurs) is colored. This avoids changing past bars and may be useful for live analysis.
🔶 SETTINGS
Sequences: Select which sequences to display on the chart.
Bar Color Logic: Choose the preferred bar coloring method.
TPO Levels [VAH/POC/VAL]Poor H/L, Single Prints& Naked POCs
🎯 Key Features
📊 Multi-Timeframe Market Profile
Daily, Weekly, and Monthly session analysis
Automatic session detection and profile calculation
Historical session preservation up to 20 sessions
📈 Value Area Analysis
Value Area High (VAH) - Upper boundary of 70% activity
Point of Control (POC) - Most traded price level
Value Area Low (VAL) - Lower boundary of 70% activity
Visual Value Area box with customizable transparency
🎯 Naked Points of Control (nPOC)
Daily nPOC tracking with orange lines
Weekly nPOC (WnPOC) visible on all timeframes
Monthly nPOC (MnPOC) visible on all timeframes
Smart POC combining for nearby levels (reduces clutter)
Auto-removal when price touches naked POC
🟪 Single Print Detection
Daily single prints - Purple boxes
Weekly single prints - Blue boxes (persist on daily charts)
Monthly single prints - Teal boxes (persist on daily charts)
Automatic removal upon price touch
Extend right for active monitoring
⚠️ Poor Structure Identification
Poor Highs - Weak resistance (2+ TPOs at high)
Poor Lows - Weak support (2+ TPOs at low)
Pink dashed lines for easy identification
Historical poor structure tracking
Auto-removal when price breaks structure
🔥 Market Generated Information
Buying/Selling tail detection (disabled by default)
Previous session VAH/POC/VAL levels
Clean professional appearance
Minimal chart clutter design
*Default settings were set for BINANCE:BTCUSDT.P
My kind regards to those who sell this indicator for a monthly subscription 😊
✅ Multi-TF RSI Buy/Sell Signal + Debug PanelMulti timeframe RSI indicator
Simple indicator to have up to 4 different RSI set on different time frames to trigger alerts
London & NY Sessions (CET + Offset)Clearly visualize the London and New York trading sessions on your chart with automatic timezone adjustment. This indicator is designed for traders who want to track key market sessions and identify periods of high liquidity and volatility.
🎯 Key Features
Visual Session Marking: Highlights London (9:00-12:00 CET) and New York (15:30-19:30 CET) sessions with colored boxes
Timezone Offset: Adjust display times from CET baseline to any timezone (-12 to +12 hours)
Customizable Display:
Toggle each session on/off independently
Adjust session colors and transparency
Optional session labels with size control
Subtle background highlighting during active sessions
Flexible Session Times: Modify start/end times for each session (hours and minutes)
Alert System: Built-in alerts for session starts and ends
Clean Design: Non-intrusive overlay that works on all timeframes
📝 Use Cases
Session Trading: Trade during high-volume periods when major markets are open
Overlap Trading: Identify when sessions overlap for maximum volatility
Time Zone Management: Perfect for traders in different time zones who need to track CET-based sessions
Scalping & Day Trading: Know exactly when institutional traders are most active
News Trading: Align your trading with economic releases from London and New York
⚙️ How to Use
Add to chart: Apply indicator to any instrument and timeframe
Set your timezone: Use the "Hour Offset from CET" to match your local time
Example: -1 for UK (GMT), -6 for US EST, +7 for Bangkok
Customize appearance: Adjust colors, transparency, and labels to your preference
Set alerts: Configure alerts for session starts/ends to never miss key market hours
🔧 Default Settings
London: 9:00-12:00 CET (European morning session)
New York: 15:30-19:30 CET (US afternoon, capturing EU/US overlap)
Colors: Blue for London, Orange for New York
Display: Both sessions enabled with labels
💡 Pro Tips
The New York session timing captures the crucial EU/US overlap period
Sessions automatically adjust for daylight saving time when using CET
Works on all markets: Forex, Indices, Commodities, Crypto
Combine with volume indicators for confirmation of session activity
trade buy-sell sushantThis indicator generates Buy and Sell signals based on a simple two-bar pattern comparison. It checks whether the last two candles have the same directional bias (bullish or bearish) and then confirms momentum by comparing the current and previous closes.
Multi-Timeframe EMA Analysis SuiteThis comprehensive multi-timeframe moving average analysis tool provides systematic trend evaluation across five configurable timeframes with advanced kernel regression envelope technology for dynamic boundary detection.
Core Innovation - Multi-Timeframe EMA System:
The primary functionality displays multiple exponential moving averages (9, 21, 30, 50, 100, 200), weighted moving average (14), and simple moving average (200) across customizable timeframes including 1H, 4H, Daily, Weekly, and Monthly periods. Each timeframe and moving average can be individually enabled or disabled based on analysis requirements.
Advanced Features:
Intelligent label positioning algorithms with automatic overlap prevention across multiple timeframes
Dynamic offset calculation maintaining readability when price levels converge
Comprehensive data table displaying all moving average values with color-coded formatting
Real-time market status evaluation categorizing conditions from "Strong Bullish" to "Strong Bearish"
Performance-optimized rendering with adjustable detail controls
Technical Implementation:
Built using Pine Script v6 with optimized multi-timeframe security requests through tuple-based data retrieval
The system implements efficient memory management and dynamic table systems for responsive chart performance during complex multi-timeframe calculations
Original developments include intelligent label spacing algorithms, dynamic offset management across timeframes, and comprehensive market status evaluation logic using moving average alignment principles
Enhanced Envelope System:
Incorporates and significantly extends the kernel regression envelope concept originally developed by LuxAlgo in their Nadaraya-Watson Envelope indicator. The mathematical foundation uses Gaussian weighting functions with substantial implementation improvements:
Complete redesign using optimized polyline rendering system for superior performance
Addition of center line calculation and visualization not present in the original
Performance optimization controls with adjustable detail levels
Enhanced label management with real-time value displays
Seamless integration with multi-timeframe analysis capabilities
Configuration Options:
Complete customization including timeframe selection, moving average lengths, envelope parameters, label positioning, table sizing, and visual styling. Users can create personalized analysis setups tailored to specific trading timeframes and analytical preferences.
Practical Applications:
Suitable for trend confirmation across multiple timeframes, identification of dynamic support and resistance levels, multi-timeframe market structure analysis, and systematic market direction evaluation
The combination of traditional moving averages with adaptive envelope boundaries provides both classical technical analysis and modern algorithmic boundary detection
Usage Instructions:
Enable desired timeframes and moving averages based on your analysis period
The envelope provides dynamic support/resistance levels while moving averages indicate directional bias. Use repainting mode for current analysis or non-repainting mode for consistent historical signals. Adjust performance settings based on system requirements and analysis detail needs
Educational Purpose:
This indicator is designed for educational and analytical purposes. Users should conduct thorough testing and validation before incorporating this tool into trading decisions.
huzaifa iqbal pakistanthis is custum only for mazaq //@version=6
strategy("UT Bot Long Only Strategy", overlay=true, pyramiding=0, initial_capital=10000, currency=currency.USD)
// Parameters for ATR-based trailing stop (UT Bot logic)
var int atrLength = 10 // ATR period length
var float atrMult = 5.0 // ATR multiplier for trailing stop
// Calculate ATR and the ATR-based stop distance (nLoss)
atrValue = ta.atr(atrLength)
nLoss = atrMult * atrValue
// ATR Trailing Stop logic (UT Bot)
// Using persistent variable 'trailingStop' to maintain state across bars
var float trailingStop = na
if na(trailingStop )
// Initialize trailing stop on first bar
trailingStop := close - nLoss
else if (close > trailingStop and close > trailingStop )
// Price is above trailing stop and was above it in previous bar -> uptrend continues
trailingStop := math.max(trailingStop , close - nLoss)
else if (close < trailingStop and close < trailingStop )
// Price is below trailing stop and was below it in previous bar -> downtrend continues
trailingStop := math.min(trailingStop , close + nLoss)
else if (close > trailingStop )
// Price crossed from below to above the trailing stop -> trend flips up (new long setup)
trailingStop := close - nLoss
else
// Price crossed from above to below the trailing stop -> trend flips down
trailingStop := close + nLoss
// Long entry signal: when price crosses above the trailing stop from below
bool longSignal = (close < trailingStop and close > trailingStop )
// Enter long position on UT Bot buy signal (price crossing above trailing stop)
if (longSignal)
strategy.entry("Long", strategy.long, comment="UT Bot Buy Signal")
// Exit conditions: take-profit at +10% and stop-loss at -0.10% from entry price
// We hold until TP or SL is hit; no early exit on UT Bot sell signals
if (strategy.position_size > 0)
// Calculate profit target and stop loss based on entry price
float entryPrice = strategy.position_avg_price
float takeProfit = entryPrice * 1.10 // +//@version=6
strategy("UT Bot Long Only Strategy", overlay=true, pyramiding=0, initial_capital=10000, currency=currency.USD)
// Parameters for ATR-based trailing stop (UT Bot logic)
var int atrLength = 10 // ATR period length
var float atrMult = 5.0 // ATR multiplier for trailing stop
// Calculate ATR and the ATR-based stop distance (nLoss)
atrValue = ta.atr(atrLength)
nLoss = atrMult * atrValue
// ATR Trailing Stop logic (UT Bot)
// Using persistent variable 'trailingStop' to maintain state across bars
var float trailingStop = na
if na(trailingStop )
// Initialize trailing stop on first bar
trailingStop := close - nLoss
else if (close > trailingStop and close > trailingStop )
// Price is above trailing stop and was above it in previous bar -> uptrend continues
trailingStop := math.max(trailingStop , close - nLoss)
else if (close < trailingStop and close < trailingStop )
// Price is below trailing stop and was below it in previous bar -> downtrend continues
trailingStop := math.min(trailingStop , close + nLoss)
else if (close > trailingStop )
// Price crossed from below to above the trailing stop -> trend flips up (new long setup)
trailingStop := close - nLoss
else
// Price crossed from above to below the trailing stop -> trend flips down
trailingStop := close + nLoss
// Long entry signal: when price crosses above the trailing stop from below
bool longSignal = (close < trailingStop and close > trailingStop )
// Enter long position on UT Bot buy signal (price crossing above trailing stop)
if (longSignal)
strategy.entry("Long", strategy.long, comment="UT Bot Buy Signal")
// Exit conditions: take-profit at +10% and stop-loss at -0.10% from entry price
// We hold until TP or SL is hit; no early exit on UT Bot sell signals
if (strategy.position_size > 0)
// Calculate profit target and stop loss based on entry price
float entryPrice = strategy.position_avg_price
//@version=6
strategy("UT Bot Long Only Strategy", overlay=true, pyramiding=0, initial_capital=10000, currency=currency.USD)
// Parameters for ATR-based trailing stop (UT Bot logic)
var int atrLength = 10 // ATR period length
var float atrMult = 5.0 // ATR multiplier for trailing stop
// Calculate ATR and the ATR-based stop distance (nLoss)
atrValue = ta.atr(atrLength)
nLoss = atrMult * atrValue
// ATR Trailing Stop logic (UT Bot)
// Using persistent variable 'trailingStop' to maintain state across bars
var float trailingStop = na
if na(trailingStop )
// Initialize trailing stop on first bar
trailingStop := close - nLoss
else if (close > trailingStop and close > trailingStop )
// Price is above trailing stop and was above it in previous bar -> uptrend continues
trailingStop := math.max(trailingStop , close - nLoss)
else if (close < trailingStop and close < trailingStop )
// Price is below trailing stop and was below it in previous bar -> downtrend continues
trailingStop := math.min(trailingStop , close + nLoss)
else if (close > trailingStop )
// Price crossed from below to above the trailing stop -> trend flips up (new long setup)
trailingStop := close - nLoss
else
// Price crossed from above to below the trailing stop -> trend flips down
trailingStop := close + nLoss
// Long entry signal: when price crosses above the trailing stop from below
bool longSignal = (close < trailingStop and close > trailingStop )
// Enter long position on UT Bot buy signal (price crossing above trailing stop)
if (longSignal)
strategy.entry("Long", strategy.long, comment="UT Bot Buy Signal")
// Exit conditions: take-profit at +10% and stop-loss at -0.10% from entry price
// We hold until TP or SL is hit; no early exit on UT Bot sell signals
if (strategy.position_size > 0)
// Calculate profit target and stop loss based on entry price
float entryPrice = strategy.position_avg_price
float takeProfit = entryPrice * 1.10 // +10%
float stopLoss = entryPrice * 0.999 // -0.10%
strategy.exit("ExitLong", "Long", limit=takeProfit, stop=stopLoss)
// Plot the ATR-based trailing stop for visualization (green when trend is up, red when down)
plot(trailingStop, "Trailing Stop", color = close >= trailingStop ? color.lime : color.red, style=plot.style_line)
float stopLoss = entryPrice * 0.999 // -0.10%
strategy.exit("ExitLong", "Long", limit=takeProfit, stop=stopLoss)
// Plot the ATR-based trailing stop for visualization (green when trend is up, red when down)
plot(trailingStop, "Trailing Stop", color = close >= trailingStop ? color.lime : color.red, style=plot.style_line)
10%
float stopLoss = entryPrice * 0.999 // -0.10%
strategy.exit("ExitLong", "Long", limit=takeProfit, stop=stopLoss)
// Plot the ATR-based trailing stop for visualization (green when trend is up, red when down)
plot(trailingStop, "Trailing Stop", color = close >= trailingStop ? color.lime : color.red, style=plot.style_line)
Binary Options Time/Price Entry Helper SushantBinary options indicator with engulfing patterns, rejection wicks, and 5-min time anchors.
Premium version with clean defaults - all features disabled by default for minimal chart clutter. Enable only what you need.
Features:
• Bullish/Bearish engulfing signals
• Rejection wick detection
• 5-minute time markers
• Fully customizable
MACD Momentum Shift MACD momentum shift (alert system). I have designed this indicator as an early alert system for momentum shifts. The indicator will fire on the second consecutive histogram bar with decreasing bearish momentum (light pink bars). My thought process is that it should provide traders with an earlier alert than a typical (MACD line crossing Signal line) alert available on Trading View. However, this is not a buy indicator! It's an early alert system. My trading technique is heavily based on where the 9/20/50/100/200 EMAs are compared to one another, on the hourly timeframe and the daily tiemframe. I plan to combine this alert system with technical analysis to make better trades. Cheers.
James
Hunt+FVG+AlertA gift to my best friend Sina creator of Solar.
This indicator is designed to mark previous day high and low and to give alert when these lines are hunted and bullish or bearish FVGs are created.
Fractal Model [Free+] (T-Trades)Fractal Model - Higher Timeframe Analysis Tool
Advanced higher timeframe candle visualization with T-spot identification, sweep detection, and multi-timeframe price action analysis.
Introduction:
The Fractal Model is a Pine Script indicator that provides advanced higher timeframe (HTF) candle visualization and analysis. It identifies key price action patterns including T-spots, sweep signals, and imbalance zones to help traders understand market structure across multiple timeframes.
Description:
The Fractal Model analyzes price action by creating higher timeframe candles on your current chart, allowing you to see HTF structure without switching timeframes. It identifies specific price action patterns that often precede significant moves, including T-spot formations, sweep confirmations, and fair value gaps.
The indicator uses logarithmic midpoint calculations and pivot detection algorithms to identify high-probability entry and exit points. It automatically detects appropriate higher timeframes based on your current chart timeframe and provides real-time analysis of price action patterns.
Key Features:
Higher Timeframe Candle Visualization: Automatically creates higher timeframe candles on your current chart, allowing you to see HTF structure without switching timeframes. Supports up to 6 different HTF levels with automatic timeframe detection.
T-Spot Identification: Identifies T-spot formations using logarithmic midpoint calculations. T-spots mark areas where price is likely to form wicks based on specific price action patterns including sweep conditions and close position analysis.
Sweep Detection: Detects when price sweeps previous highs or lows but closes on the opposite side, creating potential reversal zones. Includes both high sweeps and low sweeps with visual confirmation lines.
Fair Value Gap (FVG) Detection: Identifies gaps between candle ranges where price didn't trade, creating potential support/resistance zones. Uses three-candle pattern analysis to detect imbalance areas.
Volume Imbalance Detection: Identifies areas where price action shows volume imbalance between consecutive candles, indicating potential continuation or reversal zones.
T-Spot Sweep Confirmation: Advanced confirmation system that requires pivot formation before T-spot touch, then close beyond the pivot level to confirm sweep signals.
TTFM Labeling System: Dynamic labeling system that tracks setup validity with C2, C3, and C4 labels indicating different types of T-spot formations and their confirmation status.
How the Code Works:
1. Higher Timeframe Detection:
The indicator automatically determines appropriate HTF based on your current chart:
- 1m charts: 15m HTF
- 3m charts: 30m HTF
- 5m charts: 1h HTF
- 15m charts: 4h HTF
- 30m-1h charts: 1D HTF
- 4h-8h charts: 1W HTF
- 1D charts: 1M HTF
2. T-Spot Calculation Algorithm:
T-spots are identified using logarithmic midpoint calculations combined with pivot-based logic:
- Calculates log midpoint = exp((log(high) + log(low)) / 2) for wick analysis
- Identifies sweep conditions: high > prev_high AND close < prev_high (bearish) or low < prev_low AND close > prev_low (bullish)
- Creates T-spot zones based on close position relative to logarithmic midpoint
- **Core Logic**: All T-spot formations are based on pivot creation patterns where price sweeps previous levels but closes on the opposite side, creating potential reversal zones
3. Sweep Detection Logic:
The code detects sweeps using pivot analysis:
- Uses ta.pivothigh() and ta.pivotlow() with 1,2 parameters for pivot detection
- Confirms sweeps when: pivot forms before T-spot touch AND close breaks beyond pivot level
- Tracks pivot levels and bars for confirmation validation
- **Pivot-Based Foundation**: The entire system is built on pivot creation logic - T-spots form when price creates pivots by sweeping previous levels but closing opposite, indicating potential reversal points
4. Fair Value Gap Detection:
FVG identification uses three-candle pattern analysis:
- Candle1.l > Candle2.h AND min(Candle1.o, Candle1.c) > max(Candle2.o, Candle2.c) for bullish FVG
- Candle1.h < Candle2.l AND max(Candle1.o, Candle1.c) < min(Candle2.o, Candle2.c) for bearish FVG
5. Visual Rendering System:
Uses array-based object management:
- Clears and redraws all visual elements on each bar
- Manages HTF candles, T-spots, sweeps, and labels using separate arrays
- Implements cleanup logic to prevent memory overflow
6. Pivot-Based T-Spot Types:
The indicator identifies several T-spot patterns based on pivot creation:
- **Standard T-Spots**: Price sweeps previous high/low but closes opposite, creating pivot
- **Expansive T-Spots**: Previous candle sweeps, current candle expands and closes beyond sweep level
- **Pro-trend T-Spots**: Price sweeps logarithmic midpoint but closes beyond previous levels
- **Silver T-Spots**: Special T-spots during specific market hours (4th-5th candle of day)
- All patterns require pivot formation through sweep-and-close logic for validation
Usage Guidance:
Add the Fractal Model indicator to your TradingView chart
Configure HTF settings and T-spot bias preferences
Adjust visual customization options to match your trading style
Monitor T-spot formations and sweep confirmations for entry signals
Trading Applications:
T-Spot Trading:
- Look for T-spot formations on higher timeframes
- Wait for price to touch T-spot levels
- Enter on sweep confirmation with proper pivot validation
- Use T-spot levels as support/resistance zones
Sweep Trading:
- Identify sweep patterns where price breaks previous highs/lows but closes opposite
- Use sweep levels as potential reversal zones
- Combine with T-spot analysis for higher probability setups
Fair Value Gap Trading:
- Trade FVG fills as price returns to imbalance areas
- Use FVG levels as support/resistance zones
- Combine with higher timeframe structure for context
Technical Specifications:
- Compatible with Pine Script v6
- Non-repainting indicator
- Supports all timeframes with automatic HTF detection
- Memory-efficient array management
- Real-time T-spot and sweep detection
- Customizable visual elements and colors
Disclaimer:
This indicator is for educational and informational purposes only. Past performance does not guarantee future results. Always conduct your own research and risk management before making trading decisions.
Buzzara// © Buzzara
// =================================
// PLEASE SUPPORT THE TEAM
// =================================
//
// Telegram: t.me
a_trade// =================================
//@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 ↑↑↑>