Индикатор для TradingView своими руками
Сказка — ложь, да в ней намёк, добрым молодцам урок!
Жили-были в славном цифровом царстве, в торговом государстве, купцы-скальперы. И была у них жизнь весёлая, да лихая: торговали они не по дням и неделям, а на самых малых минутных ведомостях — таймфреймах. Только вот беда в том царстве обжилась — Чудище Полночное, Рыночным Шумом званое.
Как выйдет купец на минутную поляну, раскинет свои привычные снасти — скользящие средние да осцилляторы заморские, так Чудище тут как тут. Махнет зелёным хвостом — цена вверх летит, купец на все закрома покупает; махнет красным — цена камнем вниз падает, а купцу лишь стоп-лоссы горькие да амбары пустые остаются. Много добрых молодцев на тех минутах свои депозиты сложили, да в тильт дремучий ушли.
И до того мне горько стало на эту мясорубку смотреть, что решил я сотворить щит и меч против Чудища окаянного.
Вначале-то пошёл я дорожкой проторенной: стал старые формулы крутить да приглаживать. Да только толку от того было мало. Сделаешь снасть быстрой — она на каждый шорох откликается, ложные выносы собирает. Сделаешь медленной — сигнал приходит, когда пир уже кончился, и покупаешь ты на самой вершине горы, прямо перед падением в пропасть. Понял я тогда, что по старой цене закрытия на минутах правды не сыскать.
И воззвал я тогда к мудрости батюшки-Физики. Ведь цена на графике не сама по себе скачет, у неё своя механика есть. Шаг цены — то скорость её. Быстрота, с которой шаг меняется, — то ускорение. Но есть и третья сила, тайная, в сказках Еремеевых «рывком» прозванная (а по-нашему, по-инженерному — Jerk). Это скорость изменения самого ускорения. Именно она показывает тот миг, когда крупный богатырь своим ордером привычный ритм стакана ломает.
Сел я за свитки Pine Script, начал формулу в код вплетать. Да только первая плавка комом пошла: на минутных барах рывок этот таким частоколом обернулся, что в глазах зарябило. В утреннее затишье молчит, а как ярмарка американская открывается — его буквально на части рвёт. Пришлось добавить к нему живой воды — нормализации по истинному диапазону ATR. Стал алгоритм делить рывок на текущую волатильность, и явился на свет чистый, нормированный Z-score. Очистился график от шелухи да наносного шума.
Только вижу — опять неполная правда. Жилы у движения есть, а крови — нет. Пошёл я искать рыночное топливо. И нашёл его в подземных чертогах — звалось оно Открытым Интересом (Open Interest). Ведь коли цена без него растёт — то морок и обман, пустой стакан ветром гонит. А вот если в единый миг и рывок цены случается, и Открытый Интерес кубышку свою распахивает — значит, зашли в рынок деньги тяжёлые, купеческие, и за этим движением истинная сила стоит.
Долго я тот код переписывал, три пары железных сапог износил. То компилятор TradingView ругался, что переменные сами на себя ссылаются, то в сбалансированном режиме аномалия круг зацикливала. Но выковал-таки я сборку HFT v.2026.3 А чтобы этот цифровой меч руку не обжёг, наложил я на него пятнадцать нерушимых зарок-правил:
1. Нести службу строго на минутном таймфрейме, ибо под него вся кинематика и считалась.
2. В бой идти только на ликвидных товарах, где Открытый Интерес живой да полноводный.
3. Объёмную дельту держать на воротах, как верного стража: нет всплеска объёма — нет и входа.
4. Поглядывать на пятиминутное небо: коли там тучи тренда в одну сторону идут, супротив них на минутке не вставать.
5. Агрессивный режим включать, когда буря на рынке, а Сбалансированный — когда тишь да гладь.
6. Не оголять меча, пока свеча сигнальная до последнего вздоха не закрылась.
7. Метки на графике делать крохотными (tiny), чтобы взору не мешали и гордыню не тешили.
8. Защитный оберег (стоп-лосс) ставить сразу за ближайший излом, без пустых надежд на авось.
9. Добычу (тейк-профит) мерить так, чтобы она в два, а то и в три раза превосходила оберег.
10. Половину прибыли забирать при первом же добром рывке, а остаток в безубыток переводить.
11. Бить преимущественно лимитным ордером, чтобы мытарь-биржа комиссией казну не разорил.
12. Коли три раза оберег сработал — закрывай лавку и уходи, пока лихоманка отыгрыша разум не затмила.
13. За десять минут до царских указов (новостей) и десять минут после них — оружие складывать.
14. В одной сече рисковать лишь малой долей — полпроцента от всего твоего золота.
15. Каждую неделю прибыль из дела вынимать да в звонкую монету превращать, дабы морок цифровой явью становился.
И соткался в итоге вокруг свечей волшебный шлейф. Когда рынок спит — он серым туманом дремлет, ко сну призывая. Но стоит крупному игроку палицей по стакану ударить — ловит алгоритм этот рывок, и загорается шлейф чистым изумрудным или алым светом, указывая скальперу верный путь. Трудная то была дорога, через ошибки да потери, но когда видишь, как законы физики на минутном графике Чудище лесное побеждают, понимаешь: не зря сказка сказывалась.
Код для вставки в pinescript tradingvew:
//@version=4
study("HFT v.2026.3 - Сказ о Торнадо HFT", overlay=true, precision=2)
// ==========================================
// ЧЕРТОГ НАСТРОЕК (ВХОДНЫЕ ПАРАМЕТРЫ)
// ==========================================
mode = input(title="Режим Снасти", defval="Aggressive", options=["Aggressive", "Balanced"])
volWindow = input(5, title="Окно Волатильности (Jerk)", minval=3)
oiWindow = input(3, title="Окно Открытого Интереса", minval=2)
smoothLength = input(1, title="Сглаживание Вече", minval=1)
baseLength = input(5, title="Базовая Длина Шлейфа", minval=3)
jerkMult = input(0.75, title="Порог Рывка Богатырского (Z-Score)", step=0.05)
oiMult = input(0.65, title="Множитель Живой Воды (OI Delta)", step=0.05)
useHTFBias = input(true, title="Включить Старшее Небо (5m EMA)")
htfLength = input(50, title="Длина Старшего Тренда", minval=20)
useVolFilter = input(true, title="Фильтр Купеческого Объема")
// ==========================================
// СЛОЙ ТЕРМОДИНАМИКИ (OPEN INTEREST)
// ==========================================
oiTicker = syminfo.tickerid + "_OI"
rawOI = security(oiTicker, "1", close)
// Явное объявление рекурсивной переменной, дабы компилятор не ругался
float openInterest = na
openInterest := na(rawOI) ? nz(openInterest[1], 0.0) : rawOI
oiDelta = change(openInterest)
oiStd = stdev(oiDelta, oiWindow)
bool oiFuel = oiStd != 0 ? (oiDelta > oiStd * oiMult) : false
// ==========================================
// СТАРШЕЕ НЕБО (HIGHER TIMEFRAME BIAS)
// ==========================================
htfEMA = useHTFBias ? security(syminfo.tickerid, "5", ema(close, htfLength)) : close
trendBull = close > htfEMA
trendBear = close < htfEMA
// ==========================================
// КИНЕМАТИКА ЦЕНЫ И НОРМАЛИЗАЦИЯ ЖИВОЙ ВОДОЙ
// ==========================================
atrLen = 14
atr = atr(atrLen)
rawVel = change(close)
vel = ema(rawVel, smoothLength)
rawAcc = change(vel)
acc = ema(rawAcc, smoothLength)
deltaJerk = change(acc)
// Деление рывка на волатильность — очищение от дневного шума
jerkNorm = deltaJerk / (nz(atr, 1.0) * 0.0001 + 0.000001)
sampleMean = sma(jerkNorm, volWindow)
sampleStd = stdev(jerkNorm, volWindow)
jerkZ = sampleStd != 0 ? (jerkNorm - sampleMean) / sampleStd : 0.0
// ==========================================
// ФИЛЬТР КУПЕЧЕСКОГО ОБЪЕМА (VOLUME DELTA)
// ==========================================
volDelta = volume - volume[1]
volFilter = useVolFilter ? (volDelta > sma(volDelta, 10) * 0.3) : true
// ==========================================
// СИГНАЛЬНАЯ ВЯЗЬ (ЛОГИКА АЛГОРИТМА)
// ==========================================
bool bullCond = (jerkZ > jerkMult) and (oiFuel or change(close) > 0) and (vel > 0) and volFilter
bool bearCond = (jerkZ < -jerkMult) and (oiFuel or change(close) < 0) and (vel < 0) and volFilter
// Сверение со Старшим Небом
bool bullTornado = bullCond and (not useHTFBias or trendBull)
bool bearTornado = bearCond and (not useHTFBias or trendBear)
// Расчет времени со времён прошлых битв
float barsSinceBear = nz(barssince(bearTornado), 9999)
float barsSinceBull = nz(barssince(bullTornado), 9999)
// Сбалансированный режим — удержание шлейфа во время затишья
if mode == "Balanced"
bullTornado := bullTornado or (bullTornado[1] and barsSinceBear < 3)
bearTornado := bearTornado or (bearTornado[1] and barsSinceBull < 3)
// Фиксация знака: 1 — правь вверх, -1 — падай вниз
int signal = 0
signal := bullTornado ? 1 : bearTornado ? -1 : nz(signal[1], 0)
// ==========================================// ДИНАМИЧЕСКИЙ ШЛЕЙФ (RIBBON НА ЦЕНЕ)// ==========================================e0 = ema(close, baseLength)e1 = ema(close, baseLength + 1)e2 = ema(close, baseLength + 2)e3 = ema(close, baseLength + 3)e4 = ema(close, baseLength + 4)color ribbonColor = color.new(color.gray, 80)if signal == 1ribbonColor := color.new(#00e676, 45)else if signal == -1ribbonColor := color.new(#ff1744, 45)p0 = plot(e0, "Ось Шлейфа", ribbonColor, 2)p1 = plot(e1, "Край 1", ribbonColor, 1)p2 = plot(e2, "Край 2", ribbonColor, 1)p3 = plot(e3, "Край 3", ribbonColor, 1)p4 = plot(e4, "Край 4", ribbonColor, 1)fill(p0, p4, ribbonColor, title="Туманное Облако")// ==========================================// ЗНАМЕНИЯ НА ГРАФИКЕ (ВИЗУАЛИЗАЦИЯ И МЕТКИ)// ==========================================color bgColor = color.new(color.black, 100)if signal == 1bgColor := color.new(color.green, 93)else if signal == -1bgColor := color.new(color.red, 93)bgcolor(bgColor)// Малые стрелы для точечного входа (tiny)plotshape(bullTornado, title="Стрела Вверх", style=shape.triangleup, location=location.belowbar, color=#00e676, size=size.tiny)plotshape(bearTornado, title="Стрела Вниз", style=shape.triangledown, location=location.abovebar, color=#ff1744, size=size.tiny)// Кличи вещие (Alerts для автоматизации)alertcondition(bullTornado, "Клич на Покупку", "🚀 Industrial Titan LONG")alertcondition(bearTornado, "Клич на Продажу", "🔻 Industrial Titan SHORT")
TradingView, #PineScript, #Скальпинг, #Криптотрейдинг, #OpenInterest