Бэктест пирамидинга в Pine Script v5: Средняя цена входа

Бэктест пирамидинга в Pine Script v5: Средняя цена входа Pine Script
Пошаговое руководство по созданию скрипта для бэктеста пирамидинга с расчетом средней цены входа (Average Price) в Pine Script v5. Готовый код стратегии.
Суть: Профессиональный скрипт на Pine Script v5 для бэктеста стратегий с пирамидингом (накоплением позиции). Скрипт автоматически рассчитывает среднюю цену входа (Average Price), динамически пересчитывает уровни Take Profit / Stop Loss и визуализирует их на графике TradingView.

Пирамидинг — это метод управления капиталом, при котором трейдер увеличивает размер рабочей позиции по мере движения цены в прибыльном направлении. В отличие от усреднения против тренда (мартингейла), пирамидинг позволяет максимизировать прибыль на сильных трендовых движениях при контролируемом риске.

Главная сложность при бэктесте пирамидинга в TradingView — корректный расчет средней цены входа для всей сетки ордеров и динамическое управление уровнями фиксации прибыли и ограничения убытков. В Pine Script v5 для этого используется встроенная переменная strategy.position_avg_price.

Для определения оптимальных точек первого входа вы можете использовать продвинутые методы анализа объемов, такие как Индикатор профиля дельты (Delta Profile) по барам с Intrabar Inspection в Pine Script v5, или классические разворотные сигналы, которые генерирует Индикатор дивергенций (Bullish/Bearish Divergence) с осциллятором Стохастик в Pine Script v5.

Исходный код стратегии

Ниже представлен готовый к использованию код стратегии трендового пирамидинга. Скрипт открывает первичную позицию при пересечении скользящих средних (SMA) и добавляет новые ордера при росте цены на заданный шаг в процентах.

//@version=5
strategy('Pyramiding with Average Price Backtest', overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, pyramiding=5)

// Inputs
fast_ma_len = input.int(10, title='Fast MA Length')
slow_ma_len = input.int(30, title='Slow MA Length')
step_percent = input.float(2.0, title='Pyramiding Step (%)', minval=0.1)
max_entries = input.int(5, title='Max Pyramiding Entries', minval=1, maxval=10)
tp_percent = input.float(5.0, title='Take Profit (%) from Avg Price', minval=0.1)
sl_percent = input.float(3.0, title='Stop Loss (%) from Avg Price', minval=0.1)

// Indicators
fast_ma = ta.sma(close, fast_ma_len)
slow_ma = ta.sma(close, slow_ma_len)

plot(fast_ma, color=color.blue, title='Fast MA')
plot(slow_ma, color=color.orange, title='Slow MA')

// State variables
var float last_entry_price = na

// Entry Conditions
initial_buy = ta.crossover(fast_ma, slow_ma) and strategy.position_size == 0

// Pyramiding logic
can_pyramid = strategy.position_size > 0 and strategy.opentrades < max_entries
pyramid_buy = can_pyramid and (close >= last_entry_price * (1 + step_percent / 100))

// Execution
if (initial_buy)
    strategy.entry('Long_1', strategy.long)
    last_entry_price := close

if (pyramid_buy)
    int next_trade_num = strategy.opentrades + 1
    string trade_id = 'Long_' + str.tostring(next_trade_num)
    strategy.entry(trade_id, strategy.long)
    last_entry_price := close

// Reset last entry price
if (strategy.position_size == 0)
    last_entry_price := na

// Exit logic based on Average Price
avg_price = strategy.position_avg_price

// Plot Average Price
plot(strategy.position_size > 0 ? avg_price : na, color=color.purple, style=plot.style_linebr, linewidth=2, title='Average Entry Price')

// Calculate TP/SL levels
tp_level = avg_price * (1 + tp_percent / 100)
sl_level = avg_price * (1 - sl_percent / 100)

plot(strategy.position_size > 0 ? tp_level : na, color=color.green, style=plot.style_linebr, title='Take Profit Level')
plot(strategy.position_size > 0 ? sl_level : na, color=color.red, style=plot.style_linebr, title='Stop Loss Level')

if (strategy.position_size > 0)
    strategy.exit('Exit', limit=tp_level, stop=sl_level)

Разбор ключевых параметров и логики

  • pyramiding: Параметр в объявлении функции strategy(), определяющий максимальное количество одновременно открытых сделок в одном направлении. Без его явного указания TradingView проигнорирует последующие сигналы на вход.
  • strategy.position_avg_price: Встроенная переменная, которая автоматически пересчитывает средневзвешенную цену входа при каждом добавлении к позиции. Именно от нее рассчитываются динамические уровни Take Profit и Stop Loss.
  • strategy.opentrades: Возвращает текущее количество открытых сделок. Используется для контроля лимита пирамидинга внутри кода.
  • step_percent: Процентное изменение цены от уровня последней сделки (last_entry_price), необходимое для совершения следующей доливки.

Как запустить скрипт в TradingView

Чтобы протестировать стратегию, выполните следующие шаги:

1. Откройте платформу TradingView и перейдите на вкладку любого графика (например, BTCUSDT или AAPL).

2. В нижней панели выберите вкладку Pine Editor (Редактор Pine).

3. Полностью удалите стандартный шаблон и вставьте скопированный выше код.

4. Нажмите кнопку Add to chart (Добавить на график) в правом верхнем углу редактора.

5. Перейдите во вкладку Strategy Tester (Тестер стратегий), чтобы проанализировать показатели доходности, просадки и винрейта.

Если вы решите автоматизировать отправку сигналов из этой стратегии на биржу через вебхуки, вам может потребоваться масштабирование системы уведомлений. О том, как обойти стандартные ограничения платформы, читайте в нашей статье TradingView: Обход лимита 500 алертов Pine Script v5 через JSON мультиплексирование.

Оцените статью
FinFluct