Pine Script v5: Скринер MACD кроссоверов для 40 тикеров

Pine Script v5: Скринер MACD кроссоверов для 40 тикеров Pine Script
Создайте кастомный скринер в Pine Script v5 для отслеживания бычьих и медвежьих MACD кроссоверов на 40 тикерах. Подробная инструкция с кодом и настройками алертов.
Суть: Данная статья предоставляет готовый Pine Script v5 код для создания кастомного скринера, который отслеживает бычьи и медвежьи MACD кроссоверы на списке из 40 заданных тикеров. Скрипт отображает текущий статус кроссоверов на графике и генерирует агрегированные JSON-алерты для внешних систем, эффективно обходя лимит алертов TradingView.

В мире трейдинга скорость и точность принятия решений играют ключевую роль. Отслеживание множества активов вручную — задача трудоемкая и часто неэффективная. Именно здесь на помощь приходят кастомные скринеры. В этой статье мы, как 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 популярных акций. Вы можете изменить этот список, добавив или удалив тикеры по своему усмотрению.

Как запустить

Чтобы использовать этот скринер, выполните следующие шаги:

  1. Откройте TradingView: Перейдите на сайт TradingView и откройте любой график (например, SPY или BTCUSD). Наш скринер будет работать на этом графике, но собирать данные для других тикеров.

  2. Откройте Pine Editor: В нижней части экрана TradingView найдите вкладку ‘Pine Editor’ и откройте ее.

  3. Вставьте код: Удалите весь существующий код в редакторе и вставьте предоставленный выше Pine Script код.

  4. Добавьте на график: Нажмите кнопку ‘Add to Chart’ (Добавить на график) в правом верхнем углу Pine Editor.

  5. Настройте параметры: После добавления скрипта на график, он появится в списке индикаторов. Нажмите на значок шестеренки (Настройки) рядом с названием ‘MACD Screener (40 Tickers)’. Здесь вы можете настроить fastLength, slowLength, signalLength, а также включить или выключить отображение меток (showLabels) и алертов (showAlerts). Самое главное — вы можете изменить список тикеров в переменной tickerList прямо в коде, если вам нужны другие активы.

  6. Настройте алерты (опционально): Если вы включили 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.

Оцените статью
FinFluct