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

