Создание Heatmap Волатильности Криптопар с Нормализованным ATR в Pine Script v5

Создание Heatmap Волатильности Криптопар с Нормализованным ATR в Pine Script v5 Pine Script
Пошаговое руководство по созданию тепловой карты волатильности криптопар на основе нормализованного ATR в Pine Script v5. Визуализируйте рыночную активность и принимайте обоснованные решения.
Суть: Создание тепловой карты волатильности криптопар на основе нормализованного ATR в Pine Script v5 позволяет визуализировать относительную активность различных активов, помогая выявлять наиболее или наименее волатильные инструменты для торговых стратегий.

Исходный код

Представленный ниже код Pine Script v5 создает тепловую карту волатильности для заданного списка криптопар. Он использует индикатор Average True Range (ATR) для измерения волатильности каждого актива, затем нормализует эти значения относительно общей волатильности всех выбранных пар. Результат отображается в виде таблицы на графике, где цвет ячейки указывает на относительную волатильность: от зеленого (низкая) до красного (высокая).

Для более глубокого понимания работы с индикаторами и стратегиями в Pine Script, рекомендуем ознакомиться с нашей статьей о Кастомном ZigZag с фильтрацией по объему в Pine Script v5.


//@version=5
indicator('Crypto Volatility Heatmap (Normalized ATR)', 'CryptoVolHeatmap', true, max_bars_back=500)

// --- Inputs ---
atrLength = input.int(14, 'ATR Length', minval=1, group='Settings')
timeframe = input.timeframe('D', 'Timeframe for Symbols', group='Settings')
symbolsInput = input.string('BINANCE:BTCUSDT,BINANCE:ETHUSDT,BINANCE:SOLUSDT,BINANCE:BNBUSDT,BINANCE:XRPUSDT,BINANCE:ADAUSDT', 'Crypto Pairs (comma-separated)', group='Symbols')

// Parse the input string into an array of symbols
var string[] symbols = str.split(symbolsInput, ',')

// --- Data Collection and Normalization ---
// Initialize arrays to store ATRs and normalized ATRs
var float[] atrs = array.new_float(array.size(symbols))
var float[] normalizedAtrs = array.new_float(array.size(symbols))

// Request ATR for each symbol
for i = 0 to array.size(symbols) - 1
    symbol = array.get(symbols, i)
    // Fetch ATR for the specific symbol and timeframe using request.security
    symbolAtr = request.security(symbol, timeframe, ta.atr(atrLength))
    array.set(atrs, i, symbolAtr)

// Calculate the sum of current ATRs for normalization
float sumAtrs = 0.0
for i = 0 to array.size(atrs) - 1
    sumAtrs += array.get(atrs, i)

// Normalize ATRs: current_ATR / sum_of_all_ATRs
if sumAtrs > 0
    for i = 0 to array.size(atrs) - 1
        currentAtr = array.get(atrs, i)
        normalizedVal = currentAtr / sumAtrs
        array.set(normalizedAtrs, i, normalizedVal)

// --- Heatmap Visualization (Table) ---
// Create a table to display the heatmap. It's created once (var) and updated on the last bar.
var table heatmapTable = table.new(position.top_right, 2, array.size(symbols) + 1, bgcolor=color.rgb(30, 30, 30, 90), border_width=1, border_color=color.gray)

// Update the table only on the last bar to avoid flickering and unnecessary redraws
if barstate.islast
    // Set table headers
    table.cell(heatmapTable, 0, 0, 'Symbol', text_color=color.white, bgcolor=color.rgb(50, 50, 50))
    table.cell(heatmapTable, 1, 0, 'Norm. ATR', text_color=color.white, bgcolor=color.rgb(50, 50, 50))

    // Find the maximum normalized ATR to scale the color gradient effectively
    float maxNormAtr = 0.0
    for i = 0 to array.size(normalizedAtrs) - 1
        if array.get(normalizedAtrs, i) > maxNormAtr
            maxNormAtr := array.get(normalizedAtrs, i)

    // Populate the table with symbol data and colored cells
    for i = 0 to array.size(symbols) - 1
        symbol = array.get(symbols, i)
        normAtr = array.get(normalizedAtrs, i)

        // Scale normalized ATR to a 0-1 range based on the maximum observed value
        // This ensures the gradient covers the full spectrum of observed volatility.
        float scaledNormAtr = maxNormAtr > 0 ? normAtr / maxNormAtr : 0.0

        // Determine cell color using a gradient from green (low volatility) to red (high volatility)
        cellColor = color.from_gradient(scaledNormAtr, 0, 1, color.green, color.red)
        
        // Add symbol name to the first column
        table.cell(heatmapTable, 0, i + 1, symbol, text_color=color.white)
        // Add normalized ATR value and apply background color based on volatility
        table.cell(heatmapTable, 1, i + 1, str.tostring(normAtr, '#.#####'), text_color=color.white, bgcolor=cellColor)

// Plotting a dummy value to keep the indicator on the chart if no other plots are present
plot(na, title='Invisible Plot', display=display.none)

Разбор параметров

  • atrLength: Длина периода для расчета Average True Range (ATR). Стандартное значение — 14. Чем больше значение, тем более сглаженным будет индикатор волатильности.
  • timeframe: Таймфрейм, на котором будут запрашиваться данные для каждого символа. Например, ‘D’ для дневного таймфрейма, ‘4H’ для 4-часового. Важно, чтобы этот таймфрейм был доступен для всех указанных символов.
  • symbolsInput: Строка, содержащая список криптопар, разделенных запятыми. Например, 'BINANCE:BTCUSDT,BINANCE:ETHUSDT,BINANCE:SOLUSDT'. Убедитесь, что указанные символы доступны на вашей бирже в TradingView.

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

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

  1. Откройте TradingView и перейдите на любой график.
  2. В нижней части экрана найдите вкладку ‘Pine Editor’ и откройте ее.
  3. Удалите весь существующий код в редакторе и вставьте код, представленный выше.
  4. Нажмите кнопку ‘Save’ (Сохранить) и затем ‘Add to Chart’ (Добавить на график).
  5. Индикатор появится на вашем графике в виде таблицы в правом верхнем углу, отображая текущую относительную волатильность выбранных криптопар.
  6. Вы можете настроить параметры индикатора, такие как ATR Length, Timeframe for Symbols и список Crypto Pairs, через меню настроек индикатора на графике.

При разработке торговых стратегий, основанных на волатильности, часто возникает необходимость в гибком управлении позициями. Узнайте, как реализовать Частичный Take Profit в Pine Script v5.

Если вы хотите экспериментировать с другими типами взвешенных средних, например, для анализа объема, наша статья про VWMA с кастомными весами через матрицы в Pine Script v5 будет очень полезна.

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