📊 Алготрейдинг
August 29

Алебарда Тщедушного Канцлера

Алебарда Тщедушного Канцлера: абсурдное название скрывающее под собой точный алготрейдинг

Приветствую, алготорговцы! Сегодня у меня на повестке дня не просто новая стратегия, а целая философская концепция в коде. Знакомьтесь: «Алебарда Тщедушного Канцлера» — алгоритм, который доказывает, что в трейдинге сила часто кроется в точности, а не в грубой мощи.

📜 Философия парадокса

Почему «Алебарда»? И почему «Тщедушный Канцлер»? Все просто:

  • Алебарда — это большое, неповоротливое оружие. В нашем случае — это индикатор Supertrend. Он грубоват, запаздывает и на флэте может изрядно «попилить» депозит.
  • Тщедушный Канцлер — это наш алгоритм. Он не силен мышцами, но невероятно умен. Он не размахивает алебардой как попало, а использует её для точечных, выверенных ударов.

Абсурдный образ хитрого стратега с неподъемным оружием идеально описывает подход: мы берем «грубый» инструмент и применяем его с ювелирной точностью.

⚙️ Что под капотом?

Стратегия построена на трех китах:

  1. Supertrend — определяет основное направление тренда (русло реки).
  2. Уровни Фибоначчи — определяют «Золотые Отмели», места скопления ликвидности, где течение замедляется и готовится к развороту.
  3. ADX-фильтр — наш «Совет Мудрецов», который не дает Канцлеру совершать глупости в период бестолкового флэта.

Логика проста: мы входим только тогда, когда есть сильный тренд (ADX > 25), и цена отскакивает от ключевого уровня Фибо, подтверждая это свечной моделью (Пин-бар, Поглощение).

💡 Почему это работает?

Эффективность стратегии строится на отсечении мусора. 90% времени рынок находится во флэте. «Совет Мудрецов» (ADX-фильтр) заставляет нас пропускать все эти ложные движения и работать только в те 10% времени, когда на рынке есть четкое направление. Это кратно повышает точность входов.

🚀 Для кого этот алгоритм?

  • Для начинающих: Код отлично структурирован и снабжен комментариями. Это готовая учебная лаборатория.
  • Для практиков: Стратегия уже настроена под реальную торговлю с учетом комиссий и управления рисками.
  • Для Мосбиржи: оптимизирую и тестирую на различных фьючерсах срочного рынка.

Исходный код и бэктесты вы можете найти и протестировать в TradingView.

Установка

Копируем код:

//@version=6
strategy("Алебарда Тщедушного Канцлера", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=15, commission_type=strategy.commission.percent, commission_value=0.05)

// === НАСТРОЙКИ ===
var groupMain = "Указы Канцлера"
atrPeriod = input(10, "Длина Алебарды (ATR Length)", group=groupMain)
factor = input.float(3.0, "Мощность Удара (Factor)", step=0.01, group=groupMain)

var groupAdx = "Совет Мудрецов (защита от флэта)"
useAdxFilter = input.bool(true, "Слушать Совета", group=groupAdx)
adxLength = input.int(14, "Период Совета (ADX Period)", group=groupAdx)
adxThreshold = input.int(25, "Мудрость Порога (ADX Min Level)", minval=15, maxval=40, group=groupAdx)

var groupRisk = "Канцлерская Безопасность"
coolDownBars = input.int(5, "Отдых между Указами (Задержка между сделками)", minval=1, group=groupRisk)
useHardStop = input.bool(true, "Стража Дворца", group=groupRisk)
hardStopPct = input.float(2.0, "Сила Стражи %", minval=0.5, maxval=10.0, group=groupRisk)

var groupVisual = "Канцлерские Свитки"
showAdxLabel = input.bool(true, "Показывать Мудрость (ADX)", group=groupVisual)

// === РАСЧЕТ ИНДИКАТОРОВ ===
[supertrend, direction] = ta.supertrend(factor, atrPeriod)

// ADX для фильтрации флэта
[dip, din, adx] = ta.dmi(adxLength, adxLength)
adxOk = adx >= adxThreshold
trendStrength = adx // Сила тренда для информации

// === ВИЗУАЛИЗАЦИЯ ===
// Стили для Supertrend
plot(supertrend, color=direction < 0 ? color.green : color.red, linewidth=2, title="Путь Алебарды")

// Зоны покупок/продаж
bgcolor(direction < 0 ? color.new(color.green, 95) : color.new(color.red, 95), title="Земли Канцлера")

// Переменная для хранения последней метки мудрости
var label lastAdxLabel = na

// Метка статуса ADX (обновляем существующую, а не создаем новую)
if barstate.islast and showAdxLabel
    labelColor = useAdxFilter and adxOk ? color.green : useAdxFilter and not adxOk ? color.red : color.gray
    labelText = useAdxFilter ? ("Мудрость: " + str.tostring(math.round(adx)) + "/" + str.tostring(adxThreshold)) : "Совет Отдыхает"
    
    if na(lastAdxLabel)
        // Создаем метку в первый раз
        lastAdxLabel := label.new(bar_index, high, labelText, color=labelColor, style=label.style_label_down, textcolor=color.white)
    else
        // Обновляем существующую метку
        label.set_text(lastAdxLabel, labelText)
        label.set_color(lastAdxLabel, labelColor)
        label.set_x(lastAdxLabel, bar_index)
        label.set_y(lastAdxLabel, high)

// === ЛОГИКА ТОРГОВЛИ ===
var int lastTradeBar = na

// Условия для входа
longCondition = ta.change(direction) < 0 and (not useAdxFilter or adxOk)
shortCondition = ta.change(direction) > 0 and (not useAdxFilter or adxOk)

// Проверяем задержку между сделками
barsSinceLastTrade = na(lastTradeBar) ? 999 : bar_index - lastTradeBar
canTrade = barsSinceLastTrade >= coolDownBars

// Исполнение ордеров
if longCondition and canTrade
    strategy.entry("Указ О Закупке", strategy.long)
    lastTradeBar := bar_index
    // Защитный стоп-лосс
    if useHardStop
        stopPrice = close * (1 - hardStopPct/100)
        strategy.exit("Стража Лонга", "Указ О Закупке", stop=stopPrice)

if shortCondition and canTrade
    strategy.entry("Указ О Продаже", strategy.short)
    lastTradeBar := bar_index
    // Защитный стоп-лосс
    if useHardStop
        stopPrice = close * (1 + hardStopPct/100)
        strategy.exit("Стража Шорта", "Указ О Продаже", stop=stopPrice)

// === СВИТОК ИНФОРМАЦИИ ===
var table infoTable = table.new(position.top_right, 2, 6, bgcolor=color.new(#2D2D2D, 95), border_width=1)
if barstate.islast
    table.cell(infoTable, 0, 0, "Канцлерский Свиток", text_color=color.white, text_size=size.normal)
    table.cell(infoTable, 1, 0, "Указ №" + str.tostring(bar_index), text_color=color.orange)
    
    table.cell(infoTable, 0, 1, "Совет Мудрецов:", text_color=color.gray)
    table.cell(infoTable, 1, 1, useAdxFilter ? "ВНИМАЕТ" : "СПИТ", text_color=useAdxFilter ? color.green : color.red)
    
    table.cell(infoTable, 0, 2, "Мудрость:", text_color=color.gray)
    table.cell(infoTable, 1, 2, str.tostring(math.round(adx)), text_color=adxOk ? color.green : color.red)
    
    table.cell(infoTable, 0, 3, "Настроение:", text_color=color.gray)
    table.cell(infoTable, 1, 3, direction < 0 ? "БЫЧЬЕ" : "МЕДВЕЖЬЕ", text_color=direction < 0 ? color.green : color.red)
    
    table.cell(infoTable, 0, 4, "Отдых Канцлера:", text_color=color.gray)
    table.cell(infoTable, 1, 4, str.tostring(coolDownBars) + " свитков", text_color=color.white)
    
    table.cell(infoTable, 0, 5, "Стража Дворца:", text_color=color.gray)
    table.cell(infoTable, 1, 5, useHardStop ? str.tostring(hardStopPct) + "%" : "ОТСУТСТВУЕТ", text_color=useHardStop ? color.orange : color.red)

Вставляем в редактор Pine и добавляем на график.

Использование

Смотрим на график и ждем указателя на вход в позицию.

Расшифровка «Канцлерского Свитка» — информационной панели:


📜 Канцлерский Свиток (Информационная панель)

Строка 1:

  • Канцлерский Свиток — Название стратегии и информационного окна.
  • Указ №[число] — Номер текущего торгового бара. Каждый бар — это новый потенциальный «указ».

Строка 2:

  • Совет Мудрецов: — Статус ADX-фильтра.
  • ВНИМАЕТ — Фильтр ВКЛЮЧЕН. Совет бдителен и советует входить только в сильные тренды.
  • СПИТ — Фильтр ВЫКЛЮЧЕН. Совет не работает, канцлер принимает решения сам, рискуя нарваться на флэт.

(Включить или отключить можно в настройках стратегии)

Строка 3:

  • Мудрость: — Текущее значение индикатора ADX (сила тренда).
  • Зеленое число — Сила тренда выше порога. Совет одобряет сделки.
  • Красное число — Сила тренда ниже порога. Совет советует подождать.

Строка 4:

  • Настроение: — Направление тренда по Supertrend.
  • БЫЧЬЕ Бычий тренд (Supertrend зеленый). Канцлер благосклонен к покупкам.
  • МЕДВЕЖЬЕМедвежий тренд (Supertrend красный). Канцлер гневается и велит продавать.

Строка 5:

  • Отдых Канцлера: — Задержка между сделками (Cooldown).
  • X свитков — Канцлер будет отдыхать и подписывать другие бумаги еще X баров, прежде чем выпустить новый торговый указ.

Строка 6:

  • Стража Дворца: — Ваш жесткий стоп-лосс.
  • X% — Стража на посту и отрубит голову убытку при достижении X%.
  • ОТСУТСТВУЕТ — Защитный стоп-лосс ВЫКЛЮЧЕН. Дворец без защиты, что очень рискованно!

Краткая суть: Свиток показывает, благоприятствует ли момент для выпуска нового «указа» (сделки) или же Канцлеру следует подождать и отдохнуть, чтобы не наделать глупостей в период суеты и неразберихи (флэта).


🔧 Техническое примечание для разработчиков

В коде вы можете заметить проверку if barstate.islast для отрисовки информационной панели. Здесь кроется важный нюанс Pine Script:

Стратегии по умолчанию вычисляются только на закрытых барах. Это означает, что на летящем, незакрывшемся баре (realtime bar) условие barstate.islast может не сработать сразу, так как бар еще не подтвержден.

Решение: Если вам критично обновлять информацию до закрытия бара (например, для индикаторов), в объявлении strategy() нужно добавить параметр:

strategy(..., calc_on_every_tick=true)

Но для нашей стратегии это не нужно! Мы сознательно отказались от постоянных пересчетов, чтобы:

  • Избежать репинтов: Сигналы не меняются после своего появления.
  • Снизить нагрузку: Постоянные пересчеты на каждом тике не нужны для стратегии, работающей на закрытиях баров.
  • Эмулировать реальную торговлю: В реальности мы тоже видим закрытие свечи и лишь потом принимаем решение.

Наш «Канцлер» не суетится. Он выносит свои «указы» лишь после того, как ситуация прояснилась и бар закрылся. Это делает стратегию более надежной и честной при бэктестировании.

Заключение:

«Алебарда Тщедушного Канцлера» — это не просто сборник индикаторов. Это напоминание о том, что успех в трейдинге зависит не от сложности инструмента, а от мудрости его применения. Иногда стоит посмотреть на свои стратегии под новым, пусть и абсурдным, углом.