Исходный код
Классические сеточные стратегии с фиксированным шагом часто страдают от резких изменений волатильности. На спокойном рынке фиксированный шаг может быть слишком большим, из-за чего ордера не наливаются, а во время сильных трендовых импульсов — слишком мелким, что приводит к мгновенному набору всей сетки и быстрому маржин-коллу. Решением является динамический шаг сетки на основе ta.atr().
При разработке сеточных роботов важно учитывать рыночный контекст. Например, перед запуском сетки можно анализировать зоны ликвидности с помощью индикатора имбаланса (Fair Value Gap) с митигацией в Pine Script v5, чтобы выставлять первый ордер сетки в зоне разрыва справедливой стоимости.
Ниже представлен готовый к использованию код стратегии на Pine Script v5. Скрипт автоматически рассчитывает уровни лимитных ордеров на основе текущего значения ATR и выставляет их при пересечении ценой скользящей средней.
//@version=5
strategy("Dynamic ATR Grid Strategy", overlay=true, pyramiding=10, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=2)
// Inputs
atrLength = input.int(14, title="ATR Length", group="Grid Settings")
atrMultiplier = input.float(1.0, title="ATR Step Multiplier", group="Grid Settings")
gridLevels = input.int(5, title="Max Grid Levels", minval=1, maxval=10, group="Grid Settings")
tpMultiplier = input.float(1.5, title="Take Profit ATR Multiplier", group="Grid Settings")
// ATR Calculation
atr = ta.atr(atrLength)
// Simple entry trigger (e.g., price above EMA)
ema = ta.ema(close, 200)
longCondition = ta.crossover(close, ema)
// Grid execution
if longCondition and strategy.position_size == 0
// First market order to initiate the grid
strategy.entry("Grid_Buy_0", strategy.long)
// Place limit orders for subsequent levels
for i = 1 to gridLevels - 1
levelPrice = close - (i * atr * atrMultiplier)
orderId = "Grid_Buy_" + str.tostring(i)
strategy.order(orderId, strategy.long, limit=levelPrice)
// Manage exits
if strategy.position_size > 0
avgPrice = strategy.position_avg_price
tpPrice = avgPrice + (atr * tpMultiplier)
strategy.exit("Exit_All", limit=tpPrice)
else
// Cancel pending limit orders if position is closed
strategy.cancel_all()
// Visualization
plot(ema, color=color.blue, title="EMA 200")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.green, style=plot.style_linebr, title="Avg Entry Price") Разбор параметров
atrLength: Период индикатора ATR для расчета текущей волатильности рынка. Чем больше период, тем более сглаженными будут изменения шага сетки.atrMultiplier: Коэффициент, на который умножается значение ATR для определения расстояния между уровнями сетки. Позволяет масштабировать шаг под конкретный инструмент.gridLevels: Максимальное количество колен (уровней) в сетке ордеров, включая первый рыночный ордер.tpMultiplier: Множитель ATR для расчета динамического уровня Take Profit от средней цены позиции (strategy.position_avg_price).
Если вы торгуете коррелированные активы, динамический шаг можно адаптировать под волатильность спреда. О том, как работать со спредами, читайте в нашей статье про RSI для спреда ETH/BTC в Pine Script v5: расчет и визуализация.
Как запустить
Для запуска стратегии выполните следующие шаги:
1. Откройте платформу TradingView и перейдите во вкладку ‘Pine Editor’ в нижней панели.
2. Скопируйте представленный выше код и вставьте его в редактор, заменив стандартный шаблон.
3. Нажмите кнопку ‘Add to Chart’ (Добавить на график), чтобы визуализировать работу сетки и среднюю цену входа.
4. Для оптимизации параметров откройте настройки стратегии (иконка шестеренки на графике) и настройте множители ATR под ваш таймфрейм.
Для определения разворотных точек, на которых выгодно запускать сетку, отлично подойдет алгоритм поиска экстремумов. Рекомендуем ознакомиться с руководством Pine Script v5: Поиск паттерна ‘Три маленьких индейца’ с циклами for.




