← К каталогу
Исходный код · ID 4556

Candle Pressure Flip Engine

indicator candle pressure flip engine for tradingview.pine

Похожие материалы по тегам

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

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 и перейдите к оплате.

Стоимость полного кода
3 850,50₽ ≈ $47.88