Candle Pressure Flip Engine
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator candle pressure flip engine for tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Candle Pressure Flip Engine — это индикатор для TradingView, написанный на Pine Script v6. Он анализирует свечные паттерны давления и выявляет потенциальные разворотные сигналы на основе совокупности факторов: движения истощения, отвергающих теней, давления закрытия, всплеска объёма и разворота моментума RSI. Каждый сигнал получает итоговый балл, определяющий его силу.
Индикатор отображает на графике метки BULLISH FLIP и BEARISH FLIP, боксы целевых цен и рисков, линии входа/риска/цели, а также результаты сделок в виде меток WIN/LOSS. Дополнительно реализована система Crimson Spine — центральная EMA-линия с симметричными эхо-полосами и цветными облачными заливками вокруг цены.
Встроенный фоновый оптимизатор тестирует комбинации параметров виртуально и позволяет автоматически выбирать лучшую конфигурацию. Система профессиональных оповещений поддерживает человекочитаемые и JSON-форматы для интеграции с вебхуками. Предусмотрено несколько визуальных тем и обширная настройка отображения.
Индикатор не выполняет реальных торговых операций — все торговые планы и результаты отображаются исключительно как визуальные элементы на графике для аналитических целей.
Настройки программы
| Настройка | Описание |
|---|---|
| signalMode | Управляет избирательностью сигнального движка: Aggressive генерирует больше сигналов, Conservative — меньше, но более строгих. |
| oneTradeAtATime | При включении индикатор ожидает достижения цели или риска активной сделки перед генерацией нового сигнала. |
| signalCooldownBars | Минимальное количество баров между двумя подтверждёнными сигналами. Более высокие значения уменьшают кластеризацию сигналов. |
| showBullBearLabels | Отображает или скрывает основные метки BULLISH FLIP или BEARISH FLIP на графике. |
| maxSignalLabels | Ограничивает количество исторических меток сигналов для защиты производительности графика. |
| exhaustionLookback | Количество баров для измерения агрессивного движения перед возможным разворотом давления. |
| minMoveAtr | Минимальный размер движения, измеряемый в ATR. Более высокие значения требуют более сильного истощения перед разворотным сигналом. |
| minDirectionalBars | Минимальное количество баров внутри периода измерения, которые должны поддерживать направление истощения. |
| minBodyPct | Минимальный процент тела свечи, требуемый на свече-триггере разворота. |
| minRejectionWickPct | Минимальный процент отвергающей тени. Для бычьих разворотов используется нижняя тень, для медвежьих — верхняя. |
| closePressurePct | Порог давления закрытия — определяет, где свеча должна закрыться внутри своего диапазона. Для бычьих разворотов требуется закрытие в верхней части диапазона, для медвежьих — в нижней. |
| minSignalScore | Минимальный итоговый балл, требуемый для разворотного сигнала. Более высокие значения генерируют меньше, но более чистых сигналов. |
| useVolumeBurst | Требует повышенного объёма на сигнальной свече. Отключите для рынков с ненадёжными данными объёма. |
| volumeLength | Длина скользящей средней, используемой для сравнения текущего объёма с нормальным объёмом. |
| minVolumeMultiplier | Минимальное кратное объёма. Например, 1.10 означает, что текущий объём должен быть не менее чем на 10% выше среднего. |
| useMomentumFlip | Требует разворота моментума RSI в направлении разворота перед подтверждением сигнала. |
| rsiLength | Период RSI, используемый для подтверждения разворота моментума. |
| rsiTurnLookback | Количество баров назад, к которым сравнивается RSI для обнаружения разворота моментума. |
| buyRsiMax | Максимально допустимое значение RSI после бычьего разворота, помогающее избежать входа при чрезмерном перекупленности. |
| sellRsiMin | Минимально допустимое значение RSI после медвежьего разворота, помогающее избежать входа при чрезмерной перепроданности. |
| showTradeBoxes | Отображает современные боксы цели и риска после каждого подтверждённого сигнала. |
| showTradeLines | Отображает компактные линии входа, риска и цели внутри структуры торгового бокса. |
| showOnlyLastTradePlan | При включении старые боксы сделок удаляются, и на графике остаётся только самый последний торговый план. |
| keepHistoricalTradeBoxes | Сохраняет предыдущие боксы сделок на графике после достижения цели или риска. |
| maxHistoricalTradePlans | Максимальное количество исторических торговых планов, отображаемых на графике. Уменьшите значение, если график перегружен. |
| trackTradeResults | Отслеживает, какая из целей (цель или риск) достигается первой, и выводит метки результатов WIN/LOSS. |
| rrTarget | Значение целевого соотношения риск/доходность по умолчанию, используемое до накопления достаточных данных оптимизатором для автоматического выбора лучшего RR. |
| slMode | Режим расчёта риска: Signal Wick использует сигнальную тень, ATR — ATR x4, Hybrid — более широкое из двух значений. |
| atrLength | Длина периода для расчёта индикатора ATR, используемого в вычислениях риска. |
| slBufferTicks | Небольшой буфер в тиках, добавляемый за пределы сигнальной тени при использовании режимов риска Wick или Hybrid. |
| tradeBoxExtendBars | Насколько вправо активный торговый бокс расширяется, пока сделка открыта. |
| sameBarResult | Определяет предположение о результате, если цель и риск были достигнуты на одной свече: SL First или TP First. |
| maxResultLabels | Максимальное количество меток результатов WIN/LOSS, оставляемых видимыми на графике. |
| useOptimizer | Запускает контролируемое виртуальное тестирование сетки в фоновом режиме для поиска наиболее сильной комбинации параметров. |
| useAutoBestCombo | При накоплении достаточных данных оптимизатора сигнальный движок автоматически использует лучшую комбинацию параметров. |
| optimizerDepth | Глубина сетки оптимизатора: Light 27 тестирует меньше комбинаций, Full 81 также тестирует несколько значений RR для более глубокой оптимизации. |
| optimizerRankMode | Режим ранжирования комбинаций: Wins First приоритизирует наибольшее количество выигрышных сделок, Win Rate First — процент точности. |
| optimizerMinTrades | Минимальное количество завершённых виртуальных сделок, необходимое перед тем, как комбинация может стать лучшей автоматической настройкой. |
| visualTheme | Меняет полную цветовую палитру меток сигналов, боксов цели, боксов риска и меток результатов. |
| visualIntensity | Управляет силой рамок, свечения и визуального акцента: Minimal, Balanced или Showcase. |
| labelSizeInput | Размер меток основных сигналов BULLISH/BEARISH и результатов. |
| boxTransparency | Уровень прозрачности боксов целевых цен и рисков. Более высокие значения делают их более субтильными. |
| showSignalGlow | Добавляет тонкую подсветку на одну свечу вокруг подтверждённой сигнальной свечи. |
| showResultStamps | Показывает премиальные метки результатов при достижении сделкой цели или риска. |
| showPriceTags | Отображает компактные метки ENTRY, TARGET и RISK справа от торгового плана. |
| candleHighlightMode | Определяет подсветку свечей: выключено, только сигнальные свечи, или сигнальные и результативные свечи. |
| maxGlowObjects | Максимальное количество исторических объектов подсветки сигнальных свечей, сохраняемых на графике. |
| enableProfessionalAlerts | Включает или отключает динамические оповещения с информацией о символе, таймфрейме, направлении, ценах и результатах. |
| alertBullishFlips | Включает или отключает отправку оповещения при подтверждении бычьего разворота BULLISH FLIP. |
| alertBearishFlips | Включает или отключает отправку оповещения при подтверждении медвежьего разворота BEARISH FLIP. |
| alertTradeResults | Включает или отключает отправку оповещения при достижении активной сделкой цели или риска. |
| alertPayloadFormat | Определяет формат оповещений: человекочитаемый текст или JSON для автоматизации через вебхуки. |
| alertIncludePrices | Включает или исключает из оповещений цены входа, риска и цели. |
| alertIncludeAutoBest | Включает или исключает из оповещений информацию о состоянии автоматического выбора лучшей конфигурации оптимизатора. |
| alertTag | Пользовательский тег, используемый в начале сообщений оповещений и внутри JSON-полезной нагрузки. |
| showCrimsonSpine | Включает или отключает систему Crimson Spine: центральную красную линию EMA, симметричные эхо-линии и мягкие красные облачные заливки вокруг цены. |
| spineSource | Ценовой источник, используемый для центральной линии Crimson Spine. |
| spineLength | Длина центральной EMA. Меньшие значения более точно отслеживают цену, большие создают более гладкую линию позвоночника. |
| spineEchoSpacingAtr | Расстояние между слоями эхо, измеряемое как доля ATR. Меньшие значения удерживают ленту ближе к цене. |
| spineAdaptiveSpread | При включении расширяет облачную зону эхо при увеличении интенсивности давления и сжимает её при нейтральном давлении. |
| spineLineWidth | Толщина основной линии позвоночника и линий эхо. |
| spineTransparencyStart | Прозрачность центральной линии позвоночника. Меньшие значения более заметны. |
| spineTransparencyStep | Каждый внешний слой эхо становится более прозрачным на это значение. |
| spineFillTransparency | Прозрачность красной облачной заливки между слоями эхо. Более высокие значения более субтильны. |
| spinePulseEffect | Добавляет тонкий пульсирующий эффект к линиям позвоночника и эхо для более премиального визуального ощущения. |
Поиск по коду файла
indicator("Candle Pressure Flip Engine", shorttitle = "Candle Pressure Flip Engine [trade_w_samet]", overlay = true, max_boxes_count = 500, max_labels_count = 500, max_lines_count = 500)
groupGeneral = "⚙️ 01. General"
signalMode = input.string("Balanced", "Signal Mode", options = ["Aggressive", "Balanced", "Conservative"], group = groupGeneral, tooltip = "Controls how selective the signal engine is. Aggressive gives more signals, Conservative gives fewer but stricter signals.", display = display.none)
oneTradeAtATime = input.bool(true, "Only One Active Trade", group = groupGeneral, tooltip = "When enabled, the script waits for the active trade to hit target or risk before allowing a new signal.", display = display.none)
signalCooldownBars = input.int(8, "Signal Cooldown Bars", minval = 0, maxval = 500, group = groupGeneral, tooltip = "Minimum number of bars required between two confirmed signals. Higher values reduce signal clustering.", display = display.none)
showBullBearLabels = input.bool(true, "Show BULLISH / BEARISH Labels", group = groupGeneral, tooltip = "Shows the main BULLISH FLIP or BEARISH FLIP signal label on the chart.", display = display.none)
maxSignalLabels = input.int(80, "Max Signal Labels", minval = 10, maxval = 250, group = groupGeneral, tooltip = "Limits how many historical signal labels remain visible to protect chart performance.", display = display.none)
groupPressure = "🔥 02. Candle Pressure Flip Engine"
exhaustionLookback = input.int(8, "Exhaustion Lookback", minval = 3, maxval = 50, group = groupPressure, tooltip = "Number of bars used to measure the aggressive move before a possible pressure flip.", display = display.none)
minMoveAtr = input.float(1.20, "Minimum Exhaustion Move ATR", minval = 0.10, maxval = 10.0, step = 0.10, group = groupPressure, tooltip = "Minimum move size measured in ATR. Higher values require stronger exhaustion before a reversal signal can form.", display = display.none)
minDirectionalBars = input.int(4, "Minimum Directional Bars", minval = 1, maxval = 30, group = groupPressure, tooltip = "Minimum number of bars inside the lookback that must support the exhaustion direction.", display = display.none)
minBodyPct = input.float(30.0, "Minimum Reversal Body %", minval = 0.0, maxval = 100.0, step = 1.0, group = groupPressure, tooltip = "Minimum candle body percentage required on the reversal trigger candle.", display = display.none)
minRejectionWickPct = input.float(35.0, "Minimum Rejection Wick %", minval = 0.0, maxval = 100.0, step = 1.0, group = groupPressure, tooltip = "Minimum rejection wick percentage. Bullish flips use lower wick, bearish flips use upper wick.", display = display.none)
closePressurePct = input.float(65.0, "Close Pressure Threshold %", minval = 50.0, maxval = 95.0, step = 1.0, group = groupPressure, tooltip = "Defines where the candle must close inside its range. Bullish flips need an upper-range close, bearish flips need a lower-range close.", display = display.none)
minSignalScore = input.float(62.0, "Minimum Signal Score", minval = 0.0, maxval = 100.0, step = 1.0, group = groupPressure, tooltip = "Minimum final score required for a pressure flip signal. Higher values produce fewer but cleaner signals.", display = display.none)
groupVolume = "📊 03. Volume Burst"
useVolumeBurst = input.bool(true, "Use Volume Burst", group = groupVolume, tooltip = "Requires the signal candle to have above-average volume. Disable for markets with unreliable volume data.", display = display.none)
volumeLength = input.int(20, "Volume MA Length", minval = 1, maxval = 300, group = groupVolume, tooltip = "Moving average length used to compare current volume against normal volume.", display = display.none)
minVolumeMultiplier = input.float(1.10, "Minimum Volume Multiplier", minval = 0.10, maxval = 10.0, step = 0.05, group = groupVolume, tooltip = "Minimum volume expansion required. Example: 1.10 means current volume must be at least 10% above the volume average.", display = display.none)
groupMomentum = "🧭 04. Momentum Flip"
useMomentumFlip = input.bool(true, "Use Momentum Flip", group = groupMomentum, tooltip = "Requires RSI momentum to turn in the reversal direction before confirming the signal.", display = display.none)
rsiLength = input.int(14, "RSI Length", minval = 2, maxval = 100, group = groupMomentum, tooltip = "RSI length used for the momentum flip confirmation.", display = display.none)
rsiTurnLookback = input.int(2, "RSI Turn Lookback", minval = 1, maxval = 10, group = groupMomentum, tooltip = "How many bars back RSI is compared to detect momentum turning.", display = display.none)
buyRsiMax = input.float(58.0, "Bullish RSI Max After Flip", minval = 1.0, maxval = 100.0, step = 1.0, group = groupMomentum, tooltip = "Maximum RSI allowed after a bullish flip. Helps avoid entering after momentum is already too extended upward.", display = display.none)
sellRsiMin = input.float(42.0, "Bearish RSI Min After Flip", minval = 1.0, maxval = 100.0, step = 1.0, group = groupMomentum, tooltip = "Minimum RSI allowed after a bearish flip. Helps avoid entering after momentum is already too extended downward.", display = display.none)
groupTrade = "🎯 05. Target / Risk Result Engine"
showTradeBoxes = input.bool(true, "Show Target / Risk Boxes", group = groupTrade, tooltip = "Displays modern target and risk boxes after each confirmed signal.", display = display.none)
showTradeLines = input.bool(true, "Show Entry / Risk / Target Lines", group = groupTrade, tooltip = "Displays compact entry, risk and target lines inside the trade box structure.", display = display.none)
showOnlyLastTradePlan = input.bool(false, "Show Only Last Trade Plan", group = groupTrade, tooltip = "When enabled, older trade boxes are removed and only the most recent trade plan remains visible.", display = display.none)
keepHistoricalTradeBoxes = input.bool(true, "Keep Historical Target / Risk Boxes", group = groupTrade, tooltip = "Keeps previous trade boxes on the chart after target or risk is reached.", display = display.none)
maxHistoricalTradePlans = input.int(25, "Max Historical Trade Plans", minval = 1, maxval = 100, group = groupTrade, tooltip = "Maximum number of historical trade plans kept on the chart. Lower this if the chart becomes too crowded.", display = display.none)
trackTradeResults = input.bool(true, "Track Win / Loss Result", group = groupTrade, tooltip = "Tracks whether each signal reaches target or risk first and prints WIN / LOSS result stamps.", display = display.none)
rrTarget = input.float(2.0, "Default Target Risk Reward", minval = 0.10, maxval = 20.0, step = 0.10, group = groupTrade, tooltip = "Default target RR used before the optimizer has enough data to select the best RR automatically.", display = display.none)
slMode = input.string("ATR", "Risk Mode", options = ["Signal Wick", "ATR", "Hybrid"], group = groupTrade, tooltip = "Signal Wick uses the trigger wick for risk. ATR uses ATR x4. Hybrid uses the wider of wick and ATR risk.", display = display.none)
atrLength = input.int(14, "ATR Length", minval = 1, maxval = 200, group = groupTrade, tooltip = "ATR length used for the fixed ATR x4 risk calculation.", display = display.none)
slBufferTicks = input.int(2, "Risk Buffer Ticks", minval = 0, maxval = 100, group = groupTrade, tooltip = "Small tick buffer added beyond the signal wick when wick or hybrid risk mode is used.", display = display.none)
tradeBoxExtendBars = input.int(40, "Trade Box Extend Bars", minval = 1, maxval = 300, group = groupTrade, tooltip = "How far the active trade box extends to the right while the trade is open.", display = display.none)
sameBarResult = input.string("SL First", "If Target and Risk Hit Same Bar", options = ["SL First", "TP First"], group = groupTrade, tooltip = "Determines the result assumption if target and risk are touched on the same candle.", display = display.none)
maxResultLabels = input.int(80, "Max Result Stamps", minval = 10, maxval = 250, group = groupTrade, tooltip = "Limits how many WIN / LOSS result stamps remain visible on the chart.", display = display.none)
groupOptimizer = "🧠 06. Background Optimizer"
useOptimizer = input.bool(true, "Use Background Optimizer", group = groupOptimizer, tooltip = "Runs a controlled internal grid test in the background to find the strongest parameter combination.", display = display.none)
useAutoBestCombo = input.bool(true, "Auto Use Best Optimizer Combo", group = groupOptimizer, tooltip = "When enough optimizer trades are collected, the live signal engine automatically uses the best combination.", display = display.none)
optimizerDepth = input.string("Full 81", "Optimizer Grid Depth", options = ["Light 27", "Full 81"], group = groupOptimizer, tooltip = "Light 27 tests fewer combinations. Full 81 also tests multiple RR values for a deeper optimization.", display = display.none)
optimizerRankMode = input.string("Wins First", "Best Combination Ranking", options = ["Wins First", "Win Rate First"], group = groupOptimizer, tooltip = "Wins First prioritizes the highest number of winning trades. Win Rate First prioritizes percentage accuracy.", display = display.none)
optimizerMinTrades = input.int(10, "Minimum Trades For Best Combo", minval = 1, maxval = 500, group = groupOptimizer, tooltip = "Minimum closed virtual trades required before a combination can become the Auto Best setup.", display = display.none)
groupVisual = "🎨 07. Visual Pro Design"
visualTheme = input.string("Midnight Pro", "Visual Theme", options = ["Midnight Pro", "Ice Minimal", "Black Gold", "Red Carbon"], group = groupVisual, tooltip = "Changes the full visual palette of signal labels, risk boxes, target boxes and result stamps.", display = display.none)
visualIntensity = input.string("Balanced", "Visual Intensity", options = ["Minimal", "Balanced", "Showcase"], group = groupVisual, tooltip = "Controls the strength of borders, glow and visual emphasis.", display = display.none)
labelSizeInput = input.string("Small", "Label Size", options = ["Tiny", "Small", "Normal"], group = groupVisual, tooltip = "Controls the size of the main BULLISH / BEARISH and result labels.", display = display.none)
boxTransparency = input.int(84, "Target / Risk Box Transparency", minval = 0, maxval = 100, group = groupVisual, tooltip = "Controls how transparent the target and risk boxes are. Higher values are more subtle.", display = display.none)
showSignalGlow = input.bool(true, "Show Signal Glow", group = groupVisual, tooltip = "Adds a subtle one-bar glow around the confirmed signal candle.", display = display.none)
showResultStamps = input.bool(true, "Show WIN / LOSS Stamps", group = groupVisual, tooltip = "Shows premium result stamps when a trade reaches target or risk.", display = display.none)
showPriceTags = input.bool(true, "Show Compact Price Tags", group = groupVisual, tooltip = "Shows compact ENTRY, TARGET and RISK tags at the right side of the trade plan.", display = display.none)
candleHighlightMode = input.string("Signal Only", "Candle Highlight Mode", options = ["Off", "Signal Only", "Signal + Result"], group = groupVisual, tooltip = "Controls whether signal candles and result candles are softly highlighted.", display = display.none)
maxGlowObjects = input.int(80, "Max Signal Glow Objects", minval = 10, maxval = 250, group = groupVisual, tooltip = "Maximum number of historical signal glow objects kept on the chart.", display = display.none)
groupAlerts = "🚨 08. Professional Alerts"
enableProfessionalAlerts = input.bool(true, "Enable Dynamic Alerts", group = groupAlerts, tooltip = "Enables dynamic alert() messages with symbol, timeframe, direction, entry, risk, target and result information.", display = display.none)
alertBullishFlips = input.bool(true, "Alert Bullish Flips", group = groupAlerts, tooltip = "Sends an alert when a BULLISH FLIP signal is confirmed.", display = display.none)
alertBearishFlips = input.bool(true, "Alert Bearish Flips", group = groupAlerts, tooltip = "Sends an alert when a BEARISH FLIP signal is confirmed.", display = display.none)
alertTradeResults = input.bool(true, "Alert Trade Results", group = groupAlerts, tooltip = "Sends an alert when an active trade reaches target or risk.", display = display.none)
alertPayloadFormat = input.string("Human", "Alert Payload Format", options = ["Human", "JSON"], group = groupAlerts, tooltip = "Human creates readable alerts. JSON creates automation-friendly payloads for webhooks.", display = display.none)
alertIncludePrices = input.bool(true, "Include Entry / Risk / Target", group = groupAlerts, tooltip = "Includes entry, risk and target prices inside dynamic alert messages.", display = display.none)
alertIncludeAutoBest = input.bool(true, "Include Auto Best State", group = groupAlerts, tooltip = "Includes whether Auto Best optimizer mode is active or still waiting.", display = display.none)
alertTag = input.string("Candle Pressure Flip Engine", "Alert Tag", group = groupAlerts, tooltip = "Custom tag used at the start of alert messages and inside JSON payloads.", display = display.none)
groupSpine = "🩸 09. Crimson Spine + Echo"
showCrimsonSpine = input.bool(true, "Show Crimson Spine System", group = groupSpine, tooltip = "Shows the premium Spine + Echo + Fill system: one central red spine, symmetrical echo lines and soft crimson fill clouds around price.", display = display.none)
spineSource = input.source(close, "Spine Source", group = groupSpine, tooltip = "Price source used by the central Crimson Spine.", display = display.none)
spineLength = input.int(8, "Spine EMA Length", minval = 1, maxval = 200, group = groupSpine, tooltip = "Central EMA length. Lower values track price more tightly; higher values create a smoother spine.", display = display.none)
spineEchoSpacingAtr = input.float(0.045, "Echo Spacing ATR", minval = 0.005, maxval = 1.0, step = 0.005, group = groupSpine, tooltip = "Distance between echo layers, measured as ATR fraction. Smaller values keep the ribbon very tight around price.", display = display.none)
spineAdaptiveSpread = input.bool(true, "Adaptive Echo Spread", group = groupSpine, tooltip = "Expands the echo cloud slightly when pressure intensity increases and compresses it when pressure is neutral.", display = display.none)
spineLineWidth = input.int(2, "Spine Line Width", minval = 1, maxval = 5, group = groupSpine, tooltip = "Thickness of the main spine and echo lines.", display = display.none)
spineTransparencyStart = input.int(0, "Core Line Transparency", minval = 0, maxval = 95, group = groupSpine, tooltip = "Transparency of the center spine line. Lower values are more visible.", display = display.none)
spineTransparencyStep = input.int(10, "Echo Transparency Step", minval = 0, maxval = 20, group = groupSpine, tooltip = "Each outer echo layer becomes more transparent by this amount.", display = display.none)
spineFillTransparency = input.int(86, "Crimson Fill Transparency", minval = 0, maxval = 100, group = groupSpine, tooltip = "Transparency of the red cloud fill between echo layers. Higher values are more subtle.", display = display.none)
spinePulseEffect = input.bool(true, "Spine Pulse Effect", group = groupSpine, tooltip = "Adds a subtle pulsing glow to the spine and echo layers for a more premium live feel.", display = display.none)
float atrMultiplier = 4.0
f_clamp(_value, _min, _max) =>
math.max(_min, math.min(_value, _max))
f_labelSize(_size) =>
_size == "Tiny" ? size.tiny : _size == "Small" ? size.small : size.normal
f_modeMoveMultiplier() =>
signalMode == "Aggressive" ? 0.85 : signalMode == "Conservative" ? 1.25 : 1.00
f_modeWickAdjustment() =>
signalMode == "Aggressive" ? -8.0 : signalMode == "Conservative" ? 8.0 : 0.0
f_modeScoreAdjustment() =>
signalMode == "Aggressive" ? -8.0 : signalMode == "Conservative" ? 8.0 : 0.0
f_sideText(_dir) =>
_dir == 1 ? "BULLISH" : _dir == -1 ? "BEARISH" : "NONE"
f_resultText(_isTp) =>
_isTp ? "TP" : "SL"
f_buyColor() =>
visualTheme == "Ice Minimal" ? color.rgb(70, 190, 220) : visualTheme == "Black Gold" ? color.rgb(230, 190, 90) : visualTheme == "Red Carbon" ? color.rgb(70, 210, 230) : color.rgb(0, 205, 230)
f_sellColor() =>
visualTheme == "Ice Minimal" ? color.rgb(165, 140, 245) : visualTheme == "Black Gold" ? color.rgb(145, 115, 210) : visualTheme == "Red Carbon" ? color.rgb(195, 90, 240) : color.rgb(155, 115, 255)
f_neutralColor() =>
visualTheme == "Ice Minimal" ? color.rgb(185, 205, 220) : visualTheme == "Black Gold" ? color.rgb(210, 185, 120) : visualTheme == "Red Carbon" ? color.rgb(150, 155, 170) : color.rgb(150, 165, 185)
f_targetColor() =>
visualTheme == "Ice Minimal" ? color.rgb(35, 170, 230) : visualTheme == "Black Gold" ? color.rgb(60, 180, 240) : visualTheme == "Red Carbon" ? color.rgb(0, 190, 240) : color.rgb(0, 210, 255)
f_riskColor() =>
visualTheme == "Ice Minimal" ? color.rgb(245, 145, 60) : visualTheme == "Black Gold" ? color.rgb(255, 170, 45) : visualTheme == "Red Carbon" ? color.rgb(255, 95, 45) : color.rgb(255, 155, 45)
f_glowTransparency() =>
visualIntensity == "Minimal" ? 88 : visualIntensity == "Showcase" ? 72 : 80
f_lineWidth() =>
visualIntensity == "Showcase" ? 2 : 1
f_resultLabelSize() =>
visualIntensity == "Showcase" ? size.normal : f_labelSize(labelSizeInput)
f_spineColor(_layer) =>
int pulseShift = spinePulseEffect and bar_index % 2 == 0 ? -7 : 0
int alpha = f_clamp(spineTransparencyStart + _layer * spineTransparencyStep + pulseShift, 0, 95)
_layer == 0 ? color.new(color.rgb(255, 0, 35), alpha) : _layer == 1 ? color.new(color.rgb(220, 0, 32), alpha) : _layer == 2 ? color.new(color.rgb(185, 0, 28), alpha) : _layer == 3 ? color.new(color.rgb(145, 0, 24), alpha) : color.new(color.rgb(105, 0, 20), alpha)
f_spineFillColor(_layer) =>
int pulseShift = spinePulseEffect and bar_index % 2 == 0 ? -4 : 0
int alpha = f_clamp(spineFillTransparency + _layer * 3 + pulseShift, 0, 100)
_layer == 1 ? color.new(color.rgb(255, 0, 35), alpha) : _layer == 2 ? color.new(color.rgb(190, 0, 28), alpha) : color.new(color.rgb(120, 0, 22), alpha)
f_priceText(_price) =>
str.tostring(_price, format.mintick)
f_timeframeText() =>
timeframe.period
f_autoBestText(_ready) =>
_ready ? "ON" : "WAIT"
f_signalAlertMessage(_dir, _score, _entry, _risk, _target, _rr, _autoReady) =>
string direction = f_sideText(_dir)
string eventName = direction + "_FLIP"
string pricePart = alertIncludePrices ? " | Entry " + f_priceText(_entry) + " | Risk " + f_priceText(_risk) + " | Target " + f_priceText(_target) : ""
string autoPart = alertIncludeAutoBest ? " | Auto Best " + f_autoBestText(_autoReady) : ""
string humanMsg = alertTag + " | " + direction + " FLIP confirmed | " + syminfo.ticker + " | TF " + f_timeframeText() + " | Score " + str.tostring(_score, "#.##") + " | RR " + str.tostring(_rr, "#.##") + pricePart + autoPart
string jsonMsg = '{"tag":"' + alertTag + '","event":"' + eventName + '","symbol":"' + syminfo.ticker + '","timeframe":"' + f_timeframeText() + '","direction":"' + direction + '","score":' + str.tostring(_score, "#.##") + ',"entry":' + f_priceText(_entry) + ',"risk":' + f_priceText(_risk) + ',"target":' + f_priceText(_target) + ',"rr":' + str.tostring(_rr, "#.##") + ',"auto_best":"' + f_autoBestText(_autoReady) + '"}'
alertPayloadFormat == "JSON" ? jsonMsg : humanMsg
f_resultAlertMessage(_isTp, _entry, _risk, _target, _rr, _netR) =>
string eventName = _isTp ? "WIN_TARGET_HIT" : "LOSS_RISK_HIT"
string resultText = _isTp ? "WIN | TARGET HIT" : "LOSS | RISK HIT"
string pricePart = alertIncludePrices ? " | Entry " + f_priceText(_entry) + " | Risk " + f_priceText(_risk) + " | Target " + f_priceText(_target) : ""
string humanMsg = alertTag + " | " + resultText + " | " + syminfo.ticker + " | TF " + f_timeframeText() + " | RR " + str.tostring(_rr, "#.##") + " | Net R " + str.tostring(_netR, "#.##") + pricePart
string jsonMsg = '{"tag":"' + alertTag + '","event":"' + eventName + '","symbol":"' + syminfo.ticker + '","timeframe":"' + f_timeframeText() + '","result":"' + resultText + '","entry":' + f_priceText(_entry) + ',"risk":' + f_priceText(_risk) + ',"target":' + f_priceText(_target) + ',"rr":' + str.tostring(_rr, "#.##") + ',"net_r":' + str.tostring(_netR, "#.##") + '}'
alertPayloadFormat == "JSON" ? jsonMsg : humanMsg
float atr = ta.atr(atrLength)
float avgVolume = ta.sma(volume, volumeLength)
float volumeMultiplier = not na(avgVolume) and avgVolume > 0.0 ? volume / avgVolume : 1.0
float rsi = ta.rsi(close, rsiLength)
float candleRange = high - low
float bodySize = math.abs(close - open)
float bodyPct = candleRange > 0.0 ? bodySize / candleRange * 100.0 : 0.0
float lowerWick = math.min(open, close) - low
float upperWick = high - math.max(open, close)
float lowerWickPct = candleRange > 0.0 ? lowerWick / candleRange * 100.0 : 0.0
float upperWickPct = candleRange > 0.0 ? upperWick / candleRange * 100.0 : 0.0
float closePosition = candleRange > 0.0 ? (close - low) / candleRange * 100.0 : 50.0
bool enoughBars = bar_index > exhaustionLookback + rsiTurnLookback + 2 and not na(atr)
int bullishDirectionalBars = 0
int bearishDirectionalBars = 0
if enoughBars
for j = 0 to exhaustionLookback - 1
bullishDirectionalBars += close[j] > close[j + 1] ? 1 : 0
bearishDirectionalBars += close[j] < close[j + 1] ? 1 : 0
float moveDistance = enoughBars ? math.abs(close - close[exhaustionLookback]) : 0.0
float moveAtr = atr > 0.0 ? moveDistance / atr : 0.0
float requiredMoveAtr = minMoveAtr * f_modeMoveMultiplier()
float requiredWickPct = f_clamp(minRejectionWickPct + f_modeWickAdjustment(), 5.0, 95.0)
float requiredSignalScore = f_clamp(minSignalScore + f_modeScoreAdjustment(), 5.0, 100.0)
bool volumeOk = not useVolumeBurst or volumeMultiplier >= minVolumeMultiplier
bool buyMomentumOk = not useMomentumFlip or (rsi > rsi[rsiTurnLookback] and rsi <= buyRsiMax)
bool sellMomentumOk = not useMomentumFlip or (rsi < rsi[rsiTurnLookback] and rsi >= sellRsiMin)
f_buyScore(_reqMoveAtr, _reqWickPct) =>
float exhaustionScore = f_clamp((moveAtr / math.max(_reqMoveAtr, 0.10)) * 25.0, 0.0, 25.0)
float directionScore = f_clamp((bearishDirectionalBars / math.max(exhaustionLookback, 1)) * 10.0, 0.0, 10.0)
float wickScore = f_clamp((lowerWickPct / math.max(_reqWickPct, 1.0)) * 20.0, 0.0, 20.0)
float closeScore = f_clamp((closePosition / math.max(closePressurePct, 1.0)) * 15.0, 0.0, 15.0)
float bScore = f_clamp((bodyPct / math.max(minBodyPct, 1.0)) * 10.0, 0.0, 10.0)
float vScore = volumeOk ? 10.0 : 0.0
float mScore = buyMomentumOk ? 10.0 : 0.0
exhaustionScore + directionScore + wickScore + closeScore + bScore + vScore + mScore
f_sellScore(_reqMoveAtr, _reqWickPct) =>
float exhaustionScore = f_clamp((moveAtr / math.max(_reqMoveAtr, 0.10)) * 25.0, 0.0, 25.0)
float directionScore = f_clamp((bullishDirectionalBars / math.max(exhaustionLookback, 1)) * 10.0, 0.0, 10.0)
float wickScore = f_clamp((upperWickPct / math.max(_reqWickPct, 1.0)) * 20.0, 0.0, 20.0)
float closeScore = f_clamp(((100.0 - closePosition) / math.max(closePressurePct, 1.0)) * 15.0, 0.0, 15.0)
float bScore = f_clamp((bodyPct / math.max(minBodyPct, 1.0)) * 10.0, 0.0, 10.0)
float vScore = volumeOk ? 10.0 : 0.0
float mScore = sellMomentumOk ? 10.0 : 0.0
exhaustionScore + directionScore + wickScore + closeScore + bScore + vScore + mScore
var bool tradeActive = false
var int tradeDir = 0
var float tradeEntry = na
var float tradeSl = na
var float tradeTp = na
var float tradeRr = na
var int tradeStartBar = na
var int lastSignalBar = na
var string lastResult = "N/A"
var int completedTrades = 0
var int winTrades = 0
var int lossTrades = 0
var float netR = 0.0
var float grossWinR = 0.0
var float grossLossR = 0.0
var box tpBox = na
var box slBox = na
var line entryLine = na
var line slLine = na
var line tpLine = na
var label entryTag = na
var label slTag = na
var label tpTag = na
var array<label> signalLabels = array.new_label()
var array<label> resultLabels = array.new_label()
var array<box> historicalTradeBoxes = array.new_box()
var array<line> historicalTradeLines = array.new_line()
var array<label> historicalPriceTags = array.new_Показано первые 50% кода (символов: 38505)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.