PIGEON SYSTEM
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «pigeon system_5962808620088302236.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.