request.all_trades() для доступа к тиковым данным. Это позволяет трейдерам видеть распределение агрессивных покупок и продаж на каждом ценовом уровне в рамках одной свечи, выявляя зоны дисбаланса и потенциальные точки разворота или продолжения движения.Исходный код
Индикатор профиля дельты (Delta Profile) является мощным инструментом для анализа потока ордеров, позволяющим увидеть, как агрессивные покупатели и продавцы взаимодействуют на различных ценовых уровнях внутри каждой свечи. В Pine Script v5 это стало возможным благодаря функции request.all_trades(), которая предоставляет доступ к тиковым данным (каждой сделке) внутри текущего бара.
Представленный ниже код создает индикатор, который для каждого бара:
- Запрашивает все сделки, произошедшие в течение этого бара.
- Группирует сделки по ценовым уровням, используя заданный
Tick Size. - Рассчитывает дельту (объем покупок минус объем продаж) для каждого ценового уровня.
- Визуализирует эти дельты в виде горизонтальных прямоугольников, расположенных рядом с баром, с цветом, указывающим на положительную (покупки) или отрицательную (продажи) дельту.
Этот подход позволяет получить глубокое понимание динамики рынка, выявляя, где именно происходили агрессивные действия участников. Например, если вы видите значительную положительную дельту на минимуме бара, это может указывать на сильное поглощение продаж покупателями. Для более продвинутого анализа потока ордеров, вы можете комбинировать этот индикатор с другими инструментами, такими как индикатор дивергенций или трейлинг-стоп по теням свечей для улучшения вашей торговой стратегии.
//@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, выполните следующие шаги:
- Откройте TradingView и выберите нужный торговый инструмент и таймфрейм.
- Нажмите на кнопку 'Pine Script Editor' в нижней части экрана.
- Удалите весь существующий код в редакторе.
- Скопируйте предоставленный выше исходный код и вставьте его в редактор Pine Script.
- Нажмите кнопку 'Добавить на график' (Add to Chart).
- Индикатор появится на вашем графике. Вы можете настроить его параметры через меню 'Настройки' (Settings) индикатора, чтобы адаптировать его под свои предпочтения.
Использование request.all_trades() может быть ресурсоемким, особенно на низких таймфреймах или при большом количестве исторических данных. Убедитесь, что ваш тарифный план TradingView поддерживает эту функцию и что вы не превышаете лимиты платформы. Для управления большим количеством алертов или сложной логикой, требующей обработки множества событий, может быть полезно ознакомиться с методами обхода лимита 500 алертов Pine Script v5 через JSON мультиплексирование.




