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

PIGEON SYSTEM

pigeon system_5962808620088302236.pine

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

xauusd_gold_perfect.mq4MQL4 / MetaTrader 4 · 2 общих теговtm sniper pro.pineTradingView · 2 общих теговsniper pro.mq5MQL5 / MetaTrader 5 · 2 общих теговpro +.pineTradingView · 2 общих теговofada_gold_trader_v230.mq5MQL5 / MetaTrader 5 · 2 общих теговmulti strategy algo combined by enigma mode.pineTradingView · 2 общих тегов
Вы автор или правообладатель?

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

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

О программе

PIGEON SYSTEM — это индикатор для TradingView, отображаемый поверх графика цены. Он выявляет паттерны FVG (Fair Value Gap) и фрактальные структуры, формируя сигналы BUY и SELL с процентной оценкой уверенности.

Индикатор включает множество настраиваемых фильтров: трендовые фильтры на основе EMA и ADX (с анализом старшего таймфрейма), фильтры объёма, волатильности (ATR), импульса (MACD) и RSI. Также реализована фильтрация по рыночной структуре и зонам спроса/предложения.

Для каждого сигнала рассчитывается процент уверенности на основе количества активных фильтров — сигнал генерируется при прохождении не менее 80% из них. Доступны оповещения TradingView для обоих типов сигналов, а также информационная таблица с текущим состоянием фильтров.

Поддерживается фильтр торговой сессии и визуализация зон спроса/предложения на графике.

Настройки программы

НастройкаОписание
threshold Чувствительность FVG (в тиках) — Чувствительность обнаружения FVG в тиках
fractalPeriod Период фрактала — Количество баров слева и справа для определения фрактала
minSignalSpacing Минимальное расстояние между сигналами — Минимальное количество баров между последовательными сигналами
useTrendFilter Включить трендовый фильтр — Включение/отключение трендового фильтра на основе EMA
emaLength Период EMA тренда — Период основной скользящей средней EMA для определения тренда
emaFastLength Период быстрой EMA — Период быстрой скользящей средней EMA
useStructureFilter Включить фильтр структуры — Включение/отключение фильтра рыночной структуры (Break of Structure)
useFlatMarketFilter Включить фильтр плоского рынка — Включение/отключение фильтра плоского рынка на основе ADX
mtfTimeframe Старший таймфрейм ADX — Старший таймфрейм для расчёта ADX
adxLength Период ADX — Период расчёта ADX
adxThreshold Порог ADX (старший ТФ) — Пороговое значение ADX для определения тренда на старшем таймфрейме
adxCurrentThreshold Порог ADX (текущий ТФ) — Пороговое значение ADX для определения тренда на текущем таймфрейме
useVolumeFilter Включить фильтр объёма — Включение/отключение фильтра объёма
volumeLength Период средней объёма — Период скользящей средней объёма
volumeMultiplier Множитель порога объёма — Множитель средней объёма для порога подтверждения
useATRFilter Включить фильтр ATR — Включение/отключение фильтра волатильности ATR
atrLength Период ATR — Период расчёта ATR для фильтра волатильности
atrMultiplier Минимальный множитель ATR — Минимальный множитель ATR для подтверждения волатильности
fvgSizeMultiplier Минимальный размер FVG (множитель ATR) — Минимальный множитель ATR для размера FVG
useMomentumFilter Включить фильтр импульса — Включение/отключение фильтра импульса на основе MACD
macdFast Быстрая длина MACD — Быстрая длина для расчёта MACD
macdSlow Медленная длина MACD — Медленная длина для расчёта MACD
macdSignal Период сигнальной линии MACD — Период сигнальной линии MACD
useRSIFilter Включить фильтр RSI — Включение/отключение фильтра RSI
rsiLength Период RSI — Период расчёта RSI
rsiBullishLevel Мин. уровень RSI (бычий) — Минимальный уровень RSI для подтверждения бычьего сигнала
rsiBearishLevel Макс. уровень RSI (медвежий) — Максимальный уровень RSI для подтверждения медвежьего сигнала
useSupplyDemandFilter Включить фильтр зон спроса/предложения — Включение/отключение фильтра зон спроса/предложения
zoneLookback Глубина поиска зон — Глубина поиска пивотов для обнаружения зон спроса/предложения
zoneStrength Мин. касания для силы зоны — Минимальное количество касаний зоны для признания её сильной
zoneProximity Близость к зоне (множитель ATR) — Множитель ATR для определения близости цены к зоне
breakoutConfirmation Подтверждение пробития (множитель ATR) — Множитель ATR для подтверждения пробития зоны спроса/предложения
showZones Показать зоны спроса/предложения — Отображение зон спроса и предложения на графике
useSessionFilter Включить фильтр сессии — Включение/отключение фильтра торговой сессии
tradingSession Торговая сессия — Временной диапазон торговой сессии для фильтрации сигналов
showStrength Показать уверенность сигнала — Отображение процента уверенности сигнала рядом с метками
Получить полный код

Поиск по коду файла

indicator("PIGEON SYSTEM", shorttitle = "PIGEON", overlay = true)

groupGeneral = "General Settings"
threshold = input.int(defval = 0, minval = 0, step = 1, title = "FVG Sensitivity (in Ticks)", group = groupGeneral)
fractalPeriod = input.int(defval = 2, minval = 1, step = 1, title = "Fractal Period (Left/Right Bars)", group = groupGeneral)

groupFilter1 = "Filter 1: Signal Spacing"
minSignalSpacing = input.int(50, "Minimum Bar Spacing Between Signals", minval = 1, group = groupFilter1)

groupFilter2 = "Filter 2: Trend Filter (EMA)"
useTrendFilter = input.bool(true, "Enable Trend Filter", group = groupFilter2)
emaLength = input.int(200, "EMA Length", minval = 1, group = groupFilter2)
emaFastLength = input.int(50, "Fast EMA Length", minval = 1, group = groupFilter2)

groupFilter3 = "Filter 3: Structure Filter (BoS)"
useStructureFilter = input.bool(true, "Enable Structure Filter", group = groupFilter3)

groupFilter4 = "Filter 4: Flat Market Filter (ADX)"
useFlatMarketFilter = input.bool(true, "Enable Flat Market Filter", group = groupFilter4)
mtfTimeframe = input.timeframe("240", "Higher Timeframe for ADX", group = groupFilter4)
adxLength = input.int(14, "ADX Length", minval = 1, group = groupFilter4)
adxThreshold = input.int(25, "ADX Trend Threshold (Higher TF)", minval = 1, group = groupFilter4)
adxCurrentThreshold = input.int(20, "ADX Trend Threshold (Current TF)", minval = 1, group = groupFilter4)

groupFilter5 = "Filter 5: Volume Filter"
useVolumeFilter = input.bool(true, "Enable Volume Filter", group = groupFilter5)
volumeLength = input.int(20, "Volume MA Length", minval = 1, group = groupFilter5)
volumeMultiplier = input.float(0.8, "Volume Threshold Multiplier", minval = 0.1, step = 0.1, group = groupFilter5)

groupFilter6 = "Filter 6: Volatility Filter (ATR)"
useATRFilter = input.bool(true, "Enable ATR Filter", group = groupFilter6)
atrLength = input.int(14, "ATR Length", minval = 1, group = groupFilter6)
atrMultiplier = input.float(0.5, "Min ATR Multiplier", minval = 0.1, step = 0.1, group = groupFilter6)
fvgSizeMultiplier = input.float(1.0, "Min FVG Size (ATR Multiplier)", minval = 0.1, step = 0.1, group = groupFilter6)

groupFilter7 = "Filter 7: Momentum Filter"
useMomentumFilter = input.bool(true, "Enable Momentum Filter", group = groupFilter7)
macdFast = input.int(12, "MACD Fast Length", minval = 1, group = groupFilter7)
macdSlow = input.int(26, "MACD Slow Length", minval = 1, group = groupFilter7)
macdSignal = input.int(9, "MACD Signal Length", minval = 1, group = groupFilter7)

groupFilter8 = "Filter 8: RSI Filter"
useRSIFilter = input.bool(true, "Enable RSI Filter", group = groupFilter8)
rsiLength = input.int(14, "RSI Length", minval = 1, group = groupFilter8)
rsiBullishLevel = input.int(45, "RSI Bullish Min Level", minval = 1, maxval = 100, group = groupFilter8)
rsiBearishLevel = input.int(55, "RSI Bearish Max Level", minval = 1, maxval = 100, group = groupFilter8)

groupFilter9 = "Filter 9: Supply/Demand Zone Filter"
useSupplyDemandFilter = input.bool(true, "Enable Supply/Demand Filter", group = groupFilter9)
zoneLookback = input.int(50, "Zone Detection Lookback", minval = 10, group = groupFilter9)
zoneStrength = input.int(2, "Min Zone Touches for Strength", minval = 1, group = groupFilter9)
zoneProximity = input.float(2.0, "Zone Proximity (ATR Multiplier)", minval = 0.5, step = 0.5, group = groupFilter9)
breakoutConfirmation = input.float(1.5, "Breakout Confirmation (ATR Multiplier)", minval = 0.5, step = 0.5, group = groupFilter9)
showZones = input.bool(true, "Show Supply/Demand Zones", group = groupFilter9)

groupFilter10 = "Filter 10: Market Session Filter"
useSessionFilter = input.bool(false, "Enable Session Filter", group = groupFilter10)
tradingSession = input.session("0930-1600", "Trading Session", group = groupFilter10)

groupDisplay = "Display Settings"
showStrength = input.bool(true, "Show Signal Strength", group = groupDisplay)

var int lastSignalBar = 0

emaValue = ta.ema(close, emaLength)
emaFastValue = ta.ema(close, emaFastLength)
isBullishTrend = close > emaValue and emaFastValue > emaValue
isBearishTrend = close < emaValue and emaFastValue < emaValue

plot(useTrendFilter ? emaValue : na, "Trend EMA", color = color.new(color.white, 70), linewidth = 2, style=plot.style_circles)
plot(useTrendFilter ? emaFastValue : na, "Fast EMA", color = color.new(color.yellow, 80), linewidth = 1)

[diPlus, diMinus, adxValue] = ta.dmi(adxLength, adxLength)
mtfAdxValue = request.security(syminfo.tickerid, mtfTimeframe, adxValue, barmerge.gaps_off, barmerge.lookahead_on)
isTrendingMarketHTF = mtfAdxValue > adxThreshold
isTrendingMarketCTF = adxValue > adxCurrentThreshold
isTrendingMarket = isTrendingMarketHTF and isTrendingMarketCTF

volumeMA = ta.sma(volume, volumeLength)
isVolumeConfirmed = volume > volumeMA * volumeMultiplier

atrValue = ta.atr(atrLength)
atrMA = ta.sma(atrValue, atrLength)
isVolatilityConfirmed = atrValue > atrMA * atrMultiplier

[macdLine, signalLine, _] = ta.macd(close, macdFast, macdSlow, macdSignal)
isBullishMomentum = macdLine > signalLine and macdLine > 0
isBearishMomentum = macdLine < signalLine and macdLine < 0

rsiValue = ta.rsi(close, rsiLength)
rsiBullishConfirmed = rsiValue > rsiBullishLevel and rsiValue < 70
rsiBearishConfirmed = rsiValue < rsiBearishLevel and rsiValue > 30

inSession = not useSessionFilter or time(timeframe.period, tradingSession) != 0

pivotHigh = ta.pivothigh(high, zoneLookback/4, zoneLookback/4)
pivotLow = ta.pivotlow(low, zoneLookback/4, zoneLookback/4)

var array<float> supplyZones = array.new<float>()
var array<float> demandZones = array.new<float>()
var array<int> supplyTouches = array.new<int>()
var array<int> demandTouches = array.new<int>()
var array<bool> supplyBroken = array.new<bool>()
var array<bool> demandBroken = array.new<bool>()

if not na(pivotHigh)

    array.push(supplyZones, pivotHigh)
    array.push(supplyTouches, 1)
    array.push(supplyBroken, false)

    if array.size(supplyZones) > 10
        array.shift(supplyZones)
        array.shift(supplyTouches)
        array.shift(supplyBroken)

if not na(pivotLow)

    array.push(demandZones, pivotLow)
    array.push(demandTouches, 1)
    array.push(demandBroken, false)

    if array.size(demandZones) > 10
        array.shift(demandZones)
        array.shift(demandTouches)
        array.shift(demandBroken)

if array.size(supplyZones) > 0
    for i = 0 to array.size(supplyZones) - 1
        zoneLevel = array.get(supplyZones, i)
        isBroken = array.get(supplyBroken, i)

        if not isBroken and math.abs(high - zoneLevel) <= atrValue * 0.5
            currentTouches = array.get(supplyTouches, i)
            array.set(supplyTouches, i, currentTouches + 1)

        if not isBroken and close > zoneLevel + (atrValue * breakoutConfirmation)
            array.set(supplyBroken, i, true)

if array.size(demandZones) > 0
    for i = 0 to array.size(demandZones) - 1
        zoneLevel = array.get(demandZones, i)
        isBroken = array.get(demandBroken, i)

        if not isBroken and math.abs(low - zoneLevel) <= atrValue * 0.5
            currentTouches = array.get(demandTouches, i)
            array.set(demandTouches, i, currentTouches + 1)

        if not isBroken and close < zoneLevel - (atrValue * breakoutConfirmation)
            array.set(demandBroken, i, true)

nearestStrongSupply = 0.0
nearestStrongDemand = 0.0
isNearStrongSupply = false
isNearStrongDemand = false

if array.size(supplyZones) > 0
    for i = 0 to array.size(supplyZones) - 1
        zoneLevel = array.get(supplyZones, i)
        touches = array.get(supplyTouches, i)
        isBroken = array.get(supplyBroken, i)

        if not isBroken and touches >= zoneStrength and close <= zoneLevel + (atrValue * zoneProximity)
            nearestStrongSupply := zoneLevel
            isNearStrongSupply := true

if array.size(demandZones) > 0
    for i = 0 to array.size(demandZones) - 1
        zoneLevel = array.get(demandZones, i)
        touches = array.get(demandTouches, i)
        isBroken = array.get(demandBroken, i)

        if not isBroken and touches >= zoneStrength and close >= zoneLevel - (atrValue * zoneProximity)
            nearestStrongDemand := zoneLevel
            isNearStrongDemand := true

if showZones and useSupplyDemandFilter
    if array.size(supplyZones) > 0
        for i = 0 to array.size(supplyZones) - 1
            zoneLevel = array.get(supplyZones, i)
            touches = array.get(supplyTouches, i)
            isBroken = array.get(supplyBroken, i)

            if not isBroken and touches >= zoneStrength
                zoneColor = touches >= zoneStrength * 2 ? color.new(color.red, 85) : color.new(color.orange, 85)
                line.new(bar_index - zoneLookback, zoneLevel, bar_index, zoneLevel, color=zoneColor, width=2, style=line.style_dashed)

    if array.size(demandZones) > 0
        for i = 0 to array.size(demandZones) - 1
            zoneLevel = array.get(demandZones, i)
           

Показано первые 50% кода (символов: 15068)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 506,80₽ ≈ $18.42