Исходный код
Гамма-экспозиция (GEX) — важнейший показатель для понимания механики современного рынка. Маркет-мейкеры, продающие опционы ритейл-трейдерам, вынуждены динамически хеджировать свои позиции базовым активом. Когда цена приближается к крупным опционным уровням, объемы этого хеджирования резко возрастают, что приводит к стабилизации цены (при положительной гамме) или к ускорению тренда (при отрицательной гамме).
Для точного расчета GEX нам необходимо вычислить классическую Гамму опциона по модели Блэка-Шоулза для каждого уровня страйка, а затем взвесить ее на открытый интерес (Open Interest) и знак позиции. Ниже представлен готовый скрипт на Pine Script v5, реализующий этот математический аппарат.
//@version=5
indicator('Gamma Exposure (GEX) Levels', overlay=true)
// Black-Scholes Gamma Calculation
gammaBS(float S, float K, float t, float sigma, float r) =>
if t <= 0 or sigma <= 0 or S <= 0 or K <= 0
0.0
else
float d1 = (math.log(S / K) + (r + math.pow(sigma, 2) / 2.0) * t) / (sigma * math.sqrt(t))
float n_prime = math.exp(-math.pow(d1, 2) / 2.0) / math.sqrt(2.0 * math.pi)
float gamma = n_prime / (S * sigma * math.sqrt(t))
gamma
// Inputs
float dte = input.float(7.0, 'Days to Expiration (DTE)') / 365.0
float r = input.float(0.05, 'Risk-Free Rate (r)')
// Option Levels Configuration
strike_1 = input.float(400.0, 'Strike 1')
oi_call_1 = input.float(5000.0, 'OI Call 1')
oi_put_1 = input.float(3000.0, 'OI Put 1')
iv_1 = input.float(0.20, 'IV 1')
strike_2 = input.float(410.0, 'Strike 2')
oi_call_2 = input.float(8000.0, 'OI Call 2')
oi_put_2 = input.float(2000.0, 'OI Put 2')
iv_2 = input.float(0.18, 'IV 2')
strike_3 = input.float(390.0, 'Strike 3')
oi_call_3 = input.float(1000.0, 'OI Call 3')
oi_put_3 = input.float(9000.0, 'OI Put 3')
iv_3 = input.float(0.22, 'IV 3')
// Spot Price
float S = close
// Arrays for dynamic processing
var float[] strikes = array.new_float(3)
var float[] oi_calls = array.new_float(3)
var float[] oi_puts = array.new_float(3)
var float[] ivs = array.new_float(3)
if barstate.isfirst
array.set(strikes, 0, strike_1)
array.set(strikes, 1, strike_2)
array.set(strikes, 2, strike_3)
array.set(oi_calls, 0, oi_call_1)
array.set(oi_calls, 1, oi_call_2)
array.set(oi_calls, 2, oi_call_3)
array.set(oi_puts, 0, oi_put_1)
array.set(oi_puts, 1, oi_put_2)
array.set(oi_puts, 2, oi_put_3)
array.set(ivs, 0, iv_1)
array.set(ivs, 1, iv_2)
array.set(ivs, 2, iv_3)
// Lines and labels arrays for rendering
var line[] lines = array.new_line(3)
var label[] labels = array.new_label(3)
if barstate.islast
// Clean up previous drawings
for i = 0 to array.size(lines) - 1
line.delete(array.get(lines, i))
label.delete(array.get(labels, i))
for i = 0 to 2
float k = array.get(strikes, i)
float oic = array.get(oi_calls, i)
float oip = array.get(oi_puts, i)
float iv = array.get(ivs, i)
float g = gammaBS(S, k, dte, iv, r)
// GEX = (OI_Call - OI_Put) * Gamma * Spot * 100
float gex = (oic - oip) * g * S * 100.0
color level_color = gex >= 0 ? color.green : color.red
line l = line.new(x1=bar_index - 30, y1=k, x2=bar_index, y2=k, color=level_color, width=2, style=line.style_dashed)
label lb = label.new(x=bar_index, y=k, text='Strike ' + str.tostring(k) + ' | GEX: ' + str.tostring(gex / 1000000.0, '#.##') + 'M', color=color.new(color.black, 100), textcolor=level_color, style=label.style_label_left)
array.set(lines, i, l)
array.set(labels, i, lb) Разбор параметров
Для корректной работы скрипта и интерпретации результатов важно понимать назначение ключевых переменных и функций:
gammaBS(): Пользовательская функция, вычисляющая классическую Гамму опциона. Она использует логарифмическое распределение и плотность стандартного нормального распределения для нахождения чувствительности дельты к изменению цены базового актива.dte: Время до экспирации опционной серии (Days to Expiration), выраженное в долях года. Ввод параметров осуществляется в днях, после чего скрипт автоматически делит значение на 365.r: Безрисковая процентная ставка (Risk-Free Rate), необходимая для дисконтирования в модели Блэка-Шоулза.strike_1 / strike_2 / strike_3: Ценовые уровни (страйки) опционов, на которых зафиксирован крупный открытый интерес.oi_call_1 / oi_put_1: Открытый интерес (Open Interest) для Call и Put опционов соответственно. Разница между ними определяет результирующий знак экспозиции маркет-мейкеров.iv_1: Подразумеваемая волатильность (Implied Volatility) для конкретного страйка, критически влияющая на ширину распределения Гаммы.
Для более точных расчетов внутри текущего тика (особенно при быстром изменении спот-цены) рекомендуем ознакомиться со статьей Pine Script v5: Использование varip для точных расчетов внутри текущего бара.
Как запустить
Чтобы развернуть индикатор на графике TradingView, выполните следующие шаги:
1. Откройте веб-терминал TradingView и выберите интересующий вас актив (например, SPY или QQQ).
2. В нижней панели откройте вкладку Pine Editor.
3. Скопируйте исходный код, представленный выше, и вставьте его в редактор, заменив стандартный шаблон.
4. Нажмите кнопку Add to Chart (Добавить на график).
5. Откройте настройки индикатора и введите актуальные данные по опционным уровням (страйки, OI и IV), которые можно получить из опционной доски (Option Chain) вашего брокера или аналитического ресурса.
Если вы планируете использовать уровни GEX в качестве триггеров для пробойных стратегий в начале торговой сессии, изучите материал Реализация стратегии ORB с учетом таймзон в Pine Script v5.
Для построения более сложных арбитражных моделей и анализа спредов между спотом и опционными уровнями полезно изучить Индикатор TVWAP Spread в Pine Script v5: Арбитраж в TradingView.




