strategy.exit() с одинаковым идентификатором входа from_entry. Первый вызов закрывает часть позиции с помощью параметра qty_percent, а второй закрывает оставшуюся часть по достижении следующей цели или общего Stop Loss.Исходный код
Ниже представлен готовый к использованию шаблон торговой стратегии с логикой разделения выхода на два уровня Take Profit (50% на первом уровне и оставшиеся 50% на втором) и общим Stop Loss.
//@version=5
strategy('Partial Take Profit Strategy', overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// Входные параметры
tp1_perc = input.float(1.5, title='Take Profit 1 (%)', minval=0.1)
tp2_perc = input.float(3.0, title='Take Profit 2 (%)', minval=0.1)
sl_perc = input.float(2.0, title='Stop Loss (%)', minval=0.1)
tp1_qty_perc = input.float(50.0, title='TP1 Qty (%)', minval=1, maxval=100)
// Простой индикатор для генерации сигналов (EMA Cross)
fast_ema = ta.ema(close, 9)
slow_ema = ta.ema(close, 21)
entry_cond = ta.crossover(fast_ema, slow_ema)
plot(fast_ema, color=color.blue, title='Fast EMA')
plot(slow_ema, color=color.orange, title='Slow EMA')
// Сохраняем цену входа
var float entry_price = na
if (entry_cond and strategy.position_size == 0)
strategy.entry('Long', strategy.long)
entry_price := close
// Логика выходов (активна только при наличии открытой позиции)
if (strategy.position_size > 0)
tp1_price = entry_price * (1 + tp1_perc / 100)
tp2_price = entry_price * (1 + tp2_perc / 100)
sl_price = entry_price * (1 - sl_perc / 100)
// Первый выход: закрываем часть позиции (например, 50%) по TP1
strategy.exit('TP1', from_entry='Long', qty_percent=tp1_qty_perc, limit=tp1_price, stop=sl_price)
// Второй выход: закрываем оставшуюся часть по TP2
strategy.exit('TP2', from_entry='Long', limit=tp2_price, stop=sl_price) Разбор параметров
Для корректной работы частичного закрытия крайне важно понимать, как взаимодействуют параметры функции strategy.exit:
id: Уникальный идентификатор ордера на выход. Каждая цель должна иметь свой уникальныйid(например, ‘TP1’ и ‘TP2’), иначе TradingView перезапишет предыдущий ордер.from_entry: Связывает ордер на выход с конкретным входом (в нашем случае ‘Long’). Это критически важно для мульти-позиционных стратегий.qty_percent: Процент от объема позиции, который необходимо закрыть. Для первого тейка мы указываемqty_percent=50. Для финального тейка этот параметр можно опустить, чтобы закрыть 100% оставшейся позиции.limit: Целевая цена (Take Profit), при достижении которой исполнится лимитный ордер.stop: Уровень Stop Loss. Указание одинаковогоstopв обоих вызовах гарантирует, что вся позиция закроется при неблагоприятном движении рынка.
Как запустить
Чтобы протестировать данную логику на графике TradingView, выполните следующие шаги:
1. Откройте TradingView и перейдите в ‘Pine Editor’ (Редактор Pine) в нижней панели.
2. Скопируйте представленный выше код и вставьте его в редактор, заменив стандартный шаблон.
3. Нажмите кнопку ‘Add to chart’ (Добавить на график).
4. В панели ‘Strategy Tester’ (Тестер стратегий) вы сможете детально проанализировать список сделок и увидеть, как позиция закрывается частями.
Для построения более сложных торговых систем вам может потребоваться продвинутая фильтрация сигналов. Например, вы можете использовать VWMA с кастомными весами через матрицы в Pine Script v5 для определения динамических зон поддержки/сопротивления или анализировать структуру рынка с помощью Скрипта профиля рынка (Market Profile) с разделением на TPO в Pine Script v5.
Также, при работе на реальном счете, критически важно вести логирование всех частичных закрытий. Для автоматизации этого процесса отлично подойдет Интеграция Pine Script v5 с Google Sheets: Webhook для логов сделок, которая позволит отправлять данные о каждой частичной сделке в режиме реального времени.




