strategy.entry путем определения количества контрактов/акций на основе заданного процента риска от текущего капитала и расстояния до стоп-лосса. Это позволяет эффективно управлять риском, адаптируя объем сделки к волатильности и размеру вашего капитала.Исходный код
Представленный ниже код демонстрирует, как реализовать динамический расчет размера позиции в Pine Script v5. Он учитывает заданный процент риска от текущего капитала и расстояние до стоп-лосса, чтобы определить оптимальное количество акций или контрактов для входа в сделку. Это позволяет поддерживать постоянный уровень риска на каждую сделку, независимо от цены актива или размера стоп-лосса.
//@version=5
strategy(
title='Dynamic Position Sizing',
overlay=true,
initial_capital=10000,
default_qty_type=strategy.cash,
default_qty_value=100,
commission_type=strategy.commission.percent,
commission_value=0.1
)
// --- Входные параметры ---
riskPct = input.float(1.0, 'Процент риска от капитала (%)', minval=0.1, maxval=10.0, step=0.1)
stopLossPct = input.float(2.0, 'Стоп-лосс от цены входа (%)', minval=0.1, maxval=10.0, step=0.1)
useFixedQty = input.bool(false, 'Использовать фиксированное количество (для сравнения)')
fixedQty = input.int(10, 'Фиксированное количество', minval=1)
// --- Функция для расчета цены стоп-лосса ---
calcStopLossPrice(entryPrice, isLong) =>
isLong ? entryPrice * (1 - stopLossPct / 100) : entryPrice * (1 + stopLossPct / 100)
// --- Функция для расчета динамического количества контрактов/акций ---
calcDynamicQty(entryPrice, stopLossPrice) =>
// Используем текущий капитал для динамического расчета
currentCapital = strategy.equity
// Сумма, которой мы рискуем в этой сделке
riskAmount = currentCapital * (riskPct / 100)
// Расстояние до стоп-лосса в валюте
stopLossDistance = math.abs(entryPrice - stopLossPrice)
// Избегаем деления на ноль или очень маленького стоп-лосса
if stopLossDistance == 0
stopLossDistance := entryPrice * 0.0001 // Минимальное расстояние для избежания ошибки
// Расчет "сырого" количества контрактов/акций
rawQty = riskAmount / stopLossDistance
// Корректировка количества с учетом точности инструмента и минимального размера ордера
float qtyStep = syminfo.qty_step // Например, 1 для акций, 0.001 для некоторых криптовалют
float minOrderContracts = syminfo.minordercontracts // Например, 1 для акций, 0.001 для некоторых криптовалют
// Округляем до ближайшего шага количества
float adjustedQty = math.round(rawQty / qtyStep) * qtyStep
// Убеждаемся, что количество не меньше минимального размера ордера
if adjustedQty < minOrderContracts
adjustedQty := minOrderContracts
adjustedQty
// --- Пример торговой логики (простые скользящие средние) ---
longCondition = ta.crossover(ta.sma(close, 10), ta.sma(close, 20))
shortCondition = ta.crossunder(ta.sma(close, 10), ta.sma(close, 20))
// Цены входа для расчета стоп-лосса
var float longEntryPrice = na
var float shortEntryPrice = na
if longCondition
longEntryPrice := close
longStopLossPrice = calcStopLossPrice(longEntryPrice, true)
// Выбираем между фиксированным и динамическим количеством
calculatedQty = useFixedQty ? fixedQty : calcDynamicQty(longEntryPrice, longStopLossPrice)
if strategy.opentrades == 0 // Входим только если нет открытых сделок
strategy.entry('Long', strategy.long, qty=calculatedQty)
strategy.exit('Long Exit', from_entry='Long', stop=longStopLossPrice)
if shortCondition
shortEntryPrice := close
shortStopLossPrice = calcStopLossPrice(shortEntryPrice, false)
// Выбираем между фиксированным и динамическим количеством
calculatedQty = useFixedQty ? fixedQty : calcDynamicQty(shortEntryPrice, shortStopLossPrice)
if strategy.opentrades == 0 // Входим только если нет открытых сделок
strategy.entry('Short', strategy.short, qty=calculatedQty)
strategy.exit('Short Exit', from_entry='Short', stop=shortStopLossPrice)
// --- Отображение для визуализации ---
plot(strategy.equity, title='Капитал', color=color.blue, linewidth=2)
plot(strategy.opentrades > 0 ? strategy.position_size : na, title='Размер позиции', color=color.orange, style=plot.style_columns)
// Отображение рассчитанного динамического количества (до входа)
var float lastCalculatedQty = na
if longCondition or shortCondition
entryPriceForCalc = close // Используем текущую цену закрытия для отображения расчета
isLongForCalc = longCondition ? true : false
slPriceForCalc = calcStopLossPrice(entryPriceForCalc, isLongForCalc)
lastCalculatedQty := calcDynamicQty(entryPriceForCalc, slPriceForCalc)
plot(lastCalculatedQty, title='Рассчитанное количество (до входа)', color=color.purple, style=plot.style_linebr)
Разбор параметров
riskPct: Процент от текущего капитала, которым вы готовы рискнуть в каждой сделке. Например,1.0означает 1% от вашего капитала. Это ключевой параметр для управления риском.stopLossPct: Процентное расстояние от цены входа до стоп-лосса. Например,2.0означает, что стоп-лосс будет установлен на 2% ниже (для лонга) или выше (для шорта) цены входа.useFixedQty: Булевый переключатель. Еслиtrue, стратегия будет использовать фиксированное количество контрактов/акций, заданное вfixedQty, игнорируя динамический расчет. Полезно для сравнения.fixedQty: Фиксированное количество контрактов/акций для входа, используется, еслиuseFixedQtyустановлено вtrue.strategy.equity: Встроенная переменная Pine Script, которая возвращает текущий баланс вашего счета (начальный капитал + реализованная/нереализованная прибыль/убыток). Использованиеstrategy.equityвместоstrategy.initial_capitalкритически важно для динамического управления риском, так как оно позволяет размеру позиции адаптироваться к росту или уменьшению вашего капитала.syminfo.qty_step: Встроенная переменная, представляющая минимальный шаг изменения количества для данного инструмента. Например, для акций это обычно1, для некоторых криптовалют может быть0.001или0.000001. Используется для корректного округления рассчитанного количества.syminfo.minordercontracts: Встроенная переменная, указывающая минимальное количество контрактов/акций, которое можно разместить для данного инструмента. Рассчитанное количество не может быть меньше этого значения.
Как запустить
Чтобы использовать этот скрипт в TradingView и рассчитать динамический размер позиции, выполните следующие шаги:
- Откройте TradingView и перейдите в редактор Pine Script (обычно находится в нижней части экрана).
- Удалите весь существующий код и вставьте предоставленный выше исходный код.
- Нажмите кнопку ‘Добавить на график’ (Add to Chart).
- После добавления скрипта на график, вы можете открыть его настройки (значок шестеренки рядом с названием скрипта на графике).
- В разделе ‘Входы’ (Inputs) настройте параметры ‘Процент риска от капитала (%)’ и ‘Стоп-лосс от цены входа (%)’ в соответствии с вашей торговой стратегией и толерантностью к риску. Вы также можете переключить ‘Использовать фиксированное количество’ для сравнения.
- Перейдите на вкладку ‘Тестер стратегий’ (Strategy Tester) в нижней части экрана, чтобы просмотреть результаты бэктеста, включая изменения капитала и размер позиций. Обратите внимание, как размер позиции адаптируется к изменениям капитала и волатильности.
- Экспериментируйте с различными значениями параметров, чтобы найти оптимальные настройки для вашего инструмента и торгового стиля. Для более продвинутых стратегий, таких как Мульти-таймфреймный FVG в Pine Script v5: руководство без перерисовки, динамическое управление позицией становится еще более критичным.
Этот подход к расчету размера позиции является фундаментальным элементом профессионального управления капиталом и риском в алгоритмической торговле.




