В мире трейдинга скорость и точность принятия решений играют ключевую роль. Отслеживание множества активов вручную — задача трудоемкая и часто неэффективная. Именно здесь на помощь приходят кастомные скринеры. В этой статье мы, как Senior Quant Developer, разработаем мощный и гибкий скринер на Pine Script v5, который позволит вам автоматически мониторить MACD кроссоверы на 40 различных тикерах.
MACD (Moving Average Convergence Divergence) — один из самых популярных индикаторов импульса, используемый для определения силы, направления, импульса и продолжительности тренда. Его кроссоверы часто сигнализируют о потенциальных точках входа или выхода из позиции. Наш скрипт будет не только выявлять эти кроссоверы, но и агрегировать информацию для удобного отображения и оповещения.
Мы будем использовать функцию request.security() для получения данных по каждому тикеру, что является краеугольным камнем для создания мульти-тикерных скриптов в Pine Script. Для эффективного управления алертами и обхода стандартных ограничений TradingView, мы применим подход с JSON-мультиплексированием, о котором подробнее можно прочитать в нашей статье: TradingView: Обход лимита 500 алертов Pine Script v5 через JSON мультиплексирование.
Исходный код
Ниже представлен полный исходный код скрипта. Он включает в себя определение параметров MACD, список тикеров, логику для получения данных и обнаружения кроссоверов, а также механизм для отображения результатов и генерации алертов.
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FinFluct
//@version=5
indicator('MACD Screener (40 Tickers)', 'MACD Screener', overlay=true, max_labels_count=50, max_lines_count=0)
// --- Input Parameters ---
fastLength = input.int(12, 'MACD Fast Length', minval=1)
slowLength = input.int(26, 'MACD Slow Length', minval=1)
signalLength = input.int(9, 'MACD Signal Length', minval=1)
showLabels = input.bool(true, 'Show Crossover Labels on Chart')
showAlerts = input.bool(true, 'Enable Aggregated JSON Alerts')
// List of 40 tickers to monitor
tickerList = array.new(
[
'AAPL', 'MSFT', 'GOOGL', 'AMZN', 'NVDA', 'TSLA', 'META', 'BRK.B', 'JPM', 'V',
'JNJ', 'PG', 'XOM', 'CVX', 'HD', 'LLY', 'UNH', 'MA', 'BAC', 'KO',
'PEP', 'WMT', 'MCD', 'CRM', 'ADBE', 'NFLX', 'CMCSA', 'TMO', 'COST', 'ORCL',
'AMD', 'QCOM', 'DHR', 'TXN', 'SBUX', 'INTU', 'AMGN', 'GE', 'BA', 'CAT'
]
)
// --- MACD Calculation Function ---
// Encapsulates MACD calculation for reusability
macd(source, fastLen, slowLen, signalLen) =>
fastMA = ta.ema(source, fastLen)
slowMA = ta.ema(source, slowLen)
macdLine = fastMA - slowMA
signalLine = ta.ema(macdLine, signalLen)
[macdLine, signalLine]
// --- Main Logic ---
var string[] activeSignals = array.new()
// Clear labels on each new bar to avoid clutter
if barstate.islast and showLabels
label.delete(label.all)
// Iterate through each ticker in the list
for i = 0 to array.size(tickerList) - 1
currentTicker = array.get(tickerList, i)
// Request MACD data for the current ticker
// Use 'close' as source, and request data from the current timeframe
[macdLine, signalLine] = request.security(currentTicker, timeframe.period, macd(close, fastLength, slowLength, signalLength)[0], lookahead=barmerge.lookahead_on)
[prevMacdLine, prevSignalLine] = request.security(currentTicker, timeframe.period, macd(close, fastLength, slowLength, signalLength)[1], lookahead=barmerge.lookahead_on)
// Check for crossovers on the last completed bar
bullishCrossover = ta.crossover(macdLine, signalLine)
bearishCrossover = ta.crossunder(macdLine, signalLine)
// Store signal information
if bullishCrossover
array.push(activeSignals, '{"ticker":"' + currentTicker + '", "signal":"BULLISH_MACD_CROSSOVER", "time":"' + str.format('{0,date,yyyy-MM-dd HH:mm}', time) + '"}')
if showLabels and barstate.islastconfirmedhistory
label.new(bar_index, high, '▲ ' + currentTicker + '\nMACD Bullish',
xloc=xloc.bar_index, yloc=yloc.abovebar,
color=color.new(color.green, 20), textcolor=color.white,
style=label.style_label_down, size=size.small)
else if bearishCrossover
array.push(activeSignals, '{"ticker":"' + currentTicker + '", "signal":"BEARISH_MACD_CROSSOVER", "time":"' + str.format('{0,date,yyyy-MM-dd HH:mm}', time) + '"}')
if showLabels and barstate.islastconfirmedhistory
label.new(bar_index, low, '▼ ' + currentTicker + '\nMACD Bearish',
xloc=xloc.bar_index, yloc=yloc.belowbar,
color=color.new(color.red, 20), textcolor=color.white,
style=label.style_label_up, size=size.small)
// --- Aggregated Alert Generation ---
if barstate.islast and showAlerts
if array.size(activeSignals) > 0
// Construct a single JSON string with all active signals
jsonAlert = '{"timestamp":"' + str.format('{0,date,yyyy-MM-dd HH:mm:ss}', time) + '", "signals":[' + array.join(activeSignals, ',') + ']}'
// Generate an alert with the aggregated JSON
alert(jsonAlert, alert.freq_once_per_bar)
else
// Optionally send a 'no signals' alert if desired
// alert('{"timestamp":"' + str.format('{0,date,yyyy-MM-dd HH:mm:ss}', time) + '", "signals":[]}', alert.freq_once_per_bar)
pass
// --- Plotting (Optional, for debugging or visual confirmation on the main chart) ---
// You can plot MACD for the current chart's ticker if desired
// [currentMacdLine, currentSignalLine] = macd(close, fastLength, slowLength, signalLength)
// plot(currentMacdLine, 'MACD Line', color.blue)
// plot(currentSignalLine, 'Signal Line', color.orange)
Разбор параметров
Скрипт предоставляет несколько настраиваемых параметров, которые позволяют адаптировать его под ваши торговые стратегии и предпочтения.
fastLength: Длина быстрой скользящей средней для расчета MACD. Стандартное значение — 12.slowLength: Длина медленной скользящей средней для расчета MACD. Стандартное значение — 26.signalLength: Длина скользящей средней для сигнальной линии MACD. Стандартное значение — 9.showLabels: Булево значение. Если установлено вtrue, скрипт будет отображать текстовые метки (labels) на графике для каждого обнаруженного кроссовера. Это удобно для визуального подтверждения.showAlerts: Булево значение. Если установлено вtrue, скрипт будет генерировать агрегированные JSON-алерты при обнаружении кроссоверов. Это критически важно для интеграции с внешними системами.tickerList: Массив строк, содержащий символы (тикеры) активов, которые вы хотите отслеживать. В примере представлен список из 40 популярных акций. Вы можете изменить этот список, добавив или удалив тикеры по своему усмотрению.
Как запустить
Чтобы использовать этот скринер, выполните следующие шаги:
-
Откройте TradingView: Перейдите на сайт TradingView и откройте любой график (например, SPY или BTCUSD). Наш скринер будет работать на этом графике, но собирать данные для других тикеров.
-
Откройте Pine Editor: В нижней части экрана TradingView найдите вкладку ‘Pine Editor’ и откройте ее.
-
Вставьте код: Удалите весь существующий код в редакторе и вставьте предоставленный выше Pine Script код.
-
Добавьте на график: Нажмите кнопку ‘Add to Chart’ (Добавить на график) в правом верхнем углу Pine Editor.
-
Настройте параметры: После добавления скрипта на график, он появится в списке индикаторов. Нажмите на значок шестеренки (Настройки) рядом с названием ‘MACD Screener (40 Tickers)’. Здесь вы можете настроить
fastLength,slowLength,signalLength, а также включить или выключить отображение меток (showLabels) и алертов (showAlerts). Самое главное — вы можете изменить список тикеров в переменнойtickerListпрямо в коде, если вам нужны другие активы. -
Настройте алерты (опционально): Если вы включили
showAlerts, вы можете настроить алерты TradingView. Для этого:- Нажмите правой кнопкой мыши на графике или на значок будильника в верхней панели.
- Выберите ‘Add alert’ (Добавить алерт).
- В поле ‘Condition’ (Условие) выберите ваш скрипт ‘MACD Screener (40 Tickers)’.
- В поле ‘Action’ (Действие) выберите ‘Webhook URL’ и/или ‘Show popup’/’Send email’ в зависимости от ваших потребностей.
- В поле ‘Message’ (Сообщение) вставьте
{{json}}. Это позволит скрипту отправлять агрегированный JSON-объект, содержащий все активные сигналы, что является отличным способом обойти лимит в 500 алертов. Подробнее об этом можно узнать в нашей статье: TradingView: Обход лимита 500 алертов Pine Script v5 через JSON мультиплексирование. - Установите ‘Frequency’ (Частота) на ‘Once per bar’ (Один раз за бар) или ‘Once per bar Close’ (Один раз при закрытии бара) для стабильной работы.
- Нажмите ‘Create’ (Создать).
Теперь ваш кастомный скринер будет активно мониторить MACD кроссоверы на всех 40 заданных тикерах. Вы будете получать визуальные уведомления на графике (если showLabels включено) и/или агрегированные JSON-алерты, которые можно интегрировать с вашими торговыми ботами или другими системами. Это значительно упрощает процесс отслеживания рынка и позволяет сосредоточиться на анализе и принятии решений, а не на ручном поиске сигналов.
Для более глубокого понимания работы с Pine Script и создания сложных торговых систем, рекомендуем ознакомиться с нашими другими статьями, такими как Бэктест пирамидинга в Pine Script v5: Средняя цена входа или Индикатор профиля дельты (Delta Profile) по барам с Intrabar Inspection в Pine Script v5.




