Исходный код
Представленный ниже код 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, выполните следующие шаги:
- Откройте TradingView и перейдите на любой график.
- В нижней части экрана найдите вкладку ‘Pine Editor’ и откройте ее.
- Удалите весь существующий код в редакторе и вставьте код, представленный выше.
- Нажмите кнопку ‘Save’ (Сохранить) и затем ‘Add to Chart’ (Добавить на график).
- Индикатор появится на вашем графике в виде таблицы в правом верхнем углу, отображая текущую относительную волатильность выбранных криптопар.
- Вы можете настроить параметры индикатора, такие как
ATR Length,Timeframe for Symbolsи списокCrypto Pairs, через меню настроек индикатора на графике.
При разработке торговых стратегий, основанных на волатильности, часто возникает необходимость в гибком управлении позициями. Узнайте, как реализовать Частичный Take Profit в Pine Script v5.
Если вы хотите экспериментировать с другими типами взвешенных средних, например, для анализа объема, наша статья про VWMA с кастомными весами через матрицы в Pine Script v5 будет очень полезна.




