ОГОВОРКА: ниже приведено исключительно для развлечения + образовательных целей! Это НЕ ФИНАНСОВЫЙ СОВЕТ и НЕ совет по КОДИНГУ (ИИ или любой другой). Это просто для ДЕМОНСТРАЦИИ!

Запрос для SMA Clouds

Действуй как старший разработчик TradingView Pine Script v5.

Создай индикатор-оверлей с названием:

«Кодирование технических индикаторов 4.0 — Настройка облака SMA»

ЦЕЛЬ

Создай индикатор, который не перерисовывается, многотаймфреймовый и предоставляет контекст тренда, а также квалифицирует потенциальные сигналы. Он не должен исполнять сделки или предоставлять финансовые советы.

FRAMEWORK

Индикатор использует три аналитических слоя:

1. Структура за 8 часов

   - Определяйте более широкую рыночную структуру на таймфрейме 8Ч.

   - Классифицируйте как бычье, медвежье или нейтральное.

   - Отображайте текущую классификацию в небольшом дашборде.

2. Облако SMA за 1 час

   - Рассчитайте быструю и медленную Простую скользящую среднюю (SMA) на таймфрейме 1Ч.

   - Сделайте обе длины SMA настраиваемыми.

   - Значения по умолчанию: [INSERT FAST SMA] и [INSERT SLOW SMA].

   - Залейте область между средними:

     • Зелёный, когда быстрая SMA выше медленной SMA.

     • Красный, когда быстрая SMA ниже медленной SMA.

     • Нейтральный серый, когда соотношение неясно.

   - Облако на 1Ч — основной фильтр направления тренда.

3. Триггер за 15 минут и подтверждение IMACD

   - Рассчитывайте триггер входа на таймфрейме 15М.

   - Подтверждайте бычьи триггеры только когда импульс IMACD положительный.

   - Подтверждайте медвежьи триггеры только когда импульс IMACD отрицательный.

   - Используйте следующую спецификацию IMACD: [ВСТАВЬТЕ ТОЧНУЮ ФОРМУЛУ IMACD И НАСТРОЙКИ].

   - Постройте зелёный направленный вверх треугольник для подтверждённых бычьих триггеров.

   - Постройте красный направленный вниз треугольник для подтверждённых медвежьих триггеров.

ИЕРАРХИЯ СИГНАЛОВ

Бычья квалификация требует:

- Допустимая бычья или нейтральная структура 8Ч.

- Бычье облако SMA на 1Ч.

- Триггер 15М на бычью сторону.

- Положительное подтверждение IMACD.

Медвежья квалификация требует точной инверсии условий.

TECHNICAL REQUIREMENTS

- Используйте request.security() с barmerge.lookahead_off.

- Оценивайте сигналы только на подтверждённых закрытых свечах.

- Не перерисовывайте исторические сигналы.

- Не используйте будущие данные.

- Позвольте трём таймфреймам и всем длинам расчёта изменяться через inputs.

- Включите переключатели, чтобы показывать/скрывать облако, метки структуры, маркеры-триггеры и дашборд.

- Добавьте правила alertcondition() для подтверждённых бычьих и медвежьих квалификаций.

- Сохраняйте диаграмму визуально чистой.

- Не включайте автоматизированные ордера, заявления о результативности, P&L или рекомендации по инвестициям.

- Комментируйте код ясно и объясните, как каждый таймфрейм влияет на результат.

Перед записью кода определите любые отсутствующие правила расчёта или параметры. Не придумывайте проприетарные настройки. Сначала спросите меня о недостающих значениях.

После получения этих значений предоставьте:

1. Полный код на Pine Script v5.

2. Краткое объяснение логики.

3. Чек-лист для проверки, что индикатор не перерисовывается.

CODE (COPY & PASTE)

//@version=6

indicator("John Wick v 4.0", overlay=true)

//==================================================

// Входы MACD

//==================================================

fastLength   = input.int(12, "Быстрая длина MACD")

slowLength   = input.int(26, "Медленная длина MACD")

signalLength = input.int(9, "Длина сигнала MACD")

atrLength = input.int(14, "Длина ATR")

showExits   = input.bool(true)

showCrosses = input.bool(true)

minProfitATR = input.float(0.30)

//==================================================

// Ядро MACD

//==================================================

fastMA   = ta.ema(close, fastLength)

slowMA   = ta.ema(close, slowLength)

macdLine   = fastMA - slowMA

signalLine = ta.ema(macdLine, signalLength)

hist = macdLine - signalLine

//==================================================

// События пересечения

//==================================================

bullCross = ta.crossover(macdLine, signalLine)

bearCross = ta.crossunder(macdLine, signalLine)

//==================================================

// Промежутки между маркерами

//==================================================

atrValue = ta.atr(atrLength)

dotOffset = atrValue * 0.28

triOffset = atrValue * 0.70

longExitY  = high + dotOffset

shortExitY = low  - dotOffset

triBullY = low  - triOffset

triBearY = high + triOffset

//==================================================

// Движок состояния торговли

//==================================================

var int   activeDir    = 0

var float entryPrice   = na

var float bestHist     = na

var bool  partialTaken = false

if bullCross

   activeDir    := 1

   entryPrice   := close

   bestHist     := hist

   partialTaken := false

if bearCross

   activeDir    := -1

 entryPrice   := close

   bestHist     := hist

   partialTaken := false

if activeDir == 1

   bestHist := na(bestHist) ? hist : math.max(bestHist, hist)

if activeDir == -1

   bestHist := na(bestHist) ? hist : math.min(bestHist, hist)

//==================================================

// Логика выхода

//==================================================

longInProfit =

    activeDir == 1

and not na(entryPrice)

and high >= entryPrice + atrValue * minProfitATR

shortInProfit =

    activeDir == -1

and not na(entryPrice)

and low <= entryPrice - atrValue * minProfitATR

longMomentumFade =

    activeDir == 1

and bestHist > 0

and hist < hist[1]

shortMomentumFade =

    activeDir == -1

and bestHist < 0

and hist > hist[1]

yellowLongExit =

    showExits

and activeDir == 1

and not partialTaken

and longInProfit

and longMomentumFade

yellowShortExit =

    showExits

and activeDir == -1

and not partialTaken

and shortInProfit

and shortMomentumFade

if yellowLongExit or yellowShortExit

   partialTaken := true

redLongExit =

    showExits

and activeDir == 1

and partialTaken

and bearCross

redShortExit =

    showExits

and activeDir == -1

and partialTaken

and bullCross

if redLongExit or redShortExit

   activeDir    := 0

   entryPrice   := na

   bestHist     := na

   partialTaken := false

//==================================================

// EMA STACK (облако из 5 слоёв)

//==================================================

ema5  = ta.ema(close, 5)

ema9  = ta.ema(close, 9)

ema12 = ta.ema(close, 12)

ema26 = ta.ema(close, 26)

ema50 = ta.ema(close, 50)

//==================================================

// Рисуем EMA (тонкие / приглушённые)

//==================================================

p5  = plot(ema5, color=color.new(color.aqua, 20), linewidth=1)

p9  = plot(ema9, color=color.new(color.blue, 20), linewidth=1)

p12 = plot(ema12, color=color.new(color.gray, 20), linewidth=1)

p26 = plot(ema26, color=color.new(color.orange,20), linewidth=1)

p50 = plot(ema50, color=color.new(color.red, 20), linewidth=1)

//==================================================

// ОБЛАКА

//==================================================

// 5–9 Быстрая реакция

fill(p5, p9, color=color.new(color.aqua, 80))

// 9–12 Импульс

fill(p9, p12, color=color.new(color.blue, 82))

// 12–26 Структура

fill(p12, p26, color=color.new(color.gray, 84))

// 26–50 Тренд

fill(p26, p50, color=color.new(color.orange, 86))

//==================================================

// Точки выхода

//==================================================

plotshape(

    yellowLongExit ? longExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.new(color.yellow, 20),

    size=size.tiny

)

plotshape(

    yellowShortExit ? shortExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.new(color.yellow, 20),

    size=size.tiny

)

plotshape(

    redLongExit ? longExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.red,

    size=size.tiny

)

plotshape(

    redShortExit ? shortExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.red,

    size=size.tiny

)

//==================================================

// Треугольники входа

//==================================================

plotshape(

    showCrosses and bullCross ? triBullY : na,

    style=shape.triangleup,

    location=location.absolute,

    color=color.lime,

    size=size.small

)

plotshape(

    showCrosses and bearCross ? triBearY : na,

    style=shape.triangledown,

    location=location.absolute,

    color=color.red,

    size=size.small

)

Подсказка по ATR и код

Подсказка

Действуйте как старший разработчик TradingView Pine Script v5.

Создайте индикатор-оверлей с названием:

“Техническое кодирование индикатора 5.2 — Average True Range”

PURPOSE

Постройте индикатор направления тренда, адаптивный к волатильности, используя трейлинг-уровень на основе «трещотки» (ratcheting) Average True Range. Индикатор предназначен для учебного анализа и не должен совершать сделки или делать заявления о результативности.

CORE SETTINGS

- Период ATR: 10

- Множитель ATR: 1.9

   - Пока цена остаётся ниже предыдущего уровня трейлинга, уровень может двигаться вниз, но никогда не вверх.

- Сделайте период ATR, множитель и источник настраиваемыми.

CALCULATION

1. Рассчитайте Average True Range (ATR) за 10 периодов.

2. Рассчитайте трейлинг-расстояние:

   trailingDistance = 1.9 × ATR(10)

3. Создайте рекурсивный трейлинг-уровень, который «шагами» следует за ценой:

- Пока цена остаётся выше предыдущего уровня трейлинга, уровень может двигаться вверх, но никогда не вниз.

shortInProfit =

   - Когда цена пересекает уровень трейлинга, измените закодированное направление.

DIRECTION LOGIC

- Переключайте направление на бычье, когда цена закрытия пересекает уровень трейлинга вверх.

- Переключайте направление на медвежье, когда цена закрытия пересекает уровень трейлинга вниз.

- Генерируйте сигнал только когда направление меняется.

- Не генерируйте повторяющиеся сигналы на каждой свече.

VISUAL OUTPUT

- Рисуйте уровень трейлинга ATR.

- Используйте зелёный когда закодированное направление бычье.

- Используйте красный, когда закодированное направление медвежье.

- Постройте зелёный направленный вверх треугольник при смене направления на бычье.

- Постройте красный направленный вниз треугольник при смене направления на медвежье.

- Опционально окрашивайте свечи в соответствии с текущим направлением.

EMA CLOUD

- Добавьте облако из EMA с периодами 12 и 26.

- Заполняйте облако зелёным, когда EMA 12 выше EMA 26.

- Залейте красным, когда EMA 12 ниже EMA 26.

- Воспринимайте облако EMA как контекст импульса; оно не должно менять расчёт смены направления ATR.

- Добавьте input, чтобы скрывать облако EMA.

TECHNICAL REQUIREMENTS

- Используйте подтверждённые закрытия свечей.

- Не перерисовывайте.

- Не используйте будущую информацию или look-ahead.

- Сохраняйте уровень трейлинга через рекурсивную логику переменной.

- Добавьте правила alertcondition() для смены бычьего и медвежьего направления.

- Включите переключатели для маркеров, цвета свечей, уровня трейлинга и облака EMA.

- Не создавайте стратегические ордера, таблицу результатов, расчёты P&L или финансовые рекомендации.

- Организуйте и комментируйте код ясно.

Предоставьте:

1. Полный код на Pine Script v5.

2. Пояснение простыми словами ATR и механизма «трещотки» (ratcheting).

3. Описание условий, которые создают каждый маркер.

4. Краткий чек-лист проверки на отсутствие перерисовки (non-repainting) для шорта.


CODE

//@version=6

indicator("JW V5.2", overlay=true)

// ── Входы ──────────────────────────────────────────

atrPeriod     = input.int(10, "Период ATR")

keyValue      = input.float(1.9, "Ключевое значение / множитель ATR", step=0.1)

warnZoneATR   = input.float(0.25, "Зона предупреждения (x ATR)", step=0.05)

cloudSmooth   = input.int(3, "Гладкость облака", minval=1, tooltip="Сглаживает отображаемую полосу только — не влияет на время сигнала")

src           = close

// ── ATR trailing stop core — необработанный, управляет всем реальным ──

xATR  = ta.atr(atrPeriod)

nLoss = keyValue * xATR

var float trailStop = 0.0

trailStop := src > nz(trailStop[1], 0) and src[1] > nz(trailStop[1], 0) ? math.max(nz(trailStop[1]), src - nLoss) :

            src < nz(trailStop[1], 0) and src[1] < nz(trailStop[1], 0) ? math.min(nz(trailStop[1]), src + nLoss) :

            src > nz(trailStop[1], 0) ? src - nLoss : src + nLoss

var int pos = 0

pos := src[1] < nz(trailStop[1], 0) and src > nz(trailStop[1], 0) ? 1 :

      src[1] > nz(trailStop[1], 0) and src < nz(trailStop[1], 0) ? -1 : nz(pos[1], 0)

trendColor = pos == 1 ? color.new(color.green, 0) : pos == -1 ? color.new(color.red, 0) : color.gray

// ── Облако — визуально сглажено для удобства, чисто косметика ──

plotSrc  = ta.ema(src, cloudSmooth)

plotStop = ta.ema(trailStop, cloudSmooth)

pricePlot = plot(plotSrc, title="Цена (сглаженная)",     color=trendColor, linewidth=1)

stopPlot  = plot(plotStop, title="Trail Stop (сглаж.)", color=trendColor, linewidth=1)

fill(pricePlot, stopPlot, color=color.new(trendColor, 75), title="Облако тренда")

// ── Сигналы — зависят от исходных значений, не затрагиваются сглаживанием ──

buySignal  = pos == 1  and pos[1] == -1

sellSignal = pos == -1 and pos[1] == 1

plotshape(buySignal, title="Buy", text="buy", style=shape.triangleup, location=location.belowbar, color=color.green, textcolor=color.white, size=size.small)

plotshape(sellSignal, title="Sell", text="sell", style=shape.triangledown, location=location.abovebar, color=color.red, textcolor=color.white, size=size.small)

alertcondition(buySignal, "Buy Signal", "ATR Trail перевернулся на бычье")

alertcondition(sellSignal, "Сигнал Sell", "ATR Trail перевернулся на медвежье")

// ── Flip proximity — необработанный разрыв, тот же расчёт что и для сигнала ──

gapATR    = pos == 1 ? (src - trailStop) / xATR : (trailStop - src) / xATR

pctToFlip = math.max(0, math.min(100, 100 * (1 - gapATR / keyValue)))

dirText   = pos == 1 ? "LONG" : pos == -1 ? "SHORT" : "FLAT"

nearFlip  = gapATR <= warnZoneATR

labelColor = nearFlip ? color.new(color.orange, 0) : trendColor

labelText  = dirText + " — " + str.tostring(gapATR, "#.##") + " ATR до переворота (" + str.tostring(pctToFlip, "#") + "%)"

var label proximityLabel = na

if barstate.islast

   label.delete(proximityLabel)

   proximityLabel := label.new(bar_index + 2, src, labelText, style=label.style_label_left, color=labelColor, textcolor=color.white, size=size.normal)