Индикатор профиля дельты (Delta Profile) по барам с Intrabar Inspection в Pine Script v5

Индикатор профиля дельты (Delta Profile) по барам с Intrabar Inspection в Pine Script v5 Pine Script
Создайте мощный индикатор профиля дельты для каждого бара в Pine Script v5, используя внутрибаровый анализ (Intrabar Inspection) и функцию request.all_trades() для точного определения дисбаланса покупателей и продавцов.
Суть: Индикатор профиля дельты по барам с внутрибаровым анализом визуализирует кумулятивную дельту (разницу между объемом покупок и продаж) для каждого ценового уровня внутри текущего бара, используя функцию request.all_trades() для доступа к тиковым данным. Это позволяет трейдерам видеть распределение агрессивных покупок и продаж на каждом ценовом уровне в рамках одной свечи, выявляя зоны дисбаланса и потенциальные точки разворота или продолжения движения.

Исходный код

Индикатор профиля дельты (Delta Profile) является мощным инструментом для анализа потока ордеров, позволяющим увидеть, как агрессивные покупатели и продавцы взаимодействуют на различных ценовых уровнях внутри каждой свечи. В Pine Script v5 это стало возможным благодаря функции request.all_trades(), которая предоставляет доступ к тиковым данным (каждой сделке) внутри текущего бара.

Представленный ниже код создает индикатор, который для каждого бара:

  1. Запрашивает все сделки, произошедшие в течение этого бара.
  2. Группирует сделки по ценовым уровням, используя заданный Tick Size.
  3. Рассчитывает дельту (объем покупок минус объем продаж) для каждого ценового уровня.
  4. Визуализирует эти дельты в виде горизонтальных прямоугольников, расположенных рядом с баром, с цветом, указывающим на положительную (покупки) или отрицательную (продажи) дельту.

Этот подход позволяет получить глубокое понимание динамики рынка, выявляя, где именно происходили агрессивные действия участников. Например, если вы видите значительную положительную дельту на минимуме бара, это может указывать на сильное поглощение продаж покупателями. Для более продвинутого анализа потока ордеров, вы можете комбинировать этот индикатор с другими инструментами, такими как индикатор дивергенций или трейлинг-стоп по теням свечей для улучшения вашей торговой стратегии.


//@version=5
indicator("Delta Profile (Intrabar Inspection)", overlay=true, max_boxes_count=500, max_labels_count=500, scaleid="DeltaProfile")

// Inputs
var int    i_tickSize      = input.int(1,     "Tick Size (for grouping)", minval=1)
var int    i_maxLevels     = input.int(20,    "Max Profile Levels per Bar", minval=1, maxval=50)
var float  i_profileWidth  = input.float(0.1, "Profile Width (0.0-1.0)", minval=0.01, maxval=1.0)
var color  i_positiveColor = input.color(color.new(#00FF00, 50), "Positive Delta Color")
var color  i_negativeColor = input.color(color.new(#FF0000, 50), "Negative Delta Color")
var color  i_neutralColor  = input.color(color.new(#808080, 70), "Neutral Delta Color")
var bool   i_showLabels    = input.bool(false, "Show Delta Labels")

// Struct to hold price and delta for a level
struct LevelDelta
    float price
    float delta

// Map to accumulate delta for each price level
var deltaMap = map.new()

// Clear map at the start of each bar
if barstate.isrealtime or barstate.isnew
    deltaMap.clear()

// Request all trades for the current bar
var trades = request.all_trades()

// Process trades
if array.size(trades) > 0
    for trade in trades
        float currentPrice = trade.price
        float volume       = trade.volume
        bool  isBuy        = trade.is_buy

        // Group price to the nearest tick size
        float groupedPrice = math.round(currentPrice / i_tickSize) * i_tickSize

        float currentDelta = deltaMap.get(groupedPrice, 0.0) // Get existing delta or 0
        if isBuy
            deltaMap.put(groupedPrice, currentDelta + volume)
        else
            deltaMap.put(groupedPrice, currentDelta - volume)

// Convert map to array of LevelDelta structs for sorting and limiting
var profileLevels = array.new()
if barstate.isrealtime or barstate.isnew or barstate.isconfirmed
    array.clear(profileLevels)
    
    // Iterate map and populate array
    array keys = deltaMap.keys()
    for key in keys
        float price = key
        float delta = deltaMap.get(key)
        array.push(profileLevels, LevelDelta.new(price, delta))

    // Sort by delta magnitude and take the top `i_maxLevels`
    array.sort(profileLevels, (a, b) => math.abs(a.delta) > math.abs(b.delta))
    if array.size(profileLevels) > i_maxLevels
        profileLevels := array.slice(profileLevels, 0, i_maxLevels)
    array.sort(profileLevels, (a, b) => a.price < b.price) // Re-sort by price for visual order

// Plotting the profile
if barstate.isconfirmed // Only draw confirmed bars
    // Calculate x-coordinates for the profile boxes, centered on the bar
    float x1_coord = bar_index + (1 - i_profileWidth) / 2
    float x2_coord = bar_index + (1 + i_profileWidth) / 2

    for i = 0 to array.size(profileLevels) - 1
        LevelDelta level = array.get(profileLevels, i)
        float price = level.price
        float delta = level.delta

        color boxColor = delta > 0 ? i_positiveColor : (delta < 0 ? i_negativeColor : i_neutralColor)

        // Draw box for the delta profile
        box.new(x1=x1_coord, y1=price, x2=x2_coord, y2=price + i_tickSize, 
                border_color=na, bgcolor=boxColor, xloc=xloc.bar_index)
        
        // Optionally show delta labels
        if i_showLabels
            label.new(x=x2_coord, y=price + i_tickSize/2, text=str.tostring(delta, "#.##"),
                      xloc=xloc.bar_index, yloc=yloc.price, color=color.white, textcolor=color.black, size=size.tiny, style=label.style_label_left)

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

  • i_tickSize: Определяет размер ценового шага (тика), по которому будут группироваться сделки. Например, если i_tickSize = 1, сделки будут группироваться по каждому целому пункту цены. Если i_tickSize = 0.5, то по 0.5, 1.0, 1.5 и т.д.
  • i_maxLevels: Максимальное количество ценовых уровней с дельтой, которые будут отображаться для каждого бара. Это помогает управлять производительностью и читаемостью графика, особенно на инструментах с высокой волатильностью и большим количеством сделок. Сортировка по абсолютной величине дельты позволяет отображать наиболее значимые уровни.
  • i_profileWidth: Ширина отображаемого профиля дельты относительно ширины бара. Значение от 0.0 до 1.0, где 1.0 означает полную ширину бара.
  • i_positiveColor: Цвет для отображения ценовых уровней с положительной дельтой (преобладание покупок).
  • i_negativeColor: Цвет для отображения ценовых уровней с отрицательной дельтой (преобладание продаж).
  • i_neutralColor: Цвет для отображения ценовых уровней с нулевой дельтой.
  • i_showLabels: Логический параметр, который при значении true будет отображать числовые значения дельты рядом с каждым уровнем профиля.

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

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

  1. Откройте TradingView и выберите нужный торговый инструмент и таймфрейм.
  2. Нажмите на кнопку 'Pine Script Editor' в нижней части экрана.
  3. Удалите весь существующий код в редакторе.
  4. Скопируйте предоставленный выше исходный код и вставьте его в редактор Pine Script.
  5. Нажмите кнопку 'Добавить на график' (Add to Chart).
  6. Индикатор появится на вашем графике. Вы можете настроить его параметры через меню 'Настройки' (Settings) индикатора, чтобы адаптировать его под свои предпочтения.

Использование request.all_trades() может быть ресурсоемким, особенно на низких таймфреймах или при большом количестве исторических данных. Убедитесь, что ваш тарифный план TradingView поддерживает эту функцию и что вы не превышаете лимиты платформы. Для управления большим количеством алертов или сложной логикой, требующей обработки множества событий, может быть полезно ознакомиться с методами обхода лимита 500 алертов Pine Script v5 через JSON мультиплексирование.

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