Алебарда Тщедушного Канцлера
Алебарда Тщедушного Канцлера: абсурдное название скрывающее под собой точный алготрейдинг
Приветствую, алготорговцы! Сегодня у меня на повестке дня не просто новая стратегия, а целая философская концепция в коде. Знакомьтесь: «Алебарда Тщедушного Канцлера» — алгоритм, который доказывает, что в трейдинге сила часто кроется в точности, а не в грубой мощи.
📜 Философия парадокса
Почему «Алебарда»? И почему «Тщедушный Канцлер»? Все просто:
- Алебарда — это большое, неповоротливое оружие. В нашем случае — это индикатор Supertrend. Он грубоват, запаздывает и на флэте может изрядно «попилить» депозит.
- Тщедушный Канцлер — это наш алгоритм. Он не силен мышцами, но невероятно умен. Он не размахивает алебардой как попало, а использует её для точечных, выверенных ударов.
Абсурдный образ хитрого стратега с неподъемным оружием идеально описывает подход: мы берем «грубый» инструмент и применяем его с ювелирной точностью.
⚙️ Что под капотом?
Стратегия построена на трех китах:
- Supertrend — определяет основное направление тренда (русло реки).
- Уровни Фибоначчи — определяют «Золотые Отмели», места скопления ликвидности, где течение замедляется и готовится к развороту.
- 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 и добавляем на график.
Использование
Смотрим на график и ждем указателя на вход в позицию.
Расшифровка «Канцлерского Свитка» — информационной панели:
📜 Канцлерский Свиток (Информационная панель)
- Канцлерский Свиток — Название стратегии и информационного окна.
- Указ №[число] — Номер текущего торгового бара. Каждый бар — это новый потенциальный «указ».
- Совет Мудрецов: — Статус ADX-фильтра.
- ВНИМАЕТ — Фильтр ВКЛЮЧЕН. Совет бдителен и советует входить только в сильные тренды.
- СПИТ — Фильтр ВЫКЛЮЧЕН. Совет не работает, канцлер принимает решения сам, рискуя нарваться на флэт.
(Включить или отключить можно в настройках стратегии)
- Мудрость: — Текущее значение индикатора ADX (сила тренда).
- Зеленое число — Сила тренда выше порога. Совет одобряет сделки.
- Красное число — Сила тренда ниже порога. Совет советует подождать.
- Настроение: — Направление тренда по Supertrend.
- БЫЧЬЕ — Бычий тренд (Supertrend зеленый). Канцлер благосклонен к покупкам.
- МЕДВЕЖЬЕ — Медвежий тренд (Supertrend красный). Канцлер гневается и велит продавать.
- Отдых Канцлера: — Задержка между сделками (Cooldown).
- X свитков — Канцлер будет отдыхать и подписывать другие бумаги еще
X
баров, прежде чем выпустить новый торговый указ.
- Стража Дворца: — Ваш жесткий стоп-лосс.
- X% — Стража на посту и отрубит голову убытку при достижении
X%
. - ОТСУТСТВУЕТ — Защитный стоп-лосс ВЫКЛЮЧЕН. Дворец без защиты, что очень рискованно!
Краткая суть: Свиток показывает, благоприятствует ли момент для выпуска нового «указа» (сделки) или же Канцлеру следует подождать и отдохнуть, чтобы не наделать глупостей в период суеты и неразберихи (флэта).
🔧 Техническое примечание для разработчиков
В коде вы можете заметить проверку if barstate.islast
для отрисовки информационной панели. Здесь кроется важный нюанс Pine Script:
Стратегии по умолчанию вычисляются только на закрытых барах. Это означает, что на летящем, незакрывшемся баре (realtime bar) условие barstate.islast
может не сработать сразу, так как бар еще не подтвержден.
Решение: Если вам критично обновлять информацию до закрытия бара (например, для индикаторов), в объявлении strategy()
нужно добавить параметр:
strategy(..., calc_on_every_tick=true)
Но для нашей стратегии это не нужно! Мы сознательно отказались от постоянных пересчетов, чтобы:
- Избежать репинтов: Сигналы не меняются после своего появления.
- Снизить нагрузку: Постоянные пересчеты на каждом тике не нужны для стратегии, работающей на закрытиях баров.
- Эмулировать реальную торговлю: В реальности мы тоже видим закрытие свечи и лишь потом принимаем решение.
Наш «Канцлер» не суетится. Он выносит свои «указы» лишь после того, как ситуация прояснилась и бар закрылся. Это делает стратегию более надежной и честной при бэктестировании.
«Алебарда Тщедушного Канцлера» — это не просто сборник индикаторов. Это напоминание о том, что успех в трейдинге зависит не от сложности инструмента, а от мудрости его применения. Иногда стоит посмотреть на свои стратегии под новым, пусть и абсурдным, углом.